zeroed-some/localtoast / a04af33

Browse files

refactor stable. django rechained, or unchained idk which

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
a04af337c269cca91e72a427ad6de7e47831a60f
Parents
0fb258c
Tree
d49124b

51 changed files

StatusFile+-
M .gitignore 35 39
A backend/api/__init__.py 0 0
A backend/api/admin.py 38 0
A backend/api/apps.py 6 0
A backend/api/migrations/0001_initial.py 86 0
A backend/api/migrations/0002_restaurant_has_toast.py 20 0
A backend/api/migrations/__init__.py 0 0
A backend/api/models.py 91 0
A backend/api/serializers.py 89 0
A backend/api/tests.py 3 0
A backend/api/urls.py 20 0
A backend/api/views.py 405 0
A backend/localtoast/__init__.py 0 0
A backend/localtoast/asgi.py 16 0
A backend/localtoast/settings.py 125 0
A backend/localtoast/urls.py 13 0
A backend/localtoast/wsgi.py 16 0
A backend/manage.py 22 0
A backend/railway.json 12 0
A backend/requirements.txt 12 0
A backend/test_api.py 89 0
A frontend/.gitignore 41 0
A frontend/README.md 36 0
A frontend/app/favicon.ico bin
A frontend/app/globals.css 48 0
A frontend/app/layout.tsx 26 0
A frontend/app/page.tsx 224 0
A frontend/app/providers.tsx 24 0
A frontend/components/Loading.tsx 12 0
A frontend/components/Map.tsx 198 0
A frontend/components/RestaurantPanel.tsx 141 0
A frontend/components/ReviewModal.tsx 118 0
A frontend/components/SearchPanel.tsx 168 0
A frontend/eslint.config.mjs 16 0
A frontend/lib/api.ts 106 0
A frontend/next.config.ts 27 0
A frontend/package-lock.json 6716 0
A frontend/package.json 33 0
A frontend/postcss.config.mjs 9 0
A frontend/public/file.svg 1 0
A frontend/public/globe.svg 1 0
A frontend/public/leaflet/marker-icon-2x.png bin
A frontend/public/leaflet/marker-icon.png bin
A frontend/public/leaflet/marker-shadow.png bin
A frontend/public/next.svg 1 0
A frontend/public/vercel.svg 1 0
A frontend/public/window.svg 1 0
A frontend/tailwind.config.ts 30 0
A frontend/tsconfig.json 40 0
A package-lock.json 372 0
A package.json 15 0
.gitignoremodified
@@ -1,48 +1,44 @@
1
-# Node modules
2
-node_modules/*
1
+# Python
2
+__pycache__/
3
+*.py[cod]
4
+*$py.class
5
+*.so
6
+.Python
7
+venv/
8
+env/
9
+*.egg-info/
10
+.pytest_cache/
11
+
12
+*/**/.toastenv
13
+
14
+# Django
15
+*.log
16
+*.pot
17
+*.pyc
18
+db.sqlite3
19
+media/
20
+staticfiles/
21
+.env
322
 
4
-# Production build
23
+# IDE
24
+.vscode/
25
+.idea/
26
+*.swp
27
+*.swo
28
+
29
+# Node
30
+node_modules/
531
 .next/
632
 out/
7
-dist/
8
-
9
-# Build output from TypeScript (if manually compiled outside Next.js)
10
-*.tsbuildinfo
11
-
12
-# Environment variables
13
-.env
14
-.env.local
15
-.env.development.local
16
-.env.test.local
17
-.env.production.local
18
-
19
-# Logs
20
-logs
33
+.DS_Store
2134
 *.log
2235
 npm-debug.log*
2336
 yarn-debug.log*
2437
 yarn-error.log*
25
-pnpm-debug.log*
2638
 
27
-# IDE/editor settings
28
-.vscode/
29
-.idea/
30
-*.sublime-project
31
-*.sublime-workspace
32
-
33
-# OS-specific cruft
39
+# Misc
3440
 .DS_Store
35
-Thumbs.db
36
-
37
-# React Query cache (if persisted)
38
-react-query-cache.json
39
-
40
-# Optional: lock files (if using one exclusively)
41
-# yarn.lock
42
-# package-lock.json
43
-# pnpm-lock.yaml
44
-
45
-# Optional: system temp
46
-tmp/
47
-temp/
48
-*.swp
41
+.env.local
42
+.env.development.local
43
+.env.test.local
44
+.env.production.local
backend/api/__init__.pyadded
backend/api/admin.pyadded
@@ -0,0 +1,38 @@
1
+from django.contrib import admin
2
+from .models import Restaurant, Rating
3
+
4
+
5
+@admin.register(Restaurant)
6
+class RestaurantAdmin(admin.ModelAdmin):
7
+    list_display = ['name', 'address', 'average_rating', 'total_ratings', 'created_at']
8
+    list_filter = ['created_at', 'average_rating']
9
+    search_fields = ['name', 'address', 'place_id']
10
+    readonly_fields = ['average_rating', 'total_ratings', 'created_at']
11
+    
12
+    fieldsets = (
13
+        ('Basic Information', {
14
+            'fields': ('place_id', 'name', 'address')
15
+        }),
16
+        ('Location', {
17
+            'fields': ('latitude', 'longitude')
18
+        }),
19
+        ('Ratings', {
20
+            'fields': ('average_rating', 'total_ratings'),
21
+            'description': 'These fields are automatically calculated'
22
+        }),
23
+        ('Metadata', {
24
+            'fields': ('created_at',)
25
+        })
26
+    )
27
+
28
+
29
+@admin.register(Rating)
30
+class RatingAdmin(admin.ModelAdmin):
31
+    list_display = ['restaurant', 'rating', 'review_preview', 'created_at']
32
+    list_filter = ['rating', 'created_at']
33
+    search_fields = ['restaurant__name', 'review']
34
+    raw_id_fields = ['restaurant']
35
+    
36
+    def review_preview(self, obj):
37
+        return obj.review[:50] + '...' if len(obj.review) > 50 else obj.review
38
+    review_preview.short_description = 'Review'
backend/api/apps.pyadded
@@ -0,0 +1,6 @@
1
+from django.apps import AppConfig
2
+
3
+
4
+class ApiConfig(AppConfig):
5
+    default_auto_field = "django.db.models.BigAutoField"
6
+    name = "api"
backend/api/migrations/0001_initial.pyadded
@@ -0,0 +1,86 @@
1
+# Generated by Django 5.2.3 on 2025-06-27 20:14
2
+
3
+import django.core.validators
4
+import django.db.models.deletion
5
+import django.utils.timezone
6
+from django.db import migrations, models
7
+
8
+
9
+class Migration(migrations.Migration):
10
+
11
+    initial = True
12
+
13
+    dependencies = []
14
+
15
+    operations = [
16
+        migrations.CreateModel(
17
+            name="Restaurant",
18
+            fields=[
19
+                (
20
+                    "id",
21
+                    models.BigAutoField(
22
+                        auto_created=True,
23
+                        primary_key=True,
24
+                        serialize=False,
25
+                        verbose_name="ID",
26
+                    ),
27
+                ),
28
+                (
29
+                    "place_id",
30
+                    models.CharField(db_index=True, max_length=255, unique=True),
31
+                ),
32
+                ("name", models.CharField(max_length=255)),
33
+                ("address", models.TextField()),
34
+                ("latitude", models.FloatField()),
35
+                ("longitude", models.FloatField()),
36
+                ("created_at", models.DateTimeField(default=django.utils.timezone.now)),
37
+                ("average_rating", models.FloatField(blank=True, null=True)),
38
+                ("total_ratings", models.IntegerField(default=0)),
39
+            ],
40
+            options={
41
+                "ordering": ["-created_at"],
42
+                "indexes": [
43
+                    models.Index(
44
+                        fields=["latitude", "longitude"],
45
+                        name="api_restaur_latitud_60ec88_idx",
46
+                    )
47
+                ],
48
+            },
49
+        ),
50
+        migrations.CreateModel(
51
+            name="Rating",
52
+            fields=[
53
+                (
54
+                    "id",
55
+                    models.BigAutoField(
56
+                        auto_created=True,
57
+                        primary_key=True,
58
+                        serialize=False,
59
+                        verbose_name="ID",
60
+                    ),
61
+                ),
62
+                (
63
+                    "rating",
64
+                    models.IntegerField(
65
+                        validators=[
66
+                            django.core.validators.MinValueValidator(1),
67
+                            django.core.validators.MaxValueValidator(5),
68
+                        ]
69
+                    ),
70
+                ),
71
+                ("review", models.TextField()),
72
+                ("created_at", models.DateTimeField(default=django.utils.timezone.now)),
73
+                (
74
+                    "restaurant",
75
+                    models.ForeignKey(
76
+                        on_delete=django.db.models.deletion.CASCADE,
77
+                        related_name="ratings",
78
+                        to="api.restaurant",
79
+                    ),
80
+                ),
81
+            ],
82
+            options={
83
+                "ordering": ["-created_at"],
84
+            },
85
+        ),
86
+    ]
backend/api/migrations/0002_restaurant_has_toast.pyadded
@@ -0,0 +1,20 @@
1
+# Generated by Django 5.0.6 on 2025-07-04 23:55
2
+
3
+from django.db import migrations, models
4
+
5
+
6
+class Migration(migrations.Migration):
7
+
8
+    dependencies = [
9
+        ("api", "0001_initial"),
10
+    ]
11
+
12
+    operations = [
13
+        migrations.AddField(
14
+            model_name="restaurant",
15
+            name="has_toast",
16
+            field=models.BooleanField(
17
+                blank=True, help_text="Does this place serve toast?", null=True
18
+            ),
19
+        ),
20
+    ]
backend/api/migrations/__init__.pyadded
backend/api/models.pyadded
@@ -0,0 +1,91 @@
1
+from django.db import models
2
+from django.core.validators import MinValueValidator, MaxValueValidator
3
+from django.utils import timezone
4
+
5
+
6
+class Restaurant(models.Model):
7
+    """A restaurant that might serve toast"""
8
+    place_id = models.CharField(max_length=255, unique=True, db_index=True)
9
+    name = models.CharField(max_length=255)
10
+    address = models.TextField()
11
+    latitude = models.FloatField()
12
+    longitude = models.FloatField()
13
+    created_at = models.DateTimeField(default=timezone.now)
14
+    
15
+    # Toast availability status
16
+    has_toast = models.BooleanField(null=True, blank=True, help_text="Does this place serve toast?")
17
+    
18
+    # Cached rating fields (updated via signals)
19
+    average_rating = models.FloatField(null=True, blank=True)
20
+    total_ratings = models.IntegerField(default=0)
21
+    
22
+    class Meta:
23
+        ordering = ['-created_at']
24
+        indexes = [
25
+            models.Index(fields=['latitude', 'longitude']),
26
+        ]
27
+    
28
+    def __str__(self):
29
+        return self.name
30
+    
31
+    def update_rating_cache(self):
32
+        """Update the cached rating values"""
33
+        ratings = self.ratings.all()
34
+        if ratings.exists():
35
+            self.total_ratings = ratings.count()
36
+            self.average_rating = ratings.aggregate(
37
+                avg_rating=models.Avg('rating')
38
+            )['avg_rating']
39
+        else:
40
+            self.total_ratings = 0
41
+            self.average_rating = None
42
+        self.save(update_fields=['average_rating', 'total_ratings'])
43
+
44
+
45
+class Rating(models.Model):
46
+    """A toast rating for a restaurant"""
47
+    restaurant = models.ForeignKey(
48
+        Restaurant, 
49
+        on_delete=models.CASCADE, 
50
+        related_name='ratings'
51
+    )
52
+    rating = models.IntegerField(
53
+        validators=[MinValueValidator(1), MaxValueValidator(5)]
54
+    )
55
+    review = models.TextField()
56
+    created_at = models.DateTimeField(default=timezone.now)
57
+    
58
+    class Meta:
59
+        ordering = ['-created_at']
60
+    
61
+    def __str__(self):
62
+        return f"{self.restaurant.name} - {self.rating} stars"
63
+    
64
+    def clean(self):
65
+        """Validate that the review mentions toast"""
66
+        from django.core.exceptions import ValidationError
67
+        
68
+        if self.review:
69
+            toast_keywords = [
70
+                'toast', 'bread', 'butter', 'jam', 'marmalade', 
71
+                'french toast', 'avocado', 'sourdough', 'rye', 
72
+                'whole wheat', 'brioche', 'challah'
73
+            ]
74
+            review_lower = self.review.lower()
75
+            if not any(keyword in review_lower for keyword in toast_keywords):
76
+                raise ValidationError(
77
+                    'Reviews must be about toast! Please mention the toast in your review.'
78
+                )
79
+        super().clean()
80
+    
81
+    def save(self, *args, **kwargs):
82
+        self.full_clean()  # Runs clean() method
83
+        super().save(*args, **kwargs)
84
+        # Update restaurant's cached ratings
85
+        self.restaurant.update_rating_cache()
86
+    
87
+    def delete(self, *args, **kwargs):
88
+        restaurant = self.restaurant
89
+        super().delete(*args, **kwargs)
90
+        # Update restaurant's cached ratings after deletion
91
+        restaurant.update_rating_cache()
backend/api/serializers.pyadded
@@ -0,0 +1,89 @@
1
+from rest_framework import serializers
2
+from .models import Restaurant, Rating
3
+
4
+
5
+class RatingSerializer(serializers.ModelSerializer):
6
+    class Meta:
7
+        model = Rating
8
+        fields = ['id', 'rating', 'review', 'created_at']
9
+        read_only_fields = ['id', 'created_at']
10
+    
11
+    def validate_review(self, value):
12
+        """Ensure review mentions toast"""
13
+        if value:
14
+            toast_keywords = [
15
+                'toast', 'bread', 'butter', 'jam', 'marmalade', 
16
+                'french toast', 'avocado', 'sourdough', 'rye', 
17
+                'whole wheat', 'brioche', 'challah'
18
+            ]
19
+            review_lower = value.lower()
20
+            if not any(keyword in review_lower for keyword in toast_keywords):
21
+                raise serializers.ValidationError(
22
+                    'Reviews must be about toast! Please mention the toast in your review.'
23
+                )
24
+        return value
25
+
26
+
27
+class RestaurantSerializer(serializers.ModelSerializer):
28
+    average_rating = serializers.FloatField(read_only=True)
29
+    total_ratings = serializers.IntegerField(read_only=True)
30
+    
31
+    class Meta:
32
+        model = Restaurant
33
+        fields = [
34
+            'id', 'place_id', 'name', 'address', 
35
+            'latitude', 'longitude', 'average_rating', 
36
+            'total_ratings', 'created_at', 'has_toast'
37
+        ]
38
+        read_only_fields = ['id', 'average_rating', 'total_ratings', 'created_at']
39
+
40
+
41
+class RestaurantDetailSerializer(RestaurantSerializer):
42
+    """Detailed view including recent ratings"""
43
+    recent_ratings = serializers.SerializerMethodField()
44
+    
45
+    class Meta(RestaurantSerializer.Meta):
46
+        fields = RestaurantSerializer.Meta.fields + ['recent_ratings']
47
+    
48
+    def get_recent_ratings(self, obj):
49
+        # Get last 5 ratings
50
+        recent = obj.ratings.all()[:5]
51
+        return RatingSerializer(recent, many=True).data
52
+
53
+
54
+class CreateRatingSerializer(serializers.ModelSerializer):
55
+    """Serializer for creating a rating"""
56
+    class Meta:
57
+        model = Rating
58
+        fields = ['rating', 'review']
59
+    
60
+    def validate_review(self, value):
61
+        """Ensure review mentions toast"""
62
+        if value:
63
+            toast_keywords = [
64
+                'toast', 'bread', 'butter', 'jam', 'marmalade', 
65
+                'french toast', 'avocado', 'sourdough', 'rye', 
66
+                'whole wheat', 'brioche', 'challah'
67
+            ]
68
+            review_lower = value.lower()
69
+            if not any(keyword in review_lower for keyword in toast_keywords):
70
+                raise serializers.ValidationError(
71
+                    'Reviews must be about toast! Please mention the toast in your review.'
72
+                )
73
+        return value
74
+
75
+
76
+class PlaceSearchSerializer(serializers.Serializer):
77
+    """Serializer for place search results"""
78
+    place_id = serializers.CharField()
79
+    name = serializers.CharField()
80
+    address = serializers.CharField()
81
+    latitude = serializers.FloatField()
82
+    longitude = serializers.FloatField()
83
+    category = serializers.CharField(required=False)
84
+    cuisine = serializers.CharField(required=False)
85
+    confidence = serializers.CharField(required=False)
86
+    distance = serializers.FloatField(required=False)
87
+    source = serializers.CharField(required=False)
88
+    restaurant_id = serializers.IntegerField(required=False)
89
+    has_toast = serializers.BooleanField(required=False, allow_null=True)
backend/api/tests.pyadded
@@ -0,0 +1,3 @@
1
+from django.test import TestCase
2
+
3
+# Create your tests here.
backend/api/urls.pyadded
@@ -0,0 +1,20 @@
1
+from django.urls import path
2
+from . import views
3
+
4
+urlpatterns = [
5
+    # Health check
6
+    path('health/', views.health_check, name='health_check'),
7
+    
8
+    # Restaurant endpoints
9
+    path('restaurants/', views.RestaurantListCreateView.as_view(), name='restaurant_list_create'),
10
+    path('restaurants/nearby/', views.NearbyRestaurantsView.as_view(), name='restaurants_nearby'),
11
+    path('restaurants/<int:pk>/', views.RestaurantDetailView.as_view(), name='restaurant_detail'),
12
+    path('restaurants/<int:pk>/ratings/', views.RestaurantRatingView.as_view(), name='restaurant_ratings'),
13
+    path('restaurants/<int:pk>/toast-status/', views.RestaurantToastStatusView.as_view(), name='restaurant_toast_status'),
14
+    
15
+    # Search
16
+    path('search/places/', views.SearchPlacesView.as_view(), name='search_places'),
17
+    
18
+    # Utility
19
+    path('seed/', views.seed_data, name='seed_data'),
20
+]
backend/api/views.pyadded
@@ -0,0 +1,405 @@
1
+from django.http import JsonResponse
2
+from django.utils import timezone
3
+from django.conf import settings
4
+from django.db.models import Q
5
+from rest_framework import status, generics
6
+from rest_framework.decorators import api_view
7
+from rest_framework.response import Response
8
+from rest_framework.views import APIView
9
+import requests
10
+import math
11
+from .models import Restaurant, Rating
12
+from .serializers import (
13
+    RestaurantSerializer, RestaurantDetailSerializer,
14
+    CreateRatingSerializer, RatingSerializer, PlaceSearchSerializer
15
+)
16
+
17
+
18
+def health_check(request):
19
+    """Simple health check endpoint"""
20
+    return JsonResponse({
21
+        'status': 'LocalToast is cooking! 🍞',
22
+        'timestamp': timezone.now().isoformat(),
23
+        'version': '2.0'
24
+    })
25
+
26
+
27
+def calculate_distance(lat1, lon1, lat2, lon2):
28
+    """Calculate distance between two points in kilometers"""
29
+    R = 6371  # Radius of Earth in km
30
+    dlat = math.radians(lat2 - lat1)
31
+    dlon = math.radians(lon2 - lon1)
32
+    a = (math.sin(dlat/2) * math.sin(dlat/2) +
33
+         math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) *
34
+         math.sin(dlon/2) * math.sin(dlon/2))
35
+    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
36
+    return R * c
37
+
38
+
39
+class NearbyRestaurantsView(APIView):
40
+    """Get restaurants near a location"""
41
+    
42
+    def get(self, request):
43
+        lat = request.query_params.get('lat')
44
+        lng = request.query_params.get('lng')
45
+        radius = float(request.query_params.get('radius', 5))  # km
46
+        
47
+        if not lat or not lng:
48
+            return Response(
49
+                {'error': 'Latitude and longitude are required'},
50
+                status=status.HTTP_400_BAD_REQUEST
51
+            )
52
+        
53
+        try:
54
+            lat = float(lat)
55
+            lng = float(lng)
56
+        except ValueError:
57
+            return Response(
58
+                {'error': 'Invalid latitude or longitude'},
59
+                status=status.HTTP_400_BAD_REQUEST
60
+            )
61
+        
62
+        # Simple bounding box calculation
63
+        lat_diff = radius / 111  # 1 degree latitude ≈ 111 km
64
+        lng_diff = radius / (111 * math.cos(math.radians(lat)))
65
+        
66
+        restaurants = Restaurant.objects.filter(
67
+            latitude__range=(lat - lat_diff, lat + lat_diff),
68
+            longitude__range=(lng - lng_diff, lng + lng_diff)
69
+        )
70
+        
71
+        # Calculate actual distances and filter
72
+        results = []
73
+        for restaurant in restaurants:
74
+            distance = calculate_distance(
75
+                lat, lng, 
76
+                restaurant.latitude, 
77
+                restaurant.longitude
78
+            )
79
+            if distance <= radius:
80
+                serializer = RestaurantSerializer(restaurant)
81
+                data = serializer.data
82
+                data['distance'] = round(distance, 2)
83
+                results.append(data)
84
+        
85
+        # Sort by distance
86
+        results.sort(key=lambda x: x['distance'])
87
+        
88
+        return Response(results)
89
+
90
+
91
+class RestaurantListCreateView(generics.ListCreateAPIView):
92
+    """List all restaurants or create a new one"""
93
+    queryset = Restaurant.objects.all()
94
+    serializer_class = RestaurantSerializer
95
+    
96
+    def create(self, request, *args, **kwargs):
97
+        # Check if restaurant already exists
98
+        place_id = request.data.get('place_id')
99
+        if place_id:
100
+            existing = Restaurant.objects.filter(place_id=place_id).first()
101
+            if existing:
102
+                serializer = self.get_serializer(existing)
103
+                return Response(serializer.data, status=status.HTTP_200_OK)
104
+        
105
+        return super().create(request, *args, **kwargs)
106
+
107
+
108
+class RestaurantDetailView(generics.RetrieveAPIView):
109
+    """Get detailed info about a restaurant"""
110
+    queryset = Restaurant.objects.all()
111
+    serializer_class = RestaurantDetailSerializer
112
+
113
+
114
+class RestaurantRatingView(APIView):
115
+    """Add a rating to a restaurant or get all ratings"""
116
+    
117
+    def get(self, request, pk):
118
+        try:
119
+            restaurant = Restaurant.objects.get(pk=pk)
120
+        except Restaurant.DoesNotExist:
121
+            return Response(
122
+                {'error': 'Restaurant not found'},
123
+                status=status.HTTP_404_NOT_FOUND
124
+            )
125
+        
126
+        ratings = restaurant.ratings.all()
127
+        serializer = RatingSerializer(ratings, many=True)
128
+        return Response(serializer.data)
129
+    
130
+    def post(self, request, pk):
131
+        try:
132
+            restaurant = Restaurant.objects.get(pk=pk)
133
+        except Restaurant.DoesNotExist:
134
+            return Response(
135
+                {'error': 'Restaurant not found'},
136
+                status=status.HTTP_404_NOT_FOUND
137
+            )
138
+        
139
+        serializer = CreateRatingSerializer(data=request.data)
140
+        if serializer.is_valid():
141
+            rating = serializer.save(restaurant=restaurant)
142
+            return Response(
143
+                {
144
+                    'id': rating.id,
145
+                    'message': 'Toast rating added successfully! 🍞'
146
+                },
147
+                status=status.HTTP_201_CREATED
148
+            )
149
+        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
150
+
151
+
152
+class RestaurantToastStatusView(APIView):
153
+    """Update restaurant's toast status"""
154
+    
155
+    def patch(self, request, pk):
156
+        try:
157
+            restaurant = Restaurant.objects.get(pk=pk)
158
+        except Restaurant.DoesNotExist:
159
+            return Response(
160
+                {'error': 'Restaurant not found'},
161
+                status=status.HTTP_404_NOT_FOUND
162
+            )
163
+        
164
+        has_toast = request.data.get('has_toast')
165
+        if has_toast is None:
166
+            return Response(
167
+                {'error': 'has_toast field is required'},
168
+                status=status.HTTP_400_BAD_REQUEST
169
+            )
170
+        
171
+        restaurant.has_toast = has_toast
172
+        restaurant.save()
173
+        
174
+        return Response({
175
+            'id': restaurant.id,
176
+            'has_toast': restaurant.has_toast,
177
+            'message': f'Toast status updated! {"🍞" if has_toast else "❌"}'
178
+        })
179
+
180
+
181
+class SearchPlacesView(APIView):
182
+    """Search for places that might serve toast"""
183
+    
184
+    def get(self, request):
185
+        lat = request.query_params.get('lat')
186
+        lng = request.query_params.get('lng')
187
+        radius = request.query_params.get('radius', '1000')
188
+        
189
+        if not lat or not lng:
190
+            return Response(
191
+                {'error': 'Latitude and longitude are required'},
192
+                status=status.HTTP_400_BAD_REQUEST
193
+            )
194
+        
195
+        places = []
196
+        
197
+        # Try Google Places API first if available
198
+        if settings.GOOGLE_PLACES_API_KEY:
199
+            try:
200
+                google_results = self.search_google_places(lat, lng, radius)
201
+                places.extend(google_results)
202
+            except Exception as e:
203
+                print(f"Google Places API error: {e}")
204
+        
205
+        # If no results from Google, try OpenStreetMap
206
+        if not places:
207
+            try:
208
+                osm_results = self.search_openstreetmap(lat, lng, radius)
209
+                places.extend(osm_results)
210
+            except Exception as e:
211
+                print(f"OpenStreetMap error: {e}")
212
+        
213
+        # If still no results, return mock data
214
+        if not places:
215
+            places = self.get_mock_places(float(lat), float(lng))
216
+        
217
+        # Calculate distances and sort
218
+        user_lat, user_lng = float(lat), float(lng)
219
+        for place in places:
220
+            place['distance'] = calculate_distance(
221
+                user_lat, user_lng,
222
+                place['latitude'], place['longitude']
223
+            )
224
+        
225
+        places.sort(key=lambda x: x['distance'])
226
+        
227
+        # Auto-create restaurants for all found places
228
+        created_restaurants = []
229
+        for place in places[:20]:  # Limit to top 20
230
+            restaurant, created = Restaurant.objects.get_or_create(
231
+                place_id=place['place_id'],
232
+                defaults={
233
+                    'name': place['name'],
234
+                    'address': place['address'],
235
+                    'latitude': place['latitude'],
236
+                    'longitude': place['longitude'],
237
+                    'has_toast': None  # Unknown status initially
238
+                }
239
+            )
240
+            # Add restaurant data to place info
241
+            place['restaurant_id'] = restaurant.id
242
+            place['has_toast'] = restaurant.has_toast
243
+            created_restaurants.append(place)
244
+        
245
+        serializer = PlaceSearchSerializer(created_restaurants, many=True)
246
+        return Response(serializer.data)
247
+    
248
+    def search_google_places(self, lat, lng, radius):
249
+        """Search using Google Places API"""
250
+        url = 'https://maps.googleapis.com/maps/api/place/textsearch/json'
251
+        params = {
252
+            'query': 'cafe bakery breakfast toast',
253
+            'location': f'{lat},{lng}',
254
+            'radius': radius,
255
+            'type': 'restaurant|cafe|bakery',
256
+            'key': settings.GOOGLE_PLACES_API_KEY
257
+        }
258
+        
259
+        response = requests.get(url, params=params, timeout=10)
260
+        response.raise_for_status()
261
+        data = response.json()
262
+        
263
+        places = []
264
+        for place in data.get('results', []):
265
+            confidence = 'high' if 'toast' in place['name'].lower() else 'medium'
266
+            if any(word in place['name'].lower() for word in ['cafe', 'bakery', 'breakfast']):
267
+                confidence = 'high'
268
+            
269
+            places.append({
270
+                'place_id': place['place_id'],
271
+                'name': place['name'],
272
+                'address': place.get('formatted_address', place.get('vicinity', '')),
273
+                'latitude': place['geometry']['location']['lat'],
274
+                'longitude': place['geometry']['location']['lng'],
275
+                'category': 'restaurant',
276
+                'confidence': confidence,
277
+                'source': 'google_places'
278
+            })
279
+        
280
+        return places
281
+    
282
+    def search_openstreetmap(self, lat, lng, radius):
283
+        """Search using OpenStreetMap Overpass API"""
284
+        overpass_query = f"""
285
+            [out:json][timeout:25];
286
+            (
287
+                node["amenity"="cafe"](around:{radius},{lat},{lng});
288
+                node["shop"="bakery"](around:{radius},{lat},{lng});
289
+                node["amenity"="restaurant"]["cuisine"~"breakfast"](around:{radius},{lat},{lng});
290
+            );
291
+            out body;
292
+        """
293
+        
294
+        url = 'https://overpass-api.de/api/interpreter'
295
+        response = requests.post(
296
+            url, 
297
+            data={'data': overpass_query},
298
+            timeout=10
299
+        )
300
+        response.raise_for_status()
301
+        data = response.json()
302
+        
303
+        places = []
304
+        for element in data.get('elements', []):
305
+            if not element.get('tags', {}).get('name'):
306
+                continue
307
+            
308
+            tags = element['tags']
309
+            category = tags.get('amenity') or tags.get('shop', 'unknown')
310
+            
311
+            # Determine confidence
312
+            confidence = 'low'
313
+            if category in ['cafe', 'bakery']:
314
+                confidence = 'medium'
315
+            if 'breakfast' in tags.get('cuisine', '').lower():
316
+                confidence = 'high'
317
+            
318
+            places.append({
319
+                'place_id': f"osm_{element['id']}",
320
+                'name': tags['name'],
321
+                'address': self.format_osm_address(tags),
322
+                'latitude': element['lat'],
323
+                'longitude': element['lon'],
324
+                'category': category,
325
+                'cuisine': tags.get('cuisine', ''),
326
+                'confidence': confidence,
327
+                'source': 'openstreetmap'
328
+            })
329
+        
330
+        return places
331
+    
332
+    def format_osm_address(self, tags):
333
+        """Format address from OSM tags"""
334
+        parts = []
335
+        for key in ['addr:housenumber', 'addr:street', 'addr:city']:
336
+            if key in tags:
337
+                parts.append(tags[key])
338
+        return ' '.join(parts) if parts else 'Address not available'
339
+    
340
+    def get_mock_places(self, lat, lng):
341
+        """Return mock data as fallback"""
342
+        return [
343
+            {
344
+                'place_id': 'mock_1',
345
+                'name': 'The Breakfast Club',
346
+                'address': '123 Toast Lane',
347
+                'latitude': lat + 0.01,
348
+                'longitude': lng + 0.01,
349
+                'category': 'restaurant',
350
+                'confidence': 'low',
351
+                'source': 'mock'
352
+            }
353
+        ]
354
+
355
+
356
+@api_view(['POST'])
357
+def seed_data(request):
358
+    """Seed the database with sample restaurants"""
359
+    lat = float(request.data.get('lat', 40.7128))
360
+    lng = float(request.data.get('lng', -74.0060))
361
+    
362
+    seed_restaurants = [
363
+        {
364
+            'place_id': 'seed_1',
365
+            'name': 'Toast & Jam Café',
366
+            'address': '100 Breakfast Blvd',
367
+            'latitude': lat + 0.005,
368
+            'longitude': lng + 0.005
369
+        },
370
+        {
371
+            'place_id': 'seed_2',
372
+            'name': 'The Golden Toast',
373
+            'address': '200 Butter Lane',
374
+            'latitude': lat - 0.005,
375
+            'longitude': lng + 0.005
376
+        },
377
+        {
378
+            'place_id': 'seed_3',
379
+            'name': 'Morning Glory Diner',
380
+            'address': '300 Sunrise Ave',
381
+            'latitude': lat + 0.005,
382
+            'longitude': lng - 0.005
383
+        },
384
+        {
385
+            'place_id': 'seed_4',
386
+            'name': 'Crispy Corner',
387
+            'address': '400 Crunch St',
388
+            'latitude': lat - 0.005,
389
+            'longitude': lng - 0.005
390
+        }
391
+    ]
392
+    
393
+    created = 0
394
+    for restaurant_data in seed_restaurants:
395
+        restaurant, was_created = Restaurant.objects.get_or_create(
396
+            place_id=restaurant_data['place_id'],
397
+            defaults=restaurant_data
398
+        )
399
+        if was_created:
400
+            created += 1
401
+    
402
+    return Response({
403
+        'message': f'Seeded {created} restaurants with toast! 🍞',
404
+        'total_restaurants': Restaurant.objects.count()
405
+    })
backend/localtoast/__init__.pyadded
backend/localtoast/asgi.pyadded
@@ -0,0 +1,16 @@
1
+"""
2
+ASGI config for localtoast project.
3
+
4
+It exposes the ASGI callable as a module-level variable named ``application``.
5
+
6
+For more information on this file, see
7
+https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/
8
+"""
9
+
10
+import os
11
+
12
+from django.core.asgi import get_asgi_application
13
+
14
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "localtoast.settings")
15
+
16
+application = get_asgi_application()
backend/localtoast/settings.pyadded
@@ -0,0 +1,125 @@
1
+import os
2
+from pathlib import Path
3
+from dotenv import load_dotenv
4
+
5
+# Load environment variables
6
+load_dotenv()
7
+
8
+# Build paths inside the project
9
+BASE_DIR = Path(__file__).resolve().parent.parent
10
+
11
+# SECURITY WARNING: keep the secret key used in production secret!
12
+SECRET_KEY = os.getenv('SECRET_KEY', 'django-insecure-change-this-in-production')
13
+
14
+# SECURITY WARNING: don't run with debug turned on in production!
15
+DEBUG = os.getenv('DEBUG', 'False') == 'True'
16
+
17
+ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '').split(',')
18
+
19
+# Application definition
20
+INSTALLED_APPS = [
21
+    'django.contrib.admin',
22
+    'django.contrib.auth',
23
+    'django.contrib.contenttypes',
24
+    'django.contrib.sessions',
25
+    'django.contrib.messages',
26
+    'django.contrib.staticfiles',
27
+    'rest_framework',
28
+    'corsheaders',
29
+    'api',
30
+]
31
+
32
+MIDDLEWARE = [
33
+    'django.middleware.security.SecurityMiddleware',
34
+    'corsheaders.middleware.CorsMiddleware',
35
+    'django.middleware.common.CommonMiddleware',
36
+    'django.middleware.csrf.CsrfViewMiddleware',
37
+    'django.contrib.sessions.middleware.SessionMiddleware',
38
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
39
+    'django.contrib.messages.middleware.MessageMiddleware',
40
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
41
+]
42
+
43
+ROOT_URLCONF = 'localtoast.urls'
44
+
45
+TEMPLATES = [
46
+    {
47
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
48
+        'DIRS': [],
49
+        'APP_DIRS': True,
50
+        'OPTIONS': {
51
+            'context_processors': [
52
+                'django.template.context_processors.debug',
53
+                'django.template.context_processors.request',
54
+                'django.contrib.auth.context_processors.auth',
55
+                'django.contrib.messages.context_processors.messages',
56
+            ],
57
+        },
58
+    },
59
+]
60
+
61
+WSGI_APPLICATION = 'localtoast.wsgi.application'
62
+
63
+# Database
64
+DATABASES = {
65
+    'default': {
66
+        'ENGINE': 'django.db.backends.sqlite3',
67
+        'NAME': BASE_DIR / 'db.sqlite3',
68
+    }
69
+}
70
+
71
+# Password validation
72
+AUTH_PASSWORD_VALIDATORS = [
73
+    {
74
+        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
75
+    },
76
+    {
77
+        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
78
+    },
79
+    {
80
+        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
81
+    },
82
+    {
83
+        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
84
+    },
85
+]
86
+
87
+# Internationalization
88
+LANGUAGE_CODE = 'en-us'
89
+TIME_ZONE = 'UTC'
90
+USE_I18N = True
91
+USE_TZ = True
92
+
93
+# Static files (CSS, JavaScript, Images)
94
+STATIC_URL = 'static/'
95
+STATIC_ROOT = BASE_DIR / 'staticfiles'
96
+
97
+# Default primary key field type
98
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
99
+
100
+# REST Framework settings
101
+REST_FRAMEWORK = {
102
+    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
103
+    'PAGE_SIZE': 100,
104
+    'DEFAULT_RENDERER_CLASSES': [
105
+        'rest_framework.renderers.JSONRenderer',
106
+    ],
107
+}
108
+
109
+# CORS settings
110
+CORS_ALLOWED_ORIGINS = [
111
+    "http://localhost:3000",
112
+    "http://localhost:3001",
113
+    "https://localtoast.vercel.app", # change me matt
114
+]
115
+
116
+# Allow CORS during development
117
+if DEBUG:
118
+    CORS_ALLOW_ALL_ORIGINS = True
119
+
120
+# Media files
121
+MEDIA_URL = '/media/'
122
+MEDIA_ROOT = BASE_DIR / 'media'
123
+
124
+# Google Places API Key
125
+GOOGLE_PLACES_API_KEY = os.getenv('GOOGLE_PLACES_API_KEY', '')
backend/localtoast/urls.pyadded
@@ -0,0 +1,13 @@
1
+from django.contrib import admin
2
+from django.urls import path, include
3
+from django.conf import settings
4
+from django.conf.urls.static import static
5
+
6
+urlpatterns = [
7
+    path('admin/', admin.site.urls),
8
+    path('api/', include('api.urls')),
9
+]
10
+
11
+# Serve media files in development
12
+if settings.DEBUG:
13
+    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
backend/localtoast/wsgi.pyadded
@@ -0,0 +1,16 @@
1
+"""
2
+WSGI config for localtoast project.
3
+
4
+It exposes the WSGI callable as a module-level variable named ``application``.
5
+
6
+For more information on this file, see
7
+https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/
8
+"""
9
+
10
+import os
11
+
12
+from django.core.wsgi import get_wsgi_application
13
+
14
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "localtoast.settings")
15
+
16
+application = get_wsgi_application()
backend/manage.pyadded
@@ -0,0 +1,22 @@
1
+#!/usr/bin/env python
2
+"""Django's command-line utility for administrative tasks."""
3
+import os
4
+import sys
5
+
6
+
7
+def main():
8
+    """Run administrative tasks."""
9
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "localtoast.settings")
10
+    try:
11
+        from django.core.management import execute_from_command_line
12
+    except ImportError as exc:
13
+        raise ImportError(
14
+            "Couldn't import Django. Are you sure it's installed and "
15
+            "available on your PYTHONPATH environment variable? Did you "
16
+            "forget to activate a virtual environment?"
17
+        ) from exc
18
+    execute_from_command_line(sys.argv)
19
+
20
+
21
+if __name__ == "__main__":
22
+    main()
backend/railway.jsonadded
@@ -0,0 +1,12 @@
1
+{
2
+  "$schema": "https://railway.app/railway.schema.json",
3
+  "build": {
4
+    "builder": "NIXPACKS",
5
+    "buildCommand": "python manage.py collectstatic --noinput"
6
+  },
7
+  "deploy": {
8
+    "startCommand": "python manage.py migrate && gunicorn localtoast.wsgi",
9
+    "restartPolicyType": "ON_FAILURE",
10
+    "restartPolicyMaxRetries": 10
11
+  }
12
+}
backend/requirements.txtadded
@@ -0,0 +1,12 @@
1
+asgiref==3.8.1
2
+certifi==2025.6.15
3
+charset-normalizer==3.4.2
4
+Django==5.2.3
5
+django-cors-headers==4.7.0
6
+djangorestframework==3.16.0
7
+idna==3.10
8
+python-dotenv==1.1.1
9
+requests==2.32.4
10
+sqlparse==0.5.3
11
+urllib3==2.5.0
12
+gunicorn
backend/test_api.pyadded
@@ -0,0 +1,89 @@
1
+#!/usr/bin/env python
2
+"""
3
+Quick script to test the LocalToast API endpoints
4
+Run from backend directory: python test_api.py
5
+"""
6
+import requests
7
+import json
8
+
9
+BASE_URL = "http://localhost:8000/api"
10
+
11
+# Test location (NYC)
12
+TEST_LAT = 40.7128
13
+TEST_LNG = -74.0060
14
+
15
+def test_health():
16
+    """Test health endpoint"""
17
+    print("🏥 Testing health check...")
18
+    response = requests.get(f"{BASE_URL}/health/")
19
+    print(f"Status: {response.status_code}")
20
+    print(f"Response: {json.dumps(response.json(), indent=2)}\n")
21
+
22
+def test_seed():
23
+    """Seed some data"""
24
+    print("🌱 Seeding data...")
25
+    response = requests.post(f"{BASE_URL}/seed/", json={
26
+        "lat": TEST_LAT,
27
+        "lng": TEST_LNG
28
+    })
29
+    print(f"Status: {response.status_code}")
30
+    print(f"Response: {json.dumps(response.json(), indent=2)}\n")
31
+
32
+def test_nearby():
33
+    """Test nearby restaurants"""
34
+    print("📍 Testing nearby restaurants...")
35
+    response = requests.get(f"{BASE_URL}/restaurants/nearby/", params={
36
+        "lat": TEST_LAT,
37
+        "lng": TEST_LNG,
38
+        "radius": 5
39
+    })
40
+    print(f"Status: {response.status_code}")
41
+    data = response.json()
42
+    print(f"Found {len(data)} restaurants")
43
+    if data:
44
+        print(f"First restaurant: {data[0]['name']} ({data[0]['distance']}km away)\n")
45
+
46
+def test_add_rating():
47
+    """Test adding a rating"""
48
+    print("⭐ Testing rating system...")
49
+    # First get a restaurant
50
+    response = requests.get(f"{BASE_URL}/restaurants/")
51
+    restaurants = response.json()
52
+    
53
+    if restaurants:
54
+        restaurant_id = restaurants[0]['id']
55
+        rating_data = {
56
+            "rating": 5,
57
+            "review": "The french toast here is absolutely amazing! Crispy on the outside, fluffy inside."
58
+        }
59
+        response = requests.post(
60
+            f"{BASE_URL}/restaurants/{restaurant_id}/ratings/",
61
+            json=rating_data
62
+        )
63
+        print(f"Status: {response.status_code}")
64
+        print(f"Response: {json.dumps(response.json(), indent=2)}\n")
65
+
66
+def test_search():
67
+    """Test place search"""
68
+    print("🔍 Testing place search...")
69
+    response = requests.get(f"{BASE_URL}/search/places/", params={
70
+        "lat": TEST_LAT,
71
+        "lng": TEST_LNG,
72
+        "radius": 1000
73
+    })
74
+    print(f"Status: {response.status_code}")
75
+    data = response.json()
76
+    print(f"Found {len(data)} places")
77
+    if data:
78
+        print(f"First place: {data[0]['name']} (confidence: {data[0].get('confidence', 'unknown')})\n")
79
+
80
+if __name__ == "__main__":
81
+    print("🍞 LocalToast API Test Suite\n")
82
+    
83
+    test_health()
84
+    test_seed()
85
+    test_nearby()
86
+    test_add_rating()
87
+    test_search()
88
+    
89
+    print("✅ All tests complete!")
frontend/.gitignoreadded
@@ -0,0 +1,41 @@
1
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+# dependencies
4
+/node_modules
5
+/.pnp
6
+.pnp.*
7
+.yarn/*
8
+!.yarn/patches
9
+!.yarn/plugins
10
+!.yarn/releases
11
+!.yarn/versions
12
+
13
+# testing
14
+/coverage
15
+
16
+# next.js
17
+/.next/
18
+/out/
19
+
20
+# production
21
+/build
22
+
23
+# misc
24
+.DS_Store
25
+*.pem
26
+
27
+# debug
28
+npm-debug.log*
29
+yarn-debug.log*
30
+yarn-error.log*
31
+.pnpm-debug.log*
32
+
33
+# env files (can opt-in for committing if needed)
34
+.env*
35
+
36
+# vercel
37
+.vercel
38
+
39
+# typescript
40
+*.tsbuildinfo
41
+next-env.d.ts
frontend/README.mdadded
@@ -0,0 +1,36 @@
1
+This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2
+
3
+## Getting Started
4
+
5
+First, run the development server:
6
+
7
+```bash
8
+npm run dev
9
+# or
10
+yarn dev
11
+# or
12
+pnpm dev
13
+# or
14
+bun dev
15
+```
16
+
17
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
+
19
+You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
+
21
+This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22
+
23
+## Learn More
24
+
25
+To learn more about Next.js, take a look at the following resources:
26
+
27
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29
+
30
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31
+
32
+## Deploy on Vercel
33
+
34
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35
+
36
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
frontend/app/favicon.icoadded
Binary file changed.
frontend/app/globals.cssadded
@@ -0,0 +1,48 @@
1
+@tailwind base;
2
+@tailwind components;
3
+@tailwind utilities;
4
+
5
+/* Fix for Leaflet icons in Next.js */
6
+.leaflet-default-icon-path {
7
+  background-image: url(https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon.png);
8
+}
9
+
10
+/* Custom styles */
11
+html, body, #__next {
12
+  height: 100%;
13
+  margin: 0;
14
+  padding: 0;
15
+}
16
+
17
+/* Fix for Leaflet container */
18
+.leaflet-container {
19
+  height: 100%;
20
+  width: 100%;
21
+  position: relative;
22
+  z-index: 0;
23
+}
24
+
25
+/* Ensure popups appear above other elements */
26
+.leaflet-popup {
27
+  z-index: 1000;
28
+}
29
+
30
+/* Fix marker icons */
31
+.leaflet-marker-icon {
32
+  background: transparent;
33
+  border: none;
34
+}
35
+
36
+/* Panel animations */
37
+@keyframes slideUp {
38
+  from {
39
+    transform: translateY(100%);
40
+  }
41
+  to {
42
+    transform: translateY(0);
43
+  }
44
+}
45
+
46
+.slide-up {
47
+  animation: slideUp 0.3s ease-out;
48
+}
frontend/app/layout.tsxadded
@@ -0,0 +1,26 @@
1
+import type { Metadata } from "next";
2
+import { Inter } from "next/font/google";
3
+import "./globals.css";
4
+import 'leaflet/dist/leaflet.css';
5
+
6
+const inter = Inter({ subsets: ["latin"] });
7
+
8
+export const metadata: Metadata = {
9
+  title: "LocalToast - Find & Rate the Best Toast in Town! 🍞",
10
+  description: "Discover restaurants serving amazing toast near you. Rate and review your toast experiences!",
11
+  icons: {
12
+    icon: "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🍞</text></svg>",
13
+  }
14
+};
15
+
16
+export default function RootLayout({
17
+  children,
18
+}: {
19
+  children: React.ReactNode;
20
+}) {
21
+  return (
22
+    <html lang="en">
23
+      <body className={inter.className}>{children}</body>
24
+    </html>
25
+  );
26
+}
frontend/app/page.tsxadded
@@ -0,0 +1,224 @@
1
+'use client';
2
+
3
+import { useState, useEffect } from 'react';
4
+import dynamic from 'next/dynamic';
5
+import { MapPin, Plus, Loader2 } from 'lucide-react';
6
+import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
7
+import { Providers } from './providers';
8
+import { Loading } from '@/components/Loading';
9
+import ReviewModal from '@/components/ReviewModal';
10
+import SearchPanel from '@/components/SearchPanel';
11
+import { restaurantApi, Restaurant, CreateRatingData, PlaceSearchResult } from '@/lib/api';
12
+
13
+// Dynamic import for Map to avoid SSR issues
14
+const Map = dynamic(() => import('@/components/Map'), {
15
+  ssr: false,
16
+  loading: () => <div className="h-full w-full bg-gray-100 animate-pulse" />,
17
+});
18
+
19
+function HomePage() {
20
+  const [userLocation, setUserLocation] = useState<{ lat: number; lng: number } | null>(null);
21
+  const [selectedRestaurant, setSelectedRestaurant] = useState<Restaurant | null>(null);
22
+  const [showSearchResults, setShowSearchResults] = useState(false);
23
+  const [searchResultsMinimized, setSearchResultsMinimized] = useState(false);
24
+  const [searchResults, setSearchResults] = useState<PlaceSearchResult[]>([]);
25
+  const [restaurants, setRestaurants] = useState<Restaurant[]>([]);
26
+  const queryClient = useQueryClient();
27
+
28
+  // Get user's location
29
+  useEffect(() => {
30
+    if (navigator.geolocation) {
31
+      navigator.geolocation.getCurrentPosition(
32
+        (position) => {
33
+          setUserLocation({
34
+            lat: position.coords.latitude,
35
+            lng: position.coords.longitude
36
+          });
37
+        },
38
+        (error) => {
39
+          console.error('Error getting location:', error);
40
+          // Default to NYC
41
+          setUserLocation({ lat: 40.7128, lng: -74.0060 });
42
+        }
43
+      );
44
+    } else {
45
+      setUserLocation({ lat: 40.7128, lng: -74.0060 });
46
+    }
47
+  }, []);
48
+
49
+  // Add rating mutation
50
+  const addRatingMutation = useMutation({
51
+    mutationFn: ({ restaurantId, data }: { restaurantId: number; data: CreateRatingData }) =>
52
+      restaurantApi.addRating(restaurantId, data),
53
+    onSuccess: async () => {
54
+      // Refresh restaurants list
55
+      if (userLocation) {
56
+        const updatedRestaurants = await restaurantApi.getNearby(userLocation.lat, userLocation.lng);
57
+        setRestaurants(updatedRestaurants);
58
+      }
59
+      alert('Toast rating added! 🍞');
60
+    },
61
+    onError: (error: any) => {
62
+      alert(error.response?.data?.error || 'Failed to add rating');
63
+    },
64
+  });
65
+
66
+  // Search places mutation
67
+  const searchMutation = useMutation({
68
+    mutationFn: async () => {
69
+      const searchPlaces = await restaurantApi.searchPlaces(userLocation!.lat, userLocation!.lng, 2000);
70
+      
71
+      // All places are now auto-created as restaurants, so fetch the updated list
72
+      const updatedRestaurants = await restaurantApi.getNearby(userLocation!.lat, userLocation!.lng);
73
+      setRestaurants(updatedRestaurants);
74
+      
75
+      return searchPlaces;
76
+    },
77
+    onSuccess: (data) => {
78
+      setSearchResults(data);
79
+      setShowSearchResults(true);
80
+      setSelectedRestaurant(null); // Close any open restaurant panel
81
+    },
82
+    onError: () => {
83
+      alert('Failed to search for places');
84
+    },
85
+  });
86
+
87
+  // Update toast status mutation
88
+  const updateToastStatusMutation = useMutation({
89
+    mutationFn: ({ restaurantId, hasToast }: { restaurantId: number; hasToast: boolean }) =>
90
+      restaurantApi.updateToastStatus(restaurantId, hasToast),
91
+    onSuccess: async () => {
92
+      // Refresh restaurants
93
+      if (userLocation) {
94
+        const updatedRestaurants = await restaurantApi.getNearby(userLocation.lat, userLocation.lng);
95
+        setRestaurants(updatedRestaurants);
96
+      }
97
+    },
98
+    onError: () => {
99
+      alert('Failed to update toast status');
100
+    },
101
+  });
102
+
103
+  const handleAddRating = async (data: CreateRatingData) => {
104
+    if (!selectedRestaurant) return;
105
+    await addRatingMutation.mutateAsync({ restaurantId: selectedRestaurant.id, data });
106
+  };
107
+
108
+  if (!userLocation) {
109
+    return <Loading />;
110
+  }
111
+
112
+  return (
113
+    <div className="h-screen flex flex-col">
114
+      {/* Header */}
115
+      <header className="bg-amber-600 text-white p-4 shadow-lg relative z-10">
116
+        <div className="max-w-7xl mx-auto flex items-center justify-between">
117
+          <div className="flex items-center space-x-2">
118
+            <span className="text-2xl">🍞</span>
119
+            <h1 className="text-2xl font-bold">LocalToast</h1>
120
+          </div>
121
+          <div className="flex items-center space-x-4">
122
+            <p className="text-sm hidden sm:block">Find and rate the best toast in town!</p>
123
+            <button
124
+              onClick={() => searchMutation.mutate()}
125
+              disabled={searchMutation.isPending}
126
+              className="bg-amber-700 hover:bg-amber-800 px-4 py-2 rounded-lg text-sm font-medium transition disabled:opacity-50 flex items-center space-x-2"
127
+            >
128
+              {searchMutation.isPending ? (
129
+                <Loader2 className="w-4 h-4 animate-spin" />
130
+              ) : (
131
+                <Plus className="w-4 h-4" />
132
+              )}
133
+              <span>Find Toast</span>
134
+            </button>
135
+          </div>
136
+        </div>
137
+      </header>
138
+
139
+      {/* Main Content */}
140
+      <div className="flex-1 relative">
141
+        <Map
142
+          center={userLocation}
143
+          restaurants={restaurants}
144
+          onRestaurantClick={setSelectedRestaurant}
145
+          onToastStatusUpdate={(restaurantId, hasToast) => 
146
+            updateToastStatusMutation.mutate({ restaurantId, hasToast })
147
+          }
148
+        />
149
+
150
+        {/* Loading indicator */}
151
+        {searchMutation.isPending && (
152
+          <div className="absolute top-4 left-1/2 transform -translate-x-1/2 bg-white rounded-lg shadow-md px-4 py-2 flex items-center space-x-2">
153
+            <Loader2 className="w-4 h-4 animate-spin text-amber-600" />
154
+            <span>Searching for toast spots...</span>
155
+          </div>
156
+        )}
157
+
158
+        {/* Restaurant count - moved to top right */}
159
+        {restaurants.length > 0 && !searchMutation.isPending && (
160
+          <div className="absolute top-4 right-4 bg-white rounded-lg shadow-md px-4 py-2">
161
+            <p className="text-sm font-medium">
162
+              {restaurants.length} toast spot{restaurants.length !== 1 ? 's' : ''} nearby 🍞
163
+            </p>
164
+          </div>
165
+        )}
166
+
167
+        {/* Review Modal */}
168
+        {selectedRestaurant && (
169
+          <ReviewModal
170
+            restaurant={selectedRestaurant}
171
+            onClose={() => setSelectedRestaurant(null)}
172
+            onSubmit={handleAddRating}
173
+          />
174
+        )}
175
+
176
+        {/* Search results panel */}
177
+        {showSearchResults && (
178
+          <>
179
+            {searchResultsMinimized ? (
180
+              // Minimized state - just a bar at the bottom
181
+              <div className="absolute bottom-0 left-0 right-0 bg-white shadow-xl rounded-t-xl p-3 z-[1000] cursor-pointer"
182
+                   onClick={() => setSearchResultsMinimized(false)}>
183
+                <div className="flex justify-between items-center">
184
+                  <p className="text-sm font-medium">
185
+                    {searchResults.length} search results (click to expand)
186
+                  </p>
187
+                  <button className="text-gray-500 hover:text-gray-700">
188
+                    <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
189
+                      <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 15l7-7 7 7" />
190
+                    </svg>
191
+                  </button>
192
+                </div>
193
+              </div>
194
+            ) : (
195
+              // Full search panel
196
+              <SearchPanel
197
+                searchResults={searchResults}
198
+                onClose={() => setSearchResultsMinimized(true)}
199
+                onToastStatusUpdate={(restaurantId, hasToast) => 
200
+                  updateToastStatusMutation.mutate({ restaurantId, hasToast })
201
+                }
202
+                onRestaurantClick={(restaurantId) => {
203
+                  const restaurant = restaurants.find(r => r.id === restaurantId);
204
+                  if (restaurant) {
205
+                    setSelectedRestaurant(restaurant);
206
+                    // Don't minimize - let user continue browsing
207
+                  }
208
+                }}
209
+              />
210
+            )}
211
+          </>
212
+        )}
213
+      </div>
214
+    </div>
215
+  );
216
+}
217
+
218
+export default function Page() {
219
+  return (
220
+    <Providers>
221
+      <HomePage />
222
+    </Providers>
223
+  );
224
+}
frontend/app/providers.tsxadded
@@ -0,0 +1,24 @@
1
+'use client';
2
+
3
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
4
+import { useState } from 'react';
5
+
6
+export function Providers({ children }: { children: React.ReactNode }) {
7
+  const [queryClient] = useState(
8
+    () =>
9
+      new QueryClient({
10
+        defaultOptions: {
11
+          queries: {
12
+            staleTime: 60 * 1000, // 1 minute
13
+            refetchOnWindowFocus: false,
14
+          },
15
+        },
16
+      })
17
+  );
18
+
19
+  return (
20
+    <QueryClientProvider client={queryClient}>
21
+      {children}
22
+    </QueryClientProvider>
23
+  );
24
+}
frontend/components/Loading.tsxadded
@@ -0,0 +1,12 @@
1
+import { Loader2 } from 'lucide-react';
2
+
3
+export function Loading() {
4
+  return (
5
+    <div className="flex items-center justify-center h-full">
6
+      <div className="text-center">
7
+        <Loader2 className="w-8 h-8 animate-spin mx-auto mb-4 text-amber-600" />
8
+        <p className="text-gray-600">Getting your location...</p>
9
+      </div>
10
+    </div>
11
+  );
12
+}
frontend/components/Map.tsxadded
@@ -0,0 +1,198 @@
1
+'use client';
2
+
3
+import { useEffect, useState } from 'react';
4
+import L from 'leaflet';
5
+import { MapContainer, TileLayer, Marker, Popup, useMap } from 'react-leaflet';
6
+import 'leaflet/dist/leaflet.css';
7
+import { Star, ThumbsUp, ThumbsDown, MessageSquare } from 'lucide-react';
8
+import { Restaurant } from '@/lib/api';
9
+
10
+// Fix for default markers in React-Leaflet
11
+if (typeof window !== 'undefined') {
12
+  delete (L.Icon.Default.prototype as any)._getIconUrl;
13
+  L.Icon.Default.mergeOptions({
14
+    iconRetinaUrl: '/leaflet/marker-icon-2x.png',
15
+    iconUrl: '/leaflet/marker-icon.png',
16
+    shadowUrl: '/leaflet/marker-shadow.png',
17
+  });
18
+}
19
+
20
+interface MapProps {
21
+  center: { lat: number; lng: number };
22
+  restaurants: Restaurant[];
23
+  onRestaurantClick: (restaurant: Restaurant) => void;
24
+  onToastStatusUpdate: (restaurantId: number, hasToast: boolean) => void;
25
+}
26
+
27
+// Component to recenter map when location changes
28
+function RecenterMap({ center }: { center: { lat: number; lng: number } }) {
29
+  const map = useMap();
30
+  useEffect(() => {
31
+    map.setView([center.lat, center.lng], 13);
32
+  }, [center, map]);
33
+  return null;
34
+}
35
+
36
+export default function Map({ center, restaurants, onRestaurantClick, onToastStatusUpdate }: MapProps) {
37
+  const [mounted, setMounted] = useState(false);
38
+
39
+  useEffect(() => {
40
+    setMounted(true);
41
+  }, []);
42
+
43
+  if (!mounted) {
44
+    return <div className="h-full w-full bg-gray-100 animate-pulse" />;
45
+  }
46
+
47
+  // Create icons based on toast status
48
+  const createRestaurantIcon = (hasToast: boolean | null) => {
49
+    let iconContent = '';
50
+    let bgColor = '';
51
+    
52
+    if (hasToast === null) {
53
+      // Unknown status - gray question mark
54
+      iconContent = '❓';
55
+      bgColor = '#9CA3AF'; // gray-400
56
+    } else if (hasToast) {
57
+      // Has toast - green toast
58
+      iconContent = '🍞';
59
+      bgColor = '#10B981'; // green-500
60
+    } else {
61
+      // No toast - red X
62
+      iconContent = '❌';
63
+      bgColor = '#EF4444'; // red-500
64
+    }
65
+
66
+    return new L.Icon({
67
+      iconUrl: 'data:image/svg+xml,' +
68
+        encodeURIComponent(`
69
+        <svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
70
+          <circle cx="20" cy="20" r="18" fill="${bgColor}" stroke="#374151" stroke-width="2"/>
71
+          <text x="20" y="27" text-anchor="middle" font-size="20">${iconContent}</text>
72
+        </svg>
73
+      `),
74
+      iconSize: [40, 40],
75
+      iconAnchor: [20, 40],
76
+      popupAnchor: [0, -40],
77
+    });
78
+  };
79
+
80
+  const userIcon = new L.Icon({
81
+    iconUrl: 'data:image/svg+xml,' +
82
+      encodeURIComponent(`
83
+      <svg width="30" height="30" viewBox="0 0 30 30" xmlns="http://www.w3.org/2000/svg">
84
+        <circle cx="15" cy="15" r="10" fill="#3B82F6" stroke="#1E40AF" stroke-width="2"/>
85
+        <circle cx="15" cy="15" r="4" fill="white"/>
86
+      </svg>
87
+    `),
88
+    iconSize: [30, 30],
89
+    iconAnchor: [15, 15],
90
+  });
91
+
92
+  return (
93
+    <div className="h-full w-full relative">
94
+      <MapContainer
95
+        center={[center.lat, center.lng]}
96
+        zoom={13}
97
+        className="h-full w-full"
98
+        style={{ height: '100%', width: '100%' }}
99
+        scrollWheelZoom={true}
100
+      >
101
+        <TileLayer
102
+          attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OSM</a>'
103
+          url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
104
+        />
105
+        <RecenterMap center={center} />
106
+
107
+        {/* User location marker */}
108
+        <Marker position={[center.lat, center.lng]} icon={userIcon}>
109
+          <Popup>
110
+            <div className="text-center">
111
+              <p className="font-semibold">You are here!</p>
112
+              <p className="text-sm text-gray-600">Ready to find some toast? 🍞</p>
113
+            </div>
114
+          </Popup>
115
+        </Marker>
116
+
117
+        {/* Restaurant markers */}
118
+        {restaurants.map((restaurant) => (
119
+          <Marker
120
+            key={restaurant.id}
121
+            position={[restaurant.latitude, restaurant.longitude]}
122
+            icon={createRestaurantIcon(restaurant.has_toast)}
123
+          >
124
+            <Popup>
125
+              <div className="p-2 min-w-[250px]">
126
+                <h3 className="font-bold text-base mb-1">{restaurant.name}</h3>
127
+                <p className="text-sm text-gray-700 mb-2">{restaurant.address}</p>
128
+                
129
+                {/* Toast status */}
130
+                <div className="mb-3 p-2 bg-gray-50 rounded">
131
+                  <p className="text-sm font-medium mb-2">
132
+                    {restaurant.has_toast === null && "🤔 Does this place have toast?"}
133
+                    {restaurant.has_toast === true && "✅ This place serves toast!"}
134
+                    {restaurant.has_toast === false && "❌ No toast here"}
135
+                  </p>
136
+                  
137
+                  {/* Toast voting buttons */}
138
+                  <div className="flex gap-2">
139
+                    <button
140
+                      onClick={(e) => {
141
+                        e.stopPropagation();
142
+                        onToastStatusUpdate(restaurant.id, true);
143
+                      }}
144
+                      className={`flex-1 flex items-center justify-center gap-1 px-3 py-1.5 rounded text-sm font-medium transition ${
145
+                        restaurant.has_toast === true
146
+                          ? 'bg-green-500 text-white'
147
+                          : 'bg-gray-200 hover:bg-green-100 text-gray-700'
148
+                      }`}
149
+                    >
150
+                      <ThumbsUp className="w-4 h-4" />
151
+                      <span>Has Toast</span>
152
+                    </button>
153
+                    <button
154
+                      onClick={(e) => {
155
+                        e.stopPropagation();
156
+                        onToastStatusUpdate(restaurant.id, false);
157
+                      }}
158
+                      className={`flex-1 flex items-center justify-center gap-1 px-3 py-1.5 rounded text-sm font-medium transition ${
159
+                        restaurant.has_toast === false
160
+                          ? 'bg-red-500 text-white'
161
+                          : 'bg-gray-200 hover:bg-red-100 text-gray-700'
162
+                      }`}
163
+                    >
164
+                      <ThumbsDown className="w-4 h-4" />
165
+                      <span>No Toast</span>
166
+                    </button>
167
+                  </div>
168
+                </div>
169
+                
170
+                {/* Rating info */}
171
+                {restaurant.average_rating ? (
172
+                  <p className="text-sm font-semibold flex items-center mb-2">
173
+                    <Star className="w-4 h-4 text-yellow-500 fill-current mr-1" />
174
+                    {restaurant.average_rating.toFixed(1)} ({restaurant.total_ratings} ratings)
175
+                  </p>
176
+                ) : (
177
+                  <p className="text-sm text-gray-600 mb-2">No ratings yet</p>
178
+                )}
179
+                
180
+                {/* Review button */}
181
+                <button
182
+                  onClick={(e) => {
183
+                    e.stopPropagation();
184
+                    onRestaurantClick(restaurant);
185
+                  }}
186
+                  className="w-full bg-amber-600 hover:bg-amber-700 text-white px-3 py-2 rounded text-sm font-medium transition flex items-center justify-center gap-2"
187
+                >
188
+                  <MessageSquare className="w-4 h-4" />
189
+                  <span>Write Toast Review</span>
190
+                </button>
191
+              </div>
192
+            </Popup>
193
+          </Marker>
194
+        ))}
195
+      </MapContainer>
196
+    </div>
197
+  );
198
+}
frontend/components/RestaurantPanel.tsxadded
@@ -0,0 +1,141 @@
1
+'use client';
2
+
3
+import { useState } from 'react';
4
+import { X, Star, MapPin } from 'lucide-react';
5
+import { Restaurant, CreateRatingData } from '@/lib/api';
6
+
7
+interface RestaurantPanelProps {
8
+  restaurant: Restaurant;
9
+  onClose: () => void;
10
+  onAddRating: (data: CreateRatingData) => Promise<void>;
11
+}
12
+
13
+export default function RestaurantPanel({ restaurant, onClose, onAddRating }: RestaurantPanelProps) {
14
+  const [showRatingForm, setShowRatingForm] = useState(false);
15
+  const [rating, setRating] = useState(5);
16
+  const [review, setReview] = useState('');
17
+  const [isSubmitting, setIsSubmitting] = useState(false);
18
+
19
+  const handleSubmit = async (e: React.FormEvent) => {
20
+    e.preventDefault();
21
+    if (!review.trim()) return;
22
+
23
+    setIsSubmitting(true);
24
+    try {
25
+      await onAddRating({ rating, review });
26
+      setShowRatingForm(false);
27
+      setRating(5);
28
+      setReview('');
29
+    } catch (error) {
30
+      // Error handling done in parent
31
+    } finally {
32
+      setIsSubmitting(false);
33
+    }
34
+  };
35
+
36
+  return (
37
+    <div className="absolute bottom-0 left-0 right-0 bg-white p-6 shadow-xl rounded-t-xl max-h-96 overflow-y-auto z-[1000] slide-up">
38
+      <div className="flex justify-between items-start mb-4">
39
+        <div className="flex-1">
40
+          <h2 className="text-xl font-bold text-gray-900">{restaurant.name}</h2>
41
+          <p className="text-gray-700 flex items-center mt-1">
42
+            <MapPin className="w-4 h-4 mr-1" />
43
+            {restaurant.address}
44
+          </p>
45
+        </div>
46
+        <button
47
+          onClick={onClose}
48
+          className="text-gray-500 hover:text-gray-700 p-1"
49
+          aria-label="Close panel"
50
+        >
51
+          <X className="w-6 h-6" />
52
+        </button>
53
+      </div>
54
+
55
+      <div className="flex items-center space-x-4 mb-4">
56
+        <div className="flex items-center">
57
+          {restaurant.average_rating ? (
58
+            <>
59
+              <Star className="w-5 h-5 text-yellow-500 fill-current" />
60
+              <span className="ml-1 font-semibold text-gray-900">
61
+                {restaurant.average_rating.toFixed(1)}
62
+              </span>
63
+            </>
64
+          ) : (
65
+            <span className="text-gray-700">No ratings yet</span>
66
+          )}
67
+        </div>
68
+        <span className="text-gray-700">
69
+          {restaurant.total_ratings} {restaurant.total_ratings === 1 ? 'rating' : 'ratings'}
70
+        </span>
71
+        {restaurant.distance && (
72
+          <span className="text-gray-700">
73
+            • {restaurant.distance < 1 ? `${Math.round(restaurant.distance * 1000)}m` : `${restaurant.distance.toFixed(1)}km`} away
74
+          </span>
75
+        )}
76
+      </div>
77
+
78
+      {!showRatingForm ? (
79
+        <button
80
+          onClick={() => setShowRatingForm(true)}
81
+          className="w-full bg-amber-600 text-white py-2 px-4 rounded-lg hover:bg-amber-700 transition font-medium"
82
+        >
83
+          Rate the Toast! 🍞
84
+        </button>
85
+      ) : (
86
+        <form onSubmit={handleSubmit} className="space-y-4">
87
+          <div>
88
+            <label className="block text-sm font-medium mb-2">Rating</label>
89
+            <div className="flex space-x-2">
90
+              {[1, 2, 3, 4, 5].map((value) => (
91
+                <button
92
+                  key={value}
93
+                  type="button"
94
+                  onClick={() => setRating(value)}
95
+                  className={`p-2 ${rating >= value ? 'text-yellow-500' : 'text-gray-300'}`}
96
+                >
97
+                  <Star className="w-8 h-8 fill-current" />
98
+                </button>
99
+              ))}
100
+            </div>
101
+          </div>
102
+
103
+          <div>
104
+            <label className="block text-sm font-medium mb-2">
105
+              Review (must be about toast!)
106
+            </label>
107
+            <textarea
108
+              value={review}
109
+              onChange={(e) => setReview(e.target.value)}
110
+              className="w-full p-3 border rounded-lg focus:ring-2 focus:ring-amber-500 focus:border-amber-500"
111
+              rows={3}
112
+              placeholder="How was the toast? Crispy? Buttery? Perfect golden brown?"
113
+              required
114
+            />
115
+          </div>
116
+
117
+          <div className="flex space-x-2">
118
+            <button
119
+              type="submit"
120
+              disabled={isSubmitting || !review.trim()}
121
+              className="flex-1 bg-amber-600 text-white py-2 px-4 rounded-lg hover:bg-amber-700 transition disabled:opacity-50 disabled:cursor-not-allowed font-medium"
122
+            >
123
+              {isSubmitting ? 'Submitting...' : 'Submit Rating'}
124
+            </button>
125
+            <button
126
+              type="button"
127
+              onClick={() => {
128
+                setShowRatingForm(false);
129
+                setRating(5);
130
+                setReview('');
131
+              }}
132
+              className="flex-1 bg-gray-200 text-gray-700 py-2 px-4 rounded-lg hover:bg-gray-300 transition font-medium"
133
+            >
134
+              Cancel
135
+            </button>
136
+          </div>
137
+        </form>
138
+      )}
139
+    </div>
140
+  );
141
+}
frontend/components/ReviewModal.tsxadded
@@ -0,0 +1,118 @@
1
+'use client';
2
+
3
+import { useState } from 'react';
4
+import { X, Star, Loader2 } from 'lucide-react';
5
+import { Restaurant, CreateRatingData } from '@/lib/api';
6
+
7
+interface ReviewModalProps {
8
+  restaurant: Restaurant;
9
+  onClose: () => void;
10
+  onSubmit: (data: CreateRatingData) => Promise<void>;
11
+}
12
+
13
+export default function ReviewModal({ restaurant, onClose, onSubmit }: ReviewModalProps) {
14
+  const [rating, setRating] = useState(5);
15
+  const [review, setReview] = useState('');
16
+  const [isSubmitting, setIsSubmitting] = useState(false);
17
+
18
+  const handleSubmit = async (e: React.FormEvent) => {
19
+    e.preventDefault();
20
+    if (!review.trim()) return;
21
+
22
+    setIsSubmitting(true);
23
+    try {
24
+      await onSubmit({ rating, review });
25
+      onClose();
26
+    } catch (error) {
27
+      // Error handling done in parent
28
+    } finally {
29
+      setIsSubmitting(false);
30
+    }
31
+  };
32
+
33
+  return (
34
+    <div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-[2000] p-4">
35
+      <div className="bg-white rounded-lg max-w-md w-full p-6 shadow-xl">
36
+        <div className="flex justify-between items-start mb-4">
37
+          <div>
38
+            <h2 className="text-xl font-bold text-gray-900">Rate the Toast at {restaurant.name} 🍞</h2>
39
+            <p className="text-sm text-gray-600 mt-1">{restaurant.address}</p>
40
+          </div>
41
+          <button
42
+            onClick={onClose}
43
+            className="text-gray-500 hover:text-gray-700 p-1"
44
+            aria-label="Close modal"
45
+          >
46
+            <X className="w-6 h-6" />
47
+          </button>
48
+        </div>
49
+
50
+        <form onSubmit={handleSubmit} className="space-y-4">
51
+          <div>
52
+            <label className="block text-sm font-medium mb-2">How was the toast?</label>
53
+            <div className="flex space-x-2 justify-center">
54
+              {[1, 2, 3, 4, 5].map((value) => (
55
+                <button
56
+                  key={value}
57
+                  type="button"
58
+                  onClick={() => setRating(value)}
59
+                  className={`p-2 transition-colors ${rating >= value ? 'text-yellow-500' : 'text-gray-300'}`}
60
+                >
61
+                  <Star className="w-8 h-8 fill-current" />
62
+                </button>
63
+              ))}
64
+            </div>
65
+            <p className="text-center text-sm text-gray-600 mt-2">
66
+              {rating === 1 && "Terrible toast 😞"}
67
+              {rating === 2 && "Not great toast 😕"}
68
+              {rating === 3 && "Decent toast 🙂"}
69
+              {rating === 4 && "Good toast! 😊"}
70
+              {rating === 5 && "Amazing toast! 🤩"}
71
+            </p>
72
+          </div>
73
+
74
+          <div>
75
+            <label className="block text-sm font-medium mb-2">
76
+              Tell us about the toast (must mention toast!)
77
+            </label>
78
+            <textarea
79
+              value={review}
80
+              onChange={(e) => setReview(e.target.value)}
81
+              className="w-full p-3 border rounded-lg focus:ring-2 focus:ring-amber-500 focus:border-amber-500"
82
+              rows={4}
83
+              placeholder="How was the toast? Was it crispy? Buttery? What kind of bread? Any toppings?"
84
+              required
85
+            />
86
+            <p className="text-xs text-gray-500 mt-1">
87
+              💡 Tip: Mention the toast texture, toppings, bread type, or how it was served!
88
+            </p>
89
+          </div>
90
+
91
+          <div className="flex space-x-2">
92
+            <button
93
+              type="submit"
94
+              disabled={isSubmitting || !review.trim()}
95
+              className="flex-1 bg-amber-600 text-white py-2 px-4 rounded-lg hover:bg-amber-700 transition disabled:opacity-50 disabled:cursor-not-allowed font-medium flex items-center justify-center"
96
+            >
97
+              {isSubmitting ? (
98
+                <>
99
+                  <Loader2 className="w-4 h-4 animate-spin mr-2" />
100
+                  <span>Submitting...</span>
101
+                </>
102
+              ) : (
103
+                <span>Submit Toast Review</span>
104
+              )}
105
+            </button>
106
+            <button
107
+              type="button"
108
+              onClick={onClose}
109
+              className="flex-1 bg-gray-200 text-gray-700 py-2 px-4 rounded-lg hover:bg-gray-300 transition font-medium"
110
+            >
111
+              Cancel
112
+            </button>
113
+          </div>
114
+        </form>
115
+      </div>
116
+    </div>
117
+  );
118
+}
frontend/components/SearchPanel.tsxadded
@@ -0,0 +1,168 @@
1
+'use client';
2
+
3
+import { useState } from 'react';
4
+import { X, ThumbsUp, ThumbsDown, MessageSquare, MapPin, Star } from 'lucide-react';
5
+import { PlaceSearchResult } from '@/lib/api';
6
+
7
+interface SearchPanelProps {
8
+  searchResults: PlaceSearchResult[];
9
+  onClose: () => void;
10
+  onToastStatusUpdate: (restaurantId: number, hasToast: boolean) => void;
11
+  onRestaurantClick: (restaurantId: number) => void;
12
+}
13
+
14
+export default function SearchPanel({ 
15
+  searchResults, 
16
+  onClose, 
17
+  onToastStatusUpdate,
18
+  onRestaurantClick 
19
+}: SearchPanelProps) {
20
+  const [updatingIds, setUpdatingIds] = useState<Set<number>>(new Set());
21
+
22
+  const handleToastStatus = async (restaurantId: number, hasToast: boolean) => {
23
+    setUpdatingIds(prev => new Set(prev).add(restaurantId));
24
+    try {
25
+      await onToastStatusUpdate(restaurantId, hasToast);
26
+    } finally {
27
+      setUpdatingIds(prev => {
28
+        const next = new Set(prev);
29
+        next.delete(restaurantId);
30
+        return next;
31
+      });
32
+    }
33
+  };
34
+
35
+  const getConfidenceColor = (confidence?: string) => {
36
+    switch (confidence) {
37
+      case 'high': return 'bg-green-100 text-green-800';
38
+      case 'medium': return 'bg-yellow-100 text-yellow-800';
39
+      default: return 'bg-gray-100 text-gray-800';
40
+    }
41
+  };
42
+
43
+  const getConfidenceText = (confidence?: string) => {
44
+    switch (confidence) {
45
+      case 'high': return '🍞 Likely has toast!';
46
+      case 'medium': return '🤔 Might have toast';
47
+      default: return '❓ Check menu';
48
+    }
49
+  };
50
+
51
+  return (
52
+    <div className="absolute bottom-0 left-0 right-0 bg-white p-6 shadow-xl rounded-t-xl max-h-[40vh] overflow-y-auto z-[1000] slide-up">
53
+      <div className="flex justify-between items-center mb-4">
54
+        <div>
55
+          <h2 className="text-xl font-bold text-gray-900">
56
+            Found {searchResults.length} Places That Might Serve Toast 🍞
57
+          </h2>
58
+          <p className="text-sm text-gray-600 mt-1">
59
+            Help us map the toast! Vote if these places serve toast.
60
+          </p>
61
+        </div>
62
+        <button
63
+          onClick={onClose}
64
+          className="flex items-center gap-1 text-gray-500 hover:text-gray-700 px-2 py-1 rounded hover:bg-gray-100 transition"
65
+          aria-label="Minimize search results"
66
+        >
67
+          <span className="text-sm">Minimize</span>
68
+          <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
69
+            <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
70
+          </svg>
71
+        </button>
72
+      </div>
73
+
74
+      {searchResults.length === 0 ? (
75
+        <p className="text-center text-gray-600 py-8">
76
+          No places found nearby. Try moving to a different area.
77
+        </p>
78
+      ) : (
79
+        <div className="space-y-4">
80
+          {searchResults.map((place) => (
81
+            <div
82
+              key={place.place_id}
83
+              className="border rounded-lg p-4 hover:bg-gray-50 transition-colors"
84
+            >
85
+              <div className="flex justify-between items-start gap-4">
86
+                <div className="flex-1">
87
+                  <h3 className="font-semibold text-gray-900">{place.name}</h3>
88
+                  <p className="text-sm text-gray-600 mt-1 flex items-center">
89
+                    <MapPin className="w-4 h-4 mr-1" />
90
+                    {place.address}
91
+                  </p>
92
+                  
93
+                  <div className="flex flex-wrap items-center gap-2 mt-2">
94
+                    {place.category && (
95
+                      <span className="text-xs bg-gray-100 text-gray-700 px-2 py-1 rounded">
96
+                        {place.category}
97
+                      </span>
98
+                    )}
99
+                    {place.distance && (
100
+                      <span className="text-xs bg-amber-100 text-amber-800 px-2 py-1 rounded font-medium">
101
+                        {place.distance < 1 
102
+                          ? `${Math.round(place.distance * 1000)}m away`
103
+                          : `${place.distance.toFixed(1)}km away`
104
+                        }
105
+                      </span>
106
+                    )}
107
+                    {place.confidence && (
108
+                      <span className={`text-xs px-2 py-1 rounded font-medium ${getConfidenceColor(place.confidence)}`}>
109
+                        {getConfidenceText(place.confidence)}
110
+                      </span>
111
+                    )}
112
+                  </div>
113
+                </div>
114
+              </div>
115
+
116
+              {/* Toast status section */}
117
+              <div className="mt-3 p-3 bg-gray-50 rounded">
118
+                <p className="text-sm font-medium mb-2">
119
+                  {place.has_toast === null && "🤔 Does this place have toast?"}
120
+                  {place.has_toast === true && "✅ This place serves toast!"}
121
+                  {place.has_toast === false && "❌ No toast here"}
122
+                </p>
123
+                
124
+                {/* Toast voting buttons */}
125
+                <div className="flex gap-2">
126
+                  <button
127
+                    onClick={() => place.restaurant_id && handleToastStatus(place.restaurant_id, true)}
128
+                    disabled={!place.restaurant_id || updatingIds.has(place.restaurant_id!)}
129
+                    className={`flex-1 flex items-center justify-center gap-1 px-3 py-1.5 rounded text-sm font-medium transition ${
130
+                      place.has_toast === true
131
+                        ? 'bg-green-500 text-white'
132
+                        : 'bg-gray-200 hover:bg-green-100 text-gray-700'
133
+                    } ${(!place.restaurant_id || updatingIds.has(place.restaurant_id!)) ? 'opacity-50 cursor-not-allowed' : ''}`}
134
+                  >
135
+                    <ThumbsUp className="w-4 h-4" />
136
+                    <span>Has Toast</span>
137
+                  </button>
138
+                  <button
139
+                    onClick={() => place.restaurant_id && handleToastStatus(place.restaurant_id, false)}
140
+                    disabled={!place.restaurant_id || updatingIds.has(place.restaurant_id!)}
141
+                    className={`flex-1 flex items-center justify-center gap-1 px-3 py-1.5 rounded text-sm font-medium transition ${
142
+                      place.has_toast === false
143
+                        ? 'bg-red-500 text-white'
144
+                        : 'bg-gray-200 hover:bg-red-100 text-gray-700'
145
+                    } ${(!place.restaurant_id || updatingIds.has(place.restaurant_id!)) ? 'opacity-50 cursor-not-allowed' : ''}`}
146
+                  >
147
+                    <ThumbsDown className="w-4 h-4" />
148
+                    <span>No Toast</span>
149
+                  </button>
150
+                </div>
151
+                
152
+                {/* Review button */}
153
+                <button
154
+                  onClick={() => place.restaurant_id && onRestaurantClick(place.restaurant_id)}
155
+                  disabled={!place.restaurant_id}
156
+                  className="w-full mt-2 bg-amber-600 hover:bg-amber-700 text-white px-3 py-2 rounded text-sm font-medium transition flex items-center justify-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"
157
+                >
158
+                  <MessageSquare className="w-4 h-4" />
159
+                  <span>Write Toast Review</span>
160
+                </button>
161
+              </div>
162
+            </div>
163
+          ))}
164
+        </div>
165
+      )}
166
+    </div>
167
+  );
168
+}
frontend/eslint.config.mjsadded
@@ -0,0 +1,16 @@
1
+import { dirname } from "path";
2
+import { fileURLToPath } from "url";
3
+import { FlatCompat } from "@eslint/eslintrc";
4
+
5
+const __filename = fileURLToPath(import.meta.url);
6
+const __dirname = dirname(__filename);
7
+
8
+const compat = new FlatCompat({
9
+  baseDirectory: __dirname,
10
+});
11
+
12
+const eslintConfig = [
13
+  ...compat.extends("next/core-web-vitals", "next/typescript"),
14
+];
15
+
16
+export default eslintConfig;
frontend/lib/api.tsadded
@@ -0,0 +1,106 @@
1
+import axios from 'axios';
2
+
3
+const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000';
4
+
5
+// Create axios instance with default config
6
+export const api = axios.create({
7
+  baseURL: `${API_URL}/api`,
8
+  headers: {
9
+    'Content-Type': 'application/json',
10
+  },
11
+});
12
+
13
+// Types
14
+export interface Restaurant {
15
+  id: number;
16
+  place_id: string;
17
+  name: string;
18
+  address: string;
19
+  latitude: number;
20
+  longitude: number;
21
+  average_rating: number | null;
22
+  total_ratings: number;
23
+  created_at: string;
24
+  has_toast: boolean | null;
25
+  distance?: number;
26
+}
27
+
28
+export interface Rating {
29
+  id: number;
30
+  rating: number;
31
+  review: string;
32
+  created_at: string;
33
+}
34
+
35
+export interface RestaurantDetail extends Restaurant {
36
+  recent_ratings: Rating[];
37
+}
38
+
39
+export interface PlaceSearchResult {
40
+  place_id: string;
41
+  name: string;
42
+  address: string;
43
+  latitude: number;
44
+  longitude: number;
45
+  category?: string;
46
+  cuisine?: string;
47
+  confidence?: string;
48
+  distance?: number;
49
+  source?: string;
50
+  restaurant_id?: number;
51
+  has_toast?: boolean | null;
52
+}
53
+
54
+export interface CreateRatingData {
55
+  rating: number;
56
+  review: string;
57
+}
58
+
59
+// API functions
60
+export const restaurantApi = {
61
+  // Get nearby restaurants
62
+  getNearby: async (lat: number, lng: number, radius: number = 5) => {
63
+    const response = await api.get<Restaurant[]>('/restaurants/nearby/', {
64
+      params: { lat, lng, radius }
65
+    });
66
+    return response.data;
67
+  },
68
+
69
+  // Get restaurant details
70
+  getById: async (id: number) => {
71
+    const response = await api.get<RestaurantDetail>(`/restaurants/${id}/`);
72
+    return response.data;
73
+  },
74
+
75
+  // Create restaurant
76
+  create: async (data: Omit<Restaurant, 'id' | 'average_rating' | 'total_ratings' | 'created_at'>) => {
77
+    const response = await api.post<Restaurant>('/restaurants/', data);
78
+    return response.data;
79
+  },
80
+
81
+  // Add rating
82
+  addRating: async (restaurantId: number, data: CreateRatingData) => {
83
+    const response = await api.post(`/restaurants/${restaurantId}/ratings/`, data);
84
+    return response.data;
85
+  },
86
+
87
+  // Update toast status
88
+  updateToastStatus: async (restaurantId: number, hasToast: boolean) => {
89
+    const response = await api.patch(`/restaurants/${restaurantId}/toast-status/`, { has_toast: hasToast });
90
+    return response.data;
91
+  },
92
+
93
+  // Search places
94
+  searchPlaces: async (lat: number, lng: number, radius: number = 1000) => {
95
+    const response = await api.get<PlaceSearchResult[]>('/search/places/', {
96
+      params: { lat, lng, radius }
97
+    });
98
+    return response.data;
99
+  },
100
+
101
+  // Seed data
102
+  seedData: async (lat: number, lng: number) => {
103
+    const response = await api.post('/seed/', { lat, lng });
104
+    return response.data;
105
+  }
106
+};
frontend/next.config.tsadded
@@ -0,0 +1,27 @@
1
+import type { NextConfig } from "next";
2
+
3
+const nextConfig: NextConfig = {
4
+  // Disable SSR for Leaflet components
5
+  transpilePackages: ['leaflet'],
6
+  
7
+  // Environment variables
8
+  env: {
9
+    NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000',
10
+  },
11
+  
12
+  // CORS headers for API routes (if we add any)
13
+  async headers() {
14
+    return [
15
+      {
16
+        source: '/api/:path*',
17
+        headers: [
18
+          { key: 'Access-Control-Allow-Origin', value: '*' },
19
+          { key: 'Access-Control-Allow-Methods', value: 'GET,POST,PUT,DELETE,OPTIONS' },
20
+          { key: 'Access-Control-Allow-Headers', value: 'Content-Type' },
21
+        ],
22
+      },
23
+    ];
24
+  },
25
+};
26
+
27
+export default nextConfig;
frontend/package-lock.jsonadded
6716 lines changed — click to load
@@ -0,0 +1,6716 @@
1
+{
2
+  "name": "localtoast-frontend",
3
+  "version": "0.1.0",
4
+  "lockfileVersion": 3,
5
+  "requires": true,
6
+  "packages": {
7
+    "": {
8
+      "name": "localtoast-frontend",
9
+      "version": "0.1.0",
10
+      "dependencies": {
11
+        "@tanstack/react-query": "^5.81.2",
12
+        "axios": "^1.10.0",
13
+        "leaflet": "^1.9.4",
14
+        "lucide-react": "^0.456.0",
15
+        "next": "15.1.3",
16
+        "react": "^19.0.0",
17
+        "react-dom": "^19.0.0",
18
+        "react-leaflet": "^5.0.0"
19
+      },
20
+      "devDependencies": {
21
+        "@types/leaflet": "^1.9.19",
22
+        "@types/node": "^20",
23
+        "@types/react": "^19",
24
+        "@types/react-dom": "^19",
25
+        "autoprefixer": "^10.4.20",
26
+        "eslint": "^9",
27
+        "eslint-config-next": "15.1.3",
28
+        "postcss": "^8.4.49",
29
+        "tailwindcss": "^3.4.17",
30
+        "typescript": "^5"
31
+      }
32
+    },
33
+    "node_modules/@alloc/quick-lru": {
34
+      "version": "5.2.0",
35
+      "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
36
+      "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
37
+      "dev": true,
38
+      "license": "MIT",
39
+      "engines": {
40
+        "node": ">=10"
41
+      },
42
+      "funding": {
43
+        "url": "https://github.com/sponsors/sindresorhus"
44
+      }
45
+    },
46
+    "node_modules/@emnapi/core": {
47
+      "version": "1.4.3",
48
+      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz",
49
+      "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==",
50
+      "dev": true,
51
+      "license": "MIT",
52
+      "optional": true,
53
+      "dependencies": {
54
+        "@emnapi/wasi-threads": "1.0.2",
55
+        "tslib": "^2.4.0"
56
+      }
57
+    },
58
+    "node_modules/@emnapi/runtime": {
59
+      "version": "1.4.3",
60
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
61
+      "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
62
+      "license": "MIT",
63
+      "optional": true,
64
+      "dependencies": {
65
+        "tslib": "^2.4.0"
66
+      }
67
+    },
68
+    "node_modules/@emnapi/wasi-threads": {
69
+      "version": "1.0.2",
70
+      "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz",
71
+      "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==",
72
+      "dev": true,
73
+      "license": "MIT",
74
+      "optional": true,
75
+      "dependencies": {
76
+        "tslib": "^2.4.0"
77
+      }
78
+    },
79
+    "node_modules/@eslint-community/eslint-utils": {
80
+      "version": "4.7.0",
81
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
82
+      "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
83
+      "dev": true,
84
+      "license": "MIT",
85
+      "dependencies": {
86
+        "eslint-visitor-keys": "^3.4.3"
87
+      },
88
+      "engines": {
89
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
90
+      },
91
+      "funding": {
92
+        "url": "https://opencollective.com/eslint"
93
+      },
94
+      "peerDependencies": {
95
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
96
+      }
97
+    },
98
+    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
99
+      "version": "3.4.3",
100
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
101
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
102
+      "dev": true,
103
+      "license": "Apache-2.0",
104
+      "engines": {
105
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
106
+      },
107
+      "funding": {
108
+        "url": "https://opencollective.com/eslint"
109
+      }
110
+    },
111
+    "node_modules/@eslint-community/regexpp": {
112
+      "version": "4.12.1",
113
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
114
+      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
115
+      "dev": true,
116
+      "license": "MIT",
117
+      "engines": {
118
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
119
+      }
120
+    },
121
+    "node_modules/@eslint/config-array": {
122
+      "version": "0.20.1",
123
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz",
124
+      "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==",
125
+      "dev": true,
126
+      "license": "Apache-2.0",
127
+      "dependencies": {
128
+        "@eslint/object-schema": "^2.1.6",
129
+        "debug": "^4.3.1",
130
+        "minimatch": "^3.1.2"
131
+      },
132
+      "engines": {
133
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
134
+      }
135
+    },
136
+    "node_modules/@eslint/config-helpers": {
137
+      "version": "0.2.3",
138
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz",
139
+      "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==",
140
+      "dev": true,
141
+      "license": "Apache-2.0",
142
+      "engines": {
143
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
144
+      }
145
+    },
146
+    "node_modules/@eslint/core": {
147
+      "version": "0.14.0",
148
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
149
+      "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
150
+      "dev": true,
151
+      "license": "Apache-2.0",
152
+      "dependencies": {
153
+        "@types/json-schema": "^7.0.15"
154
+      },
155
+      "engines": {
156
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
157
+      }
158
+    },
159
+    "node_modules/@eslint/eslintrc": {
160
+      "version": "3.3.1",
161
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
162
+      "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
163
+      "dev": true,
164
+      "license": "MIT",
165
+      "dependencies": {
166
+        "ajv": "^6.12.4",
167
+        "debug": "^4.3.2",
168
+        "espree": "^10.0.1",
169
+        "globals": "^14.0.0",
170
+        "ignore": "^5.2.0",
171
+        "import-fresh": "^3.2.1",
172
+        "js-yaml": "^4.1.0",
173
+        "minimatch": "^3.1.2",
174
+        "strip-json-comments": "^3.1.1"
175
+      },
176
+      "engines": {
177
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
178
+      },
179
+      "funding": {
180
+        "url": "https://opencollective.com/eslint"
181
+      }
182
+    },
183
+    "node_modules/@eslint/js": {
184
+      "version": "9.29.0",
185
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz",
186
+      "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==",
187
+      "dev": true,
188
+      "license": "MIT",
189
+      "engines": {
190
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
191
+      },
192
+      "funding": {
193
+        "url": "https://eslint.org/donate"
194
+      }
195
+    },
196
+    "node_modules/@eslint/object-schema": {
197
+      "version": "2.1.6",
198
+      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
199
+      "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
200
+      "dev": true,
201
+      "license": "Apache-2.0",
202
+      "engines": {
203
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
204
+      }
205
+    },
206
+    "node_modules/@eslint/plugin-kit": {
207
+      "version": "0.3.3",
208
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz",
209
+      "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==",
210
+      "dev": true,
211
+      "license": "Apache-2.0",
212
+      "dependencies": {
213
+        "@eslint/core": "^0.15.1",
214
+        "levn": "^0.4.1"
215
+      },
216
+      "engines": {
217
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
218
+      }
219
+    },
220
+    "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
221
+      "version": "0.15.1",
222
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
223
+      "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
224
+      "dev": true,
225
+      "license": "Apache-2.0",
226
+      "dependencies": {
227
+        "@types/json-schema": "^7.0.15"
228
+      },
229
+      "engines": {
230
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
231
+      }
232
+    },
233
+    "node_modules/@humanfs/core": {
234
+      "version": "0.19.1",
235
+      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
236
+      "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
237
+      "dev": true,
238
+      "license": "Apache-2.0",
239
+      "engines": {
240
+        "node": ">=18.18.0"
241
+      }
242
+    },
243
+    "node_modules/@humanfs/node": {
244
+      "version": "0.16.6",
245
+      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
246
+      "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
247
+      "dev": true,
248
+      "license": "Apache-2.0",
249
+      "dependencies": {
250
+        "@humanfs/core": "^0.19.1",
251
+        "@humanwhocodes/retry": "^0.3.0"
252
+      },
253
+      "engines": {
254
+        "node": ">=18.18.0"
255
+      }
256
+    },
257
+    "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
258
+      "version": "0.3.1",
259
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
260
+      "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
261
+      "dev": true,
262
+      "license": "Apache-2.0",
263
+      "engines": {
264
+        "node": ">=18.18"
265
+      },
266
+      "funding": {
267
+        "type": "github",
268
+        "url": "https://github.com/sponsors/nzakas"
269
+      }
270
+    },
271
+    "node_modules/@humanwhocodes/module-importer": {
272
+      "version": "1.0.1",
273
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
274
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
275
+      "dev": true,
276
+      "license": "Apache-2.0",
277
+      "engines": {
278
+        "node": ">=12.22"
279
+      },
280
+      "funding": {
281
+        "type": "github",
282
+        "url": "https://github.com/sponsors/nzakas"
283
+      }
284
+    },
285
+    "node_modules/@humanwhocodes/retry": {
286
+      "version": "0.4.3",
287
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
288
+      "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
289
+      "dev": true,
290
+      "license": "Apache-2.0",
291
+      "engines": {
292
+        "node": ">=18.18"
293
+      },
294
+      "funding": {
295
+        "type": "github",
296
+        "url": "https://github.com/sponsors/nzakas"
297
+      }
298
+    },
299
+    "node_modules/@img/sharp-darwin-arm64": {
300
+      "version": "0.33.5",
301
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
302
+      "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
303
+      "cpu": [
304
+        "arm64"
305
+      ],
306
+      "license": "Apache-2.0",
307
+      "optional": true,
308
+      "os": [
309
+        "darwin"
310
+      ],
311
+      "engines": {
312
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
313
+      },
314
+      "funding": {
315
+        "url": "https://opencollective.com/libvips"
316
+      },
317
+      "optionalDependencies": {
318
+        "@img/sharp-libvips-darwin-arm64": "1.0.4"
319
+      }
320
+    },
321
+    "node_modules/@img/sharp-darwin-x64": {
322
+      "version": "0.33.5",
323
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz",
324
+      "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
325
+      "cpu": [
326
+        "x64"
327
+      ],
328
+      "license": "Apache-2.0",
329
+      "optional": true,
330
+      "os": [
331
+        "darwin"
332
+      ],
333
+      "engines": {
334
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
335
+      },
336
+      "funding": {
337
+        "url": "https://opencollective.com/libvips"
338
+      },
339
+      "optionalDependencies": {
340
+        "@img/sharp-libvips-darwin-x64": "1.0.4"
341
+      }
342
+    },
343
+    "node_modules/@img/sharp-libvips-darwin-arm64": {
344
+      "version": "1.0.4",
345
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz",
346
+      "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
347
+      "cpu": [
348
+        "arm64"
349
+      ],
350
+      "license": "LGPL-3.0-or-later",
351
+      "optional": true,
352
+      "os": [
353
+        "darwin"
354
+      ],
355
+      "funding": {
356
+        "url": "https://opencollective.com/libvips"
357
+      }
358
+    },
359
+    "node_modules/@img/sharp-libvips-darwin-x64": {
360
+      "version": "1.0.4",
361
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz",
362
+      "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
363
+      "cpu": [
364
+        "x64"
365
+      ],
366
+      "license": "LGPL-3.0-or-later",
367
+      "optional": true,
368
+      "os": [
369
+        "darwin"
370
+      ],
371
+      "funding": {
372
+        "url": "https://opencollective.com/libvips"
373
+      }
374
+    },
375
+    "node_modules/@img/sharp-libvips-linux-arm": {
376
+      "version": "1.0.5",
377
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz",
378
+      "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
379
+      "cpu": [
380
+        "arm"
381
+      ],
382
+      "license": "LGPL-3.0-or-later",
383
+      "optional": true,
384
+      "os": [
385
+        "linux"
386
+      ],
387
+      "funding": {
388
+        "url": "https://opencollective.com/libvips"
389
+      }
390
+    },
391
+    "node_modules/@img/sharp-libvips-linux-arm64": {
392
+      "version": "1.0.4",
393
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz",
394
+      "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
395
+      "cpu": [
396
+        "arm64"
397
+      ],
398
+      "license": "LGPL-3.0-or-later",
399
+      "optional": true,
400
+      "os": [
401
+        "linux"
402
+      ],
403
+      "funding": {
404
+        "url": "https://opencollective.com/libvips"
405
+      }
406
+    },
407
+    "node_modules/@img/sharp-libvips-linux-s390x": {
408
+      "version": "1.0.4",
409
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
410
+      "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
411
+      "cpu": [
412
+        "s390x"
413
+      ],
414
+      "license": "LGPL-3.0-or-later",
415
+      "optional": true,
416
+      "os": [
417
+        "linux"
418
+      ],
419
+      "funding": {
420
+        "url": "https://opencollective.com/libvips"
421
+      }
422
+    },
423
+    "node_modules/@img/sharp-libvips-linux-x64": {
424
+      "version": "1.0.4",
425
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
426
+      "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
427
+      "cpu": [
428
+        "x64"
429
+      ],
430
+      "license": "LGPL-3.0-or-later",
431
+      "optional": true,
432
+      "os": [
433
+        "linux"
434
+      ],
435
+      "funding": {
436
+        "url": "https://opencollective.com/libvips"
437
+      }
438
+    },
439
+    "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
440
+      "version": "1.0.4",
441
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz",
442
+      "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
443
+      "cpu": [
444
+        "arm64"
445
+      ],
446
+      "license": "LGPL-3.0-or-later",
447
+      "optional": true,
448
+      "os": [
449
+        "linux"
450
+      ],
451
+      "funding": {
452
+        "url": "https://opencollective.com/libvips"
453
+      }
454
+    },
455
+    "node_modules/@img/sharp-libvips-linuxmusl-x64": {
456
+      "version": "1.0.4",
457
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz",
458
+      "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
459
+      "cpu": [
460
+        "x64"
461
+      ],
462
+      "license": "LGPL-3.0-or-later",
463
+      "optional": true,
464
+      "os": [
465
+        "linux"
466
+      ],
467
+      "funding": {
468
+        "url": "https://opencollective.com/libvips"
469
+      }
470
+    },
471
+    "node_modules/@img/sharp-linux-arm": {
472
+      "version": "0.33.5",
473
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz",
474
+      "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
475
+      "cpu": [
476
+        "arm"
477
+      ],
478
+      "license": "Apache-2.0",
479
+      "optional": true,
480
+      "os": [
481
+        "linux"
482
+      ],
483
+      "engines": {
484
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
485
+      },
486
+      "funding": {
487
+        "url": "https://opencollective.com/libvips"
488
+      },
489
+      "optionalDependencies": {
490
+        "@img/sharp-libvips-linux-arm": "1.0.5"
491
+      }
492
+    },
493
+    "node_modules/@img/sharp-linux-arm64": {
494
+      "version": "0.33.5",
495
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz",
496
+      "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
497
+      "cpu": [
498
+        "arm64"
499
+      ],
500
+      "license": "Apache-2.0",
501
+      "optional": true,
502
+      "os": [
503
+        "linux"
504
+      ],
505
+      "engines": {
506
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
507
+      },
508
+      "funding": {
509
+        "url": "https://opencollective.com/libvips"
510
+      },
511
+      "optionalDependencies": {
512
+        "@img/sharp-libvips-linux-arm64": "1.0.4"
513
+      }
514
+    },
515
+    "node_modules/@img/sharp-linux-s390x": {
516
+      "version": "0.33.5",
517
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
518
+      "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
519
+      "cpu": [
520
+        "s390x"
521
+      ],
522
+      "license": "Apache-2.0",
523
+      "optional": true,
524
+      "os": [
525
+        "linux"
526
+      ],
527
+      "engines": {
528
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
529
+      },
530
+      "funding": {
531
+        "url": "https://opencollective.com/libvips"
532
+      },
533
+      "optionalDependencies": {
534
+        "@img/sharp-libvips-linux-s390x": "1.0.4"
535
+      }
536
+    },
537
+    "node_modules/@img/sharp-linux-x64": {
538
+      "version": "0.33.5",
539
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
540
+      "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
541
+      "cpu": [
542
+        "x64"
543
+      ],
544
+      "license": "Apache-2.0",
545
+      "optional": true,
546
+      "os": [
547
+        "linux"
548
+      ],
549
+      "engines": {
550
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
551
+      },
552
+      "funding": {
553
+        "url": "https://opencollective.com/libvips"
554
+      },
555
+      "optionalDependencies": {
556
+        "@img/sharp-libvips-linux-x64": "1.0.4"
557
+      }
558
+    },
559
+    "node_modules/@img/sharp-linuxmusl-arm64": {
560
+      "version": "0.33.5",
561
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz",
562
+      "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
563
+      "cpu": [
564
+        "arm64"
565
+      ],
566
+      "license": "Apache-2.0",
567
+      "optional": true,
568
+      "os": [
569
+        "linux"
570
+      ],
571
+      "engines": {
572
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
573
+      },
574
+      "funding": {
575
+        "url": "https://opencollective.com/libvips"
576
+      },
577
+      "optionalDependencies": {
578
+        "@img/sharp-libvips-linuxmusl-arm64": "1.0.4"
579
+      }
580
+    },
581
+    "node_modules/@img/sharp-linuxmusl-x64": {
582
+      "version": "0.33.5",
583
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz",
584
+      "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
585
+      "cpu": [
586
+        "x64"
587
+      ],
588
+      "license": "Apache-2.0",
589
+      "optional": true,
590
+      "os": [
591
+        "linux"
592
+      ],
593
+      "engines": {
594
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
595
+      },
596
+      "funding": {
597
+        "url": "https://opencollective.com/libvips"
598
+      },
599
+      "optionalDependencies": {
600
+        "@img/sharp-libvips-linuxmusl-x64": "1.0.4"
601
+      }
602
+    },
603
+    "node_modules/@img/sharp-wasm32": {
604
+      "version": "0.33.5",
605
+      "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz",
606
+      "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
607
+      "cpu": [
608
+        "wasm32"
609
+      ],
610
+      "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
611
+      "optional": true,
612
+      "dependencies": {
613
+        "@emnapi/runtime": "^1.2.0"
614
+      },
615
+      "engines": {
616
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
617
+      },
618
+      "funding": {
619
+        "url": "https://opencollective.com/libvips"
620
+      }
621
+    },
622
+    "node_modules/@img/sharp-win32-ia32": {
623
+      "version": "0.33.5",
624
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
625
+      "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
626
+      "cpu": [
627
+        "ia32"
628
+      ],
629
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
630
+      "optional": true,
631
+      "os": [
632
+        "win32"
633
+      ],
634
+      "engines": {
635
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
636
+      },
637
+      "funding": {
638
+        "url": "https://opencollective.com/libvips"
639
+      }
640
+    },
641
+    "node_modules/@img/sharp-win32-x64": {
642
+      "version": "0.33.5",
643
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz",
644
+      "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
645
+      "cpu": [
646
+        "x64"
647
+      ],
648
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
649
+      "optional": true,
650
+      "os": [
651
+        "win32"
652
+      ],
653
+      "engines": {
654
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
655
+      },
656
+      "funding": {
657
+        "url": "https://opencollective.com/libvips"
658
+      }
659
+    },
660
+    "node_modules/@isaacs/cliui": {
661
+      "version": "8.0.2",
662
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
663
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
664
+      "dev": true,
665
+      "license": "ISC",
666
+      "dependencies": {
667
+        "string-width": "^5.1.2",
668
+        "string-width-cjs": "npm:string-width@^4.2.0",
669
+        "strip-ansi": "^7.0.1",
670
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
671
+        "wrap-ansi": "^8.1.0",
672
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
673
+      },
674
+      "engines": {
675
+        "node": ">=12"
676
+      }
677
+    },
678
+    "node_modules/@jridgewell/gen-mapping": {
679
+      "version": "0.3.8",
680
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
681
+      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
682
+      "dev": true,
683
+      "license": "MIT",
684
+      "dependencies": {
685
+        "@jridgewell/set-array": "^1.2.1",
686
+        "@jridgewell/sourcemap-codec": "^1.4.10",
687
+        "@jridgewell/trace-mapping": "^0.3.24"
688
+      },
689
+      "engines": {
690
+        "node": ">=6.0.0"
691
+      }
692
+    },
693
+    "node_modules/@jridgewell/resolve-uri": {
694
+      "version": "3.1.2",
695
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
696
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
697
+      "dev": true,
698
+      "license": "MIT",
699
+      "engines": {
700
+        "node": ">=6.0.0"
701
+      }
702
+    },
703
+    "node_modules/@jridgewell/set-array": {
704
+      "version": "1.2.1",
705
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
706
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
707
+      "dev": true,
708
+      "license": "MIT",
709
+      "engines": {
710
+        "node": ">=6.0.0"
711
+      }
712
+    },
713
+    "node_modules/@jridgewell/sourcemap-codec": {
714
+      "version": "1.5.0",
715
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
716
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
717
+      "dev": true,
718
+      "license": "MIT"
719
+    },
720
+    "node_modules/@jridgewell/trace-mapping": {
721
+      "version": "0.3.25",
722
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
723
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
724
+      "dev": true,
725
+      "license": "MIT",
726
+      "dependencies": {
727
+        "@jridgewell/resolve-uri": "^3.1.0",
728
+        "@jridgewell/sourcemap-codec": "^1.4.14"
729
+      }
730
+    },
731
+    "node_modules/@napi-rs/wasm-runtime": {
732
+      "version": "0.2.11",
733
+      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz",
734
+      "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==",
735
+      "dev": true,
736
+      "license": "MIT",
737
+      "optional": true,
738
+      "dependencies": {
739
+        "@emnapi/core": "^1.4.3",
740
+        "@emnapi/runtime": "^1.4.3",
741
+        "@tybys/wasm-util": "^0.9.0"
742
+      }
743
+    },
744
+    "node_modules/@next/env": {
745
+      "version": "15.1.3",
746
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.3.tgz",
747
+      "integrity": "sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw==",
748
+      "license": "MIT"
749
+    },
750
+    "node_modules/@next/eslint-plugin-next": {
751
+      "version": "15.1.3",
752
+      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.3.tgz",
753
+      "integrity": "sha512-oeP1vnc5Cq9UoOb8SYHAEPbCXMzOgG70l+Zfd+Ie00R25FOm+CCVNrcIubJvB1tvBgakXE37MmqSycksXVPRqg==",
754
+      "dev": true,
755
+      "license": "MIT",
756
+      "dependencies": {
757
+        "fast-glob": "3.3.1"
758
+      }
759
+    },
760
+    "node_modules/@next/swc-darwin-arm64": {
761
+      "version": "15.1.3",
762
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz",
763
+      "integrity": "sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg==",
764
+      "cpu": [
765
+        "arm64"
766
+      ],
767
+      "license": "MIT",
768
+      "optional": true,
769
+      "os": [
770
+        "darwin"
771
+      ],
772
+      "engines": {
773
+        "node": ">= 10"
774
+      }
775
+    },
776
+    "node_modules/@next/swc-darwin-x64": {
777
+      "version": "15.1.3",
778
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz",
779
+      "integrity": "sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA==",
780
+      "cpu": [
781
+        "x64"
782
+      ],
783
+      "license": "MIT",
784
+      "optional": true,
785
+      "os": [
786
+        "darwin"
787
+      ],
788
+      "engines": {
789
+        "node": ">= 10"
790
+      }
791
+    },
792
+    "node_modules/@next/swc-linux-arm64-gnu": {
793
+      "version": "15.1.3",
794
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz",
795
+      "integrity": "sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==",
796
+      "cpu": [
797
+        "arm64"
798
+      ],
799
+      "license": "MIT",
800
+      "optional": true,
801
+      "os": [
802
+        "linux"
803
+      ],
804
+      "engines": {
805
+        "node": ">= 10"
806
+      }
807
+    },
808
+    "node_modules/@next/swc-linux-arm64-musl": {
809
+      "version": "15.1.3",
810
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz",
811
+      "integrity": "sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==",
812
+      "cpu": [
813
+        "arm64"
814
+      ],
815
+      "license": "MIT",
816
+      "optional": true,
817
+      "os": [
818
+        "linux"
819
+      ],
820
+      "engines": {
821
+        "node": ">= 10"
822
+      }
823
+    },
824
+    "node_modules/@next/swc-linux-x64-gnu": {
825
+      "version": "15.1.3",
826
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz",
827
+      "integrity": "sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==",
828
+      "cpu": [
829
+        "x64"
830
+      ],
831
+      "license": "MIT",
832
+      "optional": true,
833
+      "os": [
834
+        "linux"
835
+      ],
836
+      "engines": {
837
+        "node": ">= 10"
838
+      }
839
+    },
840
+    "node_modules/@next/swc-linux-x64-musl": {
841
+      "version": "15.1.3",
842
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz",
843
+      "integrity": "sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==",
844
+      "cpu": [
845
+        "x64"
846
+      ],
847
+      "license": "MIT",
848
+      "optional": true,
849
+      "os": [
850
+        "linux"
851
+      ],
852
+      "engines": {
853
+        "node": ">= 10"
854
+      }
855
+    },
856
+    "node_modules/@next/swc-win32-arm64-msvc": {
857
+      "version": "15.1.3",
858
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz",
859
+      "integrity": "sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw==",
860
+      "cpu": [
861
+        "arm64"
862
+      ],
863
+      "license": "MIT",
864
+      "optional": true,
865
+      "os": [
866
+        "win32"
867
+      ],
868
+      "engines": {
869
+        "node": ">= 10"
870
+      }
871
+    },
872
+    "node_modules/@next/swc-win32-x64-msvc": {
873
+      "version": "15.1.3",
874
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz",
875
+      "integrity": "sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ==",
876
+      "cpu": [
877
+        "x64"
878
+      ],
879
+      "license": "MIT",
880
+      "optional": true,
881
+      "os": [
882
+        "win32"
883
+      ],
884
+      "engines": {
885
+        "node": ">= 10"
886
+      }
887
+    },
888
+    "node_modules/@nodelib/fs.scandir": {
889
+      "version": "2.1.5",
890
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
891
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
892
+      "dev": true,
893
+      "license": "MIT",
894
+      "dependencies": {
895
+        "@nodelib/fs.stat": "2.0.5",
896
+        "run-parallel": "^1.1.9"
897
+      },
898
+      "engines": {
899
+        "node": ">= 8"
900
+      }
901
+    },
902
+    "node_modules/@nodelib/fs.stat": {
903
+      "version": "2.0.5",
904
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
905
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
906
+      "dev": true,
907
+      "license": "MIT",
908
+      "engines": {
909
+        "node": ">= 8"
910
+      }
911
+    },
912
+    "node_modules/@nodelib/fs.walk": {
913
+      "version": "1.2.8",
914
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
915
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
916
+      "dev": true,
917
+      "license": "MIT",
918
+      "dependencies": {
919
+        "@nodelib/fs.scandir": "2.1.5",
920
+        "fastq": "^1.6.0"
921
+      },
922
+      "engines": {
923
+        "node": ">= 8"
924
+      }
925
+    },
926
+    "node_modules/@nolyfill/is-core-module": {
927
+      "version": "1.0.39",
928
+      "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
929
+      "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
930
+      "dev": true,
931
+      "license": "MIT",
932
+      "engines": {
933
+        "node": ">=12.4.0"
934
+      }
935
+    },
936
+    "node_modules/@pkgjs/parseargs": {
937
+      "version": "0.11.0",
938
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
939
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
940
+      "dev": true,
941
+      "license": "MIT",
942
+      "optional": true,
943
+      "engines": {
944
+        "node": ">=14"
945
+      }
946
+    },
947
+    "node_modules/@react-leaflet/core": {
948
+      "version": "3.0.0",
949
+      "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz",
950
+      "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==",
951
+      "license": "Hippocratic-2.1",
952
+      "peerDependencies": {
953
+        "leaflet": "^1.9.0",
954
+        "react": "^19.0.0",
955
+        "react-dom": "^19.0.0"
956
+      }
957
+    },
958
+    "node_modules/@rtsao/scc": {
959
+      "version": "1.1.0",
960
+      "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
961
+      "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
962
+      "dev": true,
963
+      "license": "MIT"
964
+    },
965
+    "node_modules/@rushstack/eslint-patch": {
966
+      "version": "1.12.0",
967
+      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz",
968
+      "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==",
969
+      "dev": true,
970
+      "license": "MIT"
971
+    },
972
+    "node_modules/@swc/counter": {
973
+      "version": "0.1.3",
974
+      "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
975
+      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
976
+      "license": "Apache-2.0"
977
+    },
978
+    "node_modules/@swc/helpers": {
979
+      "version": "0.5.15",
980
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
981
+      "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
982
+      "license": "Apache-2.0",
983
+      "dependencies": {
984
+        "tslib": "^2.8.0"
985
+      }
986
+    },
987
+    "node_modules/@tanstack/query-core": {
988
+      "version": "5.81.5",
989
+      "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.81.5.tgz",
990
+      "integrity": "sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q==",
991
+      "license": "MIT",
992
+      "funding": {
993
+        "type": "github",
994
+        "url": "https://github.com/sponsors/tannerlinsley"
995
+      }
996
+    },
997
+    "node_modules/@tanstack/react-query": {
998
+      "version": "5.81.5",
999
+      "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.81.5.tgz",
1000
+      "integrity": "sha512-lOf2KqRRiYWpQT86eeeftAGnjuTR35myTP8MXyvHa81VlomoAWNEd8x5vkcAfQefu0qtYCvyqLropFZqgI2EQw==",
1001
+      "license": "MIT",
1002
+      "dependencies": {
1003
+        "@tanstack/query-core": "5.81.5"
1004
+      },
1005
+      "funding": {
1006
+        "type": "github",
1007
+        "url": "https://github.com/sponsors/tannerlinsley"
1008
+      },
1009
+      "peerDependencies": {
1010
+        "react": "^18 || ^19"
1011
+      }
1012
+    },
1013
+    "node_modules/@tybys/wasm-util": {
1014
+      "version": "0.9.0",
1015
+      "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz",
1016
+      "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==",
1017
+      "dev": true,
1018
+      "license": "MIT",
1019
+      "optional": true,
1020
+      "dependencies": {
1021
+        "tslib": "^2.4.0"
1022
+      }
1023
+    },
1024
+    "node_modules/@types/estree": {
1025
+      "version": "1.0.8",
1026
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1027
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1028
+      "dev": true,
1029
+      "license": "MIT"
1030
+    },
1031
+    "node_modules/@types/geojson": {
1032
+      "version": "7946.0.16",
1033
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
1034
+      "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
1035
+      "dev": true,
1036
+      "license": "MIT"
1037
+    },
1038
+    "node_modules/@types/json-schema": {
1039
+      "version": "7.0.15",
1040
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
1041
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
1042
+      "dev": true,
1043
+      "license": "MIT"
1044
+    },
1045
+    "node_modules/@types/json5": {
1046
+      "version": "0.0.29",
1047
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
1048
+      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
1049
+      "dev": true,
1050
+      "license": "MIT"
1051
+    },
1052
+    "node_modules/@types/leaflet": {
1053
+      "version": "1.9.19",
1054
+      "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.19.tgz",
1055
+      "integrity": "sha512-pB+n2daHcZPF2FDaWa+6B0a0mSDf4dPU35y5iTXsx7x/PzzshiX5atYiS1jlBn43X7XvM8AP+AB26lnSk0J4GA==",
1056
+      "dev": true,
1057
+      "license": "MIT",
1058
+      "dependencies": {
1059
+        "@types/geojson": "*"
1060
+      }
1061
+    },
1062
+    "node_modules/@types/node": {
1063
+      "version": "20.19.1",
1064
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz",
1065
+      "integrity": "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==",
1066
+      "dev": true,
1067
+      "license": "MIT",
1068
+      "dependencies": {
1069
+        "undici-types": "~6.21.0"
1070
+      }
1071
+    },
1072
+    "node_modules/@types/react": {
1073
+      "version": "19.1.8",
1074
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz",
1075
+      "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==",
1076
+      "dev": true,
1077
+      "license": "MIT",
1078
+      "dependencies": {
1079
+        "csstype": "^3.0.2"
1080
+      }
1081
+    },
1082
+    "node_modules/@types/react-dom": {
1083
+      "version": "19.1.6",
1084
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz",
1085
+      "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==",
1086
+      "dev": true,
1087
+      "license": "MIT",
1088
+      "peerDependencies": {
1089
+        "@types/react": "^19.0.0"
1090
+      }
1091
+    },
1092
+    "node_modules/@typescript-eslint/eslint-plugin": {
1093
+      "version": "8.35.0",
1094
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.0.tgz",
1095
+      "integrity": "sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==",
1096
+      "dev": true,
1097
+      "license": "MIT",
1098
+      "dependencies": {
1099
+        "@eslint-community/regexpp": "^4.10.0",
1100
+        "@typescript-eslint/scope-manager": "8.35.0",
1101
+        "@typescript-eslint/type-utils": "8.35.0",
1102
+        "@typescript-eslint/utils": "8.35.0",
1103
+        "@typescript-eslint/visitor-keys": "8.35.0",
1104
+        "graphemer": "^1.4.0",
1105
+        "ignore": "^7.0.0",
1106
+        "natural-compare": "^1.4.0",
1107
+        "ts-api-utils": "^2.1.0"
1108
+      },
1109
+      "engines": {
1110
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1111
+      },
1112
+      "funding": {
1113
+        "type": "opencollective",
1114
+        "url": "https://opencollective.com/typescript-eslint"
1115
+      },
1116
+      "peerDependencies": {
1117
+        "@typescript-eslint/parser": "^8.35.0",
1118
+        "eslint": "^8.57.0 || ^9.0.0",
1119
+        "typescript": ">=4.8.4 <5.9.0"
1120
+      }
1121
+    },
1122
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
1123
+      "version": "7.0.5",
1124
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
1125
+      "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
1126
+      "dev": true,
1127
+      "license": "MIT",
1128
+      "engines": {
1129
+        "node": ">= 4"
1130
+      }
1131
+    },
1132
+    "node_modules/@typescript-eslint/parser": {
1133
+      "version": "8.35.0",
1134
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.0.tgz",
1135
+      "integrity": "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==",
1136
+      "dev": true,
1137
+      "license": "MIT",
1138
+      "dependencies": {
1139
+        "@typescript-eslint/scope-manager": "8.35.0",
1140
+        "@typescript-eslint/types": "8.35.0",
1141
+        "@typescript-eslint/typescript-estree": "8.35.0",
1142
+        "@typescript-eslint/visitor-keys": "8.35.0",
1143
+        "debug": "^4.3.4"
1144
+      },
1145
+      "engines": {
1146
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1147
+      },
1148
+      "funding": {
1149
+        "type": "opencollective",
1150
+        "url": "https://opencollective.com/typescript-eslint"
1151
+      },
1152
+      "peerDependencies": {
1153
+        "eslint": "^8.57.0 || ^9.0.0",
1154
+        "typescript": ">=4.8.4 <5.9.0"
1155
+      }
1156
+    },
1157
+    "node_modules/@typescript-eslint/project-service": {
1158
+      "version": "8.35.0",
1159
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.0.tgz",
1160
+      "integrity": "sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==",
1161
+      "dev": true,
1162
+      "license": "MIT",
1163
+      "dependencies": {
1164
+        "@typescript-eslint/tsconfig-utils": "^8.35.0",
1165
+        "@typescript-eslint/types": "^8.35.0",
1166
+        "debug": "^4.3.4"
1167
+      },
1168
+      "engines": {
1169
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1170
+      },
1171
+      "funding": {
1172
+        "type": "opencollective",
1173
+        "url": "https://opencollective.com/typescript-eslint"
1174
+      },
1175
+      "peerDependencies": {
1176
+        "typescript": ">=4.8.4 <5.9.0"
1177
+      }
1178
+    },
1179
+    "node_modules/@typescript-eslint/scope-manager": {
1180
+      "version": "8.35.0",
1181
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.0.tgz",
1182
+      "integrity": "sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==",
1183
+      "dev": true,
1184
+      "license": "MIT",
1185
+      "dependencies": {
1186
+        "@typescript-eslint/types": "8.35.0",
1187
+        "@typescript-eslint/visitor-keys": "8.35.0"
1188
+      },
1189
+      "engines": {
1190
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1191
+      },
1192
+      "funding": {
1193
+        "type": "opencollective",
1194
+        "url": "https://opencollective.com/typescript-eslint"
1195
+      }
1196
+    },
1197
+    "node_modules/@typescript-eslint/tsconfig-utils": {
1198
+      "version": "8.35.0",
1199
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz",
1200
+      "integrity": "sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==",
1201
+      "dev": true,
1202
+      "license": "MIT",
1203
+      "engines": {
1204
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1205
+      },
1206
+      "funding": {
1207
+        "type": "opencollective",
1208
+        "url": "https://opencollective.com/typescript-eslint"
1209
+      },
1210
+      "peerDependencies": {
1211
+        "typescript": ">=4.8.4 <5.9.0"
1212
+      }
1213
+    },
1214
+    "node_modules/@typescript-eslint/type-utils": {
1215
+      "version": "8.35.0",
1216
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.0.tgz",
1217
+      "integrity": "sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==",
1218
+      "dev": true,
1219
+      "license": "MIT",
1220
+      "dependencies": {
1221
+        "@typescript-eslint/typescript-estree": "8.35.0",
1222
+        "@typescript-eslint/utils": "8.35.0",
1223
+        "debug": "^4.3.4",
1224
+        "ts-api-utils": "^2.1.0"
1225
+      },
1226
+      "engines": {
1227
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1228
+      },
1229
+      "funding": {
1230
+        "type": "opencollective",
1231
+        "url": "https://opencollective.com/typescript-eslint"
1232
+      },
1233
+      "peerDependencies": {
1234
+        "eslint": "^8.57.0 || ^9.0.0",
1235
+        "typescript": ">=4.8.4 <5.9.0"
1236
+      }
1237
+    },
1238
+    "node_modules/@typescript-eslint/types": {
1239
+      "version": "8.35.0",
1240
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.0.tgz",
1241
+      "integrity": "sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==",
1242
+      "dev": true,
1243
+      "license": "MIT",
1244
+      "engines": {
1245
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1246
+      },
1247
+      "funding": {
1248
+        "type": "opencollective",
1249
+        "url": "https://opencollective.com/typescript-eslint"
1250
+      }
1251
+    },
1252
+    "node_modules/@typescript-eslint/typescript-estree": {
1253
+      "version": "8.35.0",
1254
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz",
1255
+      "integrity": "sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==",
1256
+      "dev": true,
1257
+      "license": "MIT",
1258
+      "dependencies": {
1259
+        "@typescript-eslint/project-service": "8.35.0",
1260
+        "@typescript-eslint/tsconfig-utils": "8.35.0",
1261
+        "@typescript-eslint/types": "8.35.0",
1262
+        "@typescript-eslint/visitor-keys": "8.35.0",
1263
+        "debug": "^4.3.4",
1264
+        "fast-glob": "^3.3.2",
1265
+        "is-glob": "^4.0.3",
1266
+        "minimatch": "^9.0.4",
1267
+        "semver": "^7.6.0",
1268
+        "ts-api-utils": "^2.1.0"
1269
+      },
1270
+      "engines": {
1271
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1272
+      },
1273
+      "funding": {
1274
+        "type": "opencollective",
1275
+        "url": "https://opencollective.com/typescript-eslint"
1276
+      },
1277
+      "peerDependencies": {
1278
+        "typescript": ">=4.8.4 <5.9.0"
1279
+      }
1280
+    },
1281
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
1282
+      "version": "2.0.2",
1283
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
1284
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
1285
+      "dev": true,
1286
+      "license": "MIT",
1287
+      "dependencies": {
1288
+        "balanced-match": "^1.0.0"
1289
+      }
1290
+    },
1291
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": {
1292
+      "version": "3.3.3",
1293
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1294
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1295
+      "dev": true,
1296
+      "license": "MIT",
1297
+      "dependencies": {
1298
+        "@nodelib/fs.stat": "^2.0.2",
1299
+        "@nodelib/fs.walk": "^1.2.3",
1300
+        "glob-parent": "^5.1.2",
1301
+        "merge2": "^1.3.0",
1302
+        "micromatch": "^4.0.8"
1303
+      },
1304
+      "engines": {
1305
+        "node": ">=8.6.0"
1306
+      }
1307
+    },
1308
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": {
1309
+      "version": "5.1.2",
1310
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1311
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1312
+      "dev": true,
1313
+      "license": "ISC",
1314
+      "dependencies": {
1315
+        "is-glob": "^4.0.1"
1316
+      },
1317
+      "engines": {
1318
+        "node": ">= 6"
1319
+      }
1320
+    },
1321
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
1322
+      "version": "9.0.5",
1323
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
1324
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
1325
+      "dev": true,
1326
+      "license": "ISC",
1327
+      "dependencies": {
1328
+        "brace-expansion": "^2.0.1"
1329
+      },
1330
+      "engines": {
1331
+        "node": ">=16 || 14 >=14.17"
1332
+      },
1333
+      "funding": {
1334
+        "url": "https://github.com/sponsors/isaacs"
1335
+      }
1336
+    },
1337
+    "node_modules/@typescript-eslint/utils": {
1338
+      "version": "8.35.0",
1339
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.0.tgz",
1340
+      "integrity": "sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==",
1341
+      "dev": true,
1342
+      "license": "MIT",
1343
+      "dependencies": {
1344
+        "@eslint-community/eslint-utils": "^4.7.0",
1345
+        "@typescript-eslint/scope-manager": "8.35.0",
1346
+        "@typescript-eslint/types": "8.35.0",
1347
+        "@typescript-eslint/typescript-estree": "8.35.0"
1348
+      },
1349
+      "engines": {
1350
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1351
+      },
1352
+      "funding": {
1353
+        "type": "opencollective",
1354
+        "url": "https://opencollective.com/typescript-eslint"
1355
+      },
1356
+      "peerDependencies": {
1357
+        "eslint": "^8.57.0 || ^9.0.0",
1358
+        "typescript": ">=4.8.4 <5.9.0"
1359
+      }
1360
+    },
1361
+    "node_modules/@typescript-eslint/visitor-keys": {
1362
+      "version": "8.35.0",
1363
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.0.tgz",
1364
+      "integrity": "sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==",
1365
+      "dev": true,
1366
+      "license": "MIT",
1367
+      "dependencies": {
1368
+        "@typescript-eslint/types": "8.35.0",
1369
+        "eslint-visitor-keys": "^4.2.1"
1370
+      },
1371
+      "engines": {
1372
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1373
+      },
1374
+      "funding": {
1375
+        "type": "opencollective",
1376
+        "url": "https://opencollective.com/typescript-eslint"
1377
+      }
1378
+    },
1379
+    "node_modules/@unrs/resolver-binding-android-arm-eabi": {
1380
+      "version": "1.9.2",
1381
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.2.tgz",
1382
+      "integrity": "sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A==",
1383
+      "cpu": [
1384
+        "arm"
1385
+      ],
1386
+      "dev": true,
1387
+      "license": "MIT",
1388
+      "optional": true,
1389
+      "os": [
1390
+        "android"
1391
+      ]
1392
+    },
1393
+    "node_modules/@unrs/resolver-binding-android-arm64": {
1394
+      "version": "1.9.2",
1395
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.2.tgz",
1396
+      "integrity": "sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q==",
1397
+      "cpu": [
1398
+        "arm64"
1399
+      ],
1400
+      "dev": true,
1401
+      "license": "MIT",
1402
+      "optional": true,
1403
+      "os": [
1404
+        "android"
1405
+      ]
1406
+    },
1407
+    "node_modules/@unrs/resolver-binding-darwin-arm64": {
1408
+      "version": "1.9.2",
1409
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.2.tgz",
1410
+      "integrity": "sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ==",
1411
+      "cpu": [
1412
+        "arm64"
1413
+      ],
1414
+      "dev": true,
1415
+      "license": "MIT",
1416
+      "optional": true,
1417
+      "os": [
1418
+        "darwin"
1419
+      ]
1420
+    },
1421
+    "node_modules/@unrs/resolver-binding-darwin-x64": {
1422
+      "version": "1.9.2",
1423
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.2.tgz",
1424
+      "integrity": "sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ==",
1425
+      "cpu": [
1426
+        "x64"
1427
+      ],
1428
+      "dev": true,
1429
+      "license": "MIT",
1430
+      "optional": true,
1431
+      "os": [
1432
+        "darwin"
1433
+      ]
1434
+    },
1435
+    "node_modules/@unrs/resolver-binding-freebsd-x64": {
1436
+      "version": "1.9.2",
1437
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.2.tgz",
1438
+      "integrity": "sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw==",
1439
+      "cpu": [
1440
+        "x64"
1441
+      ],
1442
+      "dev": true,
1443
+      "license": "MIT",
1444
+      "optional": true,
1445
+      "os": [
1446
+        "freebsd"
1447
+      ]
1448
+    },
1449
+    "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
1450
+      "version": "1.9.2",
1451
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.2.tgz",
1452
+      "integrity": "sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw==",
1453
+      "cpu": [
1454
+        "arm"
1455
+      ],
1456
+      "dev": true,
1457
+      "license": "MIT",
1458
+      "optional": true,
1459
+      "os": [
1460
+        "linux"
1461
+      ]
1462
+    },
1463
+    "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
1464
+      "version": "1.9.2",
1465
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.2.tgz",
1466
+      "integrity": "sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg==",
1467
+      "cpu": [
1468
+        "arm"
1469
+      ],
1470
+      "dev": true,
1471
+      "license": "MIT",
1472
+      "optional": true,
1473
+      "os": [
1474
+        "linux"
1475
+      ]
1476
+    },
1477
+    "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
1478
+      "version": "1.9.2",
1479
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.2.tgz",
1480
+      "integrity": "sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA==",
1481
+      "cpu": [
1482
+        "arm64"
1483
+      ],
1484
+      "dev": true,
1485
+      "license": "MIT",
1486
+      "optional": true,
1487
+      "os": [
1488
+        "linux"
1489
+      ]
1490
+    },
1491
+    "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
1492
+      "version": "1.9.2",
1493
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.2.tgz",
1494
+      "integrity": "sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA==",
1495
+      "cpu": [
1496
+        "arm64"
1497
+      ],
1498
+      "dev": true,
1499
+      "license": "MIT",
1500
+      "optional": true,
1501
+      "os": [
1502
+        "linux"
1503
+      ]
1504
+    },
1505
+    "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
1506
+      "version": "1.9.2",
1507
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.2.tgz",
1508
+      "integrity": "sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw==",
1509
+      "cpu": [
1510
+        "ppc64"
1511
+      ],
1512
+      "dev": true,
1513
+      "license": "MIT",
1514
+      "optional": true,
1515
+      "os": [
1516
+        "linux"
1517
+      ]
1518
+    },
1519
+    "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
1520
+      "version": "1.9.2",
1521
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.2.tgz",
1522
+      "integrity": "sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ==",
1523
+      "cpu": [
1524
+        "riscv64"
1525
+      ],
1526
+      "dev": true,
1527
+      "license": "MIT",
1528
+      "optional": true,
1529
+      "os": [
1530
+        "linux"
1531
+      ]
1532
+    },
1533
+    "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
1534
+      "version": "1.9.2",
1535
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.2.tgz",
1536
+      "integrity": "sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg==",
1537
+      "cpu": [
1538
+        "riscv64"
1539
+      ],
1540
+      "dev": true,
1541
+      "license": "MIT",
1542
+      "optional": true,
1543
+      "os": [
1544
+        "linux"
1545
+      ]
1546
+    },
1547
+    "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
1548
+      "version": "1.9.2",
1549
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.2.tgz",
1550
+      "integrity": "sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ==",
1551
+      "cpu": [
1552
+        "s390x"
1553
+      ],
1554
+      "dev": true,
1555
+      "license": "MIT",
1556
+      "optional": true,
1557
+      "os": [
1558
+        "linux"
1559
+      ]
1560
+    },
1561
+    "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
1562
+      "version": "1.9.2",
1563
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.2.tgz",
1564
+      "integrity": "sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w==",
1565
+      "cpu": [
1566
+        "x64"
1567
+      ],
1568
+      "dev": true,
1569
+      "license": "MIT",
1570
+      "optional": true,
1571
+      "os": [
1572
+        "linux"
1573
+      ]
1574
+    },
1575
+    "node_modules/@unrs/resolver-binding-linux-x64-musl": {
1576
+      "version": "1.9.2",
1577
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.2.tgz",
1578
+      "integrity": "sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw==",
1579
+      "cpu": [
1580
+        "x64"
1581
+      ],
1582
+      "dev": true,
1583
+      "license": "MIT",
1584
+      "optional": true,
1585
+      "os": [
1586
+        "linux"
1587
+      ]
1588
+    },
1589
+    "node_modules/@unrs/resolver-binding-wasm32-wasi": {
1590
+      "version": "1.9.2",
1591
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.2.tgz",
1592
+      "integrity": "sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ==",
1593
+      "cpu": [
1594
+        "wasm32"
1595
+      ],
1596
+      "dev": true,
1597
+      "license": "MIT",
1598
+      "optional": true,
1599
+      "dependencies": {
1600
+        "@napi-rs/wasm-runtime": "^0.2.11"
1601
+      },
1602
+      "engines": {
1603
+        "node": ">=14.0.0"
1604
+      }
1605
+    },
1606
+    "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
1607
+      "version": "1.9.2",
1608
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.2.tgz",
1609
+      "integrity": "sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw==",
1610
+      "cpu": [
1611
+        "arm64"
1612
+      ],
1613
+      "dev": true,
1614
+      "license": "MIT",
1615
+      "optional": true,
1616
+      "os": [
1617
+        "win32"
1618
+      ]
1619
+    },
1620
+    "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
1621
+      "version": "1.9.2",
1622
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.2.tgz",
1623
+      "integrity": "sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA==",
1624
+      "cpu": [
1625
+        "ia32"
1626
+      ],
1627
+      "dev": true,
1628
+      "license": "MIT",
1629
+      "optional": true,
1630
+      "os": [
1631
+        "win32"
1632
+      ]
1633
+    },
1634
+    "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
1635
+      "version": "1.9.2",
1636
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.2.tgz",
1637
+      "integrity": "sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg==",
1638
+      "cpu": [
1639
+        "x64"
1640
+      ],
1641
+      "dev": true,
1642
+      "license": "MIT",
1643
+      "optional": true,
1644
+      "os": [
1645
+        "win32"
1646
+      ]
1647
+    },
1648
+    "node_modules/acorn": {
1649
+      "version": "8.15.0",
1650
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
1651
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
1652
+      "dev": true,
1653
+      "license": "MIT",
1654
+      "bin": {
1655
+        "acorn": "bin/acorn"
1656
+      },
1657
+      "engines": {
1658
+        "node": ">=0.4.0"
1659
+      }
1660
+    },
1661
+    "node_modules/acorn-jsx": {
1662
+      "version": "5.3.2",
1663
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
1664
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
1665
+      "dev": true,
1666
+      "license": "MIT",
1667
+      "peerDependencies": {
1668
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1669
+      }
1670
+    },
1671
+    "node_modules/ajv": {
1672
+      "version": "6.12.6",
1673
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1674
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1675
+      "dev": true,
1676
+      "license": "MIT",
1677
+      "dependencies": {
1678
+        "fast-deep-equal": "^3.1.1",
1679
+        "fast-json-stable-stringify": "^2.0.0",
1680
+        "json-schema-traverse": "^0.4.1",
1681
+        "uri-js": "^4.2.2"
1682
+      },
1683
+      "funding": {
1684
+        "type": "github",
1685
+        "url": "https://github.com/sponsors/epoberezkin"
1686
+      }
1687
+    },
1688
+    "node_modules/ansi-regex": {
1689
+      "version": "6.1.0",
1690
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
1691
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
1692
+      "dev": true,
1693
+      "license": "MIT",
1694
+      "engines": {
1695
+        "node": ">=12"
1696
+      },
1697
+      "funding": {
1698
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
1699
+      }
1700
+    },
1701
+    "node_modules/ansi-styles": {
1702
+      "version": "4.3.0",
1703
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1704
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1705
+      "dev": true,
1706
+      "license": "MIT",
1707
+      "dependencies": {
1708
+        "color-convert": "^2.0.1"
1709
+      },
1710
+      "engines": {
1711
+        "node": ">=8"
1712
+      },
1713
+      "funding": {
1714
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1715
+      }
1716
+    },
1717
+    "node_modules/any-promise": {
1718
+      "version": "1.3.0",
1719
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1720
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1721
+      "dev": true,
1722
+      "license": "MIT"
1723
+    },
1724
+    "node_modules/anymatch": {
1725
+      "version": "3.1.3",
1726
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1727
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1728
+      "dev": true,
1729
+      "license": "ISC",
1730
+      "dependencies": {
1731
+        "normalize-path": "^3.0.0",
1732
+        "picomatch": "^2.0.4"
1733
+      },
1734
+      "engines": {
1735
+        "node": ">= 8"
1736
+      }
1737
+    },
1738
+    "node_modules/arg": {
1739
+      "version": "5.0.2",
1740
+      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1741
+      "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1742
+      "dev": true,
1743
+      "license": "MIT"
1744
+    },
1745
+    "node_modules/argparse": {
1746
+      "version": "2.0.1",
1747
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1748
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1749
+      "dev": true,
1750
+      "license": "Python-2.0"
1751
+    },
1752
+    "node_modules/aria-query": {
1753
+      "version": "5.3.2",
1754
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
1755
+      "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
1756
+      "dev": true,
1757
+      "license": "Apache-2.0",
1758
+      "engines": {
1759
+        "node": ">= 0.4"
1760
+      }
1761
+    },
1762
+    "node_modules/array-buffer-byte-length": {
1763
+      "version": "1.0.2",
1764
+      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
1765
+      "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
1766
+      "dev": true,
1767
+      "license": "MIT",
1768
+      "dependencies": {
1769
+        "call-bound": "^1.0.3",
1770
+        "is-array-buffer": "^3.0.5"
1771
+      },
1772
+      "engines": {
1773
+        "node": ">= 0.4"
1774
+      },
1775
+      "funding": {
1776
+        "url": "https://github.com/sponsors/ljharb"
1777
+      }
1778
+    },
1779
+    "node_modules/array-includes": {
1780
+      "version": "3.1.9",
1781
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
1782
+      "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
1783
+      "dev": true,
1784
+      "license": "MIT",
1785
+      "dependencies": {
1786
+        "call-bind": "^1.0.8",
1787
+        "call-bound": "^1.0.4",
1788
+        "define-properties": "^1.2.1",
1789
+        "es-abstract": "^1.24.0",
1790
+        "es-object-atoms": "^1.1.1",
1791
+        "get-intrinsic": "^1.3.0",
1792
+        "is-string": "^1.1.1",
1793
+        "math-intrinsics": "^1.1.0"
1794
+      },
1795
+      "engines": {
1796
+        "node": ">= 0.4"
1797
+      },
1798
+      "funding": {
1799
+        "url": "https://github.com/sponsors/ljharb"
1800
+      }
1801
+    },
1802
+    "node_modules/array.prototype.findlast": {
1803
+      "version": "1.2.5",
1804
+      "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
1805
+      "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
1806
+      "dev": true,
1807
+      "license": "MIT",
1808
+      "dependencies": {
1809
+        "call-bind": "^1.0.7",
1810
+        "define-properties": "^1.2.1",
1811
+        "es-abstract": "^1.23.2",
1812
+        "es-errors": "^1.3.0",
1813
+        "es-object-atoms": "^1.0.0",
1814
+        "es-shim-unscopables": "^1.0.2"
1815
+      },
1816
+      "engines": {
1817
+        "node": ">= 0.4"
1818
+      },
1819
+      "funding": {
1820
+        "url": "https://github.com/sponsors/ljharb"
1821
+      }
1822
+    },
1823
+    "node_modules/array.prototype.findlastindex": {
1824
+      "version": "1.2.6",
1825
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
1826
+      "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
1827
+      "dev": true,
1828
+      "license": "MIT",
1829
+      "dependencies": {
1830
+        "call-bind": "^1.0.8",
1831
+        "call-bound": "^1.0.4",
1832
+        "define-properties": "^1.2.1",
1833
+        "es-abstract": "^1.23.9",
1834
+        "es-errors": "^1.3.0",
1835
+        "es-object-atoms": "^1.1.1",
1836
+        "es-shim-unscopables": "^1.1.0"
1837
+      },
1838
+      "engines": {
1839
+        "node": ">= 0.4"
1840
+      },
1841
+      "funding": {
1842
+        "url": "https://github.com/sponsors/ljharb"
1843
+      }
1844
+    },
1845
+    "node_modules/array.prototype.flat": {
1846
+      "version": "1.3.3",
1847
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
1848
+      "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
1849
+      "dev": true,
1850
+      "license": "MIT",
1851
+      "dependencies": {
1852
+        "call-bind": "^1.0.8",
1853
+        "define-properties": "^1.2.1",
1854
+        "es-abstract": "^1.23.5",
1855
+        "es-shim-unscopables": "^1.0.2"
1856
+      },
1857
+      "engines": {
1858
+        "node": ">= 0.4"
1859
+      },
1860
+      "funding": {
1861
+        "url": "https://github.com/sponsors/ljharb"
1862
+      }
1863
+    },
1864
+    "node_modules/array.prototype.flatmap": {
1865
+      "version": "1.3.3",
1866
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
1867
+      "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
1868
+      "dev": true,
1869
+      "license": "MIT",
1870
+      "dependencies": {
1871
+        "call-bind": "^1.0.8",
1872
+        "define-properties": "^1.2.1",
1873
+        "es-abstract": "^1.23.5",
1874
+        "es-shim-unscopables": "^1.0.2"
1875
+      },
1876
+      "engines": {
1877
+        "node": ">= 0.4"
1878
+      },
1879
+      "funding": {
1880
+        "url": "https://github.com/sponsors/ljharb"
1881
+      }
1882
+    },
1883
+    "node_modules/array.prototype.tosorted": {
1884
+      "version": "1.1.4",
1885
+      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
1886
+      "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
1887
+      "dev": true,
1888
+      "license": "MIT",
1889
+      "dependencies": {
1890
+        "call-bind": "^1.0.7",
1891
+        "define-properties": "^1.2.1",
1892
+        "es-abstract": "^1.23.3",
1893
+        "es-errors": "^1.3.0",
1894
+        "es-shim-unscopables": "^1.0.2"
1895
+      },
1896
+      "engines": {
1897
+        "node": ">= 0.4"
1898
+      }
1899
+    },
1900
+    "node_modules/arraybuffer.prototype.slice": {
1901
+      "version": "1.0.4",
1902
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
1903
+      "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
1904
+      "dev": true,
1905
+      "license": "MIT",
1906
+      "dependencies": {
1907
+        "array-buffer-byte-length": "^1.0.1",
1908
+        "call-bind": "^1.0.8",
1909
+        "define-properties": "^1.2.1",
1910
+        "es-abstract": "^1.23.5",
1911
+        "es-errors": "^1.3.0",
1912
+        "get-intrinsic": "^1.2.6",
1913
+        "is-array-buffer": "^3.0.4"
1914
+      },
1915
+      "engines": {
1916
+        "node": ">= 0.4"
1917
+      },
1918
+      "funding": {
1919
+        "url": "https://github.com/sponsors/ljharb"
1920
+      }
1921
+    },
1922
+    "node_modules/ast-types-flow": {
1923
+      "version": "0.0.8",
1924
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
1925
+      "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
1926
+      "dev": true,
1927
+      "license": "MIT"
1928
+    },
1929
+    "node_modules/async-function": {
1930
+      "version": "1.0.0",
1931
+      "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
1932
+      "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
1933
+      "dev": true,
1934
+      "license": "MIT",
1935
+      "engines": {
1936
+        "node": ">= 0.4"
1937
+      }
1938
+    },
1939
+    "node_modules/asynckit": {
1940
+      "version": "0.4.0",
1941
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1942
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
1943
+      "license": "MIT"
1944
+    },
1945
+    "node_modules/autoprefixer": {
1946
+      "version": "10.4.21",
1947
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
1948
+      "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
1949
+      "dev": true,
1950
+      "funding": [
1951
+        {
1952
+          "type": "opencollective",
1953
+          "url": "https://opencollective.com/postcss/"
1954
+        },
1955
+        {
1956
+          "type": "tidelift",
1957
+          "url": "https://tidelift.com/funding/github/npm/autoprefixer"
1958
+        },
1959
+        {
1960
+          "type": "github",
1961
+          "url": "https://github.com/sponsors/ai"
1962
+        }
1963
+      ],
1964
+      "license": "MIT",
1965
+      "dependencies": {
1966
+        "browserslist": "^4.24.4",
1967
+        "caniuse-lite": "^1.0.30001702",
1968
+        "fraction.js": "^4.3.7",
1969
+        "normalize-range": "^0.1.2",
1970
+        "picocolors": "^1.1.1",
1971
+        "postcss-value-parser": "^4.2.0"
1972
+      },
1973
+      "bin": {
1974
+        "autoprefixer": "bin/autoprefixer"
1975
+      },
1976
+      "engines": {
1977
+        "node": "^10 || ^12 || >=14"
1978
+      },
1979
+      "peerDependencies": {
1980
+        "postcss": "^8.1.0"
1981
+      }
1982
+    },
1983
+    "node_modules/available-typed-arrays": {
1984
+      "version": "1.0.7",
1985
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
1986
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
1987
+      "dev": true,
1988
+      "license": "MIT",
1989
+      "dependencies": {
1990
+        "possible-typed-array-names": "^1.0.0"
1991
+      },
1992
+      "engines": {
1993
+        "node": ">= 0.4"
1994
+      },
1995
+      "funding": {
1996
+        "url": "https://github.com/sponsors/ljharb"
1997
+      }
1998
+    },
1999
+    "node_modules/axe-core": {
2000
+      "version": "4.10.3",
2001
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz",
2002
+      "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",
2003
+      "dev": true,
2004
+      "license": "MPL-2.0",
2005
+      "engines": {
2006
+        "node": ">=4"
2007
+      }
2008
+    },
2009
+    "node_modules/axios": {
2010
+      "version": "1.10.0",
2011
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
2012
+      "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
2013
+      "license": "MIT",
2014
+      "dependencies": {
2015
+        "follow-redirects": "^1.15.6",
2016
+        "form-data": "^4.0.0",
2017
+        "proxy-from-env": "^1.1.0"
2018
+      }
2019
+    },
2020
+    "node_modules/axobject-query": {
2021
+      "version": "4.1.0",
2022
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
2023
+      "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
2024
+      "dev": true,
2025
+      "license": "Apache-2.0",
2026
+      "engines": {
2027
+        "node": ">= 0.4"
2028
+      }
2029
+    },
2030
+    "node_modules/balanced-match": {
2031
+      "version": "1.0.2",
2032
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
2033
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
2034
+      "dev": true,
2035
+      "license": "MIT"
2036
+    },
2037
+    "node_modules/binary-extensions": {
2038
+      "version": "2.3.0",
2039
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
2040
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
2041
+      "dev": true,
2042
+      "license": "MIT",
2043
+      "engines": {
2044
+        "node": ">=8"
2045
+      },
2046
+      "funding": {
2047
+        "url": "https://github.com/sponsors/sindresorhus"
2048
+      }
2049
+    },
2050
+    "node_modules/brace-expansion": {
2051
+      "version": "1.1.12",
2052
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
2053
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
2054
+      "dev": true,
2055
+      "license": "MIT",
2056
+      "dependencies": {
2057
+        "balanced-match": "^1.0.0",
2058
+        "concat-map": "0.0.1"
2059
+      }
2060
+    },
2061
+    "node_modules/braces": {
2062
+      "version": "3.0.3",
2063
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
2064
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
2065
+      "dev": true,
2066
+      "license": "MIT",
2067
+      "dependencies": {
2068
+        "fill-range": "^7.1.1"
2069
+      },
2070
+      "engines": {
2071
+        "node": ">=8"
2072
+      }
2073
+    },
2074
+    "node_modules/browserslist": {
2075
+      "version": "4.25.1",
2076
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
2077
+      "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
2078
+      "dev": true,
2079
+      "funding": [
2080
+        {
2081
+          "type": "opencollective",
2082
+          "url": "https://opencollective.com/browserslist"
2083
+        },
2084
+        {
2085
+          "type": "tidelift",
2086
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
2087
+        },
2088
+        {
2089
+          "type": "github",
2090
+          "url": "https://github.com/sponsors/ai"
2091
+        }
2092
+      ],
2093
+      "license": "MIT",
2094
+      "dependencies": {
2095
+        "caniuse-lite": "^1.0.30001726",
2096
+        "electron-to-chromium": "^1.5.173",
2097
+        "node-releases": "^2.0.19",
2098
+        "update-browserslist-db": "^1.1.3"
2099
+      },
2100
+      "bin": {
2101
+        "browserslist": "cli.js"
2102
+      },
2103
+      "engines": {
2104
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
2105
+      }
2106
+    },
2107
+    "node_modules/busboy": {
2108
+      "version": "1.6.0",
2109
+      "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
2110
+      "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
2111
+      "dependencies": {
2112
+        "streamsearch": "^1.1.0"
2113
+      },
2114
+      "engines": {
2115
+        "node": ">=10.16.0"
2116
+      }
2117
+    },
2118
+    "node_modules/call-bind": {
2119
+      "version": "1.0.8",
2120
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
2121
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
2122
+      "dev": true,
2123
+      "license": "MIT",
2124
+      "dependencies": {
2125
+        "call-bind-apply-helpers": "^1.0.0",
2126
+        "es-define-property": "^1.0.0",
2127
+        "get-intrinsic": "^1.2.4",
2128
+        "set-function-length": "^1.2.2"
2129
+      },
2130
+      "engines": {
2131
+        "node": ">= 0.4"
2132
+      },
2133
+      "funding": {
2134
+        "url": "https://github.com/sponsors/ljharb"
2135
+      }
2136
+    },
2137
+    "node_modules/call-bind-apply-helpers": {
2138
+      "version": "1.0.2",
2139
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
2140
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
2141
+      "license": "MIT",
2142
+      "dependencies": {
2143
+        "es-errors": "^1.3.0",
2144
+        "function-bind": "^1.1.2"
2145
+      },
2146
+      "engines": {
2147
+        "node": ">= 0.4"
2148
+      }
2149
+    },
2150
+    "node_modules/call-bound": {
2151
+      "version": "1.0.4",
2152
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
2153
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
2154
+      "dev": true,
2155
+      "license": "MIT",
2156
+      "dependencies": {
2157
+        "call-bind-apply-helpers": "^1.0.2",
2158
+        "get-intrinsic": "^1.3.0"
2159
+      },
2160
+      "engines": {
2161
+        "node": ">= 0.4"
2162
+      },
2163
+      "funding": {
2164
+        "url": "https://github.com/sponsors/ljharb"
2165
+      }
2166
+    },
2167
+    "node_modules/callsites": {
2168
+      "version": "3.1.0",
2169
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
2170
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
2171
+      "dev": true,
2172
+      "license": "MIT",
2173
+      "engines": {
2174
+        "node": ">=6"
2175
+      }
2176
+    },
2177
+    "node_modules/camelcase-css": {
2178
+      "version": "2.0.1",
2179
+      "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
2180
+      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
2181
+      "dev": true,
2182
+      "license": "MIT",
2183
+      "engines": {
2184
+        "node": ">= 6"
2185
+      }
2186
+    },
2187
+    "node_modules/caniuse-lite": {
2188
+      "version": "1.0.30001726",
2189
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz",
2190
+      "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==",
2191
+      "funding": [
2192
+        {
2193
+          "type": "opencollective",
2194
+          "url": "https://opencollective.com/browserslist"
2195
+        },
2196
+        {
2197
+          "type": "tidelift",
2198
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
2199
+        },
2200
+        {
2201
+          "type": "github",
2202
+          "url": "https://github.com/sponsors/ai"
2203
+        }
2204
+      ],
2205
+      "license": "CC-BY-4.0"
2206
+    },
2207
+    "node_modules/chalk": {
2208
+      "version": "4.1.2",
2209
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2210
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2211
+      "dev": true,
2212
+      "license": "MIT",
2213
+      "dependencies": {
2214
+        "ansi-styles": "^4.1.0",
2215
+        "supports-color": "^7.1.0"
2216
+      },
2217
+      "engines": {
2218
+        "node": ">=10"
2219
+      },
2220
+      "funding": {
2221
+        "url": "https://github.com/chalk/chalk?sponsor=1"
2222
+      }
2223
+    },
2224
+    "node_modules/chokidar": {
2225
+      "version": "3.6.0",
2226
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
2227
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
2228
+      "dev": true,
2229
+      "license": "MIT",
2230
+      "dependencies": {
2231
+        "anymatch": "~3.1.2",
2232
+        "braces": "~3.0.2",
2233
+        "glob-parent": "~5.1.2",
2234
+        "is-binary-path": "~2.1.0",
2235
+        "is-glob": "~4.0.1",
2236
+        "normalize-path": "~3.0.0",
2237
+        "readdirp": "~3.6.0"
2238
+      },
2239
+      "engines": {
2240
+        "node": ">= 8.10.0"
2241
+      },
2242
+      "funding": {
2243
+        "url": "https://paulmillr.com/funding/"
2244
+      },
2245
+      "optionalDependencies": {
2246
+        "fsevents": "~2.3.2"
2247
+      }
2248
+    },
2249
+    "node_modules/chokidar/node_modules/glob-parent": {
2250
+      "version": "5.1.2",
2251
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
2252
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
2253
+      "dev": true,
2254
+      "license": "ISC",
2255
+      "dependencies": {
2256
+        "is-glob": "^4.0.1"
2257
+      },
2258
+      "engines": {
2259
+        "node": ">= 6"
2260
+      }
2261
+    },
2262
+    "node_modules/client-only": {
2263
+      "version": "0.0.1",
2264
+      "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
2265
+      "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
2266
+      "license": "MIT"
2267
+    },
2268
+    "node_modules/color": {
2269
+      "version": "4.2.3",
2270
+      "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
2271
+      "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
2272
+      "license": "MIT",
2273
+      "optional": true,
2274
+      "dependencies": {
2275
+        "color-convert": "^2.0.1",
2276
+        "color-string": "^1.9.0"
2277
+      },
2278
+      "engines": {
2279
+        "node": ">=12.5.0"
2280
+      }
2281
+    },
2282
+    "node_modules/color-convert": {
2283
+      "version": "2.0.1",
2284
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2285
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2286
+      "devOptional": true,
2287
+      "license": "MIT",
2288
+      "dependencies": {
2289
+        "color-name": "~1.1.4"
2290
+      },
2291
+      "engines": {
2292
+        "node": ">=7.0.0"
2293
+      }
2294
+    },
2295
+    "node_modules/color-name": {
2296
+      "version": "1.1.4",
2297
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2298
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2299
+      "devOptional": true,
2300
+      "license": "MIT"
2301
+    },
2302
+    "node_modules/color-string": {
2303
+      "version": "1.9.1",
2304
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
2305
+      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
2306
+      "license": "MIT",
2307
+      "optional": true,
2308
+      "dependencies": {
2309
+        "color-name": "^1.0.0",
2310
+        "simple-swizzle": "^0.2.2"
2311
+      }
2312
+    },
2313
+    "node_modules/combined-stream": {
2314
+      "version": "1.0.8",
2315
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
2316
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
2317
+      "license": "MIT",
2318
+      "dependencies": {
2319
+        "delayed-stream": "~1.0.0"
2320
+      },
2321
+      "engines": {
2322
+        "node": ">= 0.8"
2323
+      }
2324
+    },
2325
+    "node_modules/commander": {
2326
+      "version": "4.1.1",
2327
+      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
2328
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
2329
+      "dev": true,
2330
+      "license": "MIT",
2331
+      "engines": {
2332
+        "node": ">= 6"
2333
+      }
2334
+    },
2335
+    "node_modules/concat-map": {
2336
+      "version": "0.0.1",
2337
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2338
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
2339
+      "dev": true,
2340
+      "license": "MIT"
2341
+    },
2342
+    "node_modules/cross-spawn": {
2343
+      "version": "7.0.6",
2344
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
2345
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
2346
+      "dev": true,
2347
+      "license": "MIT",
2348
+      "dependencies": {
2349
+        "path-key": "^3.1.0",
2350
+        "shebang-command": "^2.0.0",
2351
+        "which": "^2.0.1"
2352
+      },
2353
+      "engines": {
2354
+        "node": ">= 8"
2355
+      }
2356
+    },
2357
+    "node_modules/cssesc": {
2358
+      "version": "3.0.0",
2359
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
2360
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
2361
+      "dev": true,
2362
+      "license": "MIT",
2363
+      "bin": {
2364
+        "cssesc": "bin/cssesc"
2365
+      },
2366
+      "engines": {
2367
+        "node": ">=4"
2368
+      }
2369
+    },
2370
+    "node_modules/csstype": {
2371
+      "version": "3.1.3",
2372
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
2373
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
2374
+      "dev": true,
2375
+      "license": "MIT"
2376
+    },
2377
+    "node_modules/damerau-levenshtein": {
2378
+      "version": "1.0.8",
2379
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
2380
+      "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
2381
+      "dev": true,
2382
+      "license": "BSD-2-Clause"
2383
+    },
2384
+    "node_modules/data-view-buffer": {
2385
+      "version": "1.0.2",
2386
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
2387
+      "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
2388
+      "dev": true,
2389
+      "license": "MIT",
2390
+      "dependencies": {
2391
+        "call-bound": "^1.0.3",
2392
+        "es-errors": "^1.3.0",
2393
+        "is-data-view": "^1.0.2"
2394
+      },
2395
+      "engines": {
2396
+        "node": ">= 0.4"
2397
+      },
2398
+      "funding": {
2399
+        "url": "https://github.com/sponsors/ljharb"
2400
+      }
2401
+    },
2402
+    "node_modules/data-view-byte-length": {
2403
+      "version": "1.0.2",
2404
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
2405
+      "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
2406
+      "dev": true,
2407
+      "license": "MIT",
2408
+      "dependencies": {
2409
+        "call-bound": "^1.0.3",
2410
+        "es-errors": "^1.3.0",
2411
+        "is-data-view": "^1.0.2"
2412
+      },
2413
+      "engines": {
2414
+        "node": ">= 0.4"
2415
+      },
2416
+      "funding": {
2417
+        "url": "https://github.com/sponsors/inspect-js"
2418
+      }
2419
+    },
2420
+    "node_modules/data-view-byte-offset": {
2421
+      "version": "1.0.1",
2422
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
2423
+      "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
2424
+      "dev": true,
2425
+      "license": "MIT",
2426
+      "dependencies": {
2427
+        "call-bound": "^1.0.2",
2428
+        "es-errors": "^1.3.0",
2429
+        "is-data-view": "^1.0.1"
2430
+      },
2431
+      "engines": {
2432
+        "node": ">= 0.4"
2433
+      },
2434
+      "funding": {
2435
+        "url": "https://github.com/sponsors/ljharb"
2436
+      }
2437
+    },
2438
+    "node_modules/debug": {
2439
+      "version": "4.4.1",
2440
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
2441
+      "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
2442
+      "dev": true,
2443
+      "license": "MIT",
2444
+      "dependencies": {
2445
+        "ms": "^2.1.3"
2446
+      },
2447
+      "engines": {
2448
+        "node": ">=6.0"
2449
+      },
2450
+      "peerDependenciesMeta": {
2451
+        "supports-color": {
2452
+          "optional": true
2453
+        }
2454
+      }
2455
+    },
2456
+    "node_modules/deep-is": {
2457
+      "version": "0.1.4",
2458
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
2459
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
2460
+      "dev": true,
2461
+      "license": "MIT"
2462
+    },
2463
+    "node_modules/define-data-property": {
2464
+      "version": "1.1.4",
2465
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
2466
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
2467
+      "dev": true,
2468
+      "license": "MIT",
2469
+      "dependencies": {
2470
+        "es-define-property": "^1.0.0",
2471
+        "es-errors": "^1.3.0",
2472
+        "gopd": "^1.0.1"
2473
+      },
2474
+      "engines": {
2475
+        "node": ">= 0.4"
2476
+      },
2477
+      "funding": {
2478
+        "url": "https://github.com/sponsors/ljharb"
2479
+      }
2480
+    },
2481
+    "node_modules/define-properties": {
2482
+      "version": "1.2.1",
2483
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
2484
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
2485
+      "dev": true,
2486
+      "license": "MIT",
2487
+      "dependencies": {
2488
+        "define-data-property": "^1.0.1",
2489
+        "has-property-descriptors": "^1.0.0",
2490
+        "object-keys": "^1.1.1"
2491
+      },
2492
+      "engines": {
2493
+        "node": ">= 0.4"
2494
+      },
2495
+      "funding": {
2496
+        "url": "https://github.com/sponsors/ljharb"
2497
+      }
2498
+    },
2499
+    "node_modules/delayed-stream": {
2500
+      "version": "1.0.0",
2501
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
2502
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
2503
+      "license": "MIT",
2504
+      "engines": {
2505
+        "node": ">=0.4.0"
2506
+      }
2507
+    },
2508
+    "node_modules/detect-libc": {
2509
+      "version": "2.0.4",
2510
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
2511
+      "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
2512
+      "license": "Apache-2.0",
2513
+      "optional": true,
2514
+      "engines": {
2515
+        "node": ">=8"
2516
+      }
2517
+    },
2518
+    "node_modules/didyoumean": {
2519
+      "version": "1.2.2",
2520
+      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
2521
+      "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
2522
+      "dev": true,
2523
+      "license": "Apache-2.0"
2524
+    },
2525
+    "node_modules/dlv": {
2526
+      "version": "1.1.3",
2527
+      "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
2528
+      "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
2529
+      "dev": true,
2530
+      "license": "MIT"
2531
+    },
2532
+    "node_modules/doctrine": {
2533
+      "version": "2.1.0",
2534
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
2535
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
2536
+      "dev": true,
2537
+      "license": "Apache-2.0",
2538
+      "dependencies": {
2539
+        "esutils": "^2.0.2"
2540
+      },
2541
+      "engines": {
2542
+        "node": ">=0.10.0"
2543
+      }
2544
+    },
2545
+    "node_modules/dunder-proto": {
2546
+      "version": "1.0.1",
2547
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
2548
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
2549
+      "license": "MIT",
2550
+      "dependencies": {
2551
+        "call-bind-apply-helpers": "^1.0.1",
2552
+        "es-errors": "^1.3.0",
2553
+        "gopd": "^1.2.0"
2554
+      },
2555
+      "engines": {
2556
+        "node": ">= 0.4"
2557
+      }
2558
+    },
2559
+    "node_modules/eastasianwidth": {
2560
+      "version": "0.2.0",
2561
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
2562
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
2563
+      "dev": true,
2564
+      "license": "MIT"
2565
+    },
2566
+    "node_modules/electron-to-chromium": {
2567
+      "version": "1.5.177",
2568
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz",
2569
+      "integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==",
2570
+      "dev": true,
2571
+      "license": "ISC"
2572
+    },
2573
+    "node_modules/emoji-regex": {
2574
+      "version": "9.2.2",
2575
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
2576
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
2577
+      "dev": true,
2578
+      "license": "MIT"
2579
+    },
2580
+    "node_modules/es-abstract": {
2581
+      "version": "1.24.0",
2582
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
2583
+      "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
2584
+      "dev": true,
2585
+      "license": "MIT",
2586
+      "dependencies": {
2587
+        "array-buffer-byte-length": "^1.0.2",
2588
+        "arraybuffer.prototype.slice": "^1.0.4",
2589
+        "available-typed-arrays": "^1.0.7",
2590
+        "call-bind": "^1.0.8",
2591
+        "call-bound": "^1.0.4",
2592
+        "data-view-buffer": "^1.0.2",
2593
+        "data-view-byte-length": "^1.0.2",
2594
+        "data-view-byte-offset": "^1.0.1",
2595
+        "es-define-property": "^1.0.1",
2596
+        "es-errors": "^1.3.0",
2597
+        "es-object-atoms": "^1.1.1",
2598
+        "es-set-tostringtag": "^2.1.0",
2599
+        "es-to-primitive": "^1.3.0",
2600
+        "function.prototype.name": "^1.1.8",
2601
+        "get-intrinsic": "^1.3.0",
2602
+        "get-proto": "^1.0.1",
2603
+        "get-symbol-description": "^1.1.0",
2604
+        "globalthis": "^1.0.4",
2605
+        "gopd": "^1.2.0",
2606
+        "has-property-descriptors": "^1.0.2",
2607
+        "has-proto": "^1.2.0",
2608
+        "has-symbols": "^1.1.0",
2609
+        "hasown": "^2.0.2",
2610
+        "internal-slot": "^1.1.0",
2611
+        "is-array-buffer": "^3.0.5",
2612
+        "is-callable": "^1.2.7",
2613
+        "is-data-view": "^1.0.2",
2614
+        "is-negative-zero": "^2.0.3",
2615
+        "is-regex": "^1.2.1",
2616
+        "is-set": "^2.0.3",
2617
+        "is-shared-array-buffer": "^1.0.4",
2618
+        "is-string": "^1.1.1",
2619
+        "is-typed-array": "^1.1.15",
2620
+        "is-weakref": "^1.1.1",
2621
+        "math-intrinsics": "^1.1.0",
2622
+        "object-inspect": "^1.13.4",
2623
+        "object-keys": "^1.1.1",
2624
+        "object.assign": "^4.1.7",
2625
+        "own-keys": "^1.0.1",
2626
+        "regexp.prototype.flags": "^1.5.4",
2627
+        "safe-array-concat": "^1.1.3",
2628
+        "safe-push-apply": "^1.0.0",
2629
+        "safe-regex-test": "^1.1.0",
2630
+        "set-proto": "^1.0.0",
2631
+        "stop-iteration-iterator": "^1.1.0",
2632
+        "string.prototype.trim": "^1.2.10",
2633
+        "string.prototype.trimend": "^1.0.9",
2634
+        "string.prototype.trimstart": "^1.0.8",
2635
+        "typed-array-buffer": "^1.0.3",
2636
+        "typed-array-byte-length": "^1.0.3",
2637
+        "typed-array-byte-offset": "^1.0.4",
2638
+        "typed-array-length": "^1.0.7",
2639
+        "unbox-primitive": "^1.1.0",
2640
+        "which-typed-array": "^1.1.19"
2641
+      },
2642
+      "engines": {
2643
+        "node": ">= 0.4"
2644
+      },
2645
+      "funding": {
2646
+        "url": "https://github.com/sponsors/ljharb"
2647
+      }
2648
+    },
2649
+    "node_modules/es-define-property": {
2650
+      "version": "1.0.1",
2651
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
2652
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
2653
+      "license": "MIT",
2654
+      "engines": {
2655
+        "node": ">= 0.4"
2656
+      }
2657
+    },
2658
+    "node_modules/es-errors": {
2659
+      "version": "1.3.0",
2660
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
2661
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
2662
+      "license": "MIT",
2663
+      "engines": {
2664
+        "node": ">= 0.4"
2665
+      }
2666
+    },
2667
+    "node_modules/es-iterator-helpers": {
2668
+      "version": "1.2.1",
2669
+      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
2670
+      "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
2671
+      "dev": true,
2672
+      "license": "MIT",
2673
+      "dependencies": {
2674
+        "call-bind": "^1.0.8",
2675
+        "call-bound": "^1.0.3",
2676
+        "define-properties": "^1.2.1",
2677
+        "es-abstract": "^1.23.6",
2678
+        "es-errors": "^1.3.0",
2679
+        "es-set-tostringtag": "^2.0.3",
2680
+        "function-bind": "^1.1.2",
2681
+        "get-intrinsic": "^1.2.6",
2682
+        "globalthis": "^1.0.4",
2683
+        "gopd": "^1.2.0",
2684
+        "has-property-descriptors": "^1.0.2",
2685
+        "has-proto": "^1.2.0",
2686
+        "has-symbols": "^1.1.0",
2687
+        "internal-slot": "^1.1.0",
2688
+        "iterator.prototype": "^1.1.4",
2689
+        "safe-array-concat": "^1.1.3"
2690
+      },
2691
+      "engines": {
2692
+        "node": ">= 0.4"
2693
+      }
2694
+    },
2695
+    "node_modules/es-object-atoms": {
2696
+      "version": "1.1.1",
2697
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
2698
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
2699
+      "license": "MIT",
2700
+      "dependencies": {
2701
+        "es-errors": "^1.3.0"
2702
+      },
2703
+      "engines": {
2704
+        "node": ">= 0.4"
2705
+      }
2706
+    },
2707
+    "node_modules/es-set-tostringtag": {
2708
+      "version": "2.1.0",
2709
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
2710
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
2711
+      "license": "MIT",
2712
+      "dependencies": {
2713
+        "es-errors": "^1.3.0",
2714
+        "get-intrinsic": "^1.2.6",
2715
+        "has-tostringtag": "^1.0.2",
2716
+        "hasown": "^2.0.2"
2717
+      },
2718
+      "engines": {
2719
+        "node": ">= 0.4"
2720
+      }
2721
+    },
2722
+    "node_modules/es-shim-unscopables": {
2723
+      "version": "1.1.0",
2724
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
2725
+      "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
2726
+      "dev": true,
2727
+      "license": "MIT",
2728
+      "dependencies": {
2729
+        "hasown": "^2.0.2"
2730
+      },
2731
+      "engines": {
2732
+        "node": ">= 0.4"
2733
+      }
2734
+    },
2735
+    "node_modules/es-to-primitive": {
2736
+      "version": "1.3.0",
2737
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
2738
+      "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
2739
+      "dev": true,
2740
+      "license": "MIT",
2741
+      "dependencies": {
2742
+        "is-callable": "^1.2.7",
2743
+        "is-date-object": "^1.0.5",
2744
+        "is-symbol": "^1.0.4"
2745
+      },
2746
+      "engines": {
2747
+        "node": ">= 0.4"
2748
+      },
2749
+      "funding": {
2750
+        "url": "https://github.com/sponsors/ljharb"
2751
+      }
2752
+    },
2753
+    "node_modules/escalade": {
2754
+      "version": "3.2.0",
2755
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
2756
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
2757
+      "dev": true,
2758
+      "license": "MIT",
2759
+      "engines": {
2760
+        "node": ">=6"
2761
+      }
2762
+    },
2763
+    "node_modules/escape-string-regexp": {
2764
+      "version": "4.0.0",
2765
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
2766
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
2767
+      "dev": true,
2768
+      "license": "MIT",
2769
+      "engines": {
2770
+        "node": ">=10"
2771
+      },
2772
+      "funding": {
2773
+        "url": "https://github.com/sponsors/sindresorhus"
2774
+      }
2775
+    },
2776
+    "node_modules/eslint": {
2777
+      "version": "9.29.0",
2778
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz",
2779
+      "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==",
2780
+      "dev": true,
2781
+      "license": "MIT",
2782
+      "dependencies": {
2783
+        "@eslint-community/eslint-utils": "^4.2.0",
2784
+        "@eslint-community/regexpp": "^4.12.1",
2785
+        "@eslint/config-array": "^0.20.1",
2786
+        "@eslint/config-helpers": "^0.2.1",
2787
+        "@eslint/core": "^0.14.0",
2788
+        "@eslint/eslintrc": "^3.3.1",
2789
+        "@eslint/js": "9.29.0",
2790
+        "@eslint/plugin-kit": "^0.3.1",
2791
+        "@humanfs/node": "^0.16.6",
2792
+        "@humanwhocodes/module-importer": "^1.0.1",
2793
+        "@humanwhocodes/retry": "^0.4.2",
2794
+        "@types/estree": "^1.0.6",
2795
+        "@types/json-schema": "^7.0.15",
2796
+        "ajv": "^6.12.4",
2797
+        "chalk": "^4.0.0",
2798
+        "cross-spawn": "^7.0.6",
2799
+        "debug": "^4.3.2",
2800
+        "escape-string-regexp": "^4.0.0",
2801
+        "eslint-scope": "^8.4.0",
2802
+        "eslint-visitor-keys": "^4.2.1",
2803
+        "espree": "^10.4.0",
2804
+        "esquery": "^1.5.0",
2805
+        "esutils": "^2.0.2",
2806
+        "fast-deep-equal": "^3.1.3",
2807
+        "file-entry-cache": "^8.0.0",
2808
+        "find-up": "^5.0.0",
2809
+        "glob-parent": "^6.0.2",
2810
+        "ignore": "^5.2.0",
2811
+        "imurmurhash": "^0.1.4",
2812
+        "is-glob": "^4.0.0",
2813
+        "json-stable-stringify-without-jsonify": "^1.0.1",
2814
+        "lodash.merge": "^4.6.2",
2815
+        "minimatch": "^3.1.2",
2816
+        "natural-compare": "^1.4.0",
2817
+        "optionator": "^0.9.3"
2818
+      },
2819
+      "bin": {
2820
+        "eslint": "bin/eslint.js"
2821
+      },
2822
+      "engines": {
2823
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2824
+      },
2825
+      "funding": {
2826
+        "url": "https://eslint.org/donate"
2827
+      },
2828
+      "peerDependencies": {
2829
+        "jiti": "*"
2830
+      },
2831
+      "peerDependenciesMeta": {
2832
+        "jiti": {
2833
+          "optional": true
2834
+        }
2835
+      }
2836
+    },
2837
+    "node_modules/eslint-config-next": {
2838
+      "version": "15.1.3",
2839
+      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.1.3.tgz",
2840
+      "integrity": "sha512-wGYlNuWnh4ujuKtZvH+7B2Z2vy9nONZE6ztd+DKF7hAsIabkrxmD4TzYHzASHENo42lmz2tnT2B+zN2sOHvpJg==",
2841
+      "dev": true,
2842
+      "license": "MIT",
2843
+      "dependencies": {
2844
+        "@next/eslint-plugin-next": "15.1.3",
2845
+        "@rushstack/eslint-patch": "^1.10.3",
2846
+        "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
2847
+        "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
2848
+        "eslint-import-resolver-node": "^0.3.6",
2849
+        "eslint-import-resolver-typescript": "^3.5.2",
2850
+        "eslint-plugin-import": "^2.31.0",
2851
+        "eslint-plugin-jsx-a11y": "^6.10.0",
2852
+        "eslint-plugin-react": "^7.37.0",
2853
+        "eslint-plugin-react-hooks": "^5.0.0"
2854
+      },
2855
+      "peerDependencies": {
2856
+        "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0",
2857
+        "typescript": ">=3.3.1"
2858
+      },
2859
+      "peerDependenciesMeta": {
2860
+        "typescript": {
2861
+          "optional": true
2862
+        }
2863
+      }
2864
+    },
2865
+    "node_modules/eslint-import-resolver-node": {
2866
+      "version": "0.3.9",
2867
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
2868
+      "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
2869
+      "dev": true,
2870
+      "license": "MIT",
2871
+      "dependencies": {
2872
+        "debug": "^3.2.7",
2873
+        "is-core-module": "^2.13.0",
2874
+        "resolve": "^1.22.4"
2875
+      }
2876
+    },
2877
+    "node_modules/eslint-import-resolver-node/node_modules/debug": {
2878
+      "version": "3.2.7",
2879
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
2880
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
2881
+      "dev": true,
2882
+      "license": "MIT",
2883
+      "dependencies": {
2884
+        "ms": "^2.1.1"
2885
+      }
2886
+    },
2887
+    "node_modules/eslint-import-resolver-typescript": {
2888
+      "version": "3.10.1",
2889
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
2890
+      "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
2891
+      "dev": true,
2892
+      "license": "ISC",
2893
+      "dependencies": {
2894
+        "@nolyfill/is-core-module": "1.0.39",
2895
+        "debug": "^4.4.0",
2896
+        "get-tsconfig": "^4.10.0",
2897
+        "is-bun-module": "^2.0.0",
2898
+        "stable-hash": "^0.0.5",
2899
+        "tinyglobby": "^0.2.13",
2900
+        "unrs-resolver": "^1.6.2"
2901
+      },
2902
+      "engines": {
2903
+        "node": "^14.18.0 || >=16.0.0"
2904
+      },
2905
+      "funding": {
2906
+        "url": "https://opencollective.com/eslint-import-resolver-typescript"
2907
+      },
2908
+      "peerDependencies": {
2909
+        "eslint": "*",
2910
+        "eslint-plugin-import": "*",
2911
+        "eslint-plugin-import-x": "*"
2912
+      },
2913
+      "peerDependenciesMeta": {
2914
+        "eslint-plugin-import": {
2915
+          "optional": true
2916
+        },
2917
+        "eslint-plugin-import-x": {
2918
+          "optional": true
2919
+        }
2920
+      }
2921
+    },
2922
+    "node_modules/eslint-module-utils": {
2923
+      "version": "2.12.1",
2924
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
2925
+      "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
2926
+      "dev": true,
2927
+      "license": "MIT",
2928
+      "dependencies": {
2929
+        "debug": "^3.2.7"
2930
+      },
2931
+      "engines": {
2932
+        "node": ">=4"
2933
+      },
2934
+      "peerDependenciesMeta": {
2935
+        "eslint": {
2936
+          "optional": true
2937
+        }
2938
+      }
2939
+    },
2940
+    "node_modules/eslint-module-utils/node_modules/debug": {
2941
+      "version": "3.2.7",
2942
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
2943
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
2944
+      "dev": true,
2945
+      "license": "MIT",
2946
+      "dependencies": {
2947
+        "ms": "^2.1.1"
2948
+      }
2949
+    },
2950
+    "node_modules/eslint-plugin-import": {
2951
+      "version": "2.32.0",
2952
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
2953
+      "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
2954
+      "dev": true,
2955
+      "license": "MIT",
2956
+      "dependencies": {
2957
+        "@rtsao/scc": "^1.1.0",
2958
+        "array-includes": "^3.1.9",
2959
+        "array.prototype.findlastindex": "^1.2.6",
2960
+        "array.prototype.flat": "^1.3.3",
2961
+        "array.prototype.flatmap": "^1.3.3",
2962
+        "debug": "^3.2.7",
2963
+        "doctrine": "^2.1.0",
2964
+        "eslint-import-resolver-node": "^0.3.9",
2965
+        "eslint-module-utils": "^2.12.1",
2966
+        "hasown": "^2.0.2",
2967
+        "is-core-module": "^2.16.1",
2968
+        "is-glob": "^4.0.3",
2969
+        "minimatch": "^3.1.2",
2970
+        "object.fromentries": "^2.0.8",
2971
+        "object.groupby": "^1.0.3",
2972
+        "object.values": "^1.2.1",
2973
+        "semver": "^6.3.1",
2974
+        "string.prototype.trimend": "^1.0.9",
2975
+        "tsconfig-paths": "^3.15.0"
2976
+      },
2977
+      "engines": {
2978
+        "node": ">=4"
2979
+      },
2980
+      "peerDependencies": {
2981
+        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
2982
+      }
2983
+    },
2984
+    "node_modules/eslint-plugin-import/node_modules/debug": {
2985
+      "version": "3.2.7",
2986
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
2987
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
2988
+      "dev": true,
2989
+      "license": "MIT",
2990
+      "dependencies": {
2991
+        "ms": "^2.1.1"
2992
+      }
2993
+    },
2994
+    "node_modules/eslint-plugin-import/node_modules/semver": {
2995
+      "version": "6.3.1",
2996
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2997
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2998
+      "dev": true,
2999
+      "license": "ISC",
3000
+      "bin": {
3001
+        "semver": "bin/semver.js"
3002
+      }
3003
+    },
3004
+    "node_modules/eslint-plugin-jsx-a11y": {
3005
+      "version": "6.10.2",
3006
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
3007
+      "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
3008
+      "dev": true,
3009
+      "license": "MIT",
3010
+      "dependencies": {
3011
+        "aria-query": "^5.3.2",
3012
+        "array-includes": "^3.1.8",
3013
+        "array.prototype.flatmap": "^1.3.2",
3014
+        "ast-types-flow": "^0.0.8",
3015
+        "axe-core": "^4.10.0",
3016
+        "axobject-query": "^4.1.0",
3017
+        "damerau-levenshtein": "^1.0.8",
3018
+        "emoji-regex": "^9.2.2",
3019
+        "hasown": "^2.0.2",
3020
+        "jsx-ast-utils": "^3.3.5",
3021
+        "language-tags": "^1.0.9",
3022
+        "minimatch": "^3.1.2",
3023
+        "object.fromentries": "^2.0.8",
3024
+        "safe-regex-test": "^1.0.3",
3025
+        "string.prototype.includes": "^2.0.1"
3026
+      },
3027
+      "engines": {
3028
+        "node": ">=4.0"
3029
+      },
3030
+      "peerDependencies": {
3031
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
3032
+      }
3033
+    },
3034
+    "node_modules/eslint-plugin-react": {
3035
+      "version": "7.37.5",
3036
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
3037
+      "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
3038
+      "dev": true,
3039
+      "license": "MIT",
3040
+      "dependencies": {
3041
+        "array-includes": "^3.1.8",
3042
+        "array.prototype.findlast": "^1.2.5",
3043
+        "array.prototype.flatmap": "^1.3.3",
3044
+        "array.prototype.tosorted": "^1.1.4",
3045
+        "doctrine": "^2.1.0",
3046
+        "es-iterator-helpers": "^1.2.1",
3047
+        "estraverse": "^5.3.0",
3048
+        "hasown": "^2.0.2",
3049
+        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
3050
+        "minimatch": "^3.1.2",
3051
+        "object.entries": "^1.1.9",
3052
+        "object.fromentries": "^2.0.8",
3053
+        "object.values": "^1.2.1",
3054
+        "prop-types": "^15.8.1",
3055
+        "resolve": "^2.0.0-next.5",
3056
+        "semver": "^6.3.1",
3057
+        "string.prototype.matchall": "^4.0.12",
3058
+        "string.prototype.repeat": "^1.0.0"
3059
+      },
3060
+      "engines": {
3061
+        "node": ">=4"
3062
+      },
3063
+      "peerDependencies": {
3064
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
3065
+      }
3066
+    },
3067
+    "node_modules/eslint-plugin-react-hooks": {
3068
+      "version": "5.2.0",
3069
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
3070
+      "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
3071
+      "dev": true,
3072
+      "license": "MIT",
3073
+      "engines": {
3074
+        "node": ">=10"
3075
+      },
3076
+      "peerDependencies": {
3077
+        "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
3078
+      }
3079
+    },
3080
+    "node_modules/eslint-plugin-react/node_modules/resolve": {
3081
+      "version": "2.0.0-next.5",
3082
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
3083
+      "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
3084
+      "dev": true,
3085
+      "license": "MIT",
3086
+      "dependencies": {
3087
+        "is-core-module": "^2.13.0",
3088
+        "path-parse": "^1.0.7",
3089
+        "supports-preserve-symlinks-flag": "^1.0.0"
3090
+      },
3091
+      "bin": {
3092
+        "resolve": "bin/resolve"
3093
+      },
3094
+      "funding": {
3095
+        "url": "https://github.com/sponsors/ljharb"
3096
+      }
3097
+    },
3098
+    "node_modules/eslint-plugin-react/node_modules/semver": {
3099
+      "version": "6.3.1",
3100
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
3101
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
3102
+      "dev": true,
3103
+      "license": "ISC",
3104
+      "bin": {
3105
+        "semver": "bin/semver.js"
3106
+      }
3107
+    },
3108
+    "node_modules/eslint-scope": {
3109
+      "version": "8.4.0",
3110
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
3111
+      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
3112
+      "dev": true,
3113
+      "license": "BSD-2-Clause",
3114
+      "dependencies": {
3115
+        "esrecurse": "^4.3.0",
3116
+        "estraverse": "^5.2.0"
3117
+      },
3118
+      "engines": {
3119
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3120
+      },
3121
+      "funding": {
3122
+        "url": "https://opencollective.com/eslint"
3123
+      }
3124
+    },
3125
+    "node_modules/eslint-visitor-keys": {
3126
+      "version": "4.2.1",
3127
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
3128
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
3129
+      "dev": true,
3130
+      "license": "Apache-2.0",
3131
+      "engines": {
3132
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3133
+      },
3134
+      "funding": {
3135
+        "url": "https://opencollective.com/eslint"
3136
+      }
3137
+    },
3138
+    "node_modules/espree": {
3139
+      "version": "10.4.0",
3140
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
3141
+      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
3142
+      "dev": true,
3143
+      "license": "BSD-2-Clause",
3144
+      "dependencies": {
3145
+        "acorn": "^8.15.0",
3146
+        "acorn-jsx": "^5.3.2",
3147
+        "eslint-visitor-keys": "^4.2.1"
3148
+      },
3149
+      "engines": {
3150
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3151
+      },
3152
+      "funding": {
3153
+        "url": "https://opencollective.com/eslint"
3154
+      }
3155
+    },
3156
+    "node_modules/esquery": {
3157
+      "version": "1.6.0",
3158
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
3159
+      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
3160
+      "dev": true,
3161
+      "license": "BSD-3-Clause",
3162
+      "dependencies": {
3163
+        "estraverse": "^5.1.0"
3164
+      },
3165
+      "engines": {
3166
+        "node": ">=0.10"
3167
+      }
3168
+    },
3169
+    "node_modules/esrecurse": {
3170
+      "version": "4.3.0",
3171
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
3172
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
3173
+      "dev": true,
3174
+      "license": "BSD-2-Clause",
3175
+      "dependencies": {
3176
+        "estraverse": "^5.2.0"
3177
+      },
3178
+      "engines": {
3179
+        "node": ">=4.0"
3180
+      }
3181
+    },
3182
+    "node_modules/estraverse": {
3183
+      "version": "5.3.0",
3184
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
3185
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
3186
+      "dev": true,
3187
+      "license": "BSD-2-Clause",
3188
+      "engines": {
3189
+        "node": ">=4.0"
3190
+      }
3191
+    },
3192
+    "node_modules/esutils": {
3193
+      "version": "2.0.3",
3194
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
3195
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
3196
+      "dev": true,
3197
+      "license": "BSD-2-Clause",
3198
+      "engines": {
3199
+        "node": ">=0.10.0"
3200
+      }
3201
+    },
3202
+    "node_modules/fast-deep-equal": {
3203
+      "version": "3.1.3",
3204
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
3205
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
3206
+      "dev": true,
3207
+      "license": "MIT"
3208
+    },
3209
+    "node_modules/fast-glob": {
3210
+      "version": "3.3.1",
3211
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
3212
+      "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
3213
+      "dev": true,
3214
+      "license": "MIT",
3215
+      "dependencies": {
3216
+        "@nodelib/fs.stat": "^2.0.2",
3217
+        "@nodelib/fs.walk": "^1.2.3",
3218
+        "glob-parent": "^5.1.2",
3219
+        "merge2": "^1.3.0",
3220
+        "micromatch": "^4.0.4"
3221
+      },
3222
+      "engines": {
3223
+        "node": ">=8.6.0"
3224
+      }
3225
+    },
3226
+    "node_modules/fast-glob/node_modules/glob-parent": {
3227
+      "version": "5.1.2",
3228
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
3229
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
3230
+      "dev": true,
3231
+      "license": "ISC",
3232
+      "dependencies": {
3233
+        "is-glob": "^4.0.1"
3234
+      },
3235
+      "engines": {
3236
+        "node": ">= 6"
3237
+      }
3238
+    },
3239
+    "node_modules/fast-json-stable-stringify": {
3240
+      "version": "2.1.0",
3241
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
3242
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
3243
+      "dev": true,
3244
+      "license": "MIT"
3245
+    },
3246
+    "node_modules/fast-levenshtein": {
3247
+      "version": "2.0.6",
3248
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
3249
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
3250
+      "dev": true,
3251
+      "license": "MIT"
3252
+    },
3253
+    "node_modules/fastq": {
3254
+      "version": "1.19.1",
3255
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
3256
+      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
3257
+      "dev": true,
3258
+      "license": "ISC",
3259
+      "dependencies": {
3260
+        "reusify": "^1.0.4"
3261
+      }
3262
+    },
3263
+    "node_modules/file-entry-cache": {
3264
+      "version": "8.0.0",
3265
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
3266
+      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
3267
+      "dev": true,
3268
+      "license": "MIT",
3269
+      "dependencies": {
3270
+        "flat-cache": "^4.0.0"
3271
+      },
3272
+      "engines": {
3273
+        "node": ">=16.0.0"
3274
+      }
3275
+    },
3276
+    "node_modules/fill-range": {
3277
+      "version": "7.1.1",
3278
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
3279
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
3280
+      "dev": true,
3281
+      "license": "MIT",
3282
+      "dependencies": {
3283
+        "to-regex-range": "^5.0.1"
3284
+      },
3285
+      "engines": {
3286
+        "node": ">=8"
3287
+      }
3288
+    },
3289
+    "node_modules/find-up": {
3290
+      "version": "5.0.0",
3291
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
3292
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
3293
+      "dev": true,
3294
+      "license": "MIT",
3295
+      "dependencies": {
3296
+        "locate-path": "^6.0.0",
3297
+        "path-exists": "^4.0.0"
3298
+      },
3299
+      "engines": {
3300
+        "node": ">=10"
3301
+      },
3302
+      "funding": {
3303
+        "url": "https://github.com/sponsors/sindresorhus"
3304
+      }
3305
+    },
3306
+    "node_modules/flat-cache": {
3307
+      "version": "4.0.1",
3308
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
3309
+      "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
3310
+      "dev": true,
3311
+      "license": "MIT",
3312
+      "dependencies": {
3313
+        "flatted": "^3.2.9",
3314
+        "keyv": "^4.5.4"
3315
+      },
3316
+      "engines": {
3317
+        "node": ">=16"
3318
+      }
3319
+    },
3320
+    "node_modules/flatted": {
3321
+      "version": "3.3.3",
3322
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
3323
+      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
3324
+      "dev": true,
3325
+      "license": "ISC"
3326
+    },
3327
+    "node_modules/follow-redirects": {
3328
+      "version": "1.15.9",
3329
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
3330
+      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
3331
+      "funding": [
3332
+        {
3333
+          "type": "individual",
3334
+          "url": "https://github.com/sponsors/RubenVerborgh"
3335
+        }
3336
+      ],
3337
+      "license": "MIT",
3338
+      "engines": {
3339
+        "node": ">=4.0"
3340
+      },
3341
+      "peerDependenciesMeta": {
3342
+        "debug": {
3343
+          "optional": true
3344
+        }
3345
+      }
3346
+    },
3347
+    "node_modules/for-each": {
3348
+      "version": "0.3.5",
3349
+      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
3350
+      "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
3351
+      "dev": true,
3352
+      "license": "MIT",
3353
+      "dependencies": {
3354
+        "is-callable": "^1.2.7"
3355
+      },
3356
+      "engines": {
3357
+        "node": ">= 0.4"
3358
+      },
3359
+      "funding": {
3360
+        "url": "https://github.com/sponsors/ljharb"
3361
+      }
3362
+    },
3363
+    "node_modules/foreground-child": {
3364
+      "version": "3.3.1",
3365
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
3366
+      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
3367
+      "dev": true,
3368
+      "license": "ISC",
3369
+      "dependencies": {
3370
+        "cross-spawn": "^7.0.6",
3371
+        "signal-exit": "^4.0.1"
3372
+      },
3373
+      "engines": {
3374
+        "node": ">=14"
3375
+      },
3376
+      "funding": {
3377
+        "url": "https://github.com/sponsors/isaacs"
3378
+      }
3379
+    },
3380
+    "node_modules/form-data": {
3381
+      "version": "4.0.3",
3382
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
3383
+      "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
3384
+      "license": "MIT",
3385
+      "dependencies": {
3386
+        "asynckit": "^0.4.0",
3387
+        "combined-stream": "^1.0.8",
3388
+        "es-set-tostringtag": "^2.1.0",
3389
+        "hasown": "^2.0.2",
3390
+        "mime-types": "^2.1.12"
3391
+      },
3392
+      "engines": {
3393
+        "node": ">= 6"
3394
+      }
3395
+    },
3396
+    "node_modules/fraction.js": {
3397
+      "version": "4.3.7",
3398
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
3399
+      "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
3400
+      "dev": true,
3401
+      "license": "MIT",
3402
+      "engines": {
3403
+        "node": "*"
3404
+      },
3405
+      "funding": {
3406
+        "type": "patreon",
3407
+        "url": "https://github.com/sponsors/rawify"
3408
+      }
3409
+    },
3410
+    "node_modules/fsevents": {
3411
+      "version": "2.3.3",
3412
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
3413
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
3414
+      "dev": true,
3415
+      "hasInstallScript": true,
3416
+      "license": "MIT",
3417
+      "optional": true,
3418
+      "os": [
3419
+        "darwin"
3420
+      ],
3421
+      "engines": {
3422
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
3423
+      }
3424
+    },
3425
+    "node_modules/function-bind": {
3426
+      "version": "1.1.2",
3427
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
3428
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
3429
+      "license": "MIT",
3430
+      "funding": {
3431
+        "url": "https://github.com/sponsors/ljharb"
3432
+      }
3433
+    },
3434
+    "node_modules/function.prototype.name": {
3435
+      "version": "1.1.8",
3436
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
3437
+      "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
3438
+      "dev": true,
3439
+      "license": "MIT",
3440
+      "dependencies": {
3441
+        "call-bind": "^1.0.8",
3442
+        "call-bound": "^1.0.3",
3443
+        "define-properties": "^1.2.1",
3444
+        "functions-have-names": "^1.2.3",
3445
+        "hasown": "^2.0.2",
3446
+        "is-callable": "^1.2.7"
3447
+      },
3448
+      "engines": {
3449
+        "node": ">= 0.4"
3450
+      },
3451
+      "funding": {
3452
+        "url": "https://github.com/sponsors/ljharb"
3453
+      }
3454
+    },
3455
+    "node_modules/functions-have-names": {
3456
+      "version": "1.2.3",
3457
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
3458
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
3459
+      "dev": true,
3460
+      "license": "MIT",
3461
+      "funding": {
3462
+        "url": "https://github.com/sponsors/ljharb"
3463
+      }
3464
+    },
3465
+    "node_modules/get-intrinsic": {
3466
+      "version": "1.3.0",
3467
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
3468
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
3469
+      "license": "MIT",
3470
+      "dependencies": {
3471
+        "call-bind-apply-helpers": "^1.0.2",
3472
+        "es-define-property": "^1.0.1",
3473
+        "es-errors": "^1.3.0",
3474
+        "es-object-atoms": "^1.1.1",
3475
+        "function-bind": "^1.1.2",
3476
+        "get-proto": "^1.0.1",
3477
+        "gopd": "^1.2.0",
3478
+        "has-symbols": "^1.1.0",
3479
+        "hasown": "^2.0.2",
3480
+        "math-intrinsics": "^1.1.0"
3481
+      },
3482
+      "engines": {
3483
+        "node": ">= 0.4"
3484
+      },
3485
+      "funding": {
3486
+        "url": "https://github.com/sponsors/ljharb"
3487
+      }
3488
+    },
3489
+    "node_modules/get-proto": {
3490
+      "version": "1.0.1",
3491
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
3492
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
3493
+      "license": "MIT",
3494
+      "dependencies": {
3495
+        "dunder-proto": "^1.0.1",
3496
+        "es-object-atoms": "^1.0.0"
3497
+      },
3498
+      "engines": {
3499
+        "node": ">= 0.4"
3500
+      }
3501
+    },
3502
+    "node_modules/get-symbol-description": {
3503
+      "version": "1.1.0",
3504
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
3505
+      "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
3506
+      "dev": true,
3507
+      "license": "MIT",
3508
+      "dependencies": {
3509
+        "call-bound": "^1.0.3",
3510
+        "es-errors": "^1.3.0",
3511
+        "get-intrinsic": "^1.2.6"
3512
+      },
3513
+      "engines": {
3514
+        "node": ">= 0.4"
3515
+      },
3516
+      "funding": {
3517
+        "url": "https://github.com/sponsors/ljharb"
3518
+      }
3519
+    },
3520
+    "node_modules/get-tsconfig": {
3521
+      "version": "4.10.1",
3522
+      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
3523
+      "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
3524
+      "dev": true,
3525
+      "license": "MIT",
3526
+      "dependencies": {
3527
+        "resolve-pkg-maps": "^1.0.0"
3528
+      },
3529
+      "funding": {
3530
+        "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
3531
+      }
3532
+    },
3533
+    "node_modules/glob": {
3534
+      "version": "10.4.5",
3535
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
3536
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
3537
+      "dev": true,
3538
+      "license": "ISC",
3539
+      "dependencies": {
3540
+        "foreground-child": "^3.1.0",
3541
+        "jackspeak": "^3.1.2",
3542
+        "minimatch": "^9.0.4",
3543
+        "minipass": "^7.1.2",
3544
+        "package-json-from-dist": "^1.0.0",
3545
+        "path-scurry": "^1.11.1"
3546
+      },
3547
+      "bin": {
3548
+        "glob": "dist/esm/bin.mjs"
3549
+      },
3550
+      "funding": {
3551
+        "url": "https://github.com/sponsors/isaacs"
3552
+      }
3553
+    },
3554
+    "node_modules/glob-parent": {
3555
+      "version": "6.0.2",
3556
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
3557
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
3558
+      "dev": true,
3559
+      "license": "ISC",
3560
+      "dependencies": {
3561
+        "is-glob": "^4.0.3"
3562
+      },
3563
+      "engines": {
3564
+        "node": ">=10.13.0"
3565
+      }
3566
+    },
3567
+    "node_modules/glob/node_modules/brace-expansion": {
3568
+      "version": "2.0.2",
3569
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
3570
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
3571
+      "dev": true,
3572
+      "license": "MIT",
3573
+      "dependencies": {
3574
+        "balanced-match": "^1.0.0"
3575
+      }
3576
+    },
3577
+    "node_modules/glob/node_modules/minimatch": {
3578
+      "version": "9.0.5",
3579
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
3580
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
3581
+      "dev": true,
3582
+      "license": "ISC",
3583
+      "dependencies": {
3584
+        "brace-expansion": "^2.0.1"
3585
+      },
3586
+      "engines": {
3587
+        "node": ">=16 || 14 >=14.17"
3588
+      },
3589
+      "funding": {
3590
+        "url": "https://github.com/sponsors/isaacs"
3591
+      }
3592
+    },
3593
+    "node_modules/globals": {
3594
+      "version": "14.0.0",
3595
+      "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
3596
+      "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
3597
+      "dev": true,
3598
+      "license": "MIT",
3599
+      "engines": {
3600
+        "node": ">=18"
3601
+      },
3602
+      "funding": {
3603
+        "url": "https://github.com/sponsors/sindresorhus"
3604
+      }
3605
+    },
3606
+    "node_modules/globalthis": {
3607
+      "version": "1.0.4",
3608
+      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
3609
+      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
3610
+      "dev": true,
3611
+      "license": "MIT",
3612
+      "dependencies": {
3613
+        "define-properties": "^1.2.1",
3614
+        "gopd": "^1.0.1"
3615
+      },
3616
+      "engines": {
3617
+        "node": ">= 0.4"
3618
+      },
3619
+      "funding": {
3620
+        "url": "https://github.com/sponsors/ljharb"
3621
+      }
3622
+    },
3623
+    "node_modules/gopd": {
3624
+      "version": "1.2.0",
3625
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
3626
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
3627
+      "license": "MIT",
3628
+      "engines": {
3629
+        "node": ">= 0.4"
3630
+      },
3631
+      "funding": {
3632
+        "url": "https://github.com/sponsors/ljharb"
3633
+      }
3634
+    },
3635
+    "node_modules/graphemer": {
3636
+      "version": "1.4.0",
3637
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
3638
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
3639
+      "dev": true,
3640
+      "license": "MIT"
3641
+    },
3642
+    "node_modules/has-bigints": {
3643
+      "version": "1.1.0",
3644
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
3645
+      "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
3646
+      "dev": true,
3647
+      "license": "MIT",
3648
+      "engines": {
3649
+        "node": ">= 0.4"
3650
+      },
3651
+      "funding": {
3652
+        "url": "https://github.com/sponsors/ljharb"
3653
+      }
3654
+    },
3655
+    "node_modules/has-flag": {
3656
+      "version": "4.0.0",
3657
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
3658
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
3659
+      "dev": true,
3660
+      "license": "MIT",
3661
+      "engines": {
3662
+        "node": ">=8"
3663
+      }
3664
+    },
3665
+    "node_modules/has-property-descriptors": {
3666
+      "version": "1.0.2",
3667
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
3668
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
3669
+      "dev": true,
3670
+      "license": "MIT",
3671
+      "dependencies": {
3672
+        "es-define-property": "^1.0.0"
3673
+      },
3674
+      "funding": {
3675
+        "url": "https://github.com/sponsors/ljharb"
3676
+      }
3677
+    },
3678
+    "node_modules/has-proto": {
3679
+      "version": "1.2.0",
3680
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
3681
+      "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
3682
+      "dev": true,
3683
+      "license": "MIT",
3684
+      "dependencies": {
3685
+        "dunder-proto": "^1.0.0"
3686
+      },
3687
+      "engines": {
3688
+        "node": ">= 0.4"
3689
+      },
3690
+      "funding": {
3691
+        "url": "https://github.com/sponsors/ljharb"
3692
+      }
3693
+    },
3694
+    "node_modules/has-symbols": {
3695
+      "version": "1.1.0",
3696
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
3697
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
3698
+      "license": "MIT",
3699
+      "engines": {
3700
+        "node": ">= 0.4"
3701
+      },
3702
+      "funding": {
3703
+        "url": "https://github.com/sponsors/ljharb"
3704
+      }
3705
+    },
3706
+    "node_modules/has-tostringtag": {
3707
+      "version": "1.0.2",
3708
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
3709
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
3710
+      "license": "MIT",
3711
+      "dependencies": {
3712
+        "has-symbols": "^1.0.3"
3713
+      },
3714
+      "engines": {
3715
+        "node": ">= 0.4"
3716
+      },
3717
+      "funding": {
3718
+        "url": "https://github.com/sponsors/ljharb"
3719
+      }
3720
+    },
3721
+    "node_modules/hasown": {
3722
+      "version": "2.0.2",
3723
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
3724
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
3725
+      "license": "MIT",
3726
+      "dependencies": {
3727
+        "function-bind": "^1.1.2"
3728
+      },
3729
+      "engines": {
3730
+        "node": ">= 0.4"
3731
+      }
3732
+    },
3733
+    "node_modules/ignore": {
3734
+      "version": "5.3.2",
3735
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
3736
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
3737
+      "dev": true,
3738
+      "license": "MIT",
3739
+      "engines": {
3740
+        "node": ">= 4"
3741
+      }
3742
+    },
3743
+    "node_modules/import-fresh": {
3744
+      "version": "3.3.1",
3745
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
3746
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
3747
+      "dev": true,
3748
+      "license": "MIT",
3749
+      "dependencies": {
3750
+        "parent-module": "^1.0.0",
3751
+        "resolve-from": "^4.0.0"
3752
+      },
3753
+      "engines": {
3754
+        "node": ">=6"
3755
+      },
3756
+      "funding": {
3757
+        "url": "https://github.com/sponsors/sindresorhus"
3758
+      }
3759
+    },
3760
+    "node_modules/imurmurhash": {
3761
+      "version": "0.1.4",
3762
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
3763
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
3764
+      "dev": true,
3765
+      "license": "MIT",
3766
+      "engines": {
3767
+        "node": ">=0.8.19"
3768
+      }
3769
+    },
3770
+    "node_modules/internal-slot": {
3771
+      "version": "1.1.0",
3772
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
3773
+      "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
3774
+      "dev": true,
3775
+      "license": "MIT",
3776
+      "dependencies": {
3777
+        "es-errors": "^1.3.0",
3778
+        "hasown": "^2.0.2",
3779
+        "side-channel": "^1.1.0"
3780
+      },
3781
+      "engines": {
3782
+        "node": ">= 0.4"
3783
+      }
3784
+    },
3785
+    "node_modules/is-array-buffer": {
3786
+      "version": "3.0.5",
3787
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
3788
+      "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
3789
+      "dev": true,
3790
+      "license": "MIT",
3791
+      "dependencies": {
3792
+        "call-bind": "^1.0.8",
3793
+        "call-bound": "^1.0.3",
3794
+        "get-intrinsic": "^1.2.6"
3795
+      },
3796
+      "engines": {
3797
+        "node": ">= 0.4"
3798
+      },
3799
+      "funding": {
3800
+        "url": "https://github.com/sponsors/ljharb"
3801
+      }
3802
+    },
3803
+    "node_modules/is-arrayish": {
3804
+      "version": "0.3.2",
3805
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
3806
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
3807
+      "license": "MIT",
3808
+      "optional": true
3809
+    },
3810
+    "node_modules/is-async-function": {
3811
+      "version": "2.1.1",
3812
+      "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
3813
+      "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
3814
+      "dev": true,
3815
+      "license": "MIT",
3816
+      "dependencies": {
3817
+        "async-function": "^1.0.0",
3818
+        "call-bound": "^1.0.3",
3819
+        "get-proto": "^1.0.1",
3820
+        "has-tostringtag": "^1.0.2",
3821
+        "safe-regex-test": "^1.1.0"
3822
+      },
3823
+      "engines": {
3824
+        "node": ">= 0.4"
3825
+      },
3826
+      "funding": {
3827
+        "url": "https://github.com/sponsors/ljharb"
3828
+      }
3829
+    },
3830
+    "node_modules/is-bigint": {
3831
+      "version": "1.1.0",
3832
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
3833
+      "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
3834
+      "dev": true,
3835
+      "license": "MIT",
3836
+      "dependencies": {
3837
+        "has-bigints": "^1.0.2"
3838
+      },
3839
+      "engines": {
3840
+        "node": ">= 0.4"
3841
+      },
3842
+      "funding": {
3843
+        "url": "https://github.com/sponsors/ljharb"
3844
+      }
3845
+    },
3846
+    "node_modules/is-binary-path": {
3847
+      "version": "2.1.0",
3848
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
3849
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
3850
+      "dev": true,
3851
+      "license": "MIT",
3852
+      "dependencies": {
3853
+        "binary-extensions": "^2.0.0"
3854
+      },
3855
+      "engines": {
3856
+        "node": ">=8"
3857
+      }
3858
+    },
3859
+    "node_modules/is-boolean-object": {
3860
+      "version": "1.2.2",
3861
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
3862
+      "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
3863
+      "dev": true,
3864
+      "license": "MIT",
3865
+      "dependencies": {
3866
+        "call-bound": "^1.0.3",
3867
+        "has-tostringtag": "^1.0.2"
3868
+      },
3869
+      "engines": {
3870
+        "node": ">= 0.4"
3871
+      },
3872
+      "funding": {
3873
+        "url": "https://github.com/sponsors/ljharb"
3874
+      }
3875
+    },
3876
+    "node_modules/is-bun-module": {
3877
+      "version": "2.0.0",
3878
+      "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
3879
+      "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
3880
+      "dev": true,
3881
+      "license": "MIT",
3882
+      "dependencies": {
3883
+        "semver": "^7.7.1"
3884
+      }
3885
+    },
3886
+    "node_modules/is-callable": {
3887
+      "version": "1.2.7",
3888
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
3889
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
3890
+      "dev": true,
3891
+      "license": "MIT",
3892
+      "engines": {
3893
+        "node": ">= 0.4"
3894
+      },
3895
+      "funding": {
3896
+        "url": "https://github.com/sponsors/ljharb"
3897
+      }
3898
+    },
3899
+    "node_modules/is-core-module": {
3900
+      "version": "2.16.1",
3901
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
3902
+      "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
3903
+      "dev": true,
3904
+      "license": "MIT",
3905
+      "dependencies": {
3906
+        "hasown": "^2.0.2"
3907
+      },
3908
+      "engines": {
3909
+        "node": ">= 0.4"
3910
+      },
3911
+      "funding": {
3912
+        "url": "https://github.com/sponsors/ljharb"
3913
+      }
3914
+    },
3915
+    "node_modules/is-data-view": {
3916
+      "version": "1.0.2",
3917
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
3918
+      "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
3919
+      "dev": true,
3920
+      "license": "MIT",
3921
+      "dependencies": {
3922
+        "call-bound": "^1.0.2",
3923
+        "get-intrinsic": "^1.2.6",
3924
+        "is-typed-array": "^1.1.13"
3925
+      },
3926
+      "engines": {
3927
+        "node": ">= 0.4"
3928
+      },
3929
+      "funding": {
3930
+        "url": "https://github.com/sponsors/ljharb"
3931
+      }
3932
+    },
3933
+    "node_modules/is-date-object": {
3934
+      "version": "1.1.0",
3935
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
3936
+      "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
3937
+      "dev": true,
3938
+      "license": "MIT",
3939
+      "dependencies": {
3940
+        "call-bound": "^1.0.2",
3941
+        "has-tostringtag": "^1.0.2"
3942
+      },
3943
+      "engines": {
3944
+        "node": ">= 0.4"
3945
+      },
3946
+      "funding": {
3947
+        "url": "https://github.com/sponsors/ljharb"
3948
+      }
3949
+    },
3950
+    "node_modules/is-extglob": {
3951
+      "version": "2.1.1",
3952
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
3953
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
3954
+      "dev": true,
3955
+      "license": "MIT",
3956
+      "engines": {
3957
+        "node": ">=0.10.0"
3958
+      }
3959
+    },
3960
+    "node_modules/is-finalizationregistry": {
3961
+      "version": "1.1.1",
3962
+      "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
3963
+      "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
3964
+      "dev": true,
3965
+      "license": "MIT",
3966
+      "dependencies": {
3967
+        "call-bound": "^1.0.3"
3968
+      },
3969
+      "engines": {
3970
+        "node": ">= 0.4"
3971
+      },
3972
+      "funding": {
3973
+        "url": "https://github.com/sponsors/ljharb"
3974
+      }
3975
+    },
3976
+    "node_modules/is-fullwidth-code-point": {
3977
+      "version": "3.0.0",
3978
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
3979
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
3980
+      "dev": true,
3981
+      "license": "MIT",
3982
+      "engines": {
3983
+        "node": ">=8"
3984
+      }
3985
+    },
3986
+    "node_modules/is-generator-function": {
3987
+      "version": "1.1.0",
3988
+      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
3989
+      "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
3990
+      "dev": true,
3991
+      "license": "MIT",
3992
+      "dependencies": {
3993
+        "call-bound": "^1.0.3",
3994
+        "get-proto": "^1.0.0",
3995
+        "has-tostringtag": "^1.0.2",
3996
+        "safe-regex-test": "^1.1.0"
3997
+      },
3998
+      "engines": {
3999
+        "node": ">= 0.4"
4000
+      },
4001
+      "funding": {
4002
+        "url": "https://github.com/sponsors/ljharb"
4003
+      }
4004
+    },
4005
+    "node_modules/is-glob": {
4006
+      "version": "4.0.3",
4007
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
4008
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
4009
+      "dev": true,
4010
+      "license": "MIT",
4011
+      "dependencies": {
4012
+        "is-extglob": "^2.1.1"
4013
+      },
4014
+      "engines": {
4015
+        "node": ">=0.10.0"
4016
+      }
4017
+    },
4018
+    "node_modules/is-map": {
4019
+      "version": "2.0.3",
4020
+      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
4021
+      "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
4022
+      "dev": true,
4023
+      "license": "MIT",
4024
+      "engines": {
4025
+        "node": ">= 0.4"
4026
+      },
4027
+      "funding": {
4028
+        "url": "https://github.com/sponsors/ljharb"
4029
+      }
4030
+    },
4031
+    "node_modules/is-negative-zero": {
4032
+      "version": "2.0.3",
4033
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
4034
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
4035
+      "dev": true,
4036
+      "license": "MIT",
4037
+      "engines": {
4038
+        "node": ">= 0.4"
4039
+      },
4040
+      "funding": {
4041
+        "url": "https://github.com/sponsors/ljharb"
4042
+      }
4043
+    },
4044
+    "node_modules/is-number": {
4045
+      "version": "7.0.0",
4046
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
4047
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
4048
+      "dev": true,
4049
+      "license": "MIT",
4050
+      "engines": {
4051
+        "node": ">=0.12.0"
4052
+      }
4053
+    },
4054
+    "node_modules/is-number-object": {
4055
+      "version": "1.1.1",
4056
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
4057
+      "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
4058
+      "dev": true,
4059
+      "license": "MIT",
4060
+      "dependencies": {
4061
+        "call-bound": "^1.0.3",
4062
+        "has-tostringtag": "^1.0.2"
4063
+      },
4064
+      "engines": {
4065
+        "node": ">= 0.4"
4066
+      },
4067
+      "funding": {
4068
+        "url": "https://github.com/sponsors/ljharb"
4069
+      }
4070
+    },
4071
+    "node_modules/is-regex": {
4072
+      "version": "1.2.1",
4073
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
4074
+      "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
4075
+      "dev": true,
4076
+      "license": "MIT",
4077
+      "dependencies": {
4078
+        "call-bound": "^1.0.2",
4079
+        "gopd": "^1.2.0",
4080
+        "has-tostringtag": "^1.0.2",
4081
+        "hasown": "^2.0.2"
4082
+      },
4083
+      "engines": {
4084
+        "node": ">= 0.4"
4085
+      },
4086
+      "funding": {
4087
+        "url": "https://github.com/sponsors/ljharb"
4088
+      }
4089
+    },
4090
+    "node_modules/is-set": {
4091
+      "version": "2.0.3",
4092
+      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
4093
+      "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
4094
+      "dev": true,
4095
+      "license": "MIT",
4096
+      "engines": {
4097
+        "node": ">= 0.4"
4098
+      },
4099
+      "funding": {
4100
+        "url": "https://github.com/sponsors/ljharb"
4101
+      }
4102
+    },
4103
+    "node_modules/is-shared-array-buffer": {
4104
+      "version": "1.0.4",
4105
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
4106
+      "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
4107
+      "dev": true,
4108
+      "license": "MIT",
4109
+      "dependencies": {
4110
+        "call-bound": "^1.0.3"
4111
+      },
4112
+      "engines": {
4113
+        "node": ">= 0.4"
4114
+      },
4115
+      "funding": {
4116
+        "url": "https://github.com/sponsors/ljharb"
4117
+      }
4118
+    },
4119
+    "node_modules/is-string": {
4120
+      "version": "1.1.1",
4121
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
4122
+      "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
4123
+      "dev": true,
4124
+      "license": "MIT",
4125
+      "dependencies": {
4126
+        "call-bound": "^1.0.3",
4127
+        "has-tostringtag": "^1.0.2"
4128
+      },
4129
+      "engines": {
4130
+        "node": ">= 0.4"
4131
+      },
4132
+      "funding": {
4133
+        "url": "https://github.com/sponsors/ljharb"
4134
+      }
4135
+    },
4136
+    "node_modules/is-symbol": {
4137
+      "version": "1.1.1",
4138
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
4139
+      "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
4140
+      "dev": true,
4141
+      "license": "MIT",
4142
+      "dependencies": {
4143
+        "call-bound": "^1.0.2",
4144
+        "has-symbols": "^1.1.0",
4145
+        "safe-regex-test": "^1.1.0"
4146
+      },
4147
+      "engines": {
4148
+        "node": ">= 0.4"
4149
+      },
4150
+      "funding": {
4151
+        "url": "https://github.com/sponsors/ljharb"
4152
+      }
4153
+    },
4154
+    "node_modules/is-typed-array": {
4155
+      "version": "1.1.15",
4156
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
4157
+      "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
4158
+      "dev": true,
4159
+      "license": "MIT",
4160
+      "dependencies": {
4161
+        "which-typed-array": "^1.1.16"
4162
+      },
4163
+      "engines": {
4164
+        "node": ">= 0.4"
4165
+      },
4166
+      "funding": {
4167
+        "url": "https://github.com/sponsors/ljharb"
4168
+      }
4169
+    },
4170
+    "node_modules/is-weakmap": {
4171
+      "version": "2.0.2",
4172
+      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
4173
+      "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
4174
+      "dev": true,
4175
+      "license": "MIT",
4176
+      "engines": {
4177
+        "node": ">= 0.4"
4178
+      },
4179
+      "funding": {
4180
+        "url": "https://github.com/sponsors/ljharb"
4181
+      }
4182
+    },
4183
+    "node_modules/is-weakref": {
4184
+      "version": "1.1.1",
4185
+      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
4186
+      "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
4187
+      "dev": true,
4188
+      "license": "MIT",
4189
+      "dependencies": {
4190
+        "call-bound": "^1.0.3"
4191
+      },
4192
+      "engines": {
4193
+        "node": ">= 0.4"
4194
+      },
4195
+      "funding": {
4196
+        "url": "https://github.com/sponsors/ljharb"
4197
+      }
4198
+    },
4199
+    "node_modules/is-weakset": {
4200
+      "version": "2.0.4",
4201
+      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
4202
+      "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
4203
+      "dev": true,
4204
+      "license": "MIT",
4205
+      "dependencies": {
4206
+        "call-bound": "^1.0.3",
4207
+        "get-intrinsic": "^1.2.6"
4208
+      },
4209
+      "engines": {
4210
+        "node": ">= 0.4"
4211
+      },
4212
+      "funding": {
4213
+        "url": "https://github.com/sponsors/ljharb"
4214
+      }
4215
+    },
4216
+    "node_modules/isarray": {
4217
+      "version": "2.0.5",
4218
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
4219
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
4220
+      "dev": true,
4221
+      "license": "MIT"
4222
+    },
4223
+    "node_modules/isexe": {
4224
+      "version": "2.0.0",
4225
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
4226
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
4227
+      "dev": true,
4228
+      "license": "ISC"
4229
+    },
4230
+    "node_modules/iterator.prototype": {
4231
+      "version": "1.1.5",
4232
+      "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
4233
+      "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
4234
+      "dev": true,
4235
+      "license": "MIT",
4236
+      "dependencies": {
4237
+        "define-data-property": "^1.1.4",
4238
+        "es-object-atoms": "^1.0.0",
4239
+        "get-intrinsic": "^1.2.6",
4240
+        "get-proto": "^1.0.0",
4241
+        "has-symbols": "^1.1.0",
4242
+        "set-function-name": "^2.0.2"
4243
+      },
4244
+      "engines": {
4245
+        "node": ">= 0.4"
4246
+      }
4247
+    },
4248
+    "node_modules/jackspeak": {
4249
+      "version": "3.4.3",
4250
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
4251
+      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
4252
+      "dev": true,
4253
+      "license": "BlueOak-1.0.0",
4254
+      "dependencies": {
4255
+        "@isaacs/cliui": "^8.0.2"
4256
+      },
4257
+      "funding": {
4258
+        "url": "https://github.com/sponsors/isaacs"
4259
+      },
4260
+      "optionalDependencies": {
4261
+        "@pkgjs/parseargs": "^0.11.0"
4262
+      }
4263
+    },
4264
+    "node_modules/jiti": {
4265
+      "version": "2.4.2",
4266
+      "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
4267
+      "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
4268
+      "dev": true,
4269
+      "license": "MIT",
4270
+      "optional": true,
4271
+      "peer": true,
4272
+      "bin": {
4273
+        "jiti": "lib/jiti-cli.mjs"
4274
+      }
4275
+    },
4276
+    "node_modules/js-tokens": {
4277
+      "version": "4.0.0",
4278
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
4279
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
4280
+      "dev": true,
4281
+      "license": "MIT"
4282
+    },
4283
+    "node_modules/js-yaml": {
4284
+      "version": "4.1.0",
4285
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
4286
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
4287
+      "dev": true,
4288
+      "license": "MIT",
4289
+      "dependencies": {
4290
+        "argparse": "^2.0.1"
4291
+      },
4292
+      "bin": {
4293
+        "js-yaml": "bin/js-yaml.js"
4294
+      }
4295
+    },
4296
+    "node_modules/json-buffer": {
4297
+      "version": "3.0.1",
4298
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
4299
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
4300
+      "dev": true,
4301
+      "license": "MIT"
4302
+    },
4303
+    "node_modules/json-schema-traverse": {
4304
+      "version": "0.4.1",
4305
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
4306
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
4307
+      "dev": true,
4308
+      "license": "MIT"
4309
+    },
4310
+    "node_modules/json-stable-stringify-without-jsonify": {
4311
+      "version": "1.0.1",
4312
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
4313
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
4314
+      "dev": true,
4315
+      "license": "MIT"
4316
+    },
4317
+    "node_modules/json5": {
4318
+      "version": "1.0.2",
4319
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
4320
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
4321
+      "dev": true,
4322
+      "license": "MIT",
4323
+      "dependencies": {
4324
+        "minimist": "^1.2.0"
4325
+      },
4326
+      "bin": {
4327
+        "json5": "lib/cli.js"
4328
+      }
4329
+    },
4330
+    "node_modules/jsx-ast-utils": {
4331
+      "version": "3.3.5",
4332
+      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
4333
+      "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
4334
+      "dev": true,
4335
+      "license": "MIT",
4336
+      "dependencies": {
4337
+        "array-includes": "^3.1.6",
4338
+        "array.prototype.flat": "^1.3.1",
4339
+        "object.assign": "^4.1.4",
4340
+        "object.values": "^1.1.6"
4341
+      },
4342
+      "engines": {
4343
+        "node": ">=4.0"
4344
+      }
4345
+    },
4346
+    "node_modules/keyv": {
4347
+      "version": "4.5.4",
4348
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
4349
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
4350
+      "dev": true,
4351
+      "license": "MIT",
4352
+      "dependencies": {
4353
+        "json-buffer": "3.0.1"
4354
+      }
4355
+    },
4356
+    "node_modules/language-subtag-registry": {
4357
+      "version": "0.3.23",
4358
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
4359
+      "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
4360
+      "dev": true,
4361
+      "license": "CC0-1.0"
4362
+    },
4363
+    "node_modules/language-tags": {
4364
+      "version": "1.0.9",
4365
+      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
4366
+      "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
4367
+      "dev": true,
4368
+      "license": "MIT",
4369
+      "dependencies": {
4370
+        "language-subtag-registry": "^0.3.20"
4371
+      },
4372
+      "engines": {
4373
+        "node": ">=0.10"
4374
+      }
4375
+    },
4376
+    "node_modules/leaflet": {
4377
+      "version": "1.9.4",
4378
+      "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
4379
+      "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==",
4380
+      "license": "BSD-2-Clause"
4381
+    },
4382
+    "node_modules/levn": {
4383
+      "version": "0.4.1",
4384
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
4385
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
4386
+      "dev": true,
4387
+      "license": "MIT",
4388
+      "dependencies": {
4389
+        "prelude-ls": "^1.2.1",
4390
+        "type-check": "~0.4.0"
4391
+      },
4392
+      "engines": {
4393
+        "node": ">= 0.8.0"
4394
+      }
4395
+    },
4396
+    "node_modules/lilconfig": {
4397
+      "version": "3.1.3",
4398
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
4399
+      "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
4400
+      "dev": true,
4401
+      "license": "MIT",
4402
+      "engines": {
4403
+        "node": ">=14"
4404
+      },
4405
+      "funding": {
4406
+        "url": "https://github.com/sponsors/antonk52"
4407
+      }
4408
+    },
4409
+    "node_modules/lines-and-columns": {
4410
+      "version": "1.2.4",
4411
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
4412
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
4413
+      "dev": true,
4414
+      "license": "MIT"
4415
+    },
4416
+    "node_modules/locate-path": {
4417
+      "version": "6.0.0",
4418
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
4419
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
4420
+      "dev": true,
4421
+      "license": "MIT",
4422
+      "dependencies": {
4423
+        "p-locate": "^5.0.0"
4424
+      },
4425
+      "engines": {
4426
+        "node": ">=10"
4427
+      },
4428
+      "funding": {
4429
+        "url": "https://github.com/sponsors/sindresorhus"
4430
+      }
4431
+    },
4432
+    "node_modules/lodash.merge": {
4433
+      "version": "4.6.2",
4434
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
4435
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
4436
+      "dev": true,
4437
+      "license": "MIT"
4438
+    },
4439
+    "node_modules/loose-envify": {
4440
+      "version": "1.4.0",
4441
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
4442
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
4443
+      "dev": true,
4444
+      "license": "MIT",
4445
+      "dependencies": {
4446
+        "js-tokens": "^3.0.0 || ^4.0.0"
4447
+      },
4448
+      "bin": {
4449
+        "loose-envify": "cli.js"
4450
+      }
4451
+    },
4452
+    "node_modules/lru-cache": {
4453
+      "version": "10.4.3",
4454
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
4455
+      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
4456
+      "dev": true,
4457
+      "license": "ISC"
4458
+    },
4459
+    "node_modules/lucide-react": {
4460
+      "version": "0.456.0",
4461
+      "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.456.0.tgz",
4462
+      "integrity": "sha512-DIIGJqTT5X05sbAsQ+OhA8OtJYyD4NsEMCA/HQW/Y6ToPQ7gwbtujIoeAaup4HpHzV35SQOarKAWH8LYglB6eA==",
4463
+      "license": "ISC",
4464
+      "peerDependencies": {
4465
+        "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
4466
+      }
4467
+    },
4468
+    "node_modules/math-intrinsics": {
4469
+      "version": "1.1.0",
4470
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
4471
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
4472
+      "license": "MIT",
4473
+      "engines": {
4474
+        "node": ">= 0.4"
4475
+      }
4476
+    },
4477
+    "node_modules/merge2": {
4478
+      "version": "1.4.1",
4479
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
4480
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
4481
+      "dev": true,
4482
+      "license": "MIT",
4483
+      "engines": {
4484
+        "node": ">= 8"
4485
+      }
4486
+    },
4487
+    "node_modules/micromatch": {
4488
+      "version": "4.0.8",
4489
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
4490
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
4491
+      "dev": true,
4492
+      "license": "MIT",
4493
+      "dependencies": {
4494
+        "braces": "^3.0.3",
4495
+        "picomatch": "^2.3.1"
4496
+      },
4497
+      "engines": {
4498
+        "node": ">=8.6"
4499
+      }
4500
+    },
4501
+    "node_modules/mime-db": {
4502
+      "version": "1.52.0",
4503
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
4504
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
4505
+      "license": "MIT",
4506
+      "engines": {
4507
+        "node": ">= 0.6"
4508
+      }
4509
+    },
4510
+    "node_modules/mime-types": {
4511
+      "version": "2.1.35",
4512
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
4513
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
4514
+      "license": "MIT",
4515
+      "dependencies": {
4516
+        "mime-db": "1.52.0"
4517
+      },
4518
+      "engines": {
4519
+        "node": ">= 0.6"
4520
+      }
4521
+    },
4522
+    "node_modules/minimatch": {
4523
+      "version": "3.1.2",
4524
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
4525
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
4526
+      "dev": true,
4527
+      "license": "ISC",
4528
+      "dependencies": {
4529
+        "brace-expansion": "^1.1.7"
4530
+      },
4531
+      "engines": {
4532
+        "node": "*"
4533
+      }
4534
+    },
4535
+    "node_modules/minimist": {
4536
+      "version": "1.2.8",
4537
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
4538
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
4539
+      "dev": true,
4540
+      "license": "MIT",
4541
+      "funding": {
4542
+        "url": "https://github.com/sponsors/ljharb"
4543
+      }
4544
+    },
4545
+    "node_modules/minipass": {
4546
+      "version": "7.1.2",
4547
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
4548
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
4549
+      "dev": true,
4550
+      "license": "ISC",
4551
+      "engines": {
4552
+        "node": ">=16 || 14 >=14.17"
4553
+      }
4554
+    },
4555
+    "node_modules/ms": {
4556
+      "version": "2.1.3",
4557
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
4558
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
4559
+      "dev": true,
4560
+      "license": "MIT"
4561
+    },
4562
+    "node_modules/mz": {
4563
+      "version": "2.7.0",
4564
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
4565
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
4566
+      "dev": true,
4567
+      "license": "MIT",
4568
+      "dependencies": {
4569
+        "any-promise": "^1.0.0",
4570
+        "object-assign": "^4.0.1",
4571
+        "thenify-all": "^1.0.0"
4572
+      }
4573
+    },
4574
+    "node_modules/nanoid": {
4575
+      "version": "3.3.11",
4576
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
4577
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
4578
+      "funding": [
4579
+        {
4580
+          "type": "github",
4581
+          "url": "https://github.com/sponsors/ai"
4582
+        }
4583
+      ],
4584
+      "license": "MIT",
4585
+      "bin": {
4586
+        "nanoid": "bin/nanoid.cjs"
4587
+      },
4588
+      "engines": {
4589
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
4590
+      }
4591
+    },
4592
+    "node_modules/napi-postinstall": {
4593
+      "version": "0.2.4",
4594
+      "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz",
4595
+      "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==",
4596
+      "dev": true,
4597
+      "license": "MIT",
4598
+      "bin": {
4599
+        "napi-postinstall": "lib/cli.js"
4600
+      },
4601
+      "engines": {
4602
+        "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
4603
+      },
4604
+      "funding": {
4605
+        "url": "https://opencollective.com/napi-postinstall"
4606
+      }
4607
+    },
4608
+    "node_modules/natural-compare": {
4609
+      "version": "1.4.0",
4610
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
4611
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
4612
+      "dev": true,
4613
+      "license": "MIT"
4614
+    },
4615
+    "node_modules/next": {
4616
+      "version": "15.1.3",
4617
+      "resolved": "https://registry.npmjs.org/next/-/next-15.1.3.tgz",
4618
+      "integrity": "sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA==",
4619
+      "license": "MIT",
4620
+      "dependencies": {
4621
+        "@next/env": "15.1.3",
4622
+        "@swc/counter": "0.1.3",
4623
+        "@swc/helpers": "0.5.15",
4624
+        "busboy": "1.6.0",
4625
+        "caniuse-lite": "^1.0.30001579",
4626
+        "postcss": "8.4.31",
4627
+        "styled-jsx": "5.1.6"
4628
+      },
4629
+      "bin": {
4630
+        "next": "dist/bin/next"
4631
+      },
4632
+      "engines": {
4633
+        "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
4634
+      },
4635
+      "optionalDependencies": {
4636
+        "@next/swc-darwin-arm64": "15.1.3",
4637
+        "@next/swc-darwin-x64": "15.1.3",
4638
+        "@next/swc-linux-arm64-gnu": "15.1.3",
4639
+        "@next/swc-linux-arm64-musl": "15.1.3",
4640
+        "@next/swc-linux-x64-gnu": "15.1.3",
4641
+        "@next/swc-linux-x64-musl": "15.1.3",
4642
+        "@next/swc-win32-arm64-msvc": "15.1.3",
4643
+        "@next/swc-win32-x64-msvc": "15.1.3",
4644
+        "sharp": "^0.33.5"
4645
+      },
4646
+      "peerDependencies": {
4647
+        "@opentelemetry/api": "^1.1.0",
4648
+        "@playwright/test": "^1.41.2",
4649
+        "babel-plugin-react-compiler": "*",
4650
+        "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
4651
+        "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
4652
+        "sass": "^1.3.0"
4653
+      },
4654
+      "peerDependenciesMeta": {
4655
+        "@opentelemetry/api": {
4656
+          "optional": true
4657
+        },
4658
+        "@playwright/test": {
4659
+          "optional": true
4660
+        },
4661
+        "babel-plugin-react-compiler": {
4662
+          "optional": true
4663
+        },
4664
+        "sass": {
4665
+          "optional": true
4666
+        }
4667
+      }
4668
+    },
4669
+    "node_modules/next/node_modules/postcss": {
4670
+      "version": "8.4.31",
4671
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
4672
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
4673
+      "funding": [
4674
+        {
4675
+          "type": "opencollective",
4676
+          "url": "https://opencollective.com/postcss/"
4677
+        },
4678
+        {
4679
+          "type": "tidelift",
4680
+          "url": "https://tidelift.com/funding/github/npm/postcss"
4681
+        },
4682
+        {
4683
+          "type": "github",
4684
+          "url": "https://github.com/sponsors/ai"
4685
+        }
4686
+      ],
4687
+      "license": "MIT",
4688
+      "dependencies": {
4689
+        "nanoid": "^3.3.6",
4690
+        "picocolors": "^1.0.0",
4691
+        "source-map-js": "^1.0.2"
4692
+      },
4693
+      "engines": {
4694
+        "node": "^10 || ^12 || >=14"
4695
+      }
4696
+    },
4697
+    "node_modules/node-releases": {
4698
+      "version": "2.0.19",
4699
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
4700
+      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
4701
+      "dev": true,
4702
+      "license": "MIT"
4703
+    },
4704
+    "node_modules/normalize-path": {
4705
+      "version": "3.0.0",
4706
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
4707
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
4708
+      "dev": true,
4709
+      "license": "MIT",
4710
+      "engines": {
4711
+        "node": ">=0.10.0"
4712
+      }
4713
+    },
4714
+    "node_modules/normalize-range": {
4715
+      "version": "0.1.2",
4716
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
4717
+      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
4718
+      "dev": true,
4719
+      "license": "MIT",
4720
+      "engines": {
4721
+        "node": ">=0.10.0"
4722
+      }
4723
+    },
4724
+    "node_modules/object-assign": {
4725
+      "version": "4.1.1",
4726
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
4727
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
4728
+      "dev": true,
4729
+      "license": "MIT",
4730
+      "engines": {
4731
+        "node": ">=0.10.0"
4732
+      }
4733
+    },
4734
+    "node_modules/object-hash": {
4735
+      "version": "3.0.0",
4736
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
4737
+      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
4738
+      "dev": true,
4739
+      "license": "MIT",
4740
+      "engines": {
4741
+        "node": ">= 6"
4742
+      }
4743
+    },
4744
+    "node_modules/object-inspect": {
4745
+      "version": "1.13.4",
4746
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
4747
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
4748
+      "dev": true,
4749
+      "license": "MIT",
4750
+      "engines": {
4751
+        "node": ">= 0.4"
4752
+      },
4753
+      "funding": {
4754
+        "url": "https://github.com/sponsors/ljharb"
4755
+      }
4756
+    },
4757
+    "node_modules/object-keys": {
4758
+      "version": "1.1.1",
4759
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
4760
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
4761
+      "dev": true,
4762
+      "license": "MIT",
4763
+      "engines": {
4764
+        "node": ">= 0.4"
4765
+      }
4766
+    },
4767
+    "node_modules/object.assign": {
4768
+      "version": "4.1.7",
4769
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
4770
+      "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
4771
+      "dev": true,
4772
+      "license": "MIT",
4773
+      "dependencies": {
4774
+        "call-bind": "^1.0.8",
4775
+        "call-bound": "^1.0.3",
4776
+        "define-properties": "^1.2.1",
4777
+        "es-object-atoms": "^1.0.0",
4778
+        "has-symbols": "^1.1.0",
4779
+        "object-keys": "^1.1.1"
4780
+      },
4781
+      "engines": {
4782
+        "node": ">= 0.4"
4783
+      },
4784
+      "funding": {
4785
+        "url": "https://github.com/sponsors/ljharb"
4786
+      }
4787
+    },
4788
+    "node_modules/object.entries": {
4789
+      "version": "1.1.9",
4790
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
4791
+      "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
4792
+      "dev": true,
4793
+      "license": "MIT",
4794
+      "dependencies": {
4795
+        "call-bind": "^1.0.8",
4796
+        "call-bound": "^1.0.4",
4797
+        "define-properties": "^1.2.1",
4798
+        "es-object-atoms": "^1.1.1"
4799
+      },
4800
+      "engines": {
4801
+        "node": ">= 0.4"
4802
+      }
4803
+    },
4804
+    "node_modules/object.fromentries": {
4805
+      "version": "2.0.8",
4806
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
4807
+      "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
4808
+      "dev": true,
4809
+      "license": "MIT",
4810
+      "dependencies": {
4811
+        "call-bind": "^1.0.7",
4812
+        "define-properties": "^1.2.1",
4813
+        "es-abstract": "^1.23.2",
4814
+        "es-object-atoms": "^1.0.0"
4815
+      },
4816
+      "engines": {
4817
+        "node": ">= 0.4"
4818
+      },
4819
+      "funding": {
4820
+        "url": "https://github.com/sponsors/ljharb"
4821
+      }
4822
+    },
4823
+    "node_modules/object.groupby": {
4824
+      "version": "1.0.3",
4825
+      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
4826
+      "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
4827
+      "dev": true,
4828
+      "license": "MIT",
4829
+      "dependencies": {
4830
+        "call-bind": "^1.0.7",
4831
+        "define-properties": "^1.2.1",
4832
+        "es-abstract": "^1.23.2"
4833
+      },
4834
+      "engines": {
4835
+        "node": ">= 0.4"
4836
+      }
4837
+    },
4838
+    "node_modules/object.values": {
4839
+      "version": "1.2.1",
4840
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
4841
+      "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
4842
+      "dev": true,
4843
+      "license": "MIT",
4844
+      "dependencies": {
4845
+        "call-bind": "^1.0.8",
4846
+        "call-bound": "^1.0.3",
4847
+        "define-properties": "^1.2.1",
4848
+        "es-object-atoms": "^1.0.0"
4849
+      },
4850
+      "engines": {
4851
+        "node": ">= 0.4"
4852
+      },
4853
+      "funding": {
4854
+        "url": "https://github.com/sponsors/ljharb"
4855
+      }
4856
+    },
4857
+    "node_modules/optionator": {
4858
+      "version": "0.9.4",
4859
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
4860
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
4861
+      "dev": true,
4862
+      "license": "MIT",
4863
+      "dependencies": {
4864
+        "deep-is": "^0.1.3",
4865
+        "fast-levenshtein": "^2.0.6",
4866
+        "levn": "^0.4.1",
4867
+        "prelude-ls": "^1.2.1",
4868
+        "type-check": "^0.4.0",
4869
+        "word-wrap": "^1.2.5"
4870
+      },
4871
+      "engines": {
4872
+        "node": ">= 0.8.0"
4873
+      }
4874
+    },
4875
+    "node_modules/own-keys": {
4876
+      "version": "1.0.1",
4877
+      "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
4878
+      "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
4879
+      "dev": true,
4880
+      "license": "MIT",
4881
+      "dependencies": {
4882
+        "get-intrinsic": "^1.2.6",
4883
+        "object-keys": "^1.1.1",
4884
+        "safe-push-apply": "^1.0.0"
4885
+      },
4886
+      "engines": {
4887
+        "node": ">= 0.4"
4888
+      },
4889
+      "funding": {
4890
+        "url": "https://github.com/sponsors/ljharb"
4891
+      }
4892
+    },
4893
+    "node_modules/p-limit": {
4894
+      "version": "3.1.0",
4895
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
4896
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
4897
+      "dev": true,
4898
+      "license": "MIT",
4899
+      "dependencies": {
4900
+        "yocto-queue": "^0.1.0"
4901
+      },
4902
+      "engines": {
4903
+        "node": ">=10"
4904
+      },
4905
+      "funding": {
4906
+        "url": "https://github.com/sponsors/sindresorhus"
4907
+      }
4908
+    },
4909
+    "node_modules/p-locate": {
4910
+      "version": "5.0.0",
4911
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
4912
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
4913
+      "dev": true,
4914
+      "license": "MIT",
4915
+      "dependencies": {
4916
+        "p-limit": "^3.0.2"
4917
+      },
4918
+      "engines": {
4919
+        "node": ">=10"
4920
+      },
4921
+      "funding": {
4922
+        "url": "https://github.com/sponsors/sindresorhus"
4923
+      }
4924
+    },
4925
+    "node_modules/package-json-from-dist": {
4926
+      "version": "1.0.1",
4927
+      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
4928
+      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
4929
+      "dev": true,
4930
+      "license": "BlueOak-1.0.0"
4931
+    },
4932
+    "node_modules/parent-module": {
4933
+      "version": "1.0.1",
4934
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
4935
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
4936
+      "dev": true,
4937
+      "license": "MIT",
4938
+      "dependencies": {
4939
+        "callsites": "^3.0.0"
4940
+      },
4941
+      "engines": {
4942
+        "node": ">=6"
4943
+      }
4944
+    },
4945
+    "node_modules/path-exists": {
4946
+      "version": "4.0.0",
4947
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
4948
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
4949
+      "dev": true,
4950
+      "license": "MIT",
4951
+      "engines": {
4952
+        "node": ">=8"
4953
+      }
4954
+    },
4955
+    "node_modules/path-key": {
4956
+      "version": "3.1.1",
4957
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
4958
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
4959
+      "dev": true,
4960
+      "license": "MIT",
4961
+      "engines": {
4962
+        "node": ">=8"
4963
+      }
4964
+    },
4965
+    "node_modules/path-parse": {
4966
+      "version": "1.0.7",
4967
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
4968
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
4969
+      "dev": true,
4970
+      "license": "MIT"
4971
+    },
4972
+    "node_modules/path-scurry": {
4973
+      "version": "1.11.1",
4974
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
4975
+      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
4976
+      "dev": true,
4977
+      "license": "BlueOak-1.0.0",
4978
+      "dependencies": {
4979
+        "lru-cache": "^10.2.0",
4980
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
4981
+      },
4982
+      "engines": {
4983
+        "node": ">=16 || 14 >=14.18"
4984
+      },
4985
+      "funding": {
4986
+        "url": "https://github.com/sponsors/isaacs"
4987
+      }
4988
+    },
4989
+    "node_modules/picocolors": {
4990
+      "version": "1.1.1",
4991
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
4992
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
4993
+      "license": "ISC"
4994
+    },
4995
+    "node_modules/picomatch": {
4996
+      "version": "2.3.1",
4997
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
4998
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
4999
+      "dev": true,
5000
+      "license": "MIT",
5001
+      "engines": {
5002
+        "node": ">=8.6"
5003
+      },
5004
+      "funding": {
5005
+        "url": "https://github.com/sponsors/jonschlinkert"
5006
+      }
5007
+    },
5008
+    "node_modules/pify": {
5009
+      "version": "2.3.0",
5010
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
5011
+      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
5012
+      "dev": true,
5013
+      "license": "MIT",
5014
+      "engines": {
5015
+        "node": ">=0.10.0"
5016
+      }
5017
+    },
5018
+    "node_modules/pirates": {
5019
+      "version": "4.0.7",
5020
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
5021
+      "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
5022
+      "dev": true,
5023
+      "license": "MIT",
5024
+      "engines": {
5025
+        "node": ">= 6"
5026
+      }
5027
+    },
5028
+    "node_modules/possible-typed-array-names": {
5029
+      "version": "1.1.0",
5030
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
5031
+      "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
5032
+      "dev": true,
5033
+      "license": "MIT",
5034
+      "engines": {
5035
+        "node": ">= 0.4"
5036
+      }
5037
+    },
5038
+    "node_modules/postcss": {
5039
+      "version": "8.5.6",
5040
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
5041
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
5042
+      "dev": true,
5043
+      "funding": [
5044
+        {
5045
+          "type": "opencollective",
5046
+          "url": "https://opencollective.com/postcss/"
5047
+        },
5048
+        {
5049
+          "type": "tidelift",
5050
+          "url": "https://tidelift.com/funding/github/npm/postcss"
5051
+        },
5052
+        {
5053
+          "type": "github",
5054
+          "url": "https://github.com/sponsors/ai"
5055
+        }
5056
+      ],
5057
+      "license": "MIT",
5058
+      "dependencies": {
5059
+        "nanoid": "^3.3.11",
5060
+        "picocolors": "^1.1.1",
5061
+        "source-map-js": "^1.2.1"
5062
+      },
5063
+      "engines": {
5064
+        "node": "^10 || ^12 || >=14"
5065
+      }
5066
+    },
5067
+    "node_modules/postcss-import": {
5068
+      "version": "15.1.0",
5069
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
5070
+      "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
5071
+      "dev": true,
5072
+      "license": "MIT",
5073
+      "dependencies": {
5074
+        "postcss-value-parser": "^4.0.0",
5075
+        "read-cache": "^1.0.0",
5076
+        "resolve": "^1.1.7"
5077
+      },
5078
+      "engines": {
5079
+        "node": ">=14.0.0"
5080
+      },
5081
+      "peerDependencies": {
5082
+        "postcss": "^8.0.0"
5083
+      }
5084
+    },
5085
+    "node_modules/postcss-js": {
5086
+      "version": "4.0.1",
5087
+      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
5088
+      "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
5089
+      "dev": true,
5090
+      "license": "MIT",
5091
+      "dependencies": {
5092
+        "camelcase-css": "^2.0.1"
5093
+      },
5094
+      "engines": {
5095
+        "node": "^12 || ^14 || >= 16"
5096
+      },
5097
+      "funding": {
5098
+        "type": "opencollective",
5099
+        "url": "https://opencollective.com/postcss/"
5100
+      },
5101
+      "peerDependencies": {
5102
+        "postcss": "^8.4.21"
5103
+      }
5104
+    },
5105
+    "node_modules/postcss-nested": {
5106
+      "version": "6.2.0",
5107
+      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
5108
+      "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
5109
+      "dev": true,
5110
+      "funding": [
5111
+        {
5112
+          "type": "opencollective",
5113
+          "url": "https://opencollective.com/postcss/"
5114
+        },
5115
+        {
5116
+          "type": "github",
5117
+          "url": "https://github.com/sponsors/ai"
5118
+        }
5119
+      ],
5120
+      "license": "MIT",
5121
+      "dependencies": {
5122
+        "postcss-selector-parser": "^6.1.1"
5123
+      },
5124
+      "engines": {
5125
+        "node": ">=12.0"
5126
+      },
5127
+      "peerDependencies": {
5128
+        "postcss": "^8.2.14"
5129
+      }
5130
+    },
5131
+    "node_modules/postcss-selector-parser": {
5132
+      "version": "6.1.2",
5133
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
5134
+      "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
5135
+      "dev": true,
5136
+      "license": "MIT",
5137
+      "dependencies": {
5138
+        "cssesc": "^3.0.0",
5139
+        "util-deprecate": "^1.0.2"
5140
+      },
5141
+      "engines": {
5142
+        "node": ">=4"
5143
+      }
5144
+    },
5145
+    "node_modules/postcss-value-parser": {
5146
+      "version": "4.2.0",
5147
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
5148
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
5149
+      "dev": true,
5150
+      "license": "MIT"
5151
+    },
5152
+    "node_modules/prelude-ls": {
5153
+      "version": "1.2.1",
5154
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
5155
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
5156
+      "dev": true,
5157
+      "license": "MIT",
5158
+      "engines": {
5159
+        "node": ">= 0.8.0"
5160
+      }
5161
+    },
5162
+    "node_modules/prop-types": {
5163
+      "version": "15.8.1",
5164
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
5165
+      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
5166
+      "dev": true,
5167
+      "license": "MIT",
5168
+      "dependencies": {
5169
+        "loose-envify": "^1.4.0",
5170
+        "object-assign": "^4.1.1",
5171
+        "react-is": "^16.13.1"
5172
+      }
5173
+    },
5174
+    "node_modules/proxy-from-env": {
5175
+      "version": "1.1.0",
5176
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
5177
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
5178
+      "license": "MIT"
5179
+    },
5180
+    "node_modules/punycode": {
5181
+      "version": "2.3.1",
5182
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
5183
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
5184
+      "dev": true,
5185
+      "license": "MIT",
5186
+      "engines": {
5187
+        "node": ">=6"
5188
+      }
5189
+    },
5190
+    "node_modules/queue-microtask": {
5191
+      "version": "1.2.3",
5192
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
5193
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
5194
+      "dev": true,
5195
+      "funding": [
5196
+        {
5197
+          "type": "github",
5198
+          "url": "https://github.com/sponsors/feross"
5199
+        },
5200
+        {
5201
+          "type": "patreon",
5202
+          "url": "https://www.patreon.com/feross"
5203
+        },
5204
+        {
5205
+          "type": "consulting",
5206
+          "url": "https://feross.org/support"
5207
+        }
5208
+      ],
5209
+      "license": "MIT"
5210
+    },
5211
+    "node_modules/react": {
5212
+      "version": "19.1.0",
5213
+      "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
5214
+      "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
5215
+      "license": "MIT",
5216
+      "engines": {
5217
+        "node": ">=0.10.0"
5218
+      }
5219
+    },
5220
+    "node_modules/react-dom": {
5221
+      "version": "19.1.0",
5222
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
5223
+      "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
5224
+      "license": "MIT",
5225
+      "dependencies": {
5226
+        "scheduler": "^0.26.0"
5227
+      },
5228
+      "peerDependencies": {
5229
+        "react": "^19.1.0"
5230
+      }
5231
+    },
5232
+    "node_modules/react-is": {
5233
+      "version": "16.13.1",
5234
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
5235
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
5236
+      "dev": true,
5237
+      "license": "MIT"
5238
+    },
5239
+    "node_modules/react-leaflet": {
5240
+      "version": "5.0.0",
5241
+      "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz",
5242
+      "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==",
5243
+      "license": "Hippocratic-2.1",
5244
+      "dependencies": {
5245
+        "@react-leaflet/core": "^3.0.0"
5246
+      },
5247
+      "peerDependencies": {
5248
+        "leaflet": "^1.9.0",
5249
+        "react": "^19.0.0",
5250
+        "react-dom": "^19.0.0"
5251
+      }
5252
+    },
5253
+    "node_modules/read-cache": {
5254
+      "version": "1.0.0",
5255
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
5256
+      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
5257
+      "dev": true,
5258
+      "license": "MIT",
5259
+      "dependencies": {
5260
+        "pify": "^2.3.0"
5261
+      }
5262
+    },
5263
+    "node_modules/readdirp": {
5264
+      "version": "3.6.0",
5265
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
5266
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
5267
+      "dev": true,
5268
+      "license": "MIT",
5269
+      "dependencies": {
5270
+        "picomatch": "^2.2.1"
5271
+      },
5272
+      "engines": {
5273
+        "node": ">=8.10.0"
5274
+      }
5275
+    },
5276
+    "node_modules/reflect.getprototypeof": {
5277
+      "version": "1.0.10",
5278
+      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
5279
+      "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
5280
+      "dev": true,
5281
+      "license": "MIT",
5282
+      "dependencies": {
5283
+        "call-bind": "^1.0.8",
5284
+        "define-properties": "^1.2.1",
5285
+        "es-abstract": "^1.23.9",
5286
+        "es-errors": "^1.3.0",
5287
+        "es-object-atoms": "^1.0.0",
5288
+        "get-intrinsic": "^1.2.7",
5289
+        "get-proto": "^1.0.1",
5290
+        "which-builtin-type": "^1.2.1"
5291
+      },
5292
+      "engines": {
5293
+        "node": ">= 0.4"
5294
+      },
5295
+      "funding": {
5296
+        "url": "https://github.com/sponsors/ljharb"
5297
+      }
5298
+    },
5299
+    "node_modules/regexp.prototype.flags": {
5300
+      "version": "1.5.4",
5301
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
5302
+      "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
5303
+      "dev": true,
5304
+      "license": "MIT",
5305
+      "dependencies": {
5306
+        "call-bind": "^1.0.8",
5307
+        "define-properties": "^1.2.1",
5308
+        "es-errors": "^1.3.0",
5309
+        "get-proto": "^1.0.1",
5310
+        "gopd": "^1.2.0",
5311
+        "set-function-name": "^2.0.2"
5312
+      },
5313
+      "engines": {
5314
+        "node": ">= 0.4"
5315
+      },
5316
+      "funding": {
5317
+        "url": "https://github.com/sponsors/ljharb"
5318
+      }
5319
+    },
5320
+    "node_modules/resolve": {
5321
+      "version": "1.22.10",
5322
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
5323
+      "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
5324
+      "dev": true,
5325
+      "license": "MIT",
5326
+      "dependencies": {
5327
+        "is-core-module": "^2.16.0",
5328
+        "path-parse": "^1.0.7",
5329
+        "supports-preserve-symlinks-flag": "^1.0.0"
5330
+      },
5331
+      "bin": {
5332
+        "resolve": "bin/resolve"
5333
+      },
5334
+      "engines": {
5335
+        "node": ">= 0.4"
5336
+      },
5337
+      "funding": {
5338
+        "url": "https://github.com/sponsors/ljharb"
5339
+      }
5340
+    },
5341
+    "node_modules/resolve-from": {
5342
+      "version": "4.0.0",
5343
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
5344
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
5345
+      "dev": true,
5346
+      "license": "MIT",
5347
+      "engines": {
5348
+        "node": ">=4"
5349
+      }
5350
+    },
5351
+    "node_modules/resolve-pkg-maps": {
5352
+      "version": "1.0.0",
5353
+      "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
5354
+      "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
5355
+      "dev": true,
5356
+      "license": "MIT",
5357
+      "funding": {
5358
+        "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
5359
+      }
5360
+    },
5361
+    "node_modules/reusify": {
5362
+      "version": "1.1.0",
5363
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
5364
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
5365
+      "dev": true,
5366
+      "license": "MIT",
5367
+      "engines": {
5368
+        "iojs": ">=1.0.0",
5369
+        "node": ">=0.10.0"
5370
+      }
5371
+    },
5372
+    "node_modules/run-parallel": {
5373
+      "version": "1.2.0",
5374
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
5375
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
5376
+      "dev": true,
5377
+      "funding": [
5378
+        {
5379
+          "type": "github",
5380
+          "url": "https://github.com/sponsors/feross"
5381
+        },
5382
+        {
5383
+          "type": "patreon",
5384
+          "url": "https://www.patreon.com/feross"
5385
+        },
5386
+        {
5387
+          "type": "consulting",
5388
+          "url": "https://feross.org/support"
5389
+        }
5390
+      ],
5391
+      "license": "MIT",
5392
+      "dependencies": {
5393
+        "queue-microtask": "^1.2.2"
5394
+      }
5395
+    },
5396
+    "node_modules/safe-array-concat": {
5397
+      "version": "1.1.3",
5398
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
5399
+      "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
5400
+      "dev": true,
5401
+      "license": "MIT",
5402
+      "dependencies": {
5403
+        "call-bind": "^1.0.8",
5404
+        "call-bound": "^1.0.2",
5405
+        "get-intrinsic": "^1.2.6",
5406
+        "has-symbols": "^1.1.0",
5407
+        "isarray": "^2.0.5"
5408
+      },
5409
+      "engines": {
5410
+        "node": ">=0.4"
5411
+      },
5412
+      "funding": {
5413
+        "url": "https://github.com/sponsors/ljharb"
5414
+      }
5415
+    },
5416
+    "node_modules/safe-push-apply": {
5417
+      "version": "1.0.0",
5418
+      "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
5419
+      "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
5420
+      "dev": true,
5421
+      "license": "MIT",
5422
+      "dependencies": {
5423
+        "es-errors": "^1.3.0",
5424
+        "isarray": "^2.0.5"
5425
+      },
5426
+      "engines": {
5427
+        "node": ">= 0.4"
5428
+      },
5429
+      "funding": {
5430
+        "url": "https://github.com/sponsors/ljharb"
5431
+      }
5432
+    },
5433
+    "node_modules/safe-regex-test": {
5434
+      "version": "1.1.0",
5435
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
5436
+      "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
5437
+      "dev": true,
5438
+      "license": "MIT",
5439
+      "dependencies": {
5440
+        "call-bound": "^1.0.2",
5441
+        "es-errors": "^1.3.0",
5442
+        "is-regex": "^1.2.1"
5443
+      },
5444
+      "engines": {
5445
+        "node": ">= 0.4"
5446
+      },
5447
+      "funding": {
5448
+        "url": "https://github.com/sponsors/ljharb"
5449
+      }
5450
+    },
5451
+    "node_modules/scheduler": {
5452
+      "version": "0.26.0",
5453
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
5454
+      "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
5455
+      "license": "MIT"
5456
+    },
5457
+    "node_modules/semver": {
5458
+      "version": "7.7.2",
5459
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
5460
+      "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
5461
+      "devOptional": true,
5462
+      "license": "ISC",
5463
+      "bin": {
5464
+        "semver": "bin/semver.js"
5465
+      },
5466
+      "engines": {
5467
+        "node": ">=10"
5468
+      }
5469
+    },
5470
+    "node_modules/set-function-length": {
5471
+      "version": "1.2.2",
5472
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
5473
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
5474
+      "dev": true,
5475
+      "license": "MIT",
5476
+      "dependencies": {
5477
+        "define-data-property": "^1.1.4",
5478
+        "es-errors": "^1.3.0",
5479
+        "function-bind": "^1.1.2",
5480
+        "get-intrinsic": "^1.2.4",
5481
+        "gopd": "^1.0.1",
5482
+        "has-property-descriptors": "^1.0.2"
5483
+      },
5484
+      "engines": {
5485
+        "node": ">= 0.4"
5486
+      }
5487
+    },
5488
+    "node_modules/set-function-name": {
5489
+      "version": "2.0.2",
5490
+      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
5491
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
5492
+      "dev": true,
5493
+      "license": "MIT",
5494
+      "dependencies": {
5495
+        "define-data-property": "^1.1.4",
5496
+        "es-errors": "^1.3.0",
5497
+        "functions-have-names": "^1.2.3",
5498
+        "has-property-descriptors": "^1.0.2"
5499
+      },
5500
+      "engines": {
5501
+        "node": ">= 0.4"
5502
+      }
5503
+    },
5504
+    "node_modules/set-proto": {
5505
+      "version": "1.0.0",
5506
+      "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
5507
+      "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
5508
+      "dev": true,
5509
+      "license": "MIT",
5510
+      "dependencies": {
5511
+        "dunder-proto": "^1.0.1",
5512
+        "es-errors": "^1.3.0",
5513
+        "es-object-atoms": "^1.0.0"
5514
+      },
5515
+      "engines": {
5516
+        "node": ">= 0.4"
5517
+      }
5518
+    },
5519
+    "node_modules/sharp": {
5520
+      "version": "0.33.5",
5521
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
5522
+      "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
5523
+      "hasInstallScript": true,
5524
+      "license": "Apache-2.0",
5525
+      "optional": true,
5526
+      "dependencies": {
5527
+        "color": "^4.2.3",
5528
+        "detect-libc": "^2.0.3",
5529
+        "semver": "^7.6.3"
5530
+      },
5531
+      "engines": {
5532
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
5533
+      },
5534
+      "funding": {
5535
+        "url": "https://opencollective.com/libvips"
5536
+      },
5537
+      "optionalDependencies": {
5538
+        "@img/sharp-darwin-arm64": "0.33.5",
5539
+        "@img/sharp-darwin-x64": "0.33.5",
5540
+        "@img/sharp-libvips-darwin-arm64": "1.0.4",
5541
+        "@img/sharp-libvips-darwin-x64": "1.0.4",
5542
+        "@img/sharp-libvips-linux-arm": "1.0.5",
5543
+        "@img/sharp-libvips-linux-arm64": "1.0.4",
5544
+        "@img/sharp-libvips-linux-s390x": "1.0.4",
5545
+        "@img/sharp-libvips-linux-x64": "1.0.4",
5546
+        "@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
5547
+        "@img/sharp-libvips-linuxmusl-x64": "1.0.4",
5548
+        "@img/sharp-linux-arm": "0.33.5",
5549
+        "@img/sharp-linux-arm64": "0.33.5",
5550
+        "@img/sharp-linux-s390x": "0.33.5",
5551
+        "@img/sharp-linux-x64": "0.33.5",
5552
+        "@img/sharp-linuxmusl-arm64": "0.33.5",
5553
+        "@img/sharp-linuxmusl-x64": "0.33.5",
5554
+        "@img/sharp-wasm32": "0.33.5",
5555
+        "@img/sharp-win32-ia32": "0.33.5",
5556
+        "@img/sharp-win32-x64": "0.33.5"
5557
+      }
5558
+    },
5559
+    "node_modules/shebang-command": {
5560
+      "version": "2.0.0",
5561
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
5562
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
5563
+      "dev": true,
5564
+      "license": "MIT",
5565
+      "dependencies": {
5566
+        "shebang-regex": "^3.0.0"
5567
+      },
5568
+      "engines": {
5569
+        "node": ">=8"
5570
+      }
5571
+    },
5572
+    "node_modules/shebang-regex": {
5573
+      "version": "3.0.0",
5574
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
5575
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
5576
+      "dev": true,
5577
+      "license": "MIT",
5578
+      "engines": {
5579
+        "node": ">=8"
5580
+      }
5581
+    },
5582
+    "node_modules/side-channel": {
5583
+      "version": "1.1.0",
5584
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
5585
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
5586
+      "dev": true,
5587
+      "license": "MIT",
5588
+      "dependencies": {
5589
+        "es-errors": "^1.3.0",
5590
+        "object-inspect": "^1.13.3",
5591
+        "side-channel-list": "^1.0.0",
5592
+        "side-channel-map": "^1.0.1",
5593
+        "side-channel-weakmap": "^1.0.2"
5594
+      },
5595
+      "engines": {
5596
+        "node": ">= 0.4"
5597
+      },
5598
+      "funding": {
5599
+        "url": "https://github.com/sponsors/ljharb"
5600
+      }
5601
+    },
5602
+    "node_modules/side-channel-list": {
5603
+      "version": "1.0.0",
5604
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
5605
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
5606
+      "dev": true,
5607
+      "license": "MIT",
5608
+      "dependencies": {
5609
+        "es-errors": "^1.3.0",
5610
+        "object-inspect": "^1.13.3"
5611
+      },
5612
+      "engines": {
5613
+        "node": ">= 0.4"
5614
+      },
5615
+      "funding": {
5616
+        "url": "https://github.com/sponsors/ljharb"
5617
+      }
5618
+    },
5619
+    "node_modules/side-channel-map": {
5620
+      "version": "1.0.1",
5621
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
5622
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
5623
+      "dev": true,
5624
+      "license": "MIT",
5625
+      "dependencies": {
5626
+        "call-bound": "^1.0.2",
5627
+        "es-errors": "^1.3.0",
5628
+        "get-intrinsic": "^1.2.5",
5629
+        "object-inspect": "^1.13.3"
5630
+      },
5631
+      "engines": {
5632
+        "node": ">= 0.4"
5633
+      },
5634
+      "funding": {
5635
+        "url": "https://github.com/sponsors/ljharb"
5636
+      }
5637
+    },
5638
+    "node_modules/side-channel-weakmap": {
5639
+      "version": "1.0.2",
5640
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
5641
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
5642
+      "dev": true,
5643
+      "license": "MIT",
5644
+      "dependencies": {
5645
+        "call-bound": "^1.0.2",
5646
+        "es-errors": "^1.3.0",
5647
+        "get-intrinsic": "^1.2.5",
5648
+        "object-inspect": "^1.13.3",
5649
+        "side-channel-map": "^1.0.1"
5650
+      },
5651
+      "engines": {
5652
+        "node": ">= 0.4"
5653
+      },
5654
+      "funding": {
5655
+        "url": "https://github.com/sponsors/ljharb"
5656
+      }
5657
+    },
5658
+    "node_modules/signal-exit": {
5659
+      "version": "4.1.0",
5660
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
5661
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
5662
+      "dev": true,
5663
+      "license": "ISC",
5664
+      "engines": {
5665
+        "node": ">=14"
5666
+      },
5667
+      "funding": {
5668
+        "url": "https://github.com/sponsors/isaacs"
5669
+      }
5670
+    },
5671
+    "node_modules/simple-swizzle": {
5672
+      "version": "0.2.2",
5673
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
5674
+      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
5675
+      "license": "MIT",
5676
+      "optional": true,
5677
+      "dependencies": {
5678
+        "is-arrayish": "^0.3.1"
5679
+      }
5680
+    },
5681
+    "node_modules/source-map-js": {
5682
+      "version": "1.2.1",
5683
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
5684
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
5685
+      "license": "BSD-3-Clause",
5686
+      "engines": {
5687
+        "node": ">=0.10.0"
5688
+      }
5689
+    },
5690
+    "node_modules/stable-hash": {
5691
+      "version": "0.0.5",
5692
+      "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
5693
+      "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
5694
+      "dev": true,
5695
+      "license": "MIT"
5696
+    },
5697
+    "node_modules/stop-iteration-iterator": {
5698
+      "version": "1.1.0",
5699
+      "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
5700
+      "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
5701
+      "dev": true,
5702
+      "license": "MIT",
5703
+      "dependencies": {
5704
+        "es-errors": "^1.3.0",
5705
+        "internal-slot": "^1.1.0"
5706
+      },
5707
+      "engines": {
5708
+        "node": ">= 0.4"
5709
+      }
5710
+    },
5711
+    "node_modules/streamsearch": {
5712
+      "version": "1.1.0",
5713
+      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
5714
+      "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
5715
+      "engines": {
5716
+        "node": ">=10.0.0"
5717
+      }
5718
+    },
5719
+    "node_modules/string-width": {
5720
+      "version": "5.1.2",
5721
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
5722
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
5723
+      "dev": true,
5724
+      "license": "MIT",
5725
+      "dependencies": {
5726
+        "eastasianwidth": "^0.2.0",
5727
+        "emoji-regex": "^9.2.2",
5728
+        "strip-ansi": "^7.0.1"
5729
+      },
5730
+      "engines": {
5731
+        "node": ">=12"
5732
+      },
5733
+      "funding": {
5734
+        "url": "https://github.com/sponsors/sindresorhus"
5735
+      }
5736
+    },
5737
+    "node_modules/string-width-cjs": {
5738
+      "name": "string-width",
5739
+      "version": "4.2.3",
5740
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
5741
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
5742
+      "dev": true,
5743
+      "license": "MIT",
5744
+      "dependencies": {
5745
+        "emoji-regex": "^8.0.0",
5746
+        "is-fullwidth-code-point": "^3.0.0",
5747
+        "strip-ansi": "^6.0.1"
5748
+      },
5749
+      "engines": {
5750
+        "node": ">=8"
5751
+      }
5752
+    },
5753
+    "node_modules/string-width-cjs/node_modules/ansi-regex": {
5754
+      "version": "5.0.1",
5755
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
5756
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
5757
+      "dev": true,
5758
+      "license": "MIT",
5759
+      "engines": {
5760
+        "node": ">=8"
5761
+      }
5762
+    },
5763
+    "node_modules/string-width-cjs/node_modules/emoji-regex": {
5764
+      "version": "8.0.0",
5765
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
5766
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
5767
+      "dev": true,
5768
+      "license": "MIT"
5769
+    },
5770
+    "node_modules/string-width-cjs/node_modules/strip-ansi": {
5771
+      "version": "6.0.1",
5772
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
5773
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
5774
+      "dev": true,
5775
+      "license": "MIT",
5776
+      "dependencies": {
5777
+        "ansi-regex": "^5.0.1"
5778
+      },
5779
+      "engines": {
5780
+        "node": ">=8"
5781
+      }
5782
+    },
5783
+    "node_modules/string.prototype.includes": {
5784
+      "version": "2.0.1",
5785
+      "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
5786
+      "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
5787
+      "dev": true,
5788
+      "license": "MIT",
5789
+      "dependencies": {
5790
+        "call-bind": "^1.0.7",
5791
+        "define-properties": "^1.2.1",
5792
+        "es-abstract": "^1.23.3"
5793
+      },
5794
+      "engines": {
5795
+        "node": ">= 0.4"
5796
+      }
5797
+    },
5798
+    "node_modules/string.prototype.matchall": {
5799
+      "version": "4.0.12",
5800
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
5801
+      "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
5802
+      "dev": true,
5803
+      "license": "MIT",
5804
+      "dependencies": {
5805
+        "call-bind": "^1.0.8",
5806
+        "call-bound": "^1.0.3",
5807
+        "define-properties": "^1.2.1",
5808
+        "es-abstract": "^1.23.6",
5809
+        "es-errors": "^1.3.0",
5810
+        "es-object-atoms": "^1.0.0",
5811
+        "get-intrinsic": "^1.2.6",
5812
+        "gopd": "^1.2.0",
5813
+        "has-symbols": "^1.1.0",
5814
+        "internal-slot": "^1.1.0",
5815
+        "regexp.prototype.flags": "^1.5.3",
5816
+        "set-function-name": "^2.0.2",
5817
+        "side-channel": "^1.1.0"
5818
+      },
5819
+      "engines": {
5820
+        "node": ">= 0.4"
5821
+      },
5822
+      "funding": {
5823
+        "url": "https://github.com/sponsors/ljharb"
5824
+      }
5825
+    },
5826
+    "node_modules/string.prototype.repeat": {
5827
+      "version": "1.0.0",
5828
+      "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
5829
+      "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
5830
+      "dev": true,
5831
+      "license": "MIT",
5832
+      "dependencies": {
5833
+        "define-properties": "^1.1.3",
5834
+        "es-abstract": "^1.17.5"
5835
+      }
5836
+    },
5837
+    "node_modules/string.prototype.trim": {
5838
+      "version": "1.2.10",
5839
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
5840
+      "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
5841
+      "dev": true,
5842
+      "license": "MIT",
5843
+      "dependencies": {
5844
+        "call-bind": "^1.0.8",
5845
+        "call-bound": "^1.0.2",
5846
+        "define-data-property": "^1.1.4",
5847
+        "define-properties": "^1.2.1",
5848
+        "es-abstract": "^1.23.5",
5849
+        "es-object-atoms": "^1.0.0",
5850
+        "has-property-descriptors": "^1.0.2"
5851
+      },
5852
+      "engines": {
5853
+        "node": ">= 0.4"
5854
+      },
5855
+      "funding": {
5856
+        "url": "https://github.com/sponsors/ljharb"
5857
+      }
5858
+    },
5859
+    "node_modules/string.prototype.trimend": {
5860
+      "version": "1.0.9",
5861
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
5862
+      "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
5863
+      "dev": true,
5864
+      "license": "MIT",
5865
+      "dependencies": {
5866
+        "call-bind": "^1.0.8",
5867
+        "call-bound": "^1.0.2",
5868
+        "define-properties": "^1.2.1",
5869
+        "es-object-atoms": "^1.0.0"
5870
+      },
5871
+      "engines": {
5872
+        "node": ">= 0.4"
5873
+      },
5874
+      "funding": {
5875
+        "url": "https://github.com/sponsors/ljharb"
5876
+      }
5877
+    },
5878
+    "node_modules/string.prototype.trimstart": {
5879
+      "version": "1.0.8",
5880
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
5881
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
5882
+      "dev": true,
5883
+      "license": "MIT",
5884
+      "dependencies": {
5885
+        "call-bind": "^1.0.7",
5886
+        "define-properties": "^1.2.1",
5887
+        "es-object-atoms": "^1.0.0"
5888
+      },
5889
+      "engines": {
5890
+        "node": ">= 0.4"
5891
+      },
5892
+      "funding": {
5893
+        "url": "https://github.com/sponsors/ljharb"
5894
+      }
5895
+    },
5896
+    "node_modules/strip-ansi": {
5897
+      "version": "7.1.0",
5898
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
5899
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
5900
+      "dev": true,
5901
+      "license": "MIT",
5902
+      "dependencies": {
5903
+        "ansi-regex": "^6.0.1"
5904
+      },
5905
+      "engines": {
5906
+        "node": ">=12"
5907
+      },
5908
+      "funding": {
5909
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
5910
+      }
5911
+    },
5912
+    "node_modules/strip-ansi-cjs": {
5913
+      "name": "strip-ansi",
5914
+      "version": "6.0.1",
5915
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
5916
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
5917
+      "dev": true,
5918
+      "license": "MIT",
5919
+      "dependencies": {
5920
+        "ansi-regex": "^5.0.1"
5921
+      },
5922
+      "engines": {
5923
+        "node": ">=8"
5924
+      }
5925
+    },
5926
+    "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
5927
+      "version": "5.0.1",
5928
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
5929
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
5930
+      "dev": true,
5931
+      "license": "MIT",
5932
+      "engines": {
5933
+        "node": ">=8"
5934
+      }
5935
+    },
5936
+    "node_modules/strip-bom": {
5937
+      "version": "3.0.0",
5938
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
5939
+      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
5940
+      "dev": true,
5941
+      "license": "MIT",
5942
+      "engines": {
5943
+        "node": ">=4"
5944
+      }
5945
+    },
5946
+    "node_modules/strip-json-comments": {
5947
+      "version": "3.1.1",
5948
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
5949
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
5950
+      "dev": true,
5951
+      "license": "MIT",
5952
+      "engines": {
5953
+        "node": ">=8"
5954
+      },
5955
+      "funding": {
5956
+        "url": "https://github.com/sponsors/sindresorhus"
5957
+      }
5958
+    },
5959
+    "node_modules/styled-jsx": {
5960
+      "version": "5.1.6",
5961
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
5962
+      "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
5963
+      "license": "MIT",
5964
+      "dependencies": {
5965
+        "client-only": "0.0.1"
5966
+      },
5967
+      "engines": {
5968
+        "node": ">= 12.0.0"
5969
+      },
5970
+      "peerDependencies": {
5971
+        "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
5972
+      },
5973
+      "peerDependenciesMeta": {
5974
+        "@babel/core": {
5975
+          "optional": true
5976
+        },
5977
+        "babel-plugin-macros": {
5978
+          "optional": true
5979
+        }
5980
+      }
5981
+    },
5982
+    "node_modules/sucrase": {
5983
+      "version": "3.35.0",
5984
+      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
5985
+      "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
5986
+      "dev": true,
5987
+      "license": "MIT",
5988
+      "dependencies": {
5989
+        "@jridgewell/gen-mapping": "^0.3.2",
5990
+        "commander": "^4.0.0",
5991
+        "glob": "^10.3.10",
5992
+        "lines-and-columns": "^1.1.6",
5993
+        "mz": "^2.7.0",
5994
+        "pirates": "^4.0.1",
5995
+        "ts-interface-checker": "^0.1.9"
5996
+      },
5997
+      "bin": {
5998
+        "sucrase": "bin/sucrase",
5999
+        "sucrase-node": "bin/sucrase-node"
6000
+      },
6001
+      "engines": {
6002
+        "node": ">=16 || 14 >=14.17"
6003
+      }
6004
+    },
6005
+    "node_modules/supports-color": {
6006
+      "version": "7.2.0",
6007
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
6008
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
6009
+      "dev": true,
6010
+      "license": "MIT",
6011
+      "dependencies": {
6012
+        "has-flag": "^4.0.0"
6013
+      },
6014
+      "engines": {
6015
+        "node": ">=8"
6016
+      }
6017
+    },
6018
+    "node_modules/supports-preserve-symlinks-flag": {
6019
+      "version": "1.0.0",
6020
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
6021
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
6022
+      "dev": true,
6023
+      "license": "MIT",
6024
+      "engines": {
6025
+        "node": ">= 0.4"
6026
+      },
6027
+      "funding": {
6028
+        "url": "https://github.com/sponsors/ljharb"
6029
+      }
6030
+    },
6031
+    "node_modules/tailwindcss": {
6032
+      "version": "3.4.17",
6033
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
6034
+      "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
6035
+      "dev": true,
6036
+      "license": "MIT",
6037
+      "dependencies": {
6038
+        "@alloc/quick-lru": "^5.2.0",
6039
+        "arg": "^5.0.2",
6040
+        "chokidar": "^3.6.0",
6041
+        "didyoumean": "^1.2.2",
6042
+        "dlv": "^1.1.3",
6043
+        "fast-glob": "^3.3.2",
6044
+        "glob-parent": "^6.0.2",
6045
+        "is-glob": "^4.0.3",
6046
+        "jiti": "^1.21.6",
6047
+        "lilconfig": "^3.1.3",
6048
+        "micromatch": "^4.0.8",
6049
+        "normalize-path": "^3.0.0",
6050
+        "object-hash": "^3.0.0",
6051
+        "picocolors": "^1.1.1",
6052
+        "postcss": "^8.4.47",
6053
+        "postcss-import": "^15.1.0",
6054
+        "postcss-js": "^4.0.1",
6055
+        "postcss-load-config": "^4.0.2",
6056
+        "postcss-nested": "^6.2.0",
6057
+        "postcss-selector-parser": "^6.1.2",
6058
+        "resolve": "^1.22.8",
6059
+        "sucrase": "^3.35.0"
6060
+      },
6061
+      "bin": {
6062
+        "tailwind": "lib/cli.js",
6063
+        "tailwindcss": "lib/cli.js"
6064
+      },
6065
+      "engines": {
6066
+        "node": ">=14.0.0"
6067
+      }
6068
+    },
6069
+    "node_modules/tailwindcss/node_modules/fast-glob": {
6070
+      "version": "3.3.3",
6071
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
6072
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
6073
+      "dev": true,
6074
+      "license": "MIT",
6075
+      "dependencies": {
6076
+        "@nodelib/fs.stat": "^2.0.2",
6077
+        "@nodelib/fs.walk": "^1.2.3",
6078
+        "glob-parent": "^5.1.2",
6079
+        "merge2": "^1.3.0",
6080
+        "micromatch": "^4.0.8"
6081
+      },
6082
+      "engines": {
6083
+        "node": ">=8.6.0"
6084
+      }
6085
+    },
6086
+    "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": {
6087
+      "version": "5.1.2",
6088
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
6089
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
6090
+      "dev": true,
6091
+      "license": "ISC",
6092
+      "dependencies": {
6093
+        "is-glob": "^4.0.1"
6094
+      },
6095
+      "engines": {
6096
+        "node": ">= 6"
6097
+      }
6098
+    },
6099
+    "node_modules/tailwindcss/node_modules/jiti": {
6100
+      "version": "1.21.7",
6101
+      "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
6102
+      "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
6103
+      "dev": true,
6104
+      "license": "MIT",
6105
+      "bin": {
6106
+        "jiti": "bin/jiti.js"
6107
+      }
6108
+    },
6109
+    "node_modules/tailwindcss/node_modules/postcss-load-config": {
6110
+      "version": "4.0.2",
6111
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
6112
+      "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
6113
+      "dev": true,
6114
+      "funding": [
6115
+        {
6116
+          "type": "opencollective",
6117
+          "url": "https://opencollective.com/postcss/"
6118
+        },
6119
+        {
6120
+          "type": "github",
6121
+          "url": "https://github.com/sponsors/ai"
6122
+        }
6123
+      ],
6124
+      "license": "MIT",
6125
+      "dependencies": {
6126
+        "lilconfig": "^3.0.0",
6127
+        "yaml": "^2.3.4"
6128
+      },
6129
+      "engines": {
6130
+        "node": ">= 14"
6131
+      },
6132
+      "peerDependencies": {
6133
+        "postcss": ">=8.0.9",
6134
+        "ts-node": ">=9.0.0"
6135
+      },
6136
+      "peerDependenciesMeta": {
6137
+        "postcss": {
6138
+          "optional": true
6139
+        },
6140
+        "ts-node": {
6141
+          "optional": true
6142
+        }
6143
+      }
6144
+    },
6145
+    "node_modules/thenify": {
6146
+      "version": "3.3.1",
6147
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
6148
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
6149
+      "dev": true,
6150
+      "license": "MIT",
6151
+      "dependencies": {
6152
+        "any-promise": "^1.0.0"
6153
+      }
6154
+    },
6155
+    "node_modules/thenify-all": {
6156
+      "version": "1.6.0",
6157
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
6158
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
6159
+      "dev": true,
6160
+      "license": "MIT",
6161
+      "dependencies": {
6162
+        "thenify": ">= 3.1.0 < 4"
6163
+      },
6164
+      "engines": {
6165
+        "node": ">=0.8"
6166
+      }
6167
+    },
6168
+    "node_modules/tinyglobby": {
6169
+      "version": "0.2.14",
6170
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
6171
+      "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
6172
+      "dev": true,
6173
+      "license": "MIT",
6174
+      "dependencies": {
6175
+        "fdir": "^6.4.4",
6176
+        "picomatch": "^4.0.2"
6177
+      },
6178
+      "engines": {
6179
+        "node": ">=12.0.0"
6180
+      },
6181
+      "funding": {
6182
+        "url": "https://github.com/sponsors/SuperchupuDev"
6183
+      }
6184
+    },
6185
+    "node_modules/tinyglobby/node_modules/fdir": {
6186
+      "version": "6.4.6",
6187
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
6188
+      "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
6189
+      "dev": true,
6190
+      "license": "MIT",
6191
+      "peerDependencies": {
6192
+        "picomatch": "^3 || ^4"
6193
+      },
6194
+      "peerDependenciesMeta": {
6195
+        "picomatch": {
6196
+          "optional": true
6197
+        }
6198
+      }
6199
+    },
6200
+    "node_modules/tinyglobby/node_modules/picomatch": {
6201
+      "version": "4.0.2",
6202
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
6203
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
6204
+      "dev": true,
6205
+      "license": "MIT",
6206
+      "engines": {
6207
+        "node": ">=12"
6208
+      },
6209
+      "funding": {
6210
+        "url": "https://github.com/sponsors/jonschlinkert"
6211
+      }
6212
+    },
6213
+    "node_modules/to-regex-range": {
6214
+      "version": "5.0.1",
6215
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
6216
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
6217
+      "dev": true,
6218
+      "license": "MIT",
6219
+      "dependencies": {
6220
+        "is-number": "^7.0.0"
6221
+      },
6222
+      "engines": {
6223
+        "node": ">=8.0"
6224
+      }
6225
+    },
6226
+    "node_modules/ts-api-utils": {
6227
+      "version": "2.1.0",
6228
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
6229
+      "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
6230
+      "dev": true,
6231
+      "license": "MIT",
6232
+      "engines": {
6233
+        "node": ">=18.12"
6234
+      },
6235
+      "peerDependencies": {
6236
+        "typescript": ">=4.8.4"
6237
+      }
6238
+    },
6239
+    "node_modules/ts-interface-checker": {
6240
+      "version": "0.1.13",
6241
+      "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
6242
+      "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
6243
+      "dev": true,
6244
+      "license": "Apache-2.0"
6245
+    },
6246
+    "node_modules/tsconfig-paths": {
6247
+      "version": "3.15.0",
6248
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
6249
+      "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
6250
+      "dev": true,
6251
+      "license": "MIT",
6252
+      "dependencies": {
6253
+        "@types/json5": "^0.0.29",
6254
+        "json5": "^1.0.2",
6255
+        "minimist": "^1.2.6",
6256
+        "strip-bom": "^3.0.0"
6257
+      }
6258
+    },
6259
+    "node_modules/tslib": {
6260
+      "version": "2.8.1",
6261
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
6262
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
6263
+      "license": "0BSD"
6264
+    },
6265
+    "node_modules/type-check": {
6266
+      "version": "0.4.0",
6267
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
6268
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
6269
+      "dev": true,
6270
+      "license": "MIT",
6271
+      "dependencies": {
6272
+        "prelude-ls": "^1.2.1"
6273
+      },
6274
+      "engines": {
6275
+        "node": ">= 0.8.0"
6276
+      }
6277
+    },
6278
+    "node_modules/typed-array-buffer": {
6279
+      "version": "1.0.3",
6280
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
6281
+      "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
6282
+      "dev": true,
6283
+      "license": "MIT",
6284
+      "dependencies": {
6285
+        "call-bound": "^1.0.3",
6286
+        "es-errors": "^1.3.0",
6287
+        "is-typed-array": "^1.1.14"
6288
+      },
6289
+      "engines": {
6290
+        "node": ">= 0.4"
6291
+      }
6292
+    },
6293
+    "node_modules/typed-array-byte-length": {
6294
+      "version": "1.0.3",
6295
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
6296
+      "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
6297
+      "dev": true,
6298
+      "license": "MIT",
6299
+      "dependencies": {
6300
+        "call-bind": "^1.0.8",
6301
+        "for-each": "^0.3.3",
6302
+        "gopd": "^1.2.0",
6303
+        "has-proto": "^1.2.0",
6304
+        "is-typed-array": "^1.1.14"
6305
+      },
6306
+      "engines": {
6307
+        "node": ">= 0.4"
6308
+      },
6309
+      "funding": {
6310
+        "url": "https://github.com/sponsors/ljharb"
6311
+      }
6312
+    },
6313
+    "node_modules/typed-array-byte-offset": {
6314
+      "version": "1.0.4",
6315
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
6316
+      "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
6317
+      "dev": true,
6318
+      "license": "MIT",
6319
+      "dependencies": {
6320
+        "available-typed-arrays": "^1.0.7",
6321
+        "call-bind": "^1.0.8",
6322
+        "for-each": "^0.3.3",
6323
+        "gopd": "^1.2.0",
6324
+        "has-proto": "^1.2.0",
6325
+        "is-typed-array": "^1.1.15",
6326
+        "reflect.getprototypeof": "^1.0.9"
6327
+      },
6328
+      "engines": {
6329
+        "node": ">= 0.4"
6330
+      },
6331
+      "funding": {
6332
+        "url": "https://github.com/sponsors/ljharb"
6333
+      }
6334
+    },
6335
+    "node_modules/typed-array-length": {
6336
+      "version": "1.0.7",
6337
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
6338
+      "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
6339
+      "dev": true,
6340
+      "license": "MIT",
6341
+      "dependencies": {
6342
+        "call-bind": "^1.0.7",
6343
+        "for-each": "^0.3.3",
6344
+        "gopd": "^1.0.1",
6345
+        "is-typed-array": "^1.1.13",
6346
+        "possible-typed-array-names": "^1.0.0",
6347
+        "reflect.getprototypeof": "^1.0.6"
6348
+      },
6349
+      "engines": {
6350
+        "node": ">= 0.4"
6351
+      },
6352
+      "funding": {
6353
+        "url": "https://github.com/sponsors/ljharb"
6354
+      }
6355
+    },
6356
+    "node_modules/typescript": {
6357
+      "version": "5.8.3",
6358
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
6359
+      "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
6360
+      "dev": true,
6361
+      "license": "Apache-2.0",
6362
+      "bin": {
6363
+        "tsc": "bin/tsc",
6364
+        "tsserver": "bin/tsserver"
6365
+      },
6366
+      "engines": {
6367
+        "node": ">=14.17"
6368
+      }
6369
+    },
6370
+    "node_modules/unbox-primitive": {
6371
+      "version": "1.1.0",
6372
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
6373
+      "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
6374
+      "dev": true,
6375
+      "license": "MIT",
6376
+      "dependencies": {
6377
+        "call-bound": "^1.0.3",
6378
+        "has-bigints": "^1.0.2",
6379
+        "has-symbols": "^1.1.0",
6380
+        "which-boxed-primitive": "^1.1.1"
6381
+      },
6382
+      "engines": {
6383
+        "node": ">= 0.4"
6384
+      },
6385
+      "funding": {
6386
+        "url": "https://github.com/sponsors/ljharb"
6387
+      }
6388
+    },
6389
+    "node_modules/undici-types": {
6390
+      "version": "6.21.0",
6391
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
6392
+      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
6393
+      "dev": true,
6394
+      "license": "MIT"
6395
+    },
6396
+    "node_modules/unrs-resolver": {
6397
+      "version": "1.9.2",
6398
+      "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.2.tgz",
6399
+      "integrity": "sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA==",
6400
+      "dev": true,
6401
+      "hasInstallScript": true,
6402
+      "license": "MIT",
6403
+      "dependencies": {
6404
+        "napi-postinstall": "^0.2.4"
6405
+      },
6406
+      "funding": {
6407
+        "url": "https://opencollective.com/unrs-resolver"
6408
+      },
6409
+      "optionalDependencies": {
6410
+        "@unrs/resolver-binding-android-arm-eabi": "1.9.2",
6411
+        "@unrs/resolver-binding-android-arm64": "1.9.2",
6412
+        "@unrs/resolver-binding-darwin-arm64": "1.9.2",
6413
+        "@unrs/resolver-binding-darwin-x64": "1.9.2",
6414
+        "@unrs/resolver-binding-freebsd-x64": "1.9.2",
6415
+        "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.2",
6416
+        "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.2",
6417
+        "@unrs/resolver-binding-linux-arm64-gnu": "1.9.2",
6418
+        "@unrs/resolver-binding-linux-arm64-musl": "1.9.2",
6419
+        "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.2",
6420
+        "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.2",
6421
+        "@unrs/resolver-binding-linux-riscv64-musl": "1.9.2",
6422
+        "@unrs/resolver-binding-linux-s390x-gnu": "1.9.2",
6423
+        "@unrs/resolver-binding-linux-x64-gnu": "1.9.2",
6424
+        "@unrs/resolver-binding-linux-x64-musl": "1.9.2",
6425
+        "@unrs/resolver-binding-wasm32-wasi": "1.9.2",
6426
+        "@unrs/resolver-binding-win32-arm64-msvc": "1.9.2",
6427
+        "@unrs/resolver-binding-win32-ia32-msvc": "1.9.2",
6428
+        "@unrs/resolver-binding-win32-x64-msvc": "1.9.2"
6429
+      }
6430
+    },
6431
+    "node_modules/update-browserslist-db": {
6432
+      "version": "1.1.3",
6433
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
6434
+      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
6435
+      "dev": true,
6436
+      "funding": [
6437
+        {
6438
+          "type": "opencollective",
6439
+          "url": "https://opencollective.com/browserslist"
6440
+        },
6441
+        {
6442
+          "type": "tidelift",
6443
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
6444
+        },
6445
+        {
6446
+          "type": "github",
6447
+          "url": "https://github.com/sponsors/ai"
6448
+        }
6449
+      ],
6450
+      "license": "MIT",
6451
+      "dependencies": {
6452
+        "escalade": "^3.2.0",
6453
+        "picocolors": "^1.1.1"
6454
+      },
6455
+      "bin": {
6456
+        "update-browserslist-db": "cli.js"
6457
+      },
6458
+      "peerDependencies": {
6459
+        "browserslist": ">= 4.21.0"
6460
+      }
6461
+    },
6462
+    "node_modules/uri-js": {
6463
+      "version": "4.4.1",
6464
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
6465
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
6466
+      "dev": true,
6467
+      "license": "BSD-2-Clause",
6468
+      "dependencies": {
6469
+        "punycode": "^2.1.0"
6470
+      }
6471
+    },
6472
+    "node_modules/util-deprecate": {
6473
+      "version": "1.0.2",
6474
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
6475
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
6476
+      "dev": true,
6477
+      "license": "MIT"
6478
+    },
6479
+    "node_modules/which": {
6480
+      "version": "2.0.2",
6481
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
6482
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
6483
+      "dev": true,
6484
+      "license": "ISC",
6485
+      "dependencies": {
6486
+        "isexe": "^2.0.0"
6487
+      },
6488
+      "bin": {
6489
+        "node-which": "bin/node-which"
6490
+      },
6491
+      "engines": {
6492
+        "node": ">= 8"
6493
+      }
6494
+    },
6495
+    "node_modules/which-boxed-primitive": {
6496
+      "version": "1.1.1",
6497
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
6498
+      "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
6499
+      "dev": true,
6500
+      "license": "MIT",
6501
+      "dependencies": {
6502
+        "is-bigint": "^1.1.0",
6503
+        "is-boolean-object": "^1.2.1",
6504
+        "is-number-object": "^1.1.1",
6505
+        "is-string": "^1.1.1",
6506
+        "is-symbol": "^1.1.1"
6507
+      },
6508
+      "engines": {
6509
+        "node": ">= 0.4"
6510
+      },
6511
+      "funding": {
6512
+        "url": "https://github.com/sponsors/ljharb"
6513
+      }
6514
+    },
6515
+    "node_modules/which-builtin-type": {
6516
+      "version": "1.2.1",
6517
+      "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
6518
+      "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
6519
+      "dev": true,
6520
+      "license": "MIT",
6521
+      "dependencies": {
6522
+        "call-bound": "^1.0.2",
6523
+        "function.prototype.name": "^1.1.6",
6524
+        "has-tostringtag": "^1.0.2",
6525
+        "is-async-function": "^2.0.0",
6526
+        "is-date-object": "^1.1.0",
6527
+        "is-finalizationregistry": "^1.1.0",
6528
+        "is-generator-function": "^1.0.10",
6529
+        "is-regex": "^1.2.1",
6530
+        "is-weakref": "^1.0.2",
6531
+        "isarray": "^2.0.5",
6532
+        "which-boxed-primitive": "^1.1.0",
6533
+        "which-collection": "^1.0.2",
6534
+        "which-typed-array": "^1.1.16"
6535
+      },
6536
+      "engines": {
6537
+        "node": ">= 0.4"
6538
+      },
6539
+      "funding": {
6540
+        "url": "https://github.com/sponsors/ljharb"
6541
+      }
6542
+    },
6543
+    "node_modules/which-collection": {
6544
+      "version": "1.0.2",
6545
+      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
6546
+      "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
6547
+      "dev": true,
6548
+      "license": "MIT",
6549
+      "dependencies": {
6550
+        "is-map": "^2.0.3",
6551
+        "is-set": "^2.0.3",
6552
+        "is-weakmap": "^2.0.2",
6553
+        "is-weakset": "^2.0.3"
6554
+      },
6555
+      "engines": {
6556
+        "node": ">= 0.4"
6557
+      },
6558
+      "funding": {
6559
+        "url": "https://github.com/sponsors/ljharb"
6560
+      }
6561
+    },
6562
+    "node_modules/which-typed-array": {
6563
+      "version": "1.1.19",
6564
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
6565
+      "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
6566
+      "dev": true,
6567
+      "license": "MIT",
6568
+      "dependencies": {
6569
+        "available-typed-arrays": "^1.0.7",
6570
+        "call-bind": "^1.0.8",
6571
+        "call-bound": "^1.0.4",
6572
+        "for-each": "^0.3.5",
6573
+        "get-proto": "^1.0.1",
6574
+        "gopd": "^1.2.0",
6575
+        "has-tostringtag": "^1.0.2"
6576
+      },
6577
+      "engines": {
6578
+        "node": ">= 0.4"
6579
+      },
6580
+      "funding": {
6581
+        "url": "https://github.com/sponsors/ljharb"
6582
+      }
6583
+    },
6584
+    "node_modules/word-wrap": {
6585
+      "version": "1.2.5",
6586
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
6587
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
6588
+      "dev": true,
6589
+      "license": "MIT",
6590
+      "engines": {
6591
+        "node": ">=0.10.0"
6592
+      }
6593
+    },
6594
+    "node_modules/wrap-ansi": {
6595
+      "version": "8.1.0",
6596
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
6597
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
6598
+      "dev": true,
6599
+      "license": "MIT",
6600
+      "dependencies": {
6601
+        "ansi-styles": "^6.1.0",
6602
+        "string-width": "^5.0.1",
6603
+        "strip-ansi": "^7.0.1"
6604
+      },
6605
+      "engines": {
6606
+        "node": ">=12"
6607
+      },
6608
+      "funding": {
6609
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
6610
+      }
6611
+    },
6612
+    "node_modules/wrap-ansi-cjs": {
6613
+      "name": "wrap-ansi",
6614
+      "version": "7.0.0",
6615
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
6616
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
6617
+      "dev": true,
6618
+      "license": "MIT",
6619
+      "dependencies": {
6620
+        "ansi-styles": "^4.0.0",
6621
+        "string-width": "^4.1.0",
6622
+        "strip-ansi": "^6.0.0"
6623
+      },
6624
+      "engines": {
6625
+        "node": ">=10"
6626
+      },
6627
+      "funding": {
6628
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
6629
+      }
6630
+    },
6631
+    "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
6632
+      "version": "5.0.1",
6633
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
6634
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
6635
+      "dev": true,
6636
+      "license": "MIT",
6637
+      "engines": {
6638
+        "node": ">=8"
6639
+      }
6640
+    },
6641
+    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
6642
+      "version": "8.0.0",
6643
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
6644
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
6645
+      "dev": true,
6646
+      "license": "MIT"
6647
+    },
6648
+    "node_modules/wrap-ansi-cjs/node_modules/string-width": {
6649
+      "version": "4.2.3",
6650
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
6651
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
6652
+      "dev": true,
6653
+      "license": "MIT",
6654
+      "dependencies": {
6655
+        "emoji-regex": "^8.0.0",
6656
+        "is-fullwidth-code-point": "^3.0.0",
6657
+        "strip-ansi": "^6.0.1"
6658
+      },
6659
+      "engines": {
6660
+        "node": ">=8"
6661
+      }
6662
+    },
6663
+    "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
6664
+      "version": "6.0.1",
6665
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
6666
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
6667
+      "dev": true,
6668
+      "license": "MIT",
6669
+      "dependencies": {
6670
+        "ansi-regex": "^5.0.1"
6671
+      },
6672
+      "engines": {
6673
+        "node": ">=8"
6674
+      }
6675
+    },
6676
+    "node_modules/wrap-ansi/node_modules/ansi-styles": {
6677
+      "version": "6.2.1",
6678
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
6679
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
6680
+      "dev": true,
6681
+      "license": "MIT",
6682
+      "engines": {
6683
+        "node": ">=12"
6684
+      },
6685
+      "funding": {
6686
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
6687
+      }
6688
+    },
6689
+    "node_modules/yaml": {
6690
+      "version": "2.8.0",
6691
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
6692
+      "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
6693
+      "dev": true,
6694
+      "license": "ISC",
6695
+      "bin": {
6696
+        "yaml": "bin.mjs"
6697
+      },
6698
+      "engines": {
6699
+        "node": ">= 14.6"
6700
+      }
6701
+    },
6702
+    "node_modules/yocto-queue": {
6703
+      "version": "0.1.0",
6704
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
6705
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
6706
+      "dev": true,
6707
+      "license": "MIT",
6708
+      "engines": {
6709
+        "node": ">=10"
6710
+      },
6711
+      "funding": {
6712
+        "url": "https://github.com/sponsors/sindresorhus"
6713
+      }
6714
+    }
6715
+  }
6716
+}
frontend/package.jsonadded
@@ -0,0 +1,33 @@
1
+{
2
+  "name": "localtoast-frontend",
3
+  "version": "0.1.0",
4
+  "private": true,
5
+  "scripts": {
6
+    "dev": "next dev -p 3001",
7
+    "build": "next build",
8
+    "start": "next start",
9
+    "lint": "next lint"
10
+  },
11
+  "dependencies": {
12
+    "@tanstack/react-query": "^5.81.2",
13
+    "axios": "^1.10.0",
14
+    "leaflet": "^1.9.4",
15
+    "lucide-react": "^0.456.0",
16
+    "next": "15.1.3",
17
+    "react": "^19.0.0",
18
+    "react-dom": "^19.0.0",
19
+    "react-leaflet": "^5.0.0"
20
+  },
21
+  "devDependencies": {
22
+    "@types/leaflet": "^1.9.19",
23
+    "@types/node": "^20",
24
+    "@types/react": "^19",
25
+    "@types/react-dom": "^19",
26
+    "autoprefixer": "^10.4.20",
27
+    "eslint": "^9",
28
+    "eslint-config-next": "15.1.3",
29
+    "postcss": "^8.4.49",
30
+    "tailwindcss": "^3.4.17",
31
+    "typescript": "^5"
32
+  }
33
+}
frontend/postcss.config.mjsadded
@@ -0,0 +1,9 @@
1
+/** @type {import('postcss-load-config').Config} */
2
+const config = {
3
+  plugins: {
4
+    tailwindcss: {},
5
+    autoprefixer: {},
6
+  },
7
+}
8
+
9
+export default config
frontend/public/file.svgadded
@@ -0,0 +1,1 @@
1
+<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
frontend/public/globe.svgadded
@@ -0,0 +1,1 @@
1
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
frontend/public/leaflet/marker-icon-2x.pngadded
Image file changed (preview rendering wires once /raw URLs are threaded into the diff renderer).
frontend/public/leaflet/marker-icon.pngadded
Image file changed (preview rendering wires once /raw URLs are threaded into the diff renderer).
frontend/public/leaflet/marker-shadow.pngadded
Image file changed (preview rendering wires once /raw URLs are threaded into the diff renderer).
frontend/public/next.svgadded
@@ -0,0 +1,1 @@
1
+<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
frontend/public/vercel.svgadded
@@ -0,0 +1,1 @@
1
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
frontend/public/window.svgadded
@@ -0,0 +1,1 @@
1
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
frontend/tailwind.config.tsadded
@@ -0,0 +1,30 @@
1
+import type { Config } from 'tailwindcss'
2
+
3
+const config: Config = {
4
+  content: [
5
+    './pages/**/*.{js,ts,jsx,tsx,mdx}',
6
+    './components/**/*.{js,ts,jsx,tsx,mdx}',
7
+    './app/**/*.{js,ts,jsx,tsx,mdx}',
8
+  ],
9
+  theme: {
10
+    extend: {
11
+      colors: {
12
+        amber: {
13
+          50: '#fffbeb',
14
+          100: '#fef3c7',
15
+          200: '#fde68a',
16
+          300: '#fcd34d',
17
+          400: '#fbbf24',
18
+          500: '#f59e0b',
19
+          600: '#d97706',
20
+          700: '#b45309',
21
+          800: '#92400e',
22
+          900: '#78350f',
23
+        },
24
+      },
25
+    },
26
+  },
27
+  plugins: [],
28
+}
29
+
30
+export default config
frontend/tsconfig.jsonadded
@@ -0,0 +1,40 @@
1
+{
2
+  "compilerOptions": {
3
+    "target": "ES2017",
4
+    "lib": [
5
+      "dom",
6
+      "dom.iterable",
7
+      "esnext"
8
+    ],
9
+    "allowJs": true,
10
+    "skipLibCheck": true,
11
+    "strict": true,
12
+    "noEmit": true,
13
+    "esModuleInterop": true,
14
+    "module": "esnext",
15
+    "moduleResolution": "bundler",
16
+    "resolveJsonModule": true,
17
+    "isolatedModules": true,
18
+    "jsx": "preserve",
19
+    "incremental": true,
20
+    "paths": {
21
+      "@/*": [
22
+        "./*"
23
+      ]
24
+    },
25
+    "plugins": [
26
+      {
27
+        "name": "next"
28
+      }
29
+    ]
30
+  },
31
+  "include": [
32
+    "**/*.ts",
33
+    "**/*.tsx",
34
+    "next-env.d.ts",
35
+    ".next/types/**/*.ts"
36
+  ],
37
+  "exclude": [
38
+    "node_modules"
39
+  ]
40
+}
package-lock.jsonadded
@@ -0,0 +1,372 @@
1
+{
2
+  "name": "localtoast",
3
+  "version": "1.0.0",
4
+  "lockfileVersion": 3,
5
+  "requires": true,
6
+  "packages": {
7
+    "": {
8
+      "name": "localtoast",
9
+      "version": "1.0.0",
10
+      "devDependencies": {
11
+        "concurrently": "^8.2.2"
12
+      }
13
+    },
14
+    "node_modules/@babel/runtime": {
15
+      "version": "7.27.6",
16
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
17
+      "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
18
+      "dev": true,
19
+      "license": "MIT",
20
+      "engines": {
21
+        "node": ">=6.9.0"
22
+      }
23
+    },
24
+    "node_modules/ansi-regex": {
25
+      "version": "5.0.1",
26
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
27
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
28
+      "dev": true,
29
+      "license": "MIT",
30
+      "engines": {
31
+        "node": ">=8"
32
+      }
33
+    },
34
+    "node_modules/ansi-styles": {
35
+      "version": "4.3.0",
36
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
37
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
38
+      "dev": true,
39
+      "license": "MIT",
40
+      "dependencies": {
41
+        "color-convert": "^2.0.1"
42
+      },
43
+      "engines": {
44
+        "node": ">=8"
45
+      },
46
+      "funding": {
47
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
48
+      }
49
+    },
50
+    "node_modules/chalk": {
51
+      "version": "4.1.2",
52
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
53
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
54
+      "dev": true,
55
+      "license": "MIT",
56
+      "dependencies": {
57
+        "ansi-styles": "^4.1.0",
58
+        "supports-color": "^7.1.0"
59
+      },
60
+      "engines": {
61
+        "node": ">=10"
62
+      },
63
+      "funding": {
64
+        "url": "https://github.com/chalk/chalk?sponsor=1"
65
+      }
66
+    },
67
+    "node_modules/chalk/node_modules/supports-color": {
68
+      "version": "7.2.0",
69
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
70
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
71
+      "dev": true,
72
+      "license": "MIT",
73
+      "dependencies": {
74
+        "has-flag": "^4.0.0"
75
+      },
76
+      "engines": {
77
+        "node": ">=8"
78
+      }
79
+    },
80
+    "node_modules/cliui": {
81
+      "version": "8.0.1",
82
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
83
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
84
+      "dev": true,
85
+      "license": "ISC",
86
+      "dependencies": {
87
+        "string-width": "^4.2.0",
88
+        "strip-ansi": "^6.0.1",
89
+        "wrap-ansi": "^7.0.0"
90
+      },
91
+      "engines": {
92
+        "node": ">=12"
93
+      }
94
+    },
95
+    "node_modules/color-convert": {
96
+      "version": "2.0.1",
97
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
98
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
99
+      "dev": true,
100
+      "license": "MIT",
101
+      "dependencies": {
102
+        "color-name": "~1.1.4"
103
+      },
104
+      "engines": {
105
+        "node": ">=7.0.0"
106
+      }
107
+    },
108
+    "node_modules/color-name": {
109
+      "version": "1.1.4",
110
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
111
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
112
+      "dev": true,
113
+      "license": "MIT"
114
+    },
115
+    "node_modules/concurrently": {
116
+      "version": "8.2.2",
117
+      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
118
+      "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
119
+      "dev": true,
120
+      "license": "MIT",
121
+      "dependencies": {
122
+        "chalk": "^4.1.2",
123
+        "date-fns": "^2.30.0",
124
+        "lodash": "^4.17.21",
125
+        "rxjs": "^7.8.1",
126
+        "shell-quote": "^1.8.1",
127
+        "spawn-command": "0.0.2",
128
+        "supports-color": "^8.1.1",
129
+        "tree-kill": "^1.2.2",
130
+        "yargs": "^17.7.2"
131
+      },
132
+      "bin": {
133
+        "conc": "dist/bin/concurrently.js",
134
+        "concurrently": "dist/bin/concurrently.js"
135
+      },
136
+      "engines": {
137
+        "node": "^14.13.0 || >=16.0.0"
138
+      },
139
+      "funding": {
140
+        "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
141
+      }
142
+    },
143
+    "node_modules/date-fns": {
144
+      "version": "2.30.0",
145
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
146
+      "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
147
+      "dev": true,
148
+      "license": "MIT",
149
+      "dependencies": {
150
+        "@babel/runtime": "^7.21.0"
151
+      },
152
+      "engines": {
153
+        "node": ">=0.11"
154
+      },
155
+      "funding": {
156
+        "type": "opencollective",
157
+        "url": "https://opencollective.com/date-fns"
158
+      }
159
+    },
160
+    "node_modules/emoji-regex": {
161
+      "version": "8.0.0",
162
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
163
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
164
+      "dev": true,
165
+      "license": "MIT"
166
+    },
167
+    "node_modules/escalade": {
168
+      "version": "3.2.0",
169
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
170
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
171
+      "dev": true,
172
+      "license": "MIT",
173
+      "engines": {
174
+        "node": ">=6"
175
+      }
176
+    },
177
+    "node_modules/get-caller-file": {
178
+      "version": "2.0.5",
179
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
180
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
181
+      "dev": true,
182
+      "license": "ISC",
183
+      "engines": {
184
+        "node": "6.* || 8.* || >= 10.*"
185
+      }
186
+    },
187
+    "node_modules/has-flag": {
188
+      "version": "4.0.0",
189
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
190
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
191
+      "dev": true,
192
+      "license": "MIT",
193
+      "engines": {
194
+        "node": ">=8"
195
+      }
196
+    },
197
+    "node_modules/is-fullwidth-code-point": {
198
+      "version": "3.0.0",
199
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
200
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
201
+      "dev": true,
202
+      "license": "MIT",
203
+      "engines": {
204
+        "node": ">=8"
205
+      }
206
+    },
207
+    "node_modules/lodash": {
208
+      "version": "4.17.21",
209
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
210
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
211
+      "dev": true,
212
+      "license": "MIT"
213
+    },
214
+    "node_modules/require-directory": {
215
+      "version": "2.1.1",
216
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
217
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
218
+      "dev": true,
219
+      "license": "MIT",
220
+      "engines": {
221
+        "node": ">=0.10.0"
222
+      }
223
+    },
224
+    "node_modules/rxjs": {
225
+      "version": "7.8.2",
226
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
227
+      "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
228
+      "dev": true,
229
+      "license": "Apache-2.0",
230
+      "dependencies": {
231
+        "tslib": "^2.1.0"
232
+      }
233
+    },
234
+    "node_modules/shell-quote": {
235
+      "version": "1.8.3",
236
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
237
+      "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
238
+      "dev": true,
239
+      "license": "MIT",
240
+      "engines": {
241
+        "node": ">= 0.4"
242
+      },
243
+      "funding": {
244
+        "url": "https://github.com/sponsors/ljharb"
245
+      }
246
+    },
247
+    "node_modules/spawn-command": {
248
+      "version": "0.0.2",
249
+      "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
250
+      "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
251
+      "dev": true
252
+    },
253
+    "node_modules/string-width": {
254
+      "version": "4.2.3",
255
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
256
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
257
+      "dev": true,
258
+      "license": "MIT",
259
+      "dependencies": {
260
+        "emoji-regex": "^8.0.0",
261
+        "is-fullwidth-code-point": "^3.0.0",
262
+        "strip-ansi": "^6.0.1"
263
+      },
264
+      "engines": {
265
+        "node": ">=8"
266
+      }
267
+    },
268
+    "node_modules/strip-ansi": {
269
+      "version": "6.0.1",
270
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
271
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
272
+      "dev": true,
273
+      "license": "MIT",
274
+      "dependencies": {
275
+        "ansi-regex": "^5.0.1"
276
+      },
277
+      "engines": {
278
+        "node": ">=8"
279
+      }
280
+    },
281
+    "node_modules/supports-color": {
282
+      "version": "8.1.1",
283
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
284
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
285
+      "dev": true,
286
+      "license": "MIT",
287
+      "dependencies": {
288
+        "has-flag": "^4.0.0"
289
+      },
290
+      "engines": {
291
+        "node": ">=10"
292
+      },
293
+      "funding": {
294
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
295
+      }
296
+    },
297
+    "node_modules/tree-kill": {
298
+      "version": "1.2.2",
299
+      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
300
+      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
301
+      "dev": true,
302
+      "license": "MIT",
303
+      "bin": {
304
+        "tree-kill": "cli.js"
305
+      }
306
+    },
307
+    "node_modules/tslib": {
308
+      "version": "2.8.1",
309
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
310
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
311
+      "dev": true,
312
+      "license": "0BSD"
313
+    },
314
+    "node_modules/wrap-ansi": {
315
+      "version": "7.0.0",
316
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
317
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
318
+      "dev": true,
319
+      "license": "MIT",
320
+      "dependencies": {
321
+        "ansi-styles": "^4.0.0",
322
+        "string-width": "^4.1.0",
323
+        "strip-ansi": "^6.0.0"
324
+      },
325
+      "engines": {
326
+        "node": ">=10"
327
+      },
328
+      "funding": {
329
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
330
+      }
331
+    },
332
+    "node_modules/y18n": {
333
+      "version": "5.0.8",
334
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
335
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
336
+      "dev": true,
337
+      "license": "ISC",
338
+      "engines": {
339
+        "node": ">=10"
340
+      }
341
+    },
342
+    "node_modules/yargs": {
343
+      "version": "17.7.2",
344
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
345
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
346
+      "dev": true,
347
+      "license": "MIT",
348
+      "dependencies": {
349
+        "cliui": "^8.0.1",
350
+        "escalade": "^3.1.1",
351
+        "get-caller-file": "^2.0.5",
352
+        "require-directory": "^2.1.1",
353
+        "string-width": "^4.2.3",
354
+        "y18n": "^5.0.5",
355
+        "yargs-parser": "^21.1.1"
356
+      },
357
+      "engines": {
358
+        "node": ">=12"
359
+      }
360
+    },
361
+    "node_modules/yargs-parser": {
362
+      "version": "21.1.1",
363
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
364
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
365
+      "dev": true,
366
+      "license": "ISC",
367
+      "engines": {
368
+        "node": ">=12"
369
+      }
370
+    }
371
+  }
372
+}
package.jsonadded
@@ -0,0 +1,15 @@
1
+{
2
+  "name": "localtoast",
3
+  "version": "1.0.0",
4
+  "private": true,
5
+  "scripts": {
6
+    "dev": "concurrently \"npm run dev:backend\" \"npm run dev:frontend\"",
7
+    "dev:backend": "cd backend && python manage.py runserver",
8
+    "dev:frontend": "cd frontend && npm run dev",
9
+    "install:all": "cd frontend && npm install",
10
+    "build:frontend": "cd frontend && npm run build"
11
+  },
12
+  "devDependencies": {
13
+    "concurrently": "^8.2.2"
14
+  }
15
+}