From dd6fbeb0a14088504ec6e81f5869dae4cd6d9bff Mon Sep 17 00:00:00 2001 From: Tykayn Date: Sun, 4 May 2025 23:48:53 +0200 Subject: [PATCH] =?UTF-8?q?persister=20l'affichage=20des=20itin=C3=A9raire?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 16 ++++ js/lcm_main.js | 169 ++++++++++++++++++----------------------- styles/_overrides.scss | 16 ++-- styles/style.css | 9 +++ styles/style.css.map | 2 +- 5 files changed, 109 insertions(+), 103 deletions(-) diff --git a/index.html b/index.html index 68e13fc..bf9517d 100644 --- a/index.html +++ b/index.html @@ -76,6 +76,7 @@
+

@@ -178,6 +179,21 @@

+

+ + +

+
+
+

Options d'affichage

+
diff --git a/js/lcm_main.js b/js/lcm_main.js index 7df91a7..ff26d0f 100644 --- a/js/lcm_main.js +++ b/js/lcm_main.js @@ -305,6 +305,8 @@ function updateURLWithMapCoordinatesAndZoom() { history.replaceState(null, null, url); updateExternalEditorsLinks(); + + } @@ -611,9 +613,10 @@ function displayPointsFromApi(points, convert_to_osm_json) { }, onEachFeature: eachFeature, }); - - // Mettre à jour le compteur de stations filtrées + updateFilteredStationsCount(); + calculerEtAfficherItineraire(endItinerary); + } function displaySocketsList(feature) { @@ -655,6 +658,12 @@ function makePopupOfFeature(feature) { } }) popupContent += '
' + + // Ajouter l'affichage des tarifs si l'option est activée + if ($('#display_charges').is(':checked') && feature.properties.tags.charge) { + popupContent += '
Tarifs : ' + feature.properties.tags.charge + '
' + } + return popupContent; } @@ -1691,6 +1700,7 @@ async function calculerEtAfficherItineraire(destination, mode = 'car') { const consumptionPerKm = parseFloat($('#consumption_per_km').val()) || 160; const minBatteryLevel = parseFloat($('#min_battery_level').val()) || 15; const chargeToLevel = parseFloat($('#charge_to_level').val()) || 80; + const maxChargePower = parseFloat($('#max_charge_power').val()) || 50; // Construire l'URL OSRM const url = `https://router.project-osrm.org/route/v1/${mode}/${startLon},${startLat};${endLon},${endLat}?overview=full&geometries=geojson&alternatives=false&steps=false`; @@ -1786,111 +1796,64 @@ async function calculerEtAfficherItineraire(destination, mode = 'car') { const pauseDurationMinutes = 10; const totalPauseTimeMinutes = numberOfPauses * pauseDurationMinutes; - // Ajouter les marqueurs de pause - window.pauseMarkers = []; + // Calculer les temps de recharge nécessaires + let totalRechargeTimeMinutes = 0; if (numberOfPauses > 0) { - const totalDistance = route.distance; const pauseInterval = totalDistance / (numberOfPauses + 1); - + for (let i = 1; i <= numberOfPauses; i++) { const pauseDistance = pauseInterval * i; - let accumulatedDistance = 0; - let pauseCoords; - - // Trouver les coordonnées pour cette pause - for (let j = 0; j < coords.length - 1; j++) { - const segmentDistance = L.latLng(coords[j]).distanceTo(coords[j + 1]); - if (accumulatedDistance + segmentDistance >= pauseDistance) { - const ratio = (pauseDistance - accumulatedDistance) / segmentDistance; - pauseCoords = [ - coords[j][0] + (coords[j + 1][0] - coords[j][0]) * ratio, - coords[j][1] + (coords[j + 1][1] - coords[j][1]) * ratio - ]; - break; - } - accumulatedDistance += segmentDistance; - } - - if (pauseCoords) { - // Calculer la distance restante jusqu'à la prochaine pause ou la fin - const nextPauseDistance = (i < numberOfPauses) ? pauseInterval : (totalDistance - pauseDistance); - const consumptionToNextPause = (nextPauseDistance / 1000) * consumptionPerKm / 1000; // en kWh - const batteryLevelNeeded = (consumptionToNextPause / batteryCapacity) * 100 + minBatteryLevel; - - // Calculer le niveau de batterie actuel à ce point - const currentBatteryLevel = ((batteryStartKwh - (pauseDistance / 1000 * consumptionPerKm / 1000)) / batteryCapacity) * 100; - - // Rechercher les stations de recharge autour du point de pause - const chargingStations = await searchChargingStationsAroundPoint(pauseCoords[0], pauseCoords[1]); - - // Créer le contenu du popup avec les stations trouvées - let popupContent = `
-

Pause recommandée n°${i}

-

Durée : 10 minutes

-

Niveau de batterie actuel : ${currentBatteryLevel.toFixed(1)}%

-

Niveau de batterie nécessaire : ${batteryLevelNeeded.toFixed(1)}%

-

Distance jusqu'à la prochaine pause : ${(nextPauseDistance / 1000).toFixed(1)} km

`; - - if (chargingStations.length > 0) { - popupContent += `
-

Stations de recharge à proximité (${chargingStations.length}) :

-
    `; - - chargingStations.forEach(station => { - const name = station.tags?.name || 'Sans nom'; - const operator = station.tags?.operator || 'Opérateur inconnu'; - const distance = L.latLng(pauseCoords).distanceTo([station.lat, station.lon]).toFixed(0); - - popupContent += `
  • - ${name}
    - Opérateur : ${operator}
    - Distance : ${distance} m -
  • `; - }); - - popupContent += `
`; - } else { - popupContent += `

Aucune station de recharge trouvée dans un rayon de 1.5 km

`; - } - - popupContent += `
`; - - const pauseMarker = L.marker(pauseCoords, { - icon: L.divIcon({ - className: 'pause-marker', - html: '⏸️', - iconSize: [30, 30] - }) - }).addTo(map); - - pauseMarker.bindPopup(popupContent); - window.pauseMarkers.push(pauseMarker); - } + const nextPauseDistance = (i < numberOfPauses) ? pauseInterval : (totalDistance - pauseDistance); + + // Calculer la consommation jusqu'à la prochaine pause + const consumptionToNextPause = (nextPauseDistance / 1000) * consumptionPerKm / 1000; // en kWh + const batteryLevelNeeded = (consumptionToNextPause / batteryCapacity) * 100 + minBatteryLevel; + + // Calculer le niveau de batterie actuel + const currentBatteryLevel = ((batteryStartKwh - (pauseDistance / 1000 * consumptionPerKm / 1000)) / batteryCapacity) * 100; + + // Calculer la quantité d'énergie à recharger + const energyToRecharge = (batteryLevelNeeded - currentBatteryLevel) * batteryCapacity / 100; + + // Calculer le temps de recharge nécessaire + const rechargeTimeHours = energyToRecharge / maxChargePower; + const rechargeTimeMinutes = Math.ceil(rechargeTimeHours * 60); + + // Ajouter le temps de recharge au total (minimum 10 minutes) + totalRechargeTimeMinutes += Math.max(rechargeTimeMinutes, pauseDurationMinutes); } } - // Afficher distance, durée, et boutons de mode de transport - const distanceKm = (route.distance / 1000).toFixed(1); - const durationMin = Math.round(route.duration / 60); - const totalDurationMin = durationMin + totalPauseTimeMinutes; + // Convertir les différentes durées en format lisible + const formatDuration = (minutes) => { + if (minutes >= 60) { + const hours = Math.floor(minutes / 60); + const mins = minutes % 60; + return `${hours}h${mins > 0 ? ` ${mins}min` : ''}`; + } + return `${minutes} min`; + }; - // Convertir la durée totale en heures et minutes si nécessaire - let durationDisplay = ''; - if (totalDurationMin >= 60) { - const hours = Math.floor(totalDurationMin / 60); - const minutes = totalDurationMin % 60; - durationDisplay = `${hours}h${minutes > 0 ? ` ${minutes}min` : ''}`; - } else { - durationDisplay = `${totalDurationMin} min`; - } + const durationNoPause = formatDuration(durationMin); + const durationWithPauses = formatDuration(durationMin + totalPauseTimeMinutes); + const durationWithRecharge = formatDuration(durationMin + totalRechargeTimeMinutes); - $('#current_station_infos').html(` + $('#routing_infos').html(`

Itinéraire

Distance : ${distanceKm} km
-
Durée estimée : ${durationDisplay} (dont ${totalPauseTimeMinutes} min de pause)
+
+

Niveaux de batterie :

+
Départ : ${batteryStartLevel}%
+
Arrivée : ${batteryEndLevel.toFixed(1)}%
+
+
+

Durées estimées :

+
Sans pause : ${durationNoPause}
+
Avec pauses (10 min) : ${durationWithPauses}
+
Avec recharges : ${durationWithRecharge}
+
Nombre de pauses recommandées : ${numberOfPauses} (10 min toutes les 2h)
-
Niveau de batterie final estimé : ${batteryEndLevel.toFixed(1)}%
Consommation totale estimée : ${totalConsumptionKwh.toFixed(1)} kWh
@@ -1909,7 +1872,14 @@ async function calculerEtAfficherItineraire(destination, mode = 'car') { function setStartMarker(latlng) { if (startMarker) map.removeLayer(startMarker); - startMarker = L.marker(latlng, { draggable: true, icon: L.divIcon({className: 'start-marker', html: '🟢', iconSize: [30, 30]}) }).addTo(map); + startMarker = L.marker(latlng, { + draggable: true, + icon: L.divIcon({ + className: 'start-marker', + html: '🟢
départ', + iconSize: [30, 30] + }) + }).addTo(map); startCoords = [latlng.lat, latlng.lng]; startMarker.on('dragend', function(e) { startCoords = [e.target.getLatLng().lat, e.target.getLatLng().lng]; @@ -1919,7 +1889,14 @@ function setStartMarker(latlng) { function setEndMarker(latlng) { if (endMarker) map.removeLayer(endMarker); - endMarker = L.marker(latlng, { draggable: true, icon: L.divIcon({className: 'end-marker', html: '🔴', iconSize: [30, 30]}) }).addTo(map); + endMarker = L.marker(latlng, { + draggable: true, + icon: L.divIcon({ + className: 'end-marker', + html: '🔴
arrivée', + iconSize: [30, 30] + }) + }).addTo(map); endCoords = [latlng.lat, latlng.lng]; endMarker.on('dragend', function(e) { endCoords = [e.target.getLatLng().lat, e.target.getLatLng().lng]; diff --git a/styles/_overrides.scss b/styles/_overrides.scss index af245b9..f986996 100644 --- a/styles/_overrides.scss +++ b/styles/_overrides.scss @@ -1,11 +1,7 @@ /** overrides leaflet */ - - -// .leaflet-interactive { -// border: solid 3px white; -// } + .leaflet-control-layers { &.leaflet-control-layers-toggle { @@ -106,4 +102,12 @@ overrides leaflet padding: 5px; border-radius: 4px; box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4); -} \ No newline at end of file +} + +.battery-marker { + background: white; + border-radius: 1rem; + padding: 30px; + width: 5rem; + height: 5rem; + border: solid 1px #ccc;} \ No newline at end of file diff --git a/styles/style.css b/styles/style.css index f829b3a..45150cb 100644 --- a/styles/style.css +++ b/styles/style.css @@ -1099,6 +1099,15 @@ overrides leaflet height: 30px !important; } +.battery-marker { + background: white; + border-radius: 1rem; + padding: 30px; + width: 5rem; + height: 5rem; + border: solid 1px #ccc; +} + @keyframes rainbow-border { 0% { border-left-color: #ff0000; diff --git a/styles/style.css.map b/styles/style.css.map index 17cc285..973c58a 100644 --- a/styles/style.css.map +++ b/styles/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["main.scss","_osmose.scss","_recherche.scss","_filters.scss","_mobile.scss","_overrides.scss","_animations.scss","_stats.scss"],"names":[],"mappings":";AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAKA;EACE;;AAGE;EACE;EACA;;AAKJ;EACE;;;AAMN;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;;;AAKA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;;AAGA;EACE;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EAOE;;AANA;EACE;EACA;EACA;;;AAMJ;EACE;;;AAGF;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAIA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAIA;EACE;EACA;;;AAKN;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;;AAIJ;EACE;;AAUE;EACE;EACA;EACA;;AAcJ;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;;;AAMJ;EAAgB;;AAChB;EAAc;;AACd;EAAgB;;AAEhB;EACE;;;ACrsBJ;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAEA;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAKJ;EACE;EACA;EACA;EACA;;;AAEA;EACE;EACA;EACA;EACA;;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AC3DJ;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEA;EACE;EACA;;;AAEA;EACE;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAEA;EACE;EACA;EACA;;;AAGF;EACE;;;AASJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpEF;EACE;;;AAEA;EACE;EACA;EACA;;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAcF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAEA;AAAA;EACE;EACA,OApDS;EAqDT;;;AAGF;AAAA;EAvBA;EACA;EAwBE;EACA;EArBF;EAuBE;EACA;;;AAEA;AAAA;EACE,YA/DK;;;AAmET;AAAA;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EA/CF;;;AAkDE;AAAA;EACE;;;AAIJ;AAAA;EACE,YA/FY;EAgGZ,cAhGY;EAiGZ;;;AAEA;AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;AAAA;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EACE;EACA,OAxHS;EAsCX;;;AAsFA;AAAA;EACE;;;AAIA;AAAA;EACE,YAhIK;EAiIL,cAhIW;EAiIX;;;AAGF;AAAA;EACE,OArIW;EAsIX;;;AAMN;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AC9JJ;AACA;EACE;IACE;IACA;;EAKA;AAAA;IAEE;IACA;;EAIJ;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;AACE;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;;EAGF;AAAA;IAEE;IACA;IACA;IACA;IACA;IACA;;EAIF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;;EAIF;IAEE;;;ACrGJ;AAAA;AAAA;AAUE;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAEA;EACE;EACA;;;AAKN;EACE;EACA;;;AAGF;AAEE;EACE;EACA;EACA;EACA;EACA;;;AAEA;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAEA;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAMN;EAyBE;EACA;EACA;EACA;;;AA1BE;EACE;EACA;EACA;EACA;EACA;EACA;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;ACnGN;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;AAIJ;EAEE;IAEE;;EAGF;IACE;;;ACtCJ;EACE;EACA;EACA;;;AAEA;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAKA;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAEA;EACE;EACA;EACA;;;APuqBN;EACE;EACA","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["main.scss","_osmose.scss","_recherche.scss","_filters.scss","_mobile.scss","_overrides.scss","_animations.scss","_stats.scss"],"names":[],"mappings":";AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAKA;EACE;;AAGE;EACE;EACA;;AAKJ;EACE;;;AAMN;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;;;AAKA;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;;AAGA;EACE;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EAOE;;AANA;EACE;EACA;EACA;;;AAMJ;EACE;;;AAGF;EACE;IACE;;EAGF;IACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;AAAA;AAAA;AAIA;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAIF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAIA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAIA;EACE;EACA;;;AAKN;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;;AAIJ;EACE;;AAUE;EACE;EACA;EACA;;AAcJ;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;;;AAMJ;EAAgB;;AAChB;EAAc;;AACd;EAAgB;;AAEhB;EACE;;;ACrsBJ;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAEA;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAKJ;EACE;EACA;EACA;EACA;;;AAEA;EACE;EACA;EACA;EACA;;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AC3DJ;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAEA;EACE;EACA;;;AAEA;EACE;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAEA;EACE;EACA;EACA;;;AAGF;EACE;;;AASJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpEF;EACE;;;AAEA;EACE;EACA;EACA;;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAcF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAEA;AAAA;EACE;EACA,OApDS;EAqDT;;;AAGF;AAAA;EAvBA;EACA;EAwBE;EACA;EArBF;EAuBE;EACA;;;AAEA;AAAA;EACE,YA/DK;;;AAmET;AAAA;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EA/CF;;;AAkDE;AAAA;EACE;;;AAIJ;AAAA;EACE,YA/FY;EAgGZ,cAhGY;EAiGZ;;;AAEA;AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;AAAA;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EACE;EACA,OAxHS;EAsCX;;;AAsFA;AAAA;EACE;;;AAIA;AAAA;EACE,YAhIK;EAiIL,cAhIW;EAiIX;;;AAGF;AAAA;EACE,OArIW;EAsIX;;;AAMN;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AC9JJ;AACA;EACE;IACE;IACA;;EAKA;AAAA;IAEE;IACA;;EAIJ;IACE;;EAGF;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGF;AACE;;EAGF;IACE;IACA;IACA;IACA;IACA;;EAGF;IACE;;EAGF;AAAA;IAEE;IACA;IACA;IACA;IACA;IACA;;EAIF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;;EAIF;IAEE;;;ACrGJ;AAAA;AAAA;AAME;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAEA;EACE;EACA;;;AAKN;EACE;EACA;;;AAGF;AAEE;EACE;EACA;EACA;EACA;EACA;;;AAEA;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAEA;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAMN;EAyBE;EACA;EACA;EACA;;;AA1BE;EACE;EACA;EACA;EACA;EACA;EACA;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAWN;EACE;EACA;EACA;EACA;EACA;EACA;;;AChHF;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;AAIJ;EAEE;IAEE;;EAGF;IACE;;;ACtCJ;EACE;EACA;EACA;;;AAEA;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAKA;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAEA;EACE;EACA;EACA;;;APuqBN;EACE;EACA","file":"style.css"} \ No newline at end of file