diff --git a/CLAUDE.md b/CLAUDE.md index 0b233d76..a57c81bb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -211,3 +211,85 @@ - **Trigger schedules manually**: `curl -X POST /api/az/admin/schedules/{id}/trigger` - **Check schedule status**: `curl /api/az/admin/schedules` - **Worker logs**: `kubectl logs -f deployment/scraper-worker -n dispensary-scraper` + +24) **Crawler Maintenance Procedure (Check Jobs, Requeue, Restart)** + When crawlers are stuck or jobs aren't processing, follow this procedure: + + **Step 1: Check Job Status** + ```bash + # Port-forward to production + kubectl port-forward -n dispensary-scraper deployment/scraper 3099:3010 & + + # Check active/stuck jobs + curl -s http://localhost:3099/api/az/monitor/active-jobs | jq . + + # Check recent job history + curl -s "http://localhost:3099/api/az/monitor/jobs?limit=20" | jq '.jobs[] | {id, job_type, status, dispensary_id, started_at, products_found, duration_min: (.duration_ms/60000 | floor)}' + + # Check schedule status + curl -s http://localhost:3099/api/az/admin/schedules | jq '.schedules[] | {id, jobName, enabled, lastRunAt, lastStatus, nextRunAt}' + ``` + + **Step 2: Reset Stuck Jobs** + Jobs are considered stuck if they have `status='running'` but no heartbeat in >30 minutes: + ```bash + # Via API (if endpoint exists) + curl -s -X POST http://localhost:3099/api/az/admin/reset-stuck-jobs + + # Via direct DB (if API not available) + kubectl exec -n dispensary-scraper deployment/scraper -- psql $DATABASE_URL -c " + UPDATE dispensary_crawl_jobs + SET status = 'failed', + error_message = 'Job timed out - worker stopped sending heartbeats', + completed_at = NOW() + WHERE status = 'running' + AND (last_heartbeat_at < NOW() - INTERVAL '30 minutes' OR last_heartbeat_at IS NULL); + " + ``` + + **Step 3: Requeue Jobs (Trigger Fresh Crawl)** + ```bash + # Trigger product crawl schedule (typically ID 1) + curl -s -X POST http://localhost:3099/api/az/admin/schedules/1/trigger + + # Trigger menu detection schedule (typically ID 2) + curl -s -X POST http://localhost:3099/api/az/admin/schedules/2/trigger + + # Or crawl a specific dispensary + curl -s -X POST http://localhost:3099/api/az/admin/crawl/112 + ``` + + **Step 4: Restart Crawler Workers** + ```bash + # Restart scraper-worker pods (clears any stuck processes) + kubectl rollout restart deployment/scraper-worker -n dispensary-scraper + + # Watch rollout progress + kubectl rollout status deployment/scraper-worker -n dispensary-scraper + + # Optionally restart main scraper pod too + kubectl rollout restart deployment/scraper -n dispensary-scraper + ``` + + **Step 5: Monitor Recovery** + ```bash + # Watch worker logs + kubectl logs -f deployment/scraper-worker -n dispensary-scraper --tail=50 + + # Check dashboard for product counts + curl -s http://localhost:3099/api/az/dashboard | jq '{totalStores, totalProducts, storesByType}' + + # Verify jobs are processing + curl -s http://localhost:3099/api/az/monitor/active-jobs | jq . + ``` + + **Quick One-Liner for Full Reset:** + ```bash + # Reset stuck jobs and restart workers + kubectl exec -n dispensary-scraper deployment/scraper -- psql $DATABASE_URL -c "UPDATE dispensary_crawl_jobs SET status='failed', completed_at=NOW() WHERE status='running' AND (last_heartbeat_at < NOW() - INTERVAL '30 minutes' OR last_heartbeat_at IS NULL);" && kubectl rollout restart deployment/scraper-worker -n dispensary-scraper && kubectl rollout status deployment/scraper-worker -n dispensary-scraper + ``` + + **Cleanup port-forwards when done:** + ```bash + pkill -f "port-forward.*dispensary-scraper" + ``` diff --git a/backend/API_USAGE.md b/backend/API_USAGE.md index 15aeeefc..f7810d01 100644 --- a/backend/API_USAGE.md +++ b/backend/API_USAGE.md @@ -412,3 +412,65 @@ HTTP Status Codes: - `404` - Not Found - `429` - Too Many Requests - `500` - Server Error + +--- + +## WordPress Plugin + +### Plugin Download + +The WordPress plugin is available for download from the admin dashboard landing page. + +**Download URL Pattern:** +``` +/downloads/cb-wpmenu-{version}.zip +``` + +Example: `/downloads/cb-wpmenu-1.5.1.zip` + +### Building the Plugin + +Use the build script to create a new plugin zip for distribution: + +```bash +cd wordpress-plugin +./build-plugin.sh +``` + +The build script will: +1. Extract the version from `crawlsy-menus.php` +2. Create a zip file named `cb-wpmenu-{version}.zip` +3. Output the file to `backend/public/downloads/` +4. Display a reminder to update the landing page + +### Release Checklist + +When releasing a new plugin version: + +1. **Update the version** in `wordpress-plugin/crawlsy-menus.php`: + ```php + * Version: 1.5.2 + ``` + +2. **Build the plugin**: + ```bash + cd wordpress-plugin + ./build-plugin.sh + ``` + +3. **Update the landing page** (`frontend/src/pages/LandingPage.tsx`): + - Update download URLs: `href="/downloads/cb-wpmenu-{version}.zip"` + - Update button text: `Download Plugin v{version}` + +4. **Deploy**: + - Local: The zip is served from `backend/public/downloads/` + - Remote: Commit and push changes, then deploy + +### Naming Convention + +| Component | Format | Example | +|-----------|--------|---------| +| Plugin file | `crawlsy-menus.php` | - | +| Zip file | `cb-wpmenu-{version}.zip` | `cb-wpmenu-1.5.1.zip` | +| Download URL | `/downloads/cb-wpmenu-{version}.zip` | `/downloads/cb-wpmenu-1.5.1.zip` | +| Shortcodes | `[cb_products]`, `[cb_product]` | `[cb_products limit="12"]` | diff --git a/backend/Dockerfile b/backend/Dockerfile index fb64ee84..033ab9c0 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -43,7 +43,7 @@ ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium WORKDIR /app COPY package*.json ./ -RUN npm ci --only=production +RUN npm ci --omit=dev COPY --from=builder /app/dist ./dist diff --git a/backend/SESSION_SUMMARY.md b/backend/archive/SESSION_SUMMARY.md similarity index 100% rename from backend/SESSION_SUMMARY.md rename to backend/archive/SESSION_SUMMARY.md diff --git a/backend/add-curaleaf-az-stores.js b/backend/archive/add-curaleaf-az-stores.js similarity index 100% rename from backend/add-curaleaf-az-stores.js rename to backend/archive/add-curaleaf-az-stores.js diff --git a/backend/add-curaleaf-docker.js b/backend/archive/add-curaleaf-docker.js similarity index 100% rename from backend/add-curaleaf-docker.js rename to backend/archive/add-curaleaf-docker.js diff --git a/backend/add-discount-columns.ts b/backend/archive/add-discount-columns.ts similarity index 100% rename from backend/add-discount-columns.ts rename to backend/archive/add-discount-columns.ts diff --git a/backend/add-geo-fields.ts b/backend/archive/add-geo-fields.ts similarity index 100% rename from backend/add-geo-fields.ts rename to backend/archive/add-geo-fields.ts diff --git a/backend/add-price-history.ts b/backend/archive/add-price-history.ts similarity index 100% rename from backend/add-price-history.ts rename to backend/archive/add-price-history.ts diff --git a/backend/add-proxy-location-columns.ts b/backend/archive/add-proxy-location-columns.ts similarity index 100% rename from backend/add-proxy-location-columns.ts rename to backend/archive/add-proxy-location-columns.ts diff --git a/backend/add-sol-flower-stores.ts b/backend/archive/add-sol-flower-stores.ts similarity index 100% rename from backend/add-sol-flower-stores.ts rename to backend/archive/add-sol-flower-stores.ts diff --git a/backend/add-test-brands.ts b/backend/archive/add-test-brands.ts similarity index 100% rename from backend/add-test-brands.ts rename to backend/archive/add-test-brands.ts diff --git a/backend/cancel-pending-job.js b/backend/archive/cancel-pending-job.js similarity index 100% rename from backend/cancel-pending-job.js rename to backend/archive/cancel-pending-job.js diff --git a/backend/capture-age-gate-cookies.ts b/backend/archive/capture-age-gate-cookies.ts similarity index 100% rename from backend/capture-age-gate-cookies.ts rename to backend/archive/capture-age-gate-cookies.ts diff --git a/backend/check-48th-store.ts b/backend/archive/check-48th-store.ts similarity index 100% rename from backend/check-48th-store.ts rename to backend/archive/check-48th-store.ts diff --git a/backend/check-brand-jobs.ts b/backend/archive/check-brand-jobs.ts similarity index 100% rename from backend/check-brand-jobs.ts rename to backend/archive/check-brand-jobs.ts diff --git a/backend/check-brand-names.ts b/backend/archive/check-brand-names.ts similarity index 100% rename from backend/check-brand-names.ts rename to backend/archive/check-brand-names.ts diff --git a/backend/check-brands-table.ts b/backend/archive/check-brands-table.ts similarity index 100% rename from backend/check-brands-table.ts rename to backend/archive/check-brands-table.ts diff --git a/backend/check-brands.ts b/backend/archive/check-brands.ts similarity index 100% rename from backend/check-brands.ts rename to backend/archive/check-brands.ts diff --git a/backend/check-db.ts b/backend/archive/check-db.ts similarity index 100% rename from backend/check-db.ts rename to backend/archive/check-db.ts diff --git a/backend/check-deeply-rooted.ts b/backend/archive/check-deeply-rooted.ts similarity index 100% rename from backend/check-deeply-rooted.ts rename to backend/archive/check-deeply-rooted.ts diff --git a/backend/check-discounts.ts b/backend/archive/check-discounts.ts similarity index 100% rename from backend/check-discounts.ts rename to backend/archive/check-discounts.ts diff --git a/backend/check-enrichment-progress.ts b/backend/archive/check-enrichment-progress.ts similarity index 100% rename from backend/check-enrichment-progress.ts rename to backend/archive/check-enrichment-progress.ts diff --git a/backend/check-for-prices.ts b/backend/archive/check-for-prices.ts similarity index 100% rename from backend/check-for-prices.ts rename to backend/archive/check-for-prices.ts diff --git a/backend/check-jobs.js b/backend/archive/check-jobs.js similarity index 100% rename from backend/check-jobs.js rename to backend/archive/check-jobs.js diff --git a/backend/check-jobs.ts b/backend/archive/check-jobs.ts similarity index 100% rename from backend/check-jobs.ts rename to backend/archive/check-jobs.ts diff --git a/backend/check-leaks.ts b/backend/archive/check-leaks.ts similarity index 100% rename from backend/check-leaks.ts rename to backend/archive/check-leaks.ts diff --git a/backend/check-product-data.ts b/backend/archive/check-product-data.ts similarity index 100% rename from backend/check-product-data.ts rename to backend/archive/check-product-data.ts diff --git a/backend/check-product-detail-page.ts b/backend/archive/check-product-detail-page.ts similarity index 100% rename from backend/check-product-detail-page.ts rename to backend/archive/check-product-detail-page.ts diff --git a/backend/check-product-prices.ts b/backend/archive/check-product-prices.ts similarity index 100% rename from backend/check-product-prices.ts rename to backend/archive/check-product-prices.ts diff --git a/backend/check-products-schema.ts b/backend/archive/check-products-schema.ts similarity index 100% rename from backend/check-products-schema.ts rename to backend/archive/check-products-schema.ts diff --git a/backend/check-products.ts b/backend/archive/check-products.ts similarity index 100% rename from backend/check-products.ts rename to backend/archive/check-products.ts diff --git a/backend/check-proxies.ts b/backend/archive/check-proxies.ts similarity index 100% rename from backend/check-proxies.ts rename to backend/archive/check-proxies.ts diff --git a/backend/check-proxy-stats.js b/backend/archive/check-proxy-stats.js similarity index 100% rename from backend/check-proxy-stats.js rename to backend/archive/check-proxy-stats.js diff --git a/backend/check-scraper-data.js b/backend/archive/check-scraper-data.js similarity index 100% rename from backend/check-scraper-data.js rename to backend/archive/check-scraper-data.js diff --git a/backend/check-select-prices.ts b/backend/archive/check-select-prices.ts similarity index 100% rename from backend/check-select-prices.ts rename to backend/archive/check-select-prices.ts diff --git a/backend/check-special-product.ts b/backend/archive/check-special-product.ts similarity index 100% rename from backend/check-special-product.ts rename to backend/archive/check-special-product.ts diff --git a/backend/check-store.ts b/backend/archive/check-store.ts similarity index 100% rename from backend/check-store.ts rename to backend/archive/check-store.ts diff --git a/backend/check-stores.ts b/backend/archive/check-stores.ts similarity index 100% rename from backend/check-stores.ts rename to backend/archive/check-stores.ts diff --git a/backend/check-tables.ts b/backend/archive/check-tables.ts similarity index 100% rename from backend/check-tables.ts rename to backend/archive/check-tables.ts diff --git a/backend/check-treez-categories.ts b/backend/archive/check-treez-categories.ts similarity index 100% rename from backend/check-treez-categories.ts rename to backend/archive/check-treez-categories.ts diff --git a/backend/check-treez-data.ts b/backend/archive/check-treez-data.ts similarity index 100% rename from backend/check-treez-data.ts rename to backend/archive/check-treez-data.ts diff --git a/backend/check-treez-pagination.ts b/backend/archive/check-treez-pagination.ts similarity index 100% rename from backend/check-treez-pagination.ts rename to backend/archive/check-treez-pagination.ts diff --git a/backend/complete-schema-migration.ts b/backend/archive/complete-schema-migration.ts similarity index 100% rename from backend/complete-schema-migration.ts rename to backend/archive/complete-schema-migration.ts diff --git a/backend/count-products.ts b/backend/archive/count-products.ts similarity index 100% rename from backend/count-products.ts rename to backend/archive/count-products.ts diff --git a/backend/create-azdhs-table.ts b/backend/archive/create-azdhs-table.ts similarity index 100% rename from backend/create-azdhs-table.ts rename to backend/archive/create-azdhs-table.ts diff --git a/backend/create-brands-table.ts b/backend/archive/create-brands-table.ts similarity index 100% rename from backend/create-brands-table.ts rename to backend/archive/create-brands-table.ts diff --git a/backend/create-brands-tables.ts b/backend/archive/create-brands-tables.ts similarity index 100% rename from backend/create-brands-tables.ts rename to backend/archive/create-brands-tables.ts diff --git a/backend/create-table.js b/backend/archive/create-table.js similarity index 100% rename from backend/create-table.js rename to backend/archive/create-table.js diff --git a/backend/curaleaf-cookies.json b/backend/archive/curaleaf-cookies.json similarity index 100% rename from backend/curaleaf-cookies.json rename to backend/archive/curaleaf-cookies.json diff --git a/backend/debug-after-state-select.ts b/backend/archive/debug-after-state-select.ts similarity index 100% rename from backend/debug-after-state-select.ts rename to backend/archive/debug-after-state-select.ts diff --git a/backend/debug-age-gate-detailed.ts b/backend/archive/debug-age-gate-detailed.ts similarity index 100% rename from backend/debug-age-gate-detailed.ts rename to backend/archive/debug-age-gate-detailed.ts diff --git a/backend/debug-age-gate-elements.ts b/backend/archive/debug-age-gate-elements.ts similarity index 100% rename from backend/debug-age-gate-elements.ts rename to backend/archive/debug-age-gate-elements.ts diff --git a/backend/debug-azdhs-page.ts b/backend/archive/debug-azdhs-page.ts similarity index 100% rename from backend/debug-azdhs-page.ts rename to backend/archive/debug-azdhs-page.ts diff --git a/backend/debug-brands-page.ts b/backend/archive/debug-brands-page.ts similarity index 100% rename from backend/debug-brands-page.ts rename to backend/archive/debug-brands-page.ts diff --git a/backend/debug-curaleaf-buttons.ts b/backend/archive/debug-curaleaf-buttons.ts similarity index 100% rename from backend/debug-curaleaf-buttons.ts rename to backend/archive/debug-curaleaf-buttons.ts diff --git a/backend/debug-dutchie-detection.ts b/backend/archive/debug-dutchie-detection.ts similarity index 100% rename from backend/debug-dutchie-detection.ts rename to backend/archive/debug-dutchie-detection.ts diff --git a/backend/debug-dutchie-selectors.ts b/backend/archive/debug-dutchie-selectors.ts similarity index 100% rename from backend/debug-dutchie-selectors.ts rename to backend/archive/debug-dutchie-selectors.ts diff --git a/backend/debug-google-scraper.ts b/backend/archive/debug-google-scraper.ts similarity index 100% rename from backend/debug-google-scraper.ts rename to backend/archive/debug-google-scraper.ts diff --git a/backend/debug-product-card.ts b/backend/archive/debug-product-card.ts similarity index 100% rename from backend/debug-product-card.ts rename to backend/archive/debug-product-card.ts diff --git a/backend/debug-products-page.ts b/backend/archive/debug-products-page.ts similarity index 100% rename from backend/debug-products-page.ts rename to backend/archive/debug-products-page.ts diff --git a/backend/debug-sale-price.ts b/backend/archive/debug-sale-price.ts similarity index 100% rename from backend/debug-sale-price.ts rename to backend/archive/debug-sale-price.ts diff --git a/backend/debug-scrape.ts b/backend/archive/debug-scrape.ts similarity index 100% rename from backend/debug-scrape.ts rename to backend/archive/debug-scrape.ts diff --git a/backend/debug-sol-flower.ts b/backend/archive/debug-sol-flower.ts similarity index 100% rename from backend/debug-sol-flower.ts rename to backend/archive/debug-sol-flower.ts diff --git a/backend/debug-specials-page.ts b/backend/archive/debug-specials-page.ts similarity index 100% rename from backend/debug-specials-page.ts rename to backend/archive/debug-specials-page.ts diff --git a/backend/delete-dispensary-products.ts b/backend/archive/delete-dispensary-products.ts similarity index 100% rename from backend/delete-dispensary-products.ts rename to backend/archive/delete-dispensary-products.ts diff --git a/backend/diagnose-curaleaf-page.ts b/backend/archive/diagnose-curaleaf-page.ts similarity index 100% rename from backend/diagnose-curaleaf-page.ts rename to backend/archive/diagnose-curaleaf-page.ts diff --git a/backend/enrich-azdhs-from-google-maps.ts b/backend/archive/enrich-azdhs-from-google-maps.ts similarity index 100% rename from backend/enrich-azdhs-from-google-maps.ts rename to backend/archive/enrich-azdhs-from-google-maps.ts diff --git a/backend/enrich-dispensaries-from-google.ts b/backend/archive/enrich-dispensaries-from-google.ts similarity index 100% rename from backend/enrich-dispensaries-from-google.ts rename to backend/archive/enrich-dispensaries-from-google.ts diff --git a/backend/enrich-prices.ts b/backend/archive/enrich-prices.ts similarity index 100% rename from backend/enrich-prices.ts rename to backend/archive/enrich-prices.ts diff --git a/backend/enrich-single-dispensary.ts b/backend/archive/enrich-single-dispensary.ts similarity index 100% rename from backend/enrich-single-dispensary.ts rename to backend/archive/enrich-single-dispensary.ts diff --git a/backend/explore-curaleaf-menu.ts b/backend/archive/explore-curaleaf-menu.ts similarity index 100% rename from backend/explore-curaleaf-menu.ts rename to backend/archive/explore-curaleaf-menu.ts diff --git a/backend/find-dutchie-menu-curaleaf.ts b/backend/archive/find-dutchie-menu-curaleaf.ts similarity index 100% rename from backend/find-dutchie-menu-curaleaf.ts rename to backend/archive/find-dutchie-menu-curaleaf.ts diff --git a/backend/find-price-location.ts b/backend/archive/find-price-location.ts similarity index 100% rename from backend/find-price-location.ts rename to backend/archive/find-price-location.ts diff --git a/backend/find-products-curaleaf.ts b/backend/archive/find-products-curaleaf.ts similarity index 100% rename from backend/find-products-curaleaf.ts rename to backend/archive/find-products-curaleaf.ts diff --git a/backend/fix-brand-names.ts b/backend/archive/fix-brand-names.ts similarity index 100% rename from backend/fix-brand-names.ts rename to backend/archive/fix-brand-names.ts diff --git a/backend/fix-brands-table.ts b/backend/archive/fix-brands-table.ts similarity index 100% rename from backend/fix-brands-table.ts rename to backend/archive/fix-brands-table.ts diff --git a/backend/fix-category-urls.ts b/backend/archive/fix-category-urls.ts similarity index 100% rename from backend/fix-category-urls.ts rename to backend/archive/fix-category-urls.ts diff --git a/backend/fix-docker-db-urls.ts b/backend/archive/fix-docker-db-urls.ts similarity index 100% rename from backend/fix-docker-db-urls.ts rename to backend/archive/fix-docker-db-urls.ts diff --git a/backend/fix-stuck-job.js b/backend/archive/fix-stuck-job.js similarity index 100% rename from backend/fix-stuck-job.js rename to backend/archive/fix-stuck-job.js diff --git a/backend/get-best-dispensary.ts b/backend/archive/get-best-dispensary.ts similarity index 100% rename from backend/get-best-dispensary.ts rename to backend/archive/get-best-dispensary.ts diff --git a/backend/get-dispensary-ids.ts b/backend/archive/get-dispensary-ids.ts similarity index 100% rename from backend/get-dispensary-ids.ts rename to backend/archive/get-dispensary-ids.ts diff --git a/backend/import-proxies.ts b/backend/archive/import-proxies.ts similarity index 100% rename from backend/import-proxies.ts rename to backend/archive/import-proxies.ts diff --git a/backend/inspect-treez-structure.ts b/backend/archive/inspect-treez-structure.ts similarity index 100% rename from backend/inspect-treez-structure.ts rename to backend/archive/inspect-treez-structure.ts diff --git a/backend/launch-25-scrapers.sh b/backend/archive/launch-25-scrapers.sh similarity index 100% rename from backend/launch-25-scrapers.sh rename to backend/archive/launch-25-scrapers.sh diff --git a/backend/list-dispensaries.ts b/backend/archive/list-dispensaries.ts similarity index 100% rename from backend/list-dispensaries.ts rename to backend/archive/list-dispensaries.ts diff --git a/backend/list-stores.ts b/backend/archive/list-stores.ts similarity index 100% rename from backend/list-stores.ts rename to backend/archive/list-stores.ts diff --git a/backend/migrate-proxy-locations.ts b/backend/archive/migrate-proxy-locations.ts similarity index 100% rename from backend/migrate-proxy-locations.ts rename to backend/archive/migrate-proxy-locations.ts diff --git a/backend/parse-azdhs-copied-data.ts b/backend/archive/parse-azdhs-copied-data.ts similarity index 100% rename from backend/parse-azdhs-copied-data.ts rename to backend/archive/parse-azdhs-copied-data.ts diff --git a/backend/populate-jobs.ts b/backend/archive/populate-jobs.ts similarity index 100% rename from backend/populate-jobs.ts rename to backend/archive/populate-jobs.ts diff --git a/backend/populate-proxy-locations.ts b/backend/archive/populate-proxy-locations.ts similarity index 100% rename from backend/populate-proxy-locations.ts rename to backend/archive/populate-proxy-locations.ts diff --git a/backend/preview-azdhs-import.ts b/backend/archive/preview-azdhs-import.ts similarity index 100% rename from backend/preview-azdhs-import.ts rename to backend/archive/preview-azdhs-import.ts diff --git a/backend/reset-jobs.ts b/backend/archive/reset-jobs.ts similarity index 100% rename from backend/reset-jobs.ts rename to backend/archive/reset-jobs.ts diff --git a/backend/reset-one-job.ts b/backend/archive/reset-one-job.ts similarity index 100% rename from backend/reset-one-job.ts rename to backend/archive/reset-one-job.ts diff --git a/backend/run-location-migration.js b/backend/archive/run-location-migration.js similarity index 100% rename from backend/run-location-migration.js rename to backend/archive/run-location-migration.js diff --git a/backend/run-logo-migration.js b/backend/archive/run-logo-migration.js similarity index 100% rename from backend/run-logo-migration.js rename to backend/archive/run-logo-migration.js diff --git a/backend/run-migration.ts b/backend/archive/run-migration.ts similarity index 100% rename from backend/run-migration.ts rename to backend/archive/run-migration.ts diff --git a/backend/run-scrape-jobs-migration.ts b/backend/archive/run-scrape-jobs-migration.ts similarity index 100% rename from backend/run-scrape-jobs-migration.ts rename to backend/archive/run-scrape-jobs-migration.ts diff --git a/backend/schema-dump.sql b/backend/archive/schema-dump.sql similarity index 100% rename from backend/schema-dump.sql rename to backend/archive/schema-dump.sql diff --git a/backend/scrape-48th-brands.ts b/backend/archive/scrape-48th-brands.ts similarity index 100% rename from backend/scrape-48th-brands.ts rename to backend/archive/scrape-48th-brands.ts diff --git a/backend/scrape-azdhs-api.ts b/backend/archive/scrape-azdhs-api.ts similarity index 100% rename from backend/scrape-azdhs-api.ts rename to backend/archive/scrape-azdhs-api.ts diff --git a/backend/scrape-azdhs-auto.ts b/backend/archive/scrape-azdhs-auto.ts similarity index 100% rename from backend/scrape-azdhs-auto.ts rename to backend/archive/scrape-azdhs-auto.ts diff --git a/backend/scrape-azdhs-better.ts b/backend/archive/scrape-azdhs-better.ts similarity index 100% rename from backend/scrape-azdhs-better.ts rename to backend/archive/scrape-azdhs-better.ts diff --git a/backend/scrape-azdhs-manual-scroll.ts b/backend/archive/scrape-azdhs-manual-scroll.ts similarity index 100% rename from backend/scrape-azdhs-manual-scroll.ts rename to backend/archive/scrape-azdhs-manual-scroll.ts diff --git a/backend/scrape-azdhs-map.ts b/backend/archive/scrape-azdhs-map.ts similarity index 100% rename from backend/scrape-azdhs-map.ts rename to backend/archive/scrape-azdhs-map.ts diff --git a/backend/scrape-brands-48th.ts b/backend/archive/scrape-brands-48th.ts similarity index 100% rename from backend/scrape-brands-48th.ts rename to backend/archive/scrape-brands-48th.ts diff --git a/backend/scrape-brands.ts b/backend/archive/scrape-brands.ts similarity index 100% rename from backend/scrape-brands.ts rename to backend/archive/scrape-brands.ts diff --git a/backend/scrape-bypass-age-gate.ts b/backend/archive/scrape-bypass-age-gate.ts similarity index 100% rename from backend/scrape-bypass-age-gate.ts rename to backend/archive/scrape-bypass-age-gate.ts diff --git a/backend/scrape-curaleaf-brands.ts b/backend/archive/scrape-curaleaf-brands.ts similarity index 100% rename from backend/scrape-curaleaf-brands.ts rename to backend/archive/scrape-curaleaf-brands.ts diff --git a/backend/scrape-curaleaf-simple.ts b/backend/archive/scrape-curaleaf-simple.ts similarity index 100% rename from backend/scrape-curaleaf-simple.ts rename to backend/archive/scrape-curaleaf-simple.ts diff --git a/backend/scrape-curaleaf-stores.ts b/backend/archive/scrape-curaleaf-stores.ts similarity index 100% rename from backend/scrape-curaleaf-stores.ts rename to backend/archive/scrape-curaleaf-stores.ts diff --git a/backend/scrape-curaleaf-with-proxy.ts b/backend/archive/scrape-curaleaf-with-proxy.ts similarity index 100% rename from backend/scrape-curaleaf-with-proxy.ts rename to backend/archive/scrape-curaleaf-with-proxy.ts diff --git a/backend/scrape-dutchie-brands.ts b/backend/archive/scrape-dutchie-brands.ts similarity index 100% rename from backend/scrape-dutchie-brands.ts rename to backend/archive/scrape-dutchie-brands.ts diff --git a/backend/scrape-google-maps.ts b/backend/archive/scrape-google-maps.ts similarity index 100% rename from backend/scrape-google-maps.ts rename to backend/archive/scrape-google-maps.ts diff --git a/backend/scrape-leafly-arizona.ts b/backend/archive/scrape-leafly-arizona.ts similarity index 100% rename from backend/scrape-leafly-arizona.ts rename to backend/archive/scrape-leafly-arizona.ts diff --git a/backend/scrape-leafly-map-markers.ts b/backend/archive/scrape-leafly-map-markers.ts similarity index 100% rename from backend/scrape-leafly-map-markers.ts rename to backend/archive/scrape-leafly-map-markers.ts diff --git a/backend/scrape-leafly-map.ts b/backend/archive/scrape-leafly-map.ts similarity index 100% rename from backend/scrape-leafly-map.ts rename to backend/archive/scrape-leafly-map.ts diff --git a/backend/scrape-mobile-chrome.ts b/backend/archive/scrape-mobile-chrome.ts similarity index 100% rename from backend/scrape-mobile-chrome.ts rename to backend/archive/scrape-mobile-chrome.ts diff --git a/backend/scrape-parallel-brands.ts b/backend/archive/scrape-parallel-brands.ts similarity index 100% rename from backend/scrape-parallel-brands.ts rename to backend/archive/scrape-parallel-brands.ts diff --git a/backend/scrape-products.ts b/backend/archive/scrape-products.ts similarity index 100% rename from backend/scrape-products.ts rename to backend/archive/scrape-products.ts diff --git a/backend/scrape-real-clicks.ts b/backend/archive/scrape-real-clicks.ts similarity index 100% rename from backend/scrape-real-clicks.ts rename to backend/archive/scrape-real-clicks.ts diff --git a/backend/scrape-treez.ts b/backend/archive/scrape-treez.ts similarity index 100% rename from backend/scrape-treez.ts rename to backend/archive/scrape-treez.ts diff --git a/backend/scrape-two-gates.ts b/backend/archive/scrape-two-gates.ts similarity index 100% rename from backend/scrape-two-gates.ts rename to backend/archive/scrape-two-gates.ts diff --git a/backend/scrape-with-age-gate.ts b/backend/archive/scrape-with-age-gate.ts similarity index 100% rename from backend/scrape-with-age-gate.ts rename to backend/archive/scrape-with-age-gate.ts diff --git a/backend/scrape-with-jobs.ts b/backend/archive/scrape-with-jobs.ts similarity index 100% rename from backend/scrape-with-jobs.ts rename to backend/archive/scrape-with-jobs.ts diff --git a/backend/setup-api-permissions-table.ts b/backend/archive/setup-api-permissions-table.ts similarity index 100% rename from backend/setup-api-permissions-table.ts rename to backend/archive/setup-api-permissions-table.ts diff --git a/backend/start-proxy-test.js b/backend/archive/start-proxy-test.js similarity index 100% rename from backend/start-proxy-test.js rename to backend/archive/start-proxy-test.js diff --git a/backend/sync-by-address.ts b/backend/archive/sync-by-address.ts similarity index 100% rename from backend/sync-by-address.ts rename to backend/archive/sync-by-address.ts diff --git a/backend/sync-dispensaries-to-dutchie.ts b/backend/archive/sync-dispensaries-to-dutchie.ts similarity index 100% rename from backend/sync-dispensaries-to-dutchie.ts rename to backend/archive/sync-dispensaries-to-dutchie.ts diff --git a/backend/test-azdhs-parser.ts b/backend/archive/test-azdhs-parser.ts similarity index 100% rename from backend/test-azdhs-parser.ts rename to backend/archive/test-azdhs-parser.ts diff --git a/backend/test-brand-products.ts b/backend/archive/test-brand-products.ts similarity index 100% rename from backend/test-brand-products.ts rename to backend/archive/test-brand-products.ts diff --git a/backend/test-brand-scrape.ts b/backend/archive/test-brand-scrape.ts similarity index 100% rename from backend/test-brand-scrape.ts rename to backend/archive/test-brand-scrape.ts diff --git a/backend/test-brands-page.ts b/backend/archive/test-brands-page.ts similarity index 100% rename from backend/test-brands-page.ts rename to backend/archive/test-brands-page.ts diff --git a/backend/test-category-discovery.ts b/backend/archive/test-category-discovery.ts similarity index 100% rename from backend/test-category-discovery.ts rename to backend/archive/test-category-discovery.ts diff --git a/backend/test-curaleaf-playwright-advanced.ts b/backend/archive/test-curaleaf-playwright-advanced.ts similarity index 100% rename from backend/test-curaleaf-playwright-advanced.ts rename to backend/archive/test-curaleaf-playwright-advanced.ts diff --git a/backend/test-curaleaf-playwright-final.ts b/backend/archive/test-curaleaf-playwright-final.ts similarity index 100% rename from backend/test-curaleaf-playwright-final.ts rename to backend/archive/test-curaleaf-playwright-final.ts diff --git a/backend/test-curaleaf-playwright.ts b/backend/archive/test-curaleaf-playwright.ts similarity index 100% rename from backend/test-curaleaf-playwright.ts rename to backend/archive/test-curaleaf-playwright.ts diff --git a/backend/test-deeply-rooted.ts b/backend/archive/test-deeply-rooted.ts similarity index 100% rename from backend/test-deeply-rooted.ts rename to backend/archive/test-deeply-rooted.ts diff --git a/backend/test-dutchie-simple.ts b/backend/archive/test-dutchie-simple.ts similarity index 100% rename from backend/test-dutchie-simple.ts rename to backend/archive/test-dutchie-simple.ts diff --git a/backend/test-dutchie-template.ts b/backend/archive/test-dutchie-template.ts similarity index 100% rename from backend/test-dutchie-template.ts rename to backend/archive/test-dutchie-template.ts diff --git a/backend/test-filter-interaction.ts b/backend/archive/test-filter-interaction.ts similarity index 100% rename from backend/test-filter-interaction.ts rename to backend/archive/test-filter-interaction.ts diff --git a/backend/test-graphql-curl.sh b/backend/archive/test-graphql-curl.sh similarity index 100% rename from backend/test-graphql-curl.sh rename to backend/archive/test-graphql-curl.sh diff --git a/backend/test-improved-age-gate.ts b/backend/archive/test-improved-age-gate.ts similarity index 100% rename from backend/test-improved-age-gate.ts rename to backend/archive/test-improved-age-gate.ts diff --git a/backend/test-llm-scraper-deeply-rooted.ts b/backend/archive/test-llm-scraper-deeply-rooted.ts similarity index 100% rename from backend/test-llm-scraper-deeply-rooted.ts rename to backend/archive/test-llm-scraper-deeply-rooted.ts diff --git a/backend/test-no-proxy.ts b/backend/archive/test-no-proxy.ts similarity index 100% rename from backend/test-no-proxy.ts rename to backend/archive/test-no-proxy.ts diff --git a/backend/test-playwright-scraper-curaleaf.ts b/backend/archive/test-playwright-scraper-curaleaf.ts similarity index 100% rename from backend/test-playwright-scraper-curaleaf.ts rename to backend/archive/test-playwright-scraper-curaleaf.ts diff --git a/backend/test-puppeteer-click.ts b/backend/archive/test-puppeteer-click.ts similarity index 100% rename from backend/test-puppeteer-click.ts rename to backend/archive/test-puppeteer-click.ts diff --git a/backend/test-scrape-flower.ts b/backend/archive/test-scrape-flower.ts similarity index 100% rename from backend/test-scrape-flower.ts rename to backend/archive/test-scrape-flower.ts diff --git a/backend/test-sol-flower-age-gate.ts b/backend/archive/test-sol-flower-age-gate.ts similarity index 100% rename from backend/test-sol-flower-age-gate.ts rename to backend/archive/test-sol-flower-age-gate.ts diff --git a/backend/test-sol-flower-category-discovery.ts b/backend/archive/test-sol-flower-category-discovery.ts similarity index 100% rename from backend/test-sol-flower-category-discovery.ts rename to backend/archive/test-sol-flower-category-discovery.ts diff --git a/backend/test-sol-flower-scraper.ts b/backend/archive/test-sol-flower-scraper.ts similarity index 100% rename from backend/test-sol-flower-scraper.ts rename to backend/archive/test-sol-flower-scraper.ts diff --git a/backend/test-stealth-sol-flower.ts b/backend/archive/test-stealth-sol-flower.ts similarity index 100% rename from backend/test-stealth-sol-flower.ts rename to backend/archive/test-stealth-sol-flower.ts diff --git a/backend/test-stock-status.ts b/backend/archive/test-stock-status.ts similarity index 100% rename from backend/test-stock-status.ts rename to backend/archive/test-stock-status.ts diff --git a/backend/test-template-integration.ts b/backend/archive/test-template-integration.ts similarity index 100% rename from backend/test-template-integration.ts rename to backend/archive/test-template-integration.ts diff --git a/backend/test-treez-page.ts b/backend/archive/test-treez-page.ts similarity index 100% rename from backend/test-treez-page.ts rename to backend/archive/test-treez-page.ts diff --git a/backend/update-best-dispensary.ts b/backend/archive/update-best-dispensary.ts similarity index 100% rename from backend/update-best-dispensary.ts rename to backend/archive/update-best-dispensary.ts diff --git a/backend/update-curaleaf-dutchie-urls.ts b/backend/archive/update-curaleaf-dutchie-urls.ts similarity index 100% rename from backend/update-curaleaf-dutchie-urls.ts rename to backend/archive/update-curaleaf-dutchie-urls.ts diff --git a/backend/verify-categories.ts b/backend/archive/verify-categories.ts similarity index 100% rename from backend/verify-categories.ts rename to backend/archive/verify-categories.ts diff --git a/backend/verify-curaleaf-urls.js b/backend/archive/verify-curaleaf-urls.js similarity index 100% rename from backend/verify-curaleaf-urls.js rename to backend/archive/verify-curaleaf-urls.js diff --git a/backend/verify-curaleaf.ts b/backend/archive/verify-curaleaf.ts similarity index 100% rename from backend/verify-curaleaf.ts rename to backend/archive/verify-curaleaf.ts diff --git a/backend/verify-treez-total-count.ts b/backend/archive/verify-treez-total-count.ts similarity index 100% rename from backend/verify-treez-total-count.ts rename to backend/archive/verify-treez-total-count.ts diff --git a/backend/dist/dutchie-az/routes/index.js b/backend/dist/dutchie-az/routes/index.js index f62a84ea..5e4c313a 100644 --- a/backend/dist/dutchie-az/routes/index.js +++ b/backend/dist/dutchie-az/routes/index.js @@ -47,7 +47,7 @@ const discovery_1 = require("../services/discovery"); const product_crawler_1 = require("../services/product-crawler"); // Explicit column list for dispensaries table (avoids SELECT * issues with schema differences) const DISPENSARY_COLUMNS = ` - id, name, slug, city, state, zip, address, latitude, longitude, + id, name, dba_name, slug, city, state, zip, address, latitude, longitude, menu_type, menu_url, platform_dispensary_id, website, provider_detection_data, created_at, updated_at `; @@ -735,6 +735,127 @@ router.post('/admin/crawl/:id', async (req, res) => { res.status(500).json({ error: error.message }); } }); +const job_queue_1 = require("../services/job-queue"); +/** + * GET /api/dutchie-az/admin/dutchie-stores + * Get all Dutchie stores with their crawl status + */ +router.get('/admin/dutchie-stores', async (_req, res) => { + try { + const { rows } = await (0, connection_1.query)(` + SELECT + d.id, + d.name, + d.dba_name, + d.city, + d.state, + d.menu_type, + d.platform_dispensary_id, + d.menu_url, + d.website, + d.last_crawl_at, + d.consecutive_failures, + d.failed_at, + ( + SELECT COUNT(*) + FROM dutchie_products + WHERE dispensary_id = d.id + ) as product_count, + ( + SELECT MAX(crawled_at) + FROM dutchie_product_snapshots s + JOIN dutchie_products p ON s.dutchie_product_id = p.id + WHERE p.dispensary_id = d.id + ) as last_snapshot_at + FROM dispensaries d + WHERE d.menu_type = 'dutchie' + AND d.state = 'AZ' + ORDER BY d.name + `); + const ready = rows.filter((r) => r.platform_dispensary_id && !r.failed_at); + const needsPlatformId = rows.filter((r) => !r.platform_dispensary_id && !r.failed_at); + const failed = rows.filter((r) => r.failed_at); + res.json({ + total: rows.length, + ready: ready.length, + needsPlatformId: needsPlatformId.length, + failed: failed.length, + stores: rows.map((r) => ({ + id: r.id, + name: r.dba_name || r.name, + city: r.city, + state: r.state, + menuType: r.menu_type, + platformDispensaryId: r.platform_dispensary_id, + menuUrl: r.menu_url, + website: r.website, + lastCrawlAt: r.last_crawl_at, + productCount: parseInt(r.product_count || '0', 10), + lastSnapshotAt: r.last_snapshot_at, + status: r.failed_at + ? 'failed' + : r.platform_dispensary_id + ? 'ready' + : 'needs_platform_id', + })), + }); + } + catch (error) { + res.status(500).json({ error: error.message }); + } +}); +/** + * POST /api/dutchie-az/admin/crawl-all + * Enqueue crawl jobs for ALL ready Dutchie stores + * This is a convenience endpoint to queue all stores without triggering the scheduler + */ +router.post('/admin/crawl-all', async (req, res) => { + try { + const { pricingType = 'rec', useBothModes = true } = req.body; + // Get all "ready" dispensaries (menu_type='dutchie' AND platform_dispensary_id IS NOT NULL AND not failed) + const { rows: rawRows } = await (0, connection_1.query)(` + SELECT id, name, platform_dispensary_id FROM dispensaries + WHERE state = 'AZ' + AND menu_type = 'dutchie' + AND platform_dispensary_id IS NOT NULL + AND failed_at IS NULL + ORDER BY last_crawl_at ASC NULLS FIRST + `); + if (rawRows.length === 0) { + return res.json({ + success: true, + message: 'No ready dispensaries to crawl. Run menu detection first.', + enqueued: 0, + skipped: 0, + dispensaries: [], + }); + } + const dispensaryIds = rawRows.map((r) => r.id); + // Bulk enqueue jobs (skips dispensaries that already have pending/running jobs) + const { enqueued, skipped } = await (0, job_queue_1.bulkEnqueueJobs)('dutchie_product_crawl', dispensaryIds, { + priority: 0, + metadata: { pricingType, useBothModes }, + }); + // Get current queue stats + const queueStats = await (0, job_queue_1.getQueueStats)(); + res.json({ + success: true, + message: `Enqueued ${enqueued} crawl jobs for Dutchie stores`, + totalReady: rawRows.length, + enqueued, + skipped, + queueStats, + dispensaries: rawRows.map((r) => ({ + id: r.id, + name: r.name, + platformDispensaryId: r.platform_dispensary_id, + })), + }); + } + catch (error) { + res.status(500).json({ error: error.message }); + } +}); /** * GET /api/dutchie-az/admin/jobs * Get crawl job history @@ -1135,7 +1256,7 @@ router.get('/debug/store/:id', async (req, res) => { // ============================================================ // LIVE CRAWLER STATUS ROUTES // ============================================================ -const job_queue_1 = require("../services/job-queue"); +const job_queue_2 = require("../services/job-queue"); /** * GET /api/dutchie-az/monitor/active-jobs * Get all currently running jobs with real-time status including worker info @@ -1190,9 +1311,9 @@ router.get('/monitor/active-jobs', async (_req, res) => { ORDER BY cj.started_at DESC `); // Get queue stats - const queueStats = await (0, job_queue_1.getQueueStats)(); + const queueStats = await (0, job_queue_2.getQueueStats)(); // Get active workers - const activeWorkers = await (0, job_queue_1.getActiveWorkers)(); + const activeWorkers = await (0, job_queue_2.getActiveWorkers)(); // Also get in-memory scrapers if any (from the legacy system) let inMemoryScrapers = []; try { diff --git a/backend/dist/dutchie-az/services/discovery.js b/backend/dist/dutchie-az/services/discovery.js index 02b7efe7..0b09a9f5 100644 --- a/backend/dist/dutchie-az/services/discovery.js +++ b/backend/dist/dutchie-az/services/discovery.js @@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.importFromExistingDispensaries = importFromExistingDispensaries; exports.discoverDispensaries = discoverDispensaries; +exports.isObjectId = isObjectId; +exports.extractFromMenuUrl = extractFromMenuUrl; exports.extractCNameFromMenuUrl = extractCNameFromMenuUrl; exports.resolvePlatformDispensaryIds = resolvePlatformDispensaryIds; exports.getAllDispensaries = getAllDispensaries; @@ -145,30 +147,54 @@ async function discoverDispensaries() { return { discovered, errors }; } /** - * Extract cName (slug) from a Dutchie menu_url - * Supports formats: - * - https://dutchie.com/embedded-menu/ - * - https://dutchie.com/dispensary/ + * Check if a string looks like a MongoDB ObjectId (24 hex chars) */ -function extractCNameFromMenuUrl(menuUrl) { +function isObjectId(value) { + return /^[a-f0-9]{24}$/i.test(value); +} +function extractFromMenuUrl(menuUrl) { if (!menuUrl) return null; try { const url = new URL(menuUrl); const pathname = url.pathname; + // Match /api/v2/embedded-menu/.js - this contains the platform_dispensary_id directly + const apiMatch = pathname.match(/^\/api\/v2\/embedded-menu\/([a-f0-9]{24})\.js$/i); + if (apiMatch) { + return { type: 'platformId', value: apiMatch[1] }; + } // Match /embedded-menu/ or /dispensary/ const embeddedMatch = pathname.match(/^\/embedded-menu\/([^/?]+)/); - if (embeddedMatch) - return embeddedMatch[1]; + if (embeddedMatch) { + const value = embeddedMatch[1]; + // Check if it's actually an ObjectId (some URLs use ID directly) + if (isObjectId(value)) { + return { type: 'platformId', value }; + } + return { type: 'cName', value }; + } const dispensaryMatch = pathname.match(/^\/dispensary\/([^/?]+)/); - if (dispensaryMatch) - return dispensaryMatch[1]; + if (dispensaryMatch) { + const value = dispensaryMatch[1]; + if (isObjectId(value)) { + return { type: 'platformId', value }; + } + return { type: 'cName', value }; + } return null; } catch { return null; } } +/** + * Extract cName (slug) from a Dutchie menu_url + * Backward compatible - use extractFromMenuUrl for full info + */ +function extractCNameFromMenuUrl(menuUrl) { + const extraction = extractFromMenuUrl(menuUrl); + return extraction?.value || null; +} /** * Resolve platform dispensary IDs for all dispensaries that don't have one * CRITICAL: Uses cName extracted from menu_url, NOT the slug column! @@ -317,6 +343,7 @@ function mapDbRowToDispensary(row) { id: row.id, platform: row.platform || 'dutchie', // keep platform as-is, default to 'dutchie' name: row.name, + dbaName: row.dbaName || row.dba_name, slug: row.slug, city: row.city, state: row.state, @@ -349,6 +376,7 @@ async function getDispensaryById(id) { SELECT id, name, + dba_name AS "dbaName", slug, city, state, diff --git a/backend/dist/dutchie-az/services/menu-detection.js b/backend/dist/dutchie-az/services/menu-detection.js index 5d27ce41..4a91bf93 100644 --- a/backend/dist/dutchie-az/services/menu-detection.js +++ b/backend/dist/dutchie-az/services/menu-detection.js @@ -32,22 +32,7 @@ const DISPENSARY_COLUMNS = ` // PROVIDER DETECTION PATTERNS // ============================================================ const PROVIDER_URL_PATTERNS = [ - // IMPORTANT: Curaleaf and Sol must come BEFORE dutchie to take precedence - // These stores have their own proprietary menu systems (not crawlable via Dutchie) - { - provider: 'curaleaf', - patterns: [ - /curaleaf\.com\/stores\//i, // e.g., https://curaleaf.com/stores/curaleaf-az-glendale-east - /curaleaf\.com\/dispensary\//i, // e.g., https://curaleaf.com/dispensary/arizona - ], - }, - { - provider: 'sol', - patterns: [ - /livewithsol\.com/i, // e.g., https://www.livewithsol.com/locations/sun-city/ - /solflower\.com/i, // alternate domain if any - ], - }, + // We detect provider based on the actual menu link we find, not just the site domain. { provider: 'dutchie', patterns: [ @@ -55,6 +40,8 @@ const PROVIDER_URL_PATTERNS = [ /\/embedded-menu\//i, /\/dispensary\/[A-Z]{2}-/i, // e.g., /dispensary/AZ-store-name /dutchie-plus/i, + /curaleaf\.com/i, // Curaleaf uses Dutchie platform + /livewithsol\.com/i, // Sol Flower uses Dutchie platform ], }, { @@ -146,19 +133,6 @@ function isCuraleafUrl(url) { return false; return /curaleaf\.com\/(stores|dispensary)\//i.test(url); } -/** - * Extract the Curaleaf store URL from a website URL - * Handles both /stores/ and /dispensary/ formats - */ -function extractCuraleafStoreUrl(url) { - if (!url) - return null; - // If it's already a Curaleaf stores/dispensary URL, use it - if (isCuraleafUrl(url)) { - return url; - } - return null; -} /** * Fetch a page and extract all links */ @@ -166,10 +140,11 @@ async function fetchPageLinks(url, timeout = 10000) { try { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), timeout); + // Use Googlebot User-Agent to bypass age gates on dispensary websites const response = await fetch(url, { signal: controller.signal, headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'User-Agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', }, redirect: 'follow', @@ -179,6 +154,12 @@ async function fetchPageLinks(url, timeout = 10000) { return { links: [], error: `HTTP ${response.status}` }; } const html = await response.text(); + // Quick check: if the page contains reactEnv.dispensaryId, treat it as Dutchie + // Use direct match for dispensaryId - the [^}]* pattern fails with nested braces in JSON + const reactEnvMatch = /"dispensaryId"\s*:\s*"([a-fA-F0-9]{24})"/i.exec(html); + if (reactEnvMatch && reactEnvMatch[1]) { + return { links: [`dutchie-reactenv:${reactEnvMatch[1]}`] }; + } // Extract all href attributes from anchor tags const linkRegex = /href=["']([^"']+)["']/gi; const links = []; @@ -259,7 +240,44 @@ async function crawlWebsiteForMenuLinks(websiteUrl) { return result; } result.foundLinks = homepageLinks; - // Step 2: Check for direct provider matches in homepage links + // Step 2: Try to extract reactEnv.dispensaryId (embedded Dutchie menu) from homepage HTML + try { + // Use Googlebot User-Agent to bypass age gates on dispensary websites + const resp = await fetch(homepage, { + headers: { + 'User-Agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + }, + redirect: 'follow', + }); + if (resp.ok) { + const html = await resp.text(); + // Look for dispensaryId directly - the [^}]* pattern fails with nested braces + const reactEnvMatch = /"dispensaryId"\s*:\s*"([a-fA-F0-9]{24})"/i.exec(html); + if (reactEnvMatch && reactEnvMatch[1]) { + result.provider = 'dutchie'; + result.menuUrl = homepage; + result.platformDispensaryId = reactEnvMatch[1]; + console.log(`[WebsiteCrawl] Found reactEnv.dispensaryId=${reactEnvMatch[1]} on homepage ${homepage}`); + return result; + } + } + } + catch (err) { + console.log(`[WebsiteCrawl] reactEnv check failed for ${homepage}: ${err.message}`); + } + // Step 2: Check for reactEnv token from fetchPageLinks (encoded as dutchie-reactenv:) + for (const link of homepageLinks) { + const reactEnvToken = /^dutchie-reactenv:(.+)$/.exec(link); + if (reactEnvToken) { + result.menuUrl = homepage; + result.provider = 'dutchie'; + result.platformDispensaryId = reactEnvToken[1]; + console.log(`[WebsiteCrawl] Found reactEnv.dispensaryId=${reactEnvToken[1]} on ${homepage}`); + return result; + } + } + // Step 3: Check for direct provider matches in homepage links for (const link of homepageLinks) { for (const { provider, patterns } of PROVIDER_URL_PATTERNS) { if (patterns.some(p => p.test(link))) { @@ -270,7 +288,7 @@ async function crawlWebsiteForMenuLinks(websiteUrl) { } } } - // Step 3: Find menu/order/shop links to follow + // Step 4: Find menu/order/shop links to follow const menuLinks = homepageLinks.filter(link => { // Must be same domain or a known provider domain try { @@ -375,44 +393,6 @@ async function detectAndResolveDispensary(dispensaryId) { let menuUrl = dispensary.menuUrl; const previousMenuType = dispensary.menuType || null; const website = dispensary.website; - // ============================================================ - // CURALEAF CHECK: If website is Curaleaf, override any stale Dutchie menu_url - // This prevents 60s Dutchie timeouts for stores that have migrated to Curaleaf's platform - // ============================================================ - if (isCuraleafUrl(website)) { - console.log(`[MenuDetection] ${dispensary.name}: Website is Curaleaf - marking as curaleaf provider`); - // Use the Curaleaf website URL as the menu_url (clearing stale Dutchie URL if any) - // At this point we know website is defined since isCuraleafUrl returned true - const curaleafUrl = extractCuraleafStoreUrl(website) || website; - await (0, connection_1.query)(` - UPDATE dispensaries SET - menu_type = 'curaleaf', - menu_url = $1, - platform_dispensary_id = NULL, - provider_detection_data = COALESCE(provider_detection_data, '{}'::jsonb) || - jsonb_build_object( - 'detected_provider', 'curaleaf'::text, - 'detection_method', 'website_pattern'::text, - 'detected_at', NOW(), - 'curaleaf_store_url', $1::text, - 'stale_dutchie_url', $2::text, - 'not_crawlable', true, - 'not_crawlable_reason', 'Curaleaf proprietary menu - no Dutchie integration'::text - ), - updated_at = NOW() - WHERE id = $3 - `, [curaleafUrl, menuUrl || null, dispensaryId]); - return { - dispensaryId, - dispensaryName: dispensary.name, - previousMenuType, - detectedProvider: 'curaleaf', - cName: null, - platformDispensaryId: null, - success: true, - error: undefined, - }; - } // If menu_url is null or empty, try to discover it by crawling the dispensary website if (!menuUrl || menuUrl.trim() === '') { console.log(`[MenuDetection] ${dispensary.name}: No menu_url - attempting website crawl`); @@ -527,38 +507,30 @@ async function detectAndResolveDispensary(dispensaryId) { platformDispensaryId: null, success: false, }; - // If not dutchie, just update menu_type and return + // If not dutchie, just update menu_type (non-dutchie providers) + // Note: curaleaf.com and livewithsol.com are detected directly as 'dutchie' via PROVIDER_URL_PATTERNS if (detectedProvider !== 'dutchie') { - // Special handling for proprietary providers - mark as not_crawlable until we have crawlers - const PROPRIETARY_PROVIDERS = ['curaleaf', 'sol']; - const isProprietaryProvider = PROPRIETARY_PROVIDERS.includes(detectedProvider); - const notCrawlableReason = isProprietaryProvider - ? `${detectedProvider} proprietary menu - no crawler available` - : null; await (0, connection_1.query)(` UPDATE dispensaries SET menu_type = $1, - platform_dispensary_id = CASE WHEN $3 THEN NULL ELSE platform_dispensary_id END, provider_detection_data = COALESCE(provider_detection_data, '{}'::jsonb) || jsonb_build_object( 'detected_provider', $1::text, 'detection_method', 'url_pattern'::text, 'detected_at', NOW(), - 'not_crawlable', $3, - 'not_crawlable_reason', $4::text + 'not_crawlable', false ), updated_at = NOW() WHERE id = $2 - `, [detectedProvider, dispensaryId, isProprietaryProvider, notCrawlableReason]); + `, [detectedProvider, dispensaryId]); result.success = true; - console.log(`[MenuDetection] ${dispensary.name}: Updated menu_type to ${detectedProvider}${isProprietaryProvider ? ' (not crawlable)' : ''}`); + console.log(`[MenuDetection] ${dispensary.name}: Updated menu_type to ${detectedProvider}`); return result; } - // For dutchie: extract cName and resolve platform ID - const cName = (0, discovery_1.extractCNameFromMenuUrl)(menuUrl); - result.cName = cName; - if (!cName) { - result.error = `Could not extract cName from menu_url: ${menuUrl}`; + // For dutchie: extract cName or platformId from menu_url + const extraction = (0, discovery_1.extractFromMenuUrl)(menuUrl); + if (!extraction) { + result.error = `Could not extract cName or platformId from menu_url: ${menuUrl}`; await (0, connection_1.query)(` UPDATE dispensaries SET menu_type = 'dutchie', @@ -576,6 +548,35 @@ async function detectAndResolveDispensary(dispensaryId) { console.log(`[MenuDetection] ${dispensary.name}: ${result.error}`); return result; } + // If URL contains platform_dispensary_id directly (e.g., /api/v2/embedded-menu/.js), skip GraphQL resolution + if (extraction.type === 'platformId') { + const platformId = extraction.value; + result.platformDispensaryId = platformId; + result.success = true; + await (0, connection_1.query)(` + UPDATE dispensaries SET + menu_type = 'dutchie', + platform_dispensary_id = $1, + provider_detection_data = COALESCE(provider_detection_data, '{}'::jsonb) || + jsonb_build_object( + 'detected_provider', 'dutchie'::text, + 'detection_method', 'url_direct_platform_id'::text, + 'detected_at', NOW(), + 'platform_id_source', 'url_embedded'::text, + 'platform_id_resolved', true, + 'platform_id_resolved_at', NOW(), + 'resolution_error', NULL::text, + 'not_crawlable', false + ), + updated_at = NOW() + WHERE id = $2 + `, [platformId, dispensaryId]); + console.log(`[MenuDetection] ${dispensary.name}: Platform ID extracted directly from URL = ${platformId}`); + return result; + } + // Otherwise, we have a cName that needs GraphQL resolution + const cName = extraction.value; + result.cName = cName; // Resolve platform_dispensary_id from cName console.log(`[MenuDetection] ${dispensary.name}: Resolving platform ID for cName = ${cName}`); try { @@ -604,6 +605,55 @@ async function detectAndResolveDispensary(dispensaryId) { console.log(`[MenuDetection] ${dispensary.name}: Resolved platform ID = ${platformId}`); } else { + // cName resolution failed - try crawling website as fallback + console.log(`[MenuDetection] ${dispensary.name}: cName "${cName}" not found on Dutchie, trying website crawl fallback...`); + if (website && website.trim() !== '') { + const fallbackCrawl = await crawlWebsiteForMenuLinks(website); + if (fallbackCrawl.menuUrl && fallbackCrawl.provider === 'dutchie') { + // Found Dutchie menu via website crawl! + console.log(`[MenuDetection] ${dispensary.name}: Found Dutchie menu via website crawl: ${fallbackCrawl.menuUrl}`); + // Extract from the new menu URL + const newExtraction = (0, discovery_1.extractFromMenuUrl)(fallbackCrawl.menuUrl); + if (newExtraction) { + let fallbackPlatformId = null; + if (newExtraction.type === 'platformId') { + fallbackPlatformId = newExtraction.value; + } + else { + // Try to resolve the new cName + fallbackPlatformId = await (0, graphql_client_1.resolveDispensaryId)(newExtraction.value); + } + if (fallbackPlatformId) { + result.platformDispensaryId = fallbackPlatformId; + result.success = true; + result.cName = newExtraction.value; + await (0, connection_1.query)(` + UPDATE dispensaries SET + menu_type = 'dutchie', + menu_url = $1, + platform_dispensary_id = $2, + provider_detection_data = COALESCE(provider_detection_data, '{}'::jsonb) || + jsonb_build_object( + 'detected_provider', 'dutchie'::text, + 'detection_method', 'website_crawl_fallback'::text, + 'detected_at', NOW(), + 'original_cname', $3::text, + 'fallback_cname', $4::text, + 'website_crawled', $5::text, + 'platform_id_resolved', true, + 'platform_id_resolved_at', NOW(), + 'not_crawlable', false + ), + updated_at = NOW() + WHERE id = $6 + `, [fallbackCrawl.menuUrl, fallbackPlatformId, cName, newExtraction.value, website, dispensaryId]); + console.log(`[MenuDetection] ${dispensary.name}: Resolved via website crawl, platform ID = ${fallbackPlatformId}`); + return result; + } + } + } + } + // Website crawl fallback didn't work either result.error = `cName "${cName}" could not be resolved - may not exist on Dutchie`; await (0, connection_1.query)(` UPDATE dispensaries SET @@ -617,6 +667,7 @@ async function detectAndResolveDispensary(dispensaryId) { 'cname_extracted', $1::text, 'platform_id_resolved', false, 'resolution_error', $2::text, + 'website_crawl_attempted', true, 'not_crawlable', true ), updated_at = NOW() @@ -652,10 +703,11 @@ async function detectAndResolveDispensary(dispensaryId) { * Also includes dispensaries with no menu_url but with a website (for website crawl discovery) */ async function runBulkDetection(options = {}) { - const { state, onlyUnknown = true, onlyMissingPlatformId = false, includeWebsiteCrawl = true, limit } = options; + const { state, onlyUnknown = true, onlyMissingPlatformId = false, includeWebsiteCrawl = true, includeDutchieMissingPlatformId = true, limit, } = options; console.log('[MenuDetection] Starting bulk detection...'); // Build query to find dispensaries needing detection - // Now includes: dispensaries with menu_url OR (no menu_url but has website and not already marked not_crawlable) + // Includes: dispensaries with menu_url OR (no menu_url but has website and not already marked not_crawlable) + // Optionally includes dutchie stores missing platform ID let whereClause = `WHERE ( menu_url IS NOT NULL ${includeWebsiteCrawl ? `OR ( @@ -664,6 +716,9 @@ async function runBulkDetection(options = {}) { AND website != '' AND (provider_detection_data IS NULL OR NOT (provider_detection_data->>'not_crawlable')::boolean) )` : ''} + ${includeDutchieMissingPlatformId ? `OR ( + menu_type = 'dutchie' AND platform_dispensary_id IS NULL + )` : ''} )`; const params = []; let paramIndex = 1; @@ -671,10 +726,24 @@ async function runBulkDetection(options = {}) { whereClause += ` AND state = $${paramIndex++}`; params.push(state); } - if (onlyUnknown) { - whereClause += ` AND (menu_type IS NULL OR menu_type = '' OR menu_type = 'unknown')`; + // Handle filters for unknown and/or missing platform IDs + if (onlyUnknown && onlyMissingPlatformId) { + whereClause += ` AND ( + (menu_type IS NULL OR menu_type = '' OR menu_type = 'unknown') + OR (menu_type = 'dutchie' AND platform_dispensary_id IS NULL) + )`; } - if (onlyMissingPlatformId) { + else if (onlyUnknown) { + whereClause += ` AND ( + (menu_type IS NULL OR menu_type = '' OR menu_type = 'unknown') + ${includeDutchieMissingPlatformId ? `OR (menu_type = 'dutchie' AND platform_dispensary_id IS NULL)` : ''} + )`; + } + else if (onlyMissingPlatformId) { + whereClause += ` AND (menu_type = 'dutchie' AND platform_dispensary_id IS NULL)`; + } + else if (includeDutchieMissingPlatformId) { + // Always attempt to resolve dutchie stores missing platform IDs whereClause += ` AND (menu_type = 'dutchie' AND platform_dispensary_id IS NULL)`; } let query_str = ` @@ -730,13 +799,16 @@ async function runBulkDetection(options = {}) { async function executeMenuDetectionJob(config = {}) { const state = config.state || 'AZ'; const onlyUnknown = config.onlyUnknown !== false; - const onlyMissingPlatformId = config.onlyMissingPlatformId || false; + // Default to true - always try to resolve platform IDs for dutchie stores + const onlyMissingPlatformId = config.onlyMissingPlatformId !== false; + const includeDutchieMissingPlatformId = config.includeDutchieMissingPlatformId !== false; console.log(`[MenuDetection] Executing scheduled job for state=${state}...`); try { const result = await runBulkDetection({ state, onlyUnknown, onlyMissingPlatformId, + includeDutchieMissingPlatformId, }); const status = result.totalFailed === 0 ? 'success' : result.totalSucceeded === 0 ? 'error' : 'partial'; diff --git a/backend/dist/scripts/bootstrap-stores-for-dispensaries.js b/backend/dist/scripts/bootstrap-stores-for-dispensaries.js new file mode 100644 index 00000000..d05098a5 --- /dev/null +++ b/backend/dist/scripts/bootstrap-stores-for-dispensaries.js @@ -0,0 +1,65 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const pg_1 = require("pg"); +const pool = new pg_1.Pool({ connectionString: process.env.DATABASE_URL }); +/** + * Creates `stores` table records for all dispensaries that: + * 1. Have menu_type = 'dutchie' AND platform_dispensary_id (ready for GraphQL crawl) + * 2. Don't already have a linked stores record + * + * The stores table is required by the scraper engine (scrapeStore function) + */ +async function bootstrapStores() { + console.log('=== Bootstrapping stores for Dutchie dispensaries ===\n'); + // Find all dutchie dispensaries without linked stores + const result = await pool.query(` + SELECT d.id, d.name, d.slug, d.menu_type, d.platform_dispensary_id, d.menu_url + FROM dispensaries d + LEFT JOIN stores s ON s.dispensary_id = d.id + WHERE d.menu_type = 'dutchie' + AND d.platform_dispensary_id IS NOT NULL + AND s.id IS NULL + ORDER BY d.id + `); + console.log(`Found ${result.rows.length} dispensaries needing store records\n`); + let created = 0; + let errors = 0; + for (const d of result.rows) { + try { + // Insert store record linking to dispensary + // Note: stores table only has basic fields: name, slug, dispensary_id, dutchie_url + // The platform_dispensary_id for GraphQL crawling lives in the dispensaries table + const insertResult = await pool.query(` + INSERT INTO stores ( + name, + slug, + dispensary_id, + active, + scrape_enabled, + created_at, + updated_at + ) VALUES ($1, $2, $3, true, true, NOW(), NOW()) + RETURNING id + `, [ + d.name, + d.slug || d.name.toLowerCase().replace(/[^a-z0-9]+/g, '-'), + d.id + ]); + console.log(`[CREATED] Store ${insertResult.rows[0].id} for dispensary ${d.id}: ${d.name}`); + created++; + } + catch (e) { + console.error(`[ERROR] Dispensary ${d.id} (${d.name}): ${e.message}`); + errors++; + } + } + console.log('\n=== Bootstrap Summary ==='); + console.log(`Created: ${created}`); + console.log(`Errors: ${errors}`); + console.log(`Total needing stores: ${result.rows.length}`); + await pool.end(); +} +bootstrapStores().catch(e => { + console.error('Fatal error:', e.message); + process.exit(1); +}); diff --git a/backend/dist/scripts/check-store-linking.js b/backend/dist/scripts/check-store-linking.js new file mode 100644 index 00000000..bbdd2e41 --- /dev/null +++ b/backend/dist/scripts/check-store-linking.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const pg_1 = require("pg"); +const pool = new pg_1.Pool({ connectionString: process.env.DATABASE_URL }); +async function check() { + // Check which dispensaries have linked stores + const result = await pool.query(` + SELECT d.id as disp_id, d.name, d.menu_type, d.platform_dispensary_id, + s.id as store_id, s.name as store_name + FROM dispensaries d + LEFT JOIN stores s ON s.dispensary_id = d.id + WHERE d.menu_type = 'dutchie' AND d.platform_dispensary_id IS NOT NULL + LIMIT 15 + `); + console.log('Dispensaries with linked stores:'); + result.rows.forEach(r => { + console.log(` [${r.disp_id}] ${r.name} -> store ${r.store_id || 'NONE'} (${r.store_name || 'NOT LINKED'})`); + }); + // Count how many have linked stores + const countResult = await pool.query(` + SELECT + COUNT(*) FILTER (WHERE s.id IS NOT NULL) as with_store, + COUNT(*) FILTER (WHERE s.id IS NULL) as without_store + FROM dispensaries d + LEFT JOIN stores s ON s.dispensary_id = d.id + WHERE d.menu_type = 'dutchie' AND d.platform_dispensary_id IS NOT NULL + `); + console.log('\nSummary:', countResult.rows[0]); + await pool.end(); +} +check(); diff --git a/backend/dist/scripts/crawl-five-sequential.js b/backend/dist/scripts/crawl-five-sequential.js index f611f5be..db5c0f4c 100644 --- a/backend/dist/scripts/crawl-five-sequential.js +++ b/backend/dist/scripts/crawl-five-sequential.js @@ -1,24 +1,44 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const dispensary_orchestrator_1 = require("../services/dispensary-orchestrator"); -// Run 5 crawlers sequentially to avoid OOM -const dispensaryIds = [112, 81, 115, 140, 177]; +// All 57 dutchie stores with platform_dispensary_id (as of 2024-12) +const ALL_DISPENSARY_IDS = [ + 72, 74, 75, 76, 77, 78, 81, 82, 85, 87, 91, 92, 97, 101, 106, 108, 110, 112, + 115, 120, 123, 125, 128, 131, 135, 139, 140, 143, 144, 145, 152, 153, 161, + 168, 176, 177, 180, 181, 189, 195, 196, 199, 200, 201, 205, 206, 207, 213, + 214, 224, 225, 227, 232, 235, 248, 252, 281 +]; +const BATCH_SIZE = 5; async function run() { - console.log('Starting 5 crawlers SEQUENTIALLY...'); - for (const id of dispensaryIds) { - console.log(`\n=== Starting crawler for dispensary ${id} ===`); - try { - const result = await (0, dispensary_orchestrator_1.runDispensaryOrchestrator)(id); - console.log(` Status: ${result.status}`); - console.log(` Summary: ${result.summary}`); - if (result.productsFound) { - console.log(` Products: ${result.productsFound} found, ${result.productsNew} new, ${result.productsUpdated} updated`); + const totalBatches = Math.ceil(ALL_DISPENSARY_IDS.length / BATCH_SIZE); + console.log(`Starting crawl of ${ALL_DISPENSARY_IDS.length} stores in ${totalBatches} batches of ${BATCH_SIZE}...`); + let successCount = 0; + let errorCount = 0; + for (let i = 0; i < ALL_DISPENSARY_IDS.length; i += BATCH_SIZE) { + const batch = ALL_DISPENSARY_IDS.slice(i, i + BATCH_SIZE); + const batchNum = Math.floor(i / BATCH_SIZE) + 1; + console.log(`\n========== BATCH ${batchNum}/${totalBatches} (IDs: ${batch.join(', ')}) ==========`); + for (const id of batch) { + console.log(`\n--- Crawling dispensary ${id} ---`); + try { + const result = await (0, dispensary_orchestrator_1.runDispensaryOrchestrator)(id); + console.log(` Status: ${result.status}`); + console.log(` Summary: ${result.summary}`); + if (result.productsFound) { + console.log(` Products: ${result.productsFound} found, ${result.productsNew} new, ${result.productsUpdated} updated`); + } + successCount++; + } + catch (e) { + console.log(` ERROR: ${e.message}`); + errorCount++; } } - catch (e) { - console.log(` ERROR: ${e.message}`); - } + console.log(`\n--- Batch ${batchNum} complete. Progress: ${Math.min(i + BATCH_SIZE, ALL_DISPENSARY_IDS.length)}/${ALL_DISPENSARY_IDS.length} ---`); } - console.log('\n=== All 5 crawlers complete ==='); + console.log('\n========================================'); + console.log(`=== ALL CRAWLS COMPLETE ===`); + console.log(`Success: ${successCount}, Errors: ${errorCount}`); + console.log('========================================'); } run().catch(e => console.log('Fatal:', e.message)); diff --git a/backend/dist/scripts/detect-all.js b/backend/dist/scripts/detect-all.js new file mode 100644 index 00000000..0d014f89 --- /dev/null +++ b/backend/dist/scripts/detect-all.js @@ -0,0 +1,111 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const pg_1 = require("pg"); +const pool = new pg_1.Pool({ connectionString: process.env.DATABASE_URL }); +// Simple fetch with timeout +async function fetchWithTimeout(url, timeout = 10000) { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeout); + try { + const resp = await fetch(url, { + signal: controller.signal, + headers: { + 'User-Agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + }, + redirect: 'follow', + }); + clearTimeout(id); + return await resp.text(); + } + catch (e) { + clearTimeout(id); + throw e; + } +} +// Check for dutchie patterns in HTML +function detectDutchie(html) { + // Check for reactEnv.dispensaryId (Curaleaf/Sol pattern) + const reactEnvMatch = html.match(/"dispensaryId"\s*:\s*"([a-fA-F0-9]{24})"/i); + if (reactEnvMatch) { + return { provider: 'dutchie', platformId: reactEnvMatch[1] }; + } + // Check for Dutchie embedded-menu script (Trulieve pattern) + // Look for: embedded-menu/5eaf48fc972e6200b1303b97.js + const embedMatch = html.match(/embedded-menu\/([a-f0-9]{24})(?:\.js)?/i); + if (embedMatch) { + return { provider: 'dutchie', platformId: embedMatch[1] }; + } + // Check for dutchie.com links + const dutchieLink = html.match(/https?:\/\/(?:www\.)?dutchie\.com\/(?:dispensary|embedded-menu|stores)\/([a-zA-Z0-9-]+)/i); + if (dutchieLink) { + return { provider: 'dutchie', menuUrl: dutchieLink[0] }; + } + // Check for jane + if (html.includes('iheartjane.com') || html.includes('jane.co')) { + const janeMatch = html.match(/https?:\/\/(?:www\.)?(?:iheartjane\.com|jane\.co)\/[^"\s]+/i); + return { provider: 'jane', menuUrl: janeMatch?.[0] }; + } + // Check for treez + if (html.includes('.treez.io')) { + const treezMatch = html.match(/https?:\/\/[a-zA-Z0-9-]+\.treez\.io[^"\s]*/i); + return { provider: 'treez', menuUrl: treezMatch?.[0] }; + } + // Check for leafly + if (html.includes('leafly.com/dispensary')) { + return { provider: 'leafly' }; + } + return { provider: 'unknown' }; +} +async function main() { + const { rows: stores } = await pool.query(` + SELECT id, name, website + FROM dispensaries + WHERE platform_dispensary_id IS NULL + AND website IS NOT NULL + AND website NOT LIKE '%example%' + ORDER BY id + LIMIT 150 + `); + console.log('Checking ' + stores.length + ' stores...\n'); + let dutchieCount = 0; + let otherCount = 0; + let errorCount = 0; + for (const store of stores) { + try { + const html = await fetchWithTimeout(store.website); + const result = detectDutchie(html); + if (result.provider === 'dutchie') { + if (result.platformId) { + await pool.query('UPDATE dispensaries SET menu_type = $1, platform_dispensary_id = $2, updated_at = NOW() WHERE id = $3', ['dutchie', result.platformId, store.id]); + console.log('[' + store.id + '] ' + store.name + ' => DUTCHIE (ID: ' + result.platformId + ')'); + dutchieCount++; + } + else if (result.menuUrl) { + await pool.query('UPDATE dispensaries SET menu_type = $1, menu_url = $2, updated_at = NOW() WHERE id = $3', ['dutchie', result.menuUrl, store.id]); + console.log('[' + store.id + '] ' + store.name + ' => DUTCHIE (URL: ' + result.menuUrl.slice(0, 60) + ')'); + dutchieCount++; + } + } + else if (result.provider !== 'unknown') { + await pool.query('UPDATE dispensaries SET menu_type = $1, menu_url = COALESCE($2, menu_url), updated_at = NOW() WHERE id = $3', [result.provider, result.menuUrl, store.id]); + console.log('[' + store.id + '] ' + store.name + ' => ' + result.provider.toUpperCase()); + otherCount++; + } + else { + console.log('[' + store.id + '] ' + store.name + ' => no menu found'); + } + } + catch (err) { + const errMsg = err.name === 'AbortError' ? 'timeout' : err.message?.slice(0, 40) || 'error'; + console.log('[' + store.id + '] ' + store.name + ' => ERROR: ' + errMsg); + errorCount++; + } + } + console.log('\n=== Summary ==='); + console.log('Dutchie detected: ' + dutchieCount); + console.log('Other providers: ' + otherCount); + console.log('Errors: ' + errorCount); + await pool.end(); +} +main().catch(console.error); diff --git a/backend/dist/scripts/export-dispensaries.js b/backend/dist/scripts/export-dispensaries.js new file mode 100644 index 00000000..13f2c868 --- /dev/null +++ b/backend/dist/scripts/export-dispensaries.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const pg_1 = require("pg"); +const pool = new pg_1.Pool({ connectionString: process.env.DATABASE_URL }); +async function exportDispensaries() { + const { rows } = await pool.query(` + SELECT id, name, dba_name, company_name, slug, + address, city, state, zip, latitude, longitude, + website, menu_type, menu_url, platform_dispensary_id, + created_at, updated_at + FROM dispensaries + WHERE menu_type IS NOT NULL + ORDER BY id + `); + console.log(JSON.stringify(rows, null, 2)); + await pool.end(); +} +exportDispensaries(); diff --git a/backend/dist/scripts/extract-platform-ids.js b/backend/dist/scripts/extract-platform-ids.js new file mode 100644 index 00000000..06bbcad0 --- /dev/null +++ b/backend/dist/scripts/extract-platform-ids.js @@ -0,0 +1,240 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const playwright_1 = require("playwright"); +const pg_1 = require("pg"); +const pool = new pg_1.Pool({ + connectionString: process.env.DATABASE_URL +}); +async function extractPlatformId(browser, dispensary) { + let capturedId = null; + const context = await browser.newContext(); + const page = await context.newPage(); + // Intercept network requests to find retailer IDs + page.on('request', (request) => { + const url = request.url(); + if (url.includes('dutchie') || url.includes('plus.dutchie') || url.includes('api.dutchie')) { + // Check URL for retailer ID + const urlMatch = url.match(/[\/=]([a-f0-9]{24})(?:[\/\?&]|$)/i); + if (urlMatch && !capturedId) { + capturedId = urlMatch[1]; + console.log(` Captured from URL: ${capturedId}`); + } + const postData = request.postData(); + if (postData) { + // Look for retailerId in GraphQL variables + const match = postData.match(/["']?retailerId["']?\s*:\s*["']([a-f0-9]{24})["']/i); + if (match && !capturedId) { + capturedId = match[1]; + console.log(` Captured retailerId: ${capturedId}`); + } + // Also look for dispensaryId + const dispMatch = postData.match(/["']?dispensaryId["']?\s*:\s*["']([a-f0-9]{24})["']/i); + if (dispMatch && !capturedId) { + capturedId = dispMatch[1]; + console.log(` Captured dispensaryId: ${capturedId}`); + } + } + } + }); + try { + console.log(`\nLoading ${dispensary.name}: ${dispensary.website}`); + await page.goto(dispensary.website, { waitUntil: 'domcontentloaded', timeout: 30000 }); + // Wait for initial load + await page.waitForTimeout(2000); + // Check page content for retailerId + const content = await page.content(); + // Try various patterns in page content + const patterns = [ + /["']retailerId["']\s*:\s*["']([a-f0-9]{24})["']/i, + /dispensaryId["']\s*:\s*["']([a-f0-9]{24})["']/i, + /retailer["']?\s*:\s*["']([a-f0-9]{24})["']/i, + /dutchie\.com\/embedded-menu\/([a-f0-9]{24})/i, + /dutchie\.com\/dispensary\/([a-f0-9]{24})/i, + /plus\.dutchie\.com\/plus\/([a-f0-9]{24})/i, + /retailerId=([a-f0-9]{24})/i, + ]; + for (const pattern of patterns) { + const match = content.match(pattern); + if (match && !capturedId) { + capturedId = match[1]; + console.log(` Found in content: ${capturedId}`); + break; + } + } + // Check __NEXT_DATA__ if present + if (!capturedId) { + const nextData = await page.evaluate(() => { + const el = document.getElementById('__NEXT_DATA__'); + return el?.textContent || null; + }); + if (nextData) { + for (const pattern of patterns) { + const match = nextData.match(pattern); + if (match) { + capturedId = match[1]; + console.log(` Found in __NEXT_DATA__: ${capturedId}`); + break; + } + } + } + } + // Look for iframes that might contain dutchie embed + if (!capturedId) { + const iframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of iframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + console.log(` Found in iframe: ${capturedId}`); + break; + } + } + } + } + // If still not found, try clicking on "Shop" or "Menu" links + if (!capturedId) { + const menuSelectors = [ + 'a:has-text("Shop")', + 'a:has-text("Menu")', + 'a:has-text("Order")', + 'a[href*="menu"]', + 'a[href*="shop"]', + 'a[href*="order"]', + 'button:has-text("Shop")', + 'button:has-text("Menu")', + ]; + for (const selector of menuSelectors) { + try { + const element = page.locator(selector).first(); + const isVisible = await element.isVisible({ timeout: 500 }); + if (isVisible) { + const href = await element.getAttribute('href'); + // If it's an internal link, click it + if (href && !href.startsWith('http')) { + console.log(` Clicking ${selector}...`); + await element.click(); + await page.waitForTimeout(3000); + // Check new page content + const newContent = await page.content(); + for (const pattern of patterns) { + const match = newContent.match(pattern); + if (match && !capturedId) { + capturedId = match[1]; + console.log(` Found after navigation: ${capturedId}`); + break; + } + } + // Check iframes on new page + if (!capturedId) { + const newIframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of newIframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + console.log(` Found in iframe after nav: ${capturedId}`); + break; + } + } + } + } + if (capturedId) + break; + } + } + } + catch (e) { + // Continue to next selector + } + } + } + // If still not found, wait longer for async dutchie widget to load + if (!capturedId) { + console.log(` Waiting for async content...`); + await page.waitForTimeout(5000); + // Check for dutchie script tags + const scripts = await page.evaluate(() => { + return Array.from(document.querySelectorAll('script')).map(s => s.src || s.innerHTML?.substring(0, 500)); + }); + for (const script of scripts) { + if (script && script.includes('dutchie')) { + for (const pattern of patterns) { + const match = script.match(pattern); + if (match && !capturedId) { + capturedId = match[1]; + console.log(` Found in script: ${capturedId}`); + break; + } + } + if (capturedId) + break; + } + } + // Final check of iframes after wait + if (!capturedId) { + const finalIframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of finalIframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + console.log(` Found in iframe (delayed): ${capturedId}`); + break; + } + } + } + } + } + } + catch (e) { + console.log(` Error: ${e.message.substring(0, 80)}`); + } + finally { + await context.close(); + } + return capturedId; +} +async function main() { + // Get dispensaries missing platform IDs + const result = await pool.query(` + SELECT id, name, website + FROM dispensaries + WHERE state = 'AZ' + AND menu_type = 'dutchie' + AND (platform_dispensary_id IS NULL OR platform_dispensary_id = '') + AND website IS NOT NULL AND website != '' + ORDER BY name + `); + console.log(`Found ${result.rows.length} dispensaries to process\n`); + const browser = await playwright_1.chromium.launch({ headless: true }); + const results = []; + for (const dispensary of result.rows) { + const platformId = await extractPlatformId(browser, dispensary); + results.push({ id: dispensary.id, name: dispensary.name, platformId }); + if (platformId) { + // Update database + await pool.query('UPDATE dispensaries SET platform_dispensary_id = $1 WHERE id = $2', [platformId, dispensary.id]); + console.log(` Updated database with ${platformId}`); + } + } + await browser.close(); + console.log('\n=== SUMMARY ==='); + const found = results.filter(r => r.platformId); + const notFound = results.filter(r => !r.platformId); + console.log(`\nFound (${found.length}):`); + found.forEach(r => console.log(` ${r.id}: ${r.name} -> ${r.platformId}`)); + console.log(`\nNot Found (${notFound.length}):`); + notFound.forEach(r => console.log(` ${r.id}: ${r.name}`)); + await pool.end(); +} +main().catch(e => { + console.error('Error:', e); + process.exit(1); +}); diff --git a/backend/dist/scripts/import-dispensaries.js b/backend/dist/scripts/import-dispensaries.js new file mode 100644 index 00000000..c4cc3a4f --- /dev/null +++ b/backend/dist/scripts/import-dispensaries.js @@ -0,0 +1,108 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +const pg_1 = require("pg"); +const fs = __importStar(require("fs")); +const pool = new pg_1.Pool({ connectionString: process.env.DATABASE_URL }); +async function importDispensaries(filePath) { + const data = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + console.log(`Importing ${data.length} dispensaries...`); + let inserted = 0; + let updated = 0; + let errors = 0; + for (const d of data) { + try { + // Check if dispensary exists by name and city + const { rows: existing } = await pool.query(`SELECT id FROM dispensaries WHERE name = $1 AND city = $2`, [d.name, d.city]); + if (existing.length > 0) { + // Update existing + await pool.query(` + UPDATE dispensaries SET + dba_name = COALESCE($1, dba_name), + company_name = COALESCE($2, company_name), + slug = COALESCE($3, slug), + address = COALESCE($4, address), + state = COALESCE($5, state), + zip = COALESCE($6, zip), + latitude = COALESCE($7, latitude), + longitude = COALESCE($8, longitude), + website = COALESCE($9, website), + menu_type = COALESCE($10, menu_type), + menu_url = COALESCE($11, menu_url), + platform_dispensary_id = COALESCE($12, platform_dispensary_id), + updated_at = NOW() + WHERE id = $13 + `, [ + d.dba_name, d.company_name, d.slug, + d.address, d.state, d.zip, + d.latitude, d.longitude, d.website, + d.menu_type, d.menu_url, d.platform_dispensary_id, + existing[0].id + ]); + console.log(`Updated: [${existing[0].id}] ${d.name} (${d.city})`); + updated++; + } + else { + // Insert new + const { rows: newRow } = await pool.query(` + INSERT INTO dispensaries ( + name, dba_name, company_name, slug, + address, city, state, zip, latitude, longitude, + website, menu_type, menu_url, platform_dispensary_id, + created_at, updated_at + ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, NOW(), NOW()) + RETURNING id + `, [ + d.name, d.dba_name, d.company_name, d.slug, + d.address, d.city, d.state, d.zip, d.latitude, d.longitude, + d.website, d.menu_type, d.menu_url, d.platform_dispensary_id + ]); + console.log(`Inserted: [${newRow[0].id}] ${d.name} (${d.city})`); + inserted++; + } + } + catch (err) { + console.error(`Error for ${d.name}: ${err.message}`); + errors++; + } + } + console.log(`\n=== Import Summary ===`); + console.log(`Inserted: ${inserted}`); + console.log(`Updated: ${updated}`); + console.log(`Errors: ${errors}`); + await pool.end(); +} +const filePath = process.argv[2] || '/tmp/dispensaries-export.json'; +importDispensaries(filePath).catch(console.error); diff --git a/backend/dist/scripts/jars-az-extractor.js b/backend/dist/scripts/jars-az-extractor.js new file mode 100644 index 00000000..2df24136 --- /dev/null +++ b/backend/dist/scripts/jars-az-extractor.js @@ -0,0 +1,118 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const playwright_1 = require("playwright"); +async function extractJarsAzStoreIds() { + const browser = await playwright_1.chromium.launch({ headless: true }); + const page = await browser.newPage(); + const results = []; + const capturedIds = []; + const allRequests = []; + // Intercept network requests to find Dutchie Plus API calls + page.on('request', (request) => { + const url = request.url(); + allRequests.push(url.substring(0, 100)); + if (url.includes('dutchie') || url.includes('graphql')) { + const postData = request.postData(); + console.log('Dutchie request to:', url.substring(0, 80)); + if (postData) { + // Look for retailerId in GraphQL variables + const match = postData.match(/"retailerId"\s*:\s*"([a-f0-9-]{36})"/i); + if (match) { + const id = match[1]; + if (capturedIds.indexOf(id) === -1) { + capturedIds.push(id); + console.log('Captured retailerId from request:', id); + } + } + } + } + }); + try { + // Just load one page first and thoroughly debug it + console.log('Loading Mesa store with full network debugging...'); + await page.goto('https://jarscannabis.com/shop/mesa-az/', { + waitUntil: 'networkidle', + timeout: 60000 + }); + console.log('\nWaiting 5 seconds for dynamic content...'); + await page.waitForTimeout(5000); + // Get page title and content + const title = await page.title(); + console.log('Page title:', title); + const content = await page.content(); + console.log('Page content length:', content.length); + // Save screenshot + await page.screenshot({ path: '/tmp/jars-mesa-debug.png', fullPage: true }); + console.log('Screenshot saved to /tmp/jars-mesa-debug.png'); + // Look for all UUIDs in content + const uuidPattern = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi; + const uuids = content.match(uuidPattern); + if (uuids) { + const uniqueUuids = [...new Set(uuids)]; + console.log('\n=== All UUIDs found on page ==='); + uniqueUuids.forEach(u => console.log(u)); + } + // Look for all iframes + const iframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => ({ + src: f.src, + id: f.id, + name: f.name, + className: f.className + })); + }); + console.log('\n=== Iframes ==='); + console.log(JSON.stringify(iframes, null, 2)); + // Look for any elements with dutchie + const dutchieElements = await page.evaluate(() => { + const elements = document.body.innerHTML.match(/dutchie[^<>]*\"/gi) || []; + return elements.slice(0, 20); + }); + console.log('\n=== Dutchie mentions ==='); + dutchieElements.forEach(e => console.log(e)); + // Look for script src containing dutchie + const scripts = await page.evaluate(() => { + return Array.from(document.querySelectorAll('script[src]')) + .map(s => s.getAttribute('src')) + .filter(src => src && (src.includes('dutchie') || src.includes('embed'))); + }); + console.log('\n=== Relevant scripts ==='); + scripts.forEach(s => console.log(s)); + // Look for __NEXT_DATA__ + const nextData = await page.evaluate(() => { + const el = document.getElementById('__NEXT_DATA__'); + return el ? el.textContent : null; + }); + if (nextData) { + console.log('\n=== __NEXT_DATA__ found ==='); + const data = JSON.parse(nextData); + // Look for retailer in various places + const propsStr = JSON.stringify(data, null, 2); + // Find all UUID patterns in the props + const propsUuids = propsStr.match(/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi); + if (propsUuids) { + console.log('UUIDs in __NEXT_DATA__:', [...new Set(propsUuids)]); + } + } + else { + console.log('\nNo __NEXT_DATA__ found'); + } + // Look for specific Dutchie embed patterns + const embedPatterns = content.match(/https:\/\/[^"'\s]*dutchie[^"'\s]*/gi); + if (embedPatterns) { + console.log('\n=== Dutchie embed URLs ==='); + [...new Set(embedPatterns)].forEach(u => console.log(u)); + } + console.log('\n=== Network requests summary ==='); + console.log('Total requests:', allRequests.length); + const dutchieRequests = allRequests.filter(r => r.includes('dutchie')); + console.log('Dutchie requests:', dutchieRequests.length); + dutchieRequests.forEach(r => console.log(r)); + console.log('\n=== CAPTURED IDS ==='); + console.log(capturedIds); + } + finally { + await browser.close(); + } +} +extractJarsAzStoreIds().catch(e => console.error('Error:', e.message)); diff --git a/backend/dist/scripts/jars-az-finder.js b/backend/dist/scripts/jars-az-finder.js new file mode 100644 index 00000000..625d2405 --- /dev/null +++ b/backend/dist/scripts/jars-az-finder.js @@ -0,0 +1,177 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const playwright_1 = require("playwright"); +async function findJarsAzStores() { + const browser = await playwright_1.chromium.launch({ headless: true }); + const page = await browser.newPage(); + const capturedRetailerIds = []; + const allApiCalls = []; + // Intercept ALL requests to find retailer IDs + page.on('request', (request) => { + const url = request.url(); + // Log Buddy API calls + if (url.includes('buddyapi') || url.includes('dutchie') || url.includes('graphql')) { + allApiCalls.push(url); + const postData = request.postData(); + if (postData) { + // Look for retailerId in various formats + const match = postData.match(/retailerId['":\s]+([a-f0-9-]{36})/i); + if (match) { + capturedRetailerIds.push({ url, retailerId: match[1] }); + } + } + // Also check URL params + const urlMatch = url.match(/retailerId=([a-f0-9-]{36})/i); + if (urlMatch) { + capturedRetailerIds.push({ url, retailerId: urlMatch[1] }); + } + } + }); + try { + // First, let's try to find the actual Arizona menu URLs + console.log('Loading JARS find-a-dispensary page...'); + await page.goto('https://jarscannabis.com/find-a-dispensary', { + waitUntil: 'networkidle', + timeout: 30000 + }); + await page.waitForTimeout(3000); + // Take screenshot + await page.screenshot({ path: '/tmp/jars-find-dispensary.png', fullPage: true }); + console.log('Screenshot saved to /tmp/jars-find-dispensary.png'); + // Try to find state selector and click Arizona + console.log('\nLooking for state selector...'); + // Try various ways to select Arizona + const stateSelectors = [ + 'select[name*="state"]', + '[class*="state"] select', + 'select option[value="AZ"]', + 'button:has-text("Arizona")', + 'a:has-text("Arizona")', + '[data-state="AZ"]', + 'div:has-text("Arizona")', + ]; + for (const selector of stateSelectors) { + try { + const element = page.locator(selector).first(); + const isVisible = await element.isVisible({ timeout: 1000 }); + if (isVisible) { + console.log(`Found element with selector: ${selector}`); + await element.click(); + await page.waitForTimeout(2000); + } + } + catch (e) { + // Continue to next selector + } + } + // Get all links on the page + const links = await page.evaluate(() => { + return Array.from(document.querySelectorAll('a')).map(a => ({ + href: a.href, + text: a.textContent?.trim() + })).filter(l => l.href.includes('/shop') || l.href.includes('menu') || l.href.includes('arizona') || l.href.includes('-az')); + }); + console.log('\n=== Shop/Menu Links Found ==='); + links.forEach(l => console.log(`${l.text}: ${l.href}`)); + // Look for __NEXT_DATA__ which might have location data + const nextData = await page.evaluate(() => { + const el = document.getElementById('__NEXT_DATA__'); + return el?.textContent || null; + }); + if (nextData) { + console.log('\n=== Analyzing __NEXT_DATA__ ==='); + const data = JSON.parse(nextData); + const dataStr = JSON.stringify(data); + // Look for Arizona references + if (dataStr.includes('Arizona') || dataStr.includes('AZ')) { + console.log('Found Arizona references in __NEXT_DATA__'); + // Extract all objects that might be Arizona stores + const findArizonaStores = (obj, path = '') => { + const results = []; + if (!obj || typeof obj !== 'object') + return results; + if (Array.isArray(obj)) { + obj.forEach((item, i) => { + results.push(...findArizonaStores(item, `${path}[${i}]`)); + }); + } + else { + // Check if this object looks like an AZ store + if (obj.state === 'AZ' || obj.state === 'Arizona' || + obj.stateCode === 'AZ' || obj.region === 'Arizona' || + (obj.city && ['Mesa', 'Phoenix', 'Peoria', 'Payson', 'Globe', 'Safford', 'Somerton', 'Prescott Valley'].includes(obj.city))) { + results.push({ path, data: obj }); + } + for (const key of Object.keys(obj)) { + results.push(...findArizonaStores(obj[key], `${path}.${key}`)); + } + } + return results; + }; + const azStores = findArizonaStores(data); + console.log(`Found ${azStores.length} Arizona store objects`); + azStores.forEach(s => { + console.log('\n---'); + console.log('Path:', s.path); + console.log(JSON.stringify(s.data, null, 2)); + }); + } + // Also look for retailer IDs + const retailerMatches = dataStr.match(/"retailerId"\s*:\s*"([a-f0-9-]{36})"/gi); + if (retailerMatches) { + console.log('\n=== RetailerIds in __NEXT_DATA__ ==='); + const uniqueIds = [...new Set(retailerMatches.map(m => { + const match = m.match(/([a-f0-9-]{36})/i); + return match ? match[1] : null; + }).filter(Boolean))]; + uniqueIds.forEach(id => console.log(id)); + } + } + // Try loading a known store URL pattern + const testUrls = [ + 'https://jarscannabis.com/arizona/', + 'https://jarscannabis.com/az/', + 'https://jarscannabis.com/stores/arizona/', + 'https://jarscannabis.com/locations/arizona/', + 'https://jarscannabis.com/shop/arizona/', + 'https://az.jarscannabis.com/', + ]; + console.log('\n=== Testing Arizona URLs ==='); + for (const testUrl of testUrls) { + try { + const response = await page.goto(testUrl, { waitUntil: 'domcontentloaded', timeout: 10000 }); + const status = response?.status(); + console.log(`${testUrl}: ${status}`); + if (status === 200) { + const title = await page.title(); + console.log(` Title: ${title}`); + // If we found a working page, extract store links + const storeLinks = await page.evaluate(() => { + return Array.from(document.querySelectorAll('a')).map(a => ({ + href: a.href, + text: a.textContent?.trim() + })).filter(l => l.href.includes('shop') || l.href.includes('menu')); + }); + if (storeLinks.length > 0) { + console.log(' Store links:'); + storeLinks.forEach(l => console.log(` ${l.text}: ${l.href}`)); + } + } + } + catch (e) { + console.log(`${testUrl}: Error - ${e.message.substring(0, 50)}`); + } + } + console.log('\n=== Captured Retailer IDs from API calls ==='); + const uniqueRetailerIds = [...new Map(capturedRetailerIds.map(r => [r.retailerId, r])).values()]; + uniqueRetailerIds.forEach(r => { + console.log(`${r.retailerId} (from: ${r.url.substring(0, 60)}...)`); + }); + console.log('\n=== All API calls ==='); + allApiCalls.forEach(url => console.log(url.substring(0, 100))); + } + finally { + await browser.close(); + } +} +findJarsAzStores().catch(e => console.error('Error:', e.message)); diff --git a/backend/dist/scripts/platform-id-extractor.js b/backend/dist/scripts/platform-id-extractor.js new file mode 100644 index 00000000..9584d975 --- /dev/null +++ b/backend/dist/scripts/platform-id-extractor.js @@ -0,0 +1,301 @@ +"use strict"; +/** + * Platform ID Extractor - Standalone script for extracting Dutchie platform IDs + * + * This script visits dispensary websites to capture their Dutchie retailerId + * by intercepting network requests to the Dutchie GraphQL API. + * + * It does NOT use the main orchestrator - it's a standalone browser-based tool. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const playwright_1 = require("playwright"); +const pg_1 = require("pg"); +const pool = new pg_1.Pool({ + connectionString: process.env.DATABASE_URL +}); +async function extractPlatformId(browser, dispensary) { + let capturedId = null; + let captureSource = null; + let errorMsg = null; + const context = await browser.newContext({ + userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' + }); + const page = await context.newPage(); + // Patterns to match retailer IDs in various formats + const idPatterns = [ + /["']retailerId["']\s*:\s*["']([a-f0-9]{24})["']/i, + /["']dispensaryId["']\s*:\s*["']([a-f0-9]{24})["']/i, + /retailer["']?\s*:\s*["']([a-f0-9]{24})["']/i, + /dutchie\.com\/embedded-menu\/([a-f0-9]{24})/i, + /dutchie\.com\/dispensary\/([a-f0-9]{24})/i, + /plus\.dutchie\.com\/plus\/([a-f0-9]{24})/i, + /retailerId=([a-f0-9]{24})/i, + /\/([a-f0-9]{24})(?:\/|\?|$)/i, // Generic ID in URL path + ]; + // Intercept network requests + page.on('request', (request) => { + if (capturedId) + return; + const url = request.url(); + if (url.includes('dutchie') || url.includes('api.dutchie')) { + // Check URL for retailer ID + for (const pattern of idPatterns) { + const match = url.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'request_url'; + break; + } + } + // Check POST data + const postData = request.postData(); + if (postData && !capturedId) { + for (const pattern of idPatterns) { + const match = postData.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'request_body'; + break; + } + } + } + } + }); + try { + console.log(`\n[${dispensary.id}] ${dispensary.name}: ${dispensary.website}`); + // Load main page + await page.goto(dispensary.website, { + waitUntil: 'domcontentloaded', + timeout: 25000 + }); + await page.waitForTimeout(2000); + // Check page content + if (!capturedId) { + const content = await page.content(); + for (const pattern of idPatterns) { + const match = content.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'page_content'; + break; + } + } + } + // Check __NEXT_DATA__ + if (!capturedId) { + const nextData = await page.evaluate(() => { + const el = document.getElementById('__NEXT_DATA__'); + return el?.textContent || null; + }); + if (nextData) { + for (const pattern of idPatterns) { + const match = nextData.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = '__NEXT_DATA__'; + break; + } + } + } + } + // Check iframes + if (!capturedId) { + const iframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of iframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + captureSource = 'iframe_src'; + break; + } + } + } + } + // Check scripts + if (!capturedId) { + const scripts = await page.evaluate(() => { + return Array.from(document.querySelectorAll('script')) + .map(s => s.src || s.innerHTML?.substring(0, 1000)) + .filter(Boolean); + }); + for (const script of scripts) { + if (script && (script.includes('dutchie') || script.includes('retailerId'))) { + for (const pattern of idPatterns) { + const match = script.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'script'; + break; + } + } + if (capturedId) + break; + } + } + } + // Try navigating to menu/shop page + if (!capturedId) { + const menuLink = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + for (const link of links) { + const href = link.href?.toLowerCase() || ''; + const text = link.textContent?.toLowerCase() || ''; + if (href.includes('menu') || href.includes('shop') || href.includes('order') || + text.includes('menu') || text.includes('shop') || text.includes('order')) { + return link.href; + } + } + return null; + }); + if (menuLink && !menuLink.startsWith('javascript:')) { + try { + console.log(` -> Following menu link: ${menuLink.substring(0, 60)}...`); + await page.goto(menuLink, { waitUntil: 'domcontentloaded', timeout: 20000 }); + await page.waitForTimeout(3000); + // Recheck all sources on new page + const newContent = await page.content(); + for (const pattern of idPatterns) { + const match = newContent.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'menu_page_content'; + break; + } + } + // Check iframes on new page + if (!capturedId) { + const newIframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of newIframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + captureSource = 'menu_page_iframe'; + break; + } + } + } + } + } + catch (navError) { + // Menu navigation failed, continue + } + } + } + // Final wait for async content + if (!capturedId) { + await page.waitForTimeout(3000); + // Final iframe check + const finalIframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of finalIframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + captureSource = 'delayed_iframe'; + break; + } + } + } + } + if (capturedId) { + console.log(` ✓ Found: ${capturedId} (${captureSource})`); + } + else { + console.log(` ✗ Not found`); + } + } + catch (e) { + errorMsg = e.message.substring(0, 100); + console.log(` ✗ Error: ${errorMsg}`); + } + finally { + await context.close(); + } + return { + id: dispensary.id, + name: dispensary.name, + website: dispensary.website, + platformId: capturedId, + source: captureSource, + error: errorMsg + }; +} +async function main() { + // Get specific dispensary ID from command line, or process all missing + const targetId = process.argv[2] ? parseInt(process.argv[2], 10) : null; + let query; + let params = []; + if (targetId) { + query = ` + SELECT id, name, website + FROM dispensaries + WHERE id = $1 + AND website IS NOT NULL AND website != '' + `; + params = [targetId]; + } + else { + query = ` + SELECT id, name, website + FROM dispensaries + WHERE state = 'AZ' + AND menu_type = 'dutchie' + AND (platform_dispensary_id IS NULL OR platform_dispensary_id = '') + AND website IS NOT NULL AND website != '' + ORDER BY name + `; + } + const result = await pool.query(query, params); + if (result.rows.length === 0) { + console.log('No dispensaries to process'); + await pool.end(); + return; + } + console.log(`\n=== Platform ID Extractor ===`); + console.log(`Processing ${result.rows.length} dispensaries...\n`); + const browser = await playwright_1.chromium.launch({ + headless: true, + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + const results = []; + for (const dispensary of result.rows) { + const extractionResult = await extractPlatformId(browser, dispensary); + results.push(extractionResult); + // Update database immediately if found + if (extractionResult.platformId) { + await pool.query('UPDATE dispensaries SET platform_dispensary_id = $1 WHERE id = $2', [extractionResult.platformId, extractionResult.id]); + } + } + await browser.close(); + // Summary + console.log('\n' + '='.repeat(60)); + console.log('SUMMARY'); + console.log('='.repeat(60)); + const found = results.filter(r => r.platformId); + const notFound = results.filter(r => !r.platformId); + console.log(`\nFound: ${found.length}/${results.length}`); + if (found.length > 0) { + console.log('\nSuccessful extractions:'); + found.forEach(r => console.log(` [${r.id}] ${r.name} -> ${r.platformId} (${r.source})`)); + } + if (notFound.length > 0) { + console.log(`\nNot found: ${notFound.length}`); + notFound.forEach(r => { + const reason = r.error || 'No Dutchie ID detected'; + console.log(` [${r.id}] ${r.name}: ${reason}`); + }); + } + await pool.end(); +} +main().catch(e => { + console.error('Fatal error:', e); + process.exit(1); +}); diff --git a/backend/dist/scripts/test-jane-scraper.js b/backend/dist/scripts/test-jane-scraper.js new file mode 100644 index 00000000..3477a724 --- /dev/null +++ b/backend/dist/scripts/test-jane-scraper.js @@ -0,0 +1,255 @@ +"use strict"; +/** + * Test script for iHeartJane menu scraping via Playwright + * Intercepts API/Algolia calls made by the browser + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const playwright_1 = require("playwright"); +async function scrapeJaneMenu(urlOrStoreId) { + // Handle either a full URL or just a store ID + const menuUrl = urlOrStoreId.startsWith('http') + ? urlOrStoreId + : `https://www.iheartjane.com/embed/stores/${urlOrStoreId}/menu`; + console.log(`Starting Playwright scrape for iHeartJane: ${menuUrl}`); + const browser = await playwright_1.chromium.launch({ + headless: true, + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-blink-features=AutomationControlled' + ] + }); + const context = await browser.newContext({ + userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + viewport: { width: 1920, height: 1080 }, + locale: 'en-US', + timezoneId: 'America/Chicago' + }); + // Add stealth scripts to avoid detection + await context.addInitScript(() => { + Object.defineProperty(navigator, 'webdriver', { get: () => false }); + window.chrome = { runtime: {} }; + }); + const page = await context.newPage(); + const products = []; + const apiResponses = []; + const capturedCredentials = {}; + // Intercept ALL network requests to capture API/Algolia data and credentials + page.on('request', (request) => { + const url = request.url(); + const headers = request.headers(); + // Capture Algolia credentials from request headers + if (url.includes('algolia')) { + const appId = headers['x-algolia-application-id']; + const apiKey = headers['x-algolia-api-key']; + if (appId && apiKey) { + capturedCredentials.algolia = { appId, apiKey }; + console.log(`Captured Algolia credentials: App=${appId}, Key=${apiKey.substring(0, 10)}...`); + } + } + }); + page.on('response', async (response) => { + const url = response.url(); + // Capture Algolia search results + if (url.includes('algolia.net') || url.includes('algolianet.com')) { + try { + const data = await response.json(); + if (data.results && data.results[0] && data.results[0].hits) { + console.log(`Captured ${data.results[0].hits.length} products from Algolia`); + apiResponses.push({ type: 'algolia', data: data.results[0] }); + } + } + catch (e) { + // Not JSON or error parsing + } + } + // Capture Jane API responses + if (url.includes('api.iheartjane.com') && url.includes('products')) { + try { + const data = await response.json(); + console.log(`Captured Jane API response: ${url}`); + apiResponses.push({ type: 'jane-api', url, data }); + } + catch (e) { + // Not JSON or error parsing + } + } + }); + try { + console.log(`Navigating to: ${menuUrl}`); + await page.goto(menuUrl, { + waitUntil: 'domcontentloaded', + timeout: 60000 + }); + // Wait for page to settle + await page.waitForTimeout(2000); + // Handle age gate - use Playwright locator with force click + console.log('Looking for age gate...'); + try { + let clicked = false; + // Method 1: Use Playwright locator with exact text match + try { + const yesButton = page.locator('button:has-text("Yes")').first(); + await yesButton.waitFor({ state: 'visible', timeout: 5000 }); + await yesButton.click({ force: true }); + clicked = true; + console.log('Clicked age gate via Playwright locator'); + await page.waitForTimeout(5000); + } + catch (e) { + console.log('Playwright locator failed:', e.message); + } + // Method 2: Try clicking by visible bounding box + if (!clicked) { + try { + const box = await page.locator('button:has-text("Yes")').first().boundingBox(); + if (box) { + await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2); + clicked = true; + console.log(`Clicked age gate at coordinates: ${box.x + box.width / 2}, ${box.y + box.height / 2}`); + await page.waitForTimeout(5000); + } + } + catch (e) { + console.log('Bounding box click failed'); + } + } + // Method 3: Try JavaScript click + if (!clicked) { + const jsClickResult = await page.evaluate(() => { + const buttons = Array.from(document.querySelectorAll('button')); + for (const btn of buttons) { + if (btn.textContent?.includes('Yes')) { + btn.click(); + return { success: true, buttonText: btn.textContent }; + } + } + return { success: false }; + }); + if (jsClickResult.success) { + clicked = true; + console.log(`Clicked via JS: ${jsClickResult.buttonText}`); + await page.waitForTimeout(5000); + } + } + // Method 4: Click element containing "Yes" with dispatchEvent + if (!clicked) { + const dispatchResult = await page.evaluate(() => { + const buttons = Array.from(document.querySelectorAll('button')); + for (const btn of buttons) { + if (btn.textContent?.includes('Yes')) { + btn.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true })); + return true; + } + } + return false; + }); + if (dispatchResult) { + clicked = true; + console.log('Clicked via dispatchEvent'); + await page.waitForTimeout(5000); + } + } + // Log button info for debugging + const buttonInfo = await page.evaluate(() => { + const buttons = Array.from(document.querySelectorAll('button')); + return buttons.map(b => ({ + text: b.textContent?.trim(), + visible: b.offsetParent !== null, + rect: b.getBoundingClientRect() + })); + }); + console.log('Buttons found:', JSON.stringify(buttonInfo, null, 2)); + } + catch (e) { + console.log('Age gate handling error:', e); + } + // Wait for content to load after age gate + await page.waitForTimeout(3000); + // Try to scroll to trigger more product loads + console.log('Scrolling to load more products...'); + for (let i = 0; i < 3; i++) { + await page.evaluate(() => window.scrollBy(0, 1000)); + await page.waitForTimeout(1000); + } + // Extract products from the page DOM as backup + const domProducts = await page.evaluate(() => { + const items = []; + // Try various selectors that Jane might use + const productCards = document.querySelectorAll('[data-testid*="product"], [class*="ProductCard"], [class*="product-card"], .product-tile'); + productCards.forEach((card) => { + const name = card.querySelector('[class*="name"], [class*="title"], h3, h4')?.textContent?.trim(); + const brand = card.querySelector('[class*="brand"]')?.textContent?.trim(); + const price = card.querySelector('[class*="price"]')?.textContent?.trim(); + const image = card.querySelector('img')?.getAttribute('src'); + if (name) { + items.push({ name, brand, price, image, source: 'dom' }); + } + }); + return items; + }); + console.log(`Extracted ${domProducts.length} products from DOM`); + // Check for __NEXT_DATA__ or similar embedded data + const embeddedData = await page.evaluate(() => { + // Check for Next.js data + const nextData = document.getElementById('__NEXT_DATA__'); + if (nextData) { + return { type: 'next', data: JSON.parse(nextData.textContent || '{}') }; + } + // Check for any window-level product data + const win = window; + if (win.__INITIAL_STATE__) + return { type: 'initial_state', data: win.__INITIAL_STATE__ }; + if (win.__PRELOADED_STATE__) + return { type: 'preloaded', data: win.__PRELOADED_STATE__ }; + if (win.products) + return { type: 'products', data: win.products }; + return null; + }); + if (embeddedData) { + console.log(`Found embedded data: ${embeddedData.type}`); + apiResponses.push(embeddedData); + } + // Take a screenshot for debugging + const screenshotPath = `/tmp/jane-scrape-${Date.now()}.png`; + await page.screenshot({ path: screenshotPath, fullPage: true }); + console.log(`Screenshot saved to ${screenshotPath}`); + // Process captured API responses + console.log('\n=== API Responses Summary ==='); + for (const resp of apiResponses) { + console.log(`Type: ${resp.type}`); + if (resp.type === 'algolia' && resp.data.hits) { + console.log(` Hits: ${resp.data.hits.length}`); + console.log(` Total: ${resp.data.nbHits}`); + if (resp.data.hits[0]) { + console.log(` Sample product:`, JSON.stringify(resp.data.hits[0], null, 2).substring(0, 1000)); + } + } + } + console.log('\n=== DOM Products Sample ==='); + console.log(JSON.stringify(domProducts.slice(0, 3), null, 2)); + console.log('\n=== Captured Credentials ==='); + console.log(JSON.stringify(capturedCredentials, null, 2)); + return { + apiResponses, + domProducts, + embeddedData, + capturedCredentials + }; + } + finally { + await browser.close(); + } +} +// Main execution +const urlOrStoreId = process.argv[2] || 'https://iheartjane.com/aly2djS2yXoTGnR0/DBeqE6HSSwijog9l'; // Default to The Flower Shop Az +scrapeJaneMenu(urlOrStoreId) + .then((result) => { + console.log('\n=== Scrape Complete ==='); + console.log(`Total API responses captured: ${result.apiResponses.length}`); + console.log(`Total DOM products: ${result.domProducts.length}`); +}) + .catch((err) => { + console.error('Scrape failed:', err); + process.exit(1); +}); diff --git a/backend/dist/services/category-crawler-jobs.js b/backend/dist/services/category-crawler-jobs.js index a646a3de..b6f0d5d9 100644 --- a/backend/dist/services/category-crawler-jobs.js +++ b/backend/dist/services/category-crawler-jobs.js @@ -29,15 +29,15 @@ exports.runAllCategoryProductionCrawls = runAllCategoryProductionCrawls; exports.runAllCategorySandboxCrawls = runAllCategorySandboxCrawls; const migrate_1 = require("../db/migrate"); const crawler_logger_1 = require("./crawler-logger"); -const intelligence_detector_1 = require("./intelligence-detector"); -const scraper_v2_1 = require("../scraper-v2"); +// Note: scrapeStore from scraper-v2 is NOT used for Dutchie - we use GraphQL API directly +const product_crawler_1 = require("../dutchie-az/services/product-crawler"); const puppeteer_1 = __importDefault(require("puppeteer")); const WORKER_ID = `crawler-${process.pid}-${Date.now()}`; // ======================================== // Helper Functions // ======================================== async function getDispensaryWithCategories(dispensaryId) { - const result = await migrate_1.pool.query(`SELECT id, name, website, menu_url, + const result = await migrate_1.pool.query(`SELECT id, name, website, menu_url, menu_type, platform_dispensary_id, product_provider, product_confidence, product_crawler_mode, last_product_scan_at, specials_provider, specials_confidence, specials_crawler_mode, last_specials_scan_at, brand_provider, brand_confidence, brand_crawler_mode, last_brand_scan_at, @@ -118,7 +118,11 @@ async function getCrawlerTemplate(provider, category, environment) { // ======================================== /** * CrawlProductsJob - Production product crawling - * Only runs for Dutchie dispensaries in production mode + * Uses Dutchie GraphQL API directly (NOT browser-based scraping) + * + * IMPORTANT: This function calls crawlDispensaryProducts() from dutchie-az + * which uses the GraphQL API. The GraphQL response includes categories directly, + * so no browser-based category discovery is needed. */ async function runCrawlProductsJob(dispensaryId) { const category = 'product'; @@ -127,96 +131,101 @@ async function runCrawlProductsJob(dispensaryId) { if (!dispensary) { return { success: false, category, message: `Dispensary ${dispensaryId} not found` }; } - // Verify production eligibility - if (dispensary.product_provider !== 'dutchie') { + // Verify production eligibility - accept either: + // 1. product_provider = 'dutchie' with product_crawler_mode = 'production', OR + // 2. menu_type = 'dutchie' with platform_dispensary_id (known Dutchie store) + const isDutchieProduction = (dispensary.product_provider === 'dutchie' && dispensary.product_crawler_mode === 'production') || + (dispensary.menu_type === 'dutchie' && dispensary.platform_dispensary_id); + if (!isDutchieProduction) { return { success: false, category, message: 'Not a Dutchie dispensary for products' }; } - if (dispensary.product_crawler_mode !== 'production') { - return { success: false, category, message: 'Products not in production mode' }; + if (!dispensary.platform_dispensary_id) { + return { success: false, category, message: 'Missing platform_dispensary_id for GraphQL crawl' }; } - const storeId = await getStoreIdForDispensary(dispensaryId); - if (!storeId) { - return { success: false, category, message: 'No linked store found for Dutchie crawl' }; - } - let browser = null; // Log job start crawler_logger_1.crawlerLogger.jobStarted({ job_id: 0, // Category jobs don't have traditional job IDs - store_id: storeId, + store_id: dispensaryId, // Use dispensary ID since we're not using stores table store_name: dispensary.name, job_type: 'CrawlProductsJob', trigger_type: 'category_crawl', provider: 'dutchie', }); try { - // Run the existing Dutchie scraper - await (0, scraper_v2_1.scrapeStore)(storeId, 3); + // Build Dispensary object for GraphQL crawler + // The crawler uses platformDispensaryId to call the Dutchie GraphQL API directly + const dispensaryForCrawl = { + id: dispensary.id, + platform: 'dutchie', + name: dispensary.name, + slug: dispensary.name.toLowerCase().replace(/[^a-z0-9]+/g, '-'), + city: '', + state: 'AZ', + menuType: dispensary.menu_type || 'dutchie', + menuUrl: dispensary.menu_url || undefined, + platformDispensaryId: dispensary.platform_dispensary_id || undefined, + website: dispensary.website || undefined, + createdAt: new Date(), + updatedAt: new Date(), + }; + // Use GraphQL crawler directly - this calls the Dutchie API, not browser scraping + const crawlResult = await (0, product_crawler_1.crawlDispensaryProducts)(dispensaryForCrawl, 'rec', // Default to recreational pricing + { useBothModes: true, downloadImages: true }); // Update scan time await updateCategoryScanTime(dispensaryId, category); const durationMs = Date.now() - startTime; - // Log job completion with summary - crawler_logger_1.crawlerLogger.jobCompleted({ - job_id: 0, - store_id: storeId, - store_name: dispensary.name, - duration_ms: durationMs, - products_found: 0, // Not tracked at this level - products_new: 0, - products_updated: 0, - provider: 'dutchie', - }); - return { - success: true, - category, - message: 'Product crawl completed successfully', - data: { storeId, provider: 'dutchie', durationMs }, - }; + if (crawlResult.success) { + // Log job completion with summary + crawler_logger_1.crawlerLogger.jobCompleted({ + job_id: 0, + store_id: dispensaryId, + store_name: dispensary.name, + duration_ms: durationMs, + products_found: crawlResult.productsFound, + products_new: 0, // GraphQL crawler doesn't track new vs updated separately + products_updated: crawlResult.productsUpserted, + provider: 'dutchie', + }); + return { + success: true, + category, + message: `GraphQL crawl completed: ${crawlResult.productsUpserted} products, ${crawlResult.snapshotsCreated} snapshots`, + data: { + dispensaryId, + provider: 'dutchie', + durationMs, + productsFound: crawlResult.productsFound, + productsUpserted: crawlResult.productsUpserted, + snapshotsCreated: crawlResult.snapshotsCreated, + modeAProducts: crawlResult.modeAProducts, + modeBProducts: crawlResult.modeBProducts, + }, + }; + } + else { + // Log job failure + crawler_logger_1.crawlerLogger.jobFailed({ + job_id: 0, + store_id: dispensaryId, + store_name: dispensary.name, + duration_ms: durationMs, + error_message: crawlResult.errorMessage || 'Unknown error', + provider: 'dutchie', + }); + return { success: false, category, message: crawlResult.errorMessage || 'GraphQL crawl failed' }; + } } catch (error) { const durationMs = Date.now() - startTime; // Log job failure crawler_logger_1.crawlerLogger.jobFailed({ job_id: 0, - store_id: storeId, + store_id: dispensaryId, store_name: dispensary.name, duration_ms: durationMs, error_message: error.message, provider: 'dutchie', }); - // Check for provider change - try { - browser = await puppeteer_1.default.launch({ headless: true, args: ['--no-sandbox'] }); - const page = await browser.newPage(); - const url = dispensary.menu_url || dispensary.website; - if (url) { - await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 }); - const changeResult = await (0, intelligence_detector_1.detectCategoryProviderChange)(page, category, 'dutchie'); - if (changeResult.changed) { - // Provider changed - move ONLY products to sandbox - await (0, intelligence_detector_1.moveCategoryToSandbox)(dispensaryId, category, `Provider changed from dutchie to ${changeResult.newProvider}`); - // Create sandbox entry for re-analysis - const sandboxId = await createCategorySandboxEntry(dispensaryId, category, changeResult.newProvider || 'unknown', null, { providerChangeDetected: true, previousProvider: 'dutchie' }); - await createCategorySandboxJob(dispensaryId, sandboxId, category, null, 'detection'); - // Log provider change - crawler_logger_1.crawlerLogger.providerChanged({ - dispensary_id: dispensaryId, - dispensary_name: dispensary.name, - old_provider: 'dutchie', - new_provider: changeResult.newProvider || 'unknown', - old_confidence: dispensary.product_confidence, - new_confidence: 0, - category: 'product', - }); - } - } - } - catch { - // Ignore detection errors - } - finally { - if (browser) - await browser.close(); - } return { success: false, category, message: error.message }; } } diff --git a/backend/dist/services/dispensary-orchestrator.js b/backend/dist/services/dispensary-orchestrator.js index 0917c2b1..69b92245 100644 --- a/backend/dist/services/dispensary-orchestrator.js +++ b/backend/dist/services/dispensary-orchestrator.js @@ -94,9 +94,15 @@ async function runDispensaryOrchestrator(dispensaryId, scheduleId) { } } // 3. Determine crawl type and run - const provider = dispensary.product_provider; + // Use product_provider if available, otherwise fall back to menu_type + const provider = dispensary.product_provider || dispensary.menu_type; const mode = dispensary.product_crawler_mode; - if (provider === 'dutchie' && mode === 'production') { + // Run production Dutchie crawl if: + // 1. product_provider is 'dutchie' with production mode, OR + // 2. menu_type is 'dutchie' with platform_dispensary_id (known Dutchie store) + const isDutchieProduction = (provider === 'dutchie' && mode === 'production') || + (dispensary.menu_type === 'dutchie' && dispensary.platform_dispensary_id); + if (isDutchieProduction) { // Production Dutchie crawl await updateScheduleStatus(dispensaryId, 'running', 'Running Dutchie production crawl...', null, runId); try { @@ -202,13 +208,18 @@ async function runDispensaryOrchestrator(dispensaryId, scheduleId) { // Helper Functions // ======================================== async function getDispensaryInfo(dispensaryId) { - const result = await migrate_1.pool.query(`SELECT id, name, city, website, menu_url, + const result = await migrate_1.pool.query(`SELECT id, name, city, website, menu_url, menu_type, platform_dispensary_id, product_provider, product_confidence, product_crawler_mode, last_product_scan_at FROM dispensaries WHERE id = $1`, [dispensaryId]); return result.rows[0] || null; } async function checkNeedsDetection(dispensary) { + // If menu_type is already 'dutchie' and we have platform_dispensary_id, skip detection entirely + // This avoids wasteful detection timeouts for known Dutchie stores + if (dispensary.menu_type === 'dutchie' && dispensary.platform_dispensary_id) { + return false; + } // No provider = definitely needs detection if (!dispensary.product_provider) return true; diff --git a/backend/public/downloads/cb-wpmenu-1.5.1.zip b/backend/public/downloads/cb-wpmenu-1.5.1.zip new file mode 100644 index 00000000..91668f92 Binary files /dev/null and b/backend/public/downloads/cb-wpmenu-1.5.1.zip differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859-medium.webp new file mode 100644 index 00000000..416298d4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859-thumb.webp new file mode 100644 index 00000000..cc3d9f5a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859.webp new file mode 100644 index 00000000..7f576070 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3515f-34aff859.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4-medium.webp new file mode 100644 index 00000000..c6454522 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4-thumb.webp new file mode 100644 index 00000000..95478867 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4.webp new file mode 100644 index 00000000..68e92de5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35160-6ebcbce4.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35161-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976-medium.webp new file mode 100644 index 00000000..ea38ec78 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976-thumb.webp new file mode 100644 index 00000000..1e593459 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976.webp new file mode 100644 index 00000000..cd077a6e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35162-a993b976.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35-medium.webp new file mode 100644 index 00000000..d8654f98 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35-thumb.webp new file mode 100644 index 00000000..16fb55e9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35.webp new file mode 100644 index 00000000..31ed7b91 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35164-b6547a35.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162-medium.webp new file mode 100644 index 00000000..5f013bea Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162-thumb.webp new file mode 100644 index 00000000..2e2facde Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162.webp new file mode 100644 index 00000000..5fae6a84 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35165-5b846162.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35167-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35169-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516b-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516c-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516d-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3516e-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35172-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b-medium.webp new file mode 100644 index 00000000..45b1970b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b-thumb.webp new file mode 100644 index 00000000..784cdfd5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b.webp new file mode 100644 index 00000000..d6ee1908 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35177-3f6f9c4b.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765-medium.webp new file mode 100644 index 00000000..d3c4b6df Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765-thumb.webp new file mode 100644 index 00000000..f2d49b63 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765.webp new file mode 100644 index 00000000..ba4aa729 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35187-e20f6765.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b-medium.webp new file mode 100644 index 00000000..7c37218f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b-thumb.webp new file mode 100644 index 00000000..d91f739a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b.webp new file mode 100644 index 00000000..5cf3f891 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35188-3ebacd4b.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5-medium.webp new file mode 100644 index 00000000..6e5570d4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5-thumb.webp new file mode 100644 index 00000000..7b19ae7f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5.webp new file mode 100644 index 00000000..ebcf02eb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35189-8e4e80d5.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519c-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519d-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3519e-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351a0-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62-medium.webp new file mode 100644 index 00000000..f1473c9a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62-thumb.webp new file mode 100644 index 00000000..4f071269 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62.webp new file mode 100644 index 00000000..31c5cddb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b3-f47c5b62.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06-medium.webp new file mode 100644 index 00000000..23e43bdd Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06-thumb.webp new file mode 100644 index 00000000..227dafa1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06.webp new file mode 100644 index 00000000..f763456a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b4-db976d06.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa-medium.webp new file mode 100644 index 00000000..b335ee10 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa-thumb.webp new file mode 100644 index 00000000..520cde73 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa.webp new file mode 100644 index 00000000..e7c20882 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b6-664a0caa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1-medium.webp new file mode 100644 index 00000000..ec2ba09e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1-thumb.webp new file mode 100644 index 00000000..8d8a08c2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1.webp new file mode 100644 index 00000000..745f9a7b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351b9-ef3489b1.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2-medium.webp new file mode 100644 index 00000000..2c25a52f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2-thumb.webp new file mode 100644 index 00000000..c573e940 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2.webp new file mode 100644 index 00000000..2d63ceb2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351bb-833632c2.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7-medium.webp new file mode 100644 index 00000000..12e36868 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7-thumb.webp new file mode 100644 index 00000000..166989b3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7.webp new file mode 100644 index 00000000..ce74d24d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351be-536351e7.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c1-701c49c6.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140-medium.webp new file mode 100644 index 00000000..644ce859 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140-thumb.webp new file mode 100644 index 00000000..2710104e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140.webp new file mode 100644 index 00000000..1316eb7c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351c7-b76e6140.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62-medium.webp new file mode 100644 index 00000000..f1473c9a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62-thumb.webp new file mode 100644 index 00000000..4f071269 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62.webp new file mode 100644 index 00000000..31c5cddb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351cb-f47c5b62.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139-medium.webp new file mode 100644 index 00000000..8a80107e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139-thumb.webp new file mode 100644 index 00000000..acb5a8d8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139.webp new file mode 100644 index 00000000..ca3e9fce Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d4-1fc7e139.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f-medium.webp new file mode 100644 index 00000000..aa6301aa Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f-thumb.webp new file mode 100644 index 00000000..522de3b8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f.webp new file mode 100644 index 00000000..ef7f72bc Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351d8-914c965f.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139-medium.webp new file mode 100644 index 00000000..8a80107e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139-thumb.webp new file mode 100644 index 00000000..acb5a8d8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139.webp new file mode 100644 index 00000000..ca3e9fce Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351da-1fc7e139.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496-medium.webp new file mode 100644 index 00000000..1221706f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496-thumb.webp new file mode 100644 index 00000000..1673c69a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496.webp new file mode 100644 index 00000000..b7f1bab3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351db-00522496.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca-medium.webp new file mode 100644 index 00000000..b31e4344 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca-thumb.webp new file mode 100644 index 00000000..a08bf268 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca.webp new file mode 100644 index 00000000..774af23e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351de-f8538aca.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e6-2b235e95.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d-medium.webp new file mode 100644 index 00000000..e66f07e5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d-thumb.webp new file mode 100644 index 00000000..c8e7df57 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d.webp new file mode 100644 index 00000000..f03ac909 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351e8-a60a737d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d-medium.webp new file mode 100644 index 00000000..e66f07e5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d-thumb.webp new file mode 100644 index 00000000..c8e7df57 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d.webp new file mode 100644 index 00000000..f03ac909 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351eb-a60a737d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f0-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48-medium.webp new file mode 100644 index 00000000..74ec0ce9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48-thumb.webp new file mode 100644 index 00000000..da38f697 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48.webp new file mode 100644 index 00000000..ee739cbb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f1-4786cd48.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d-medium.webp new file mode 100644 index 00000000..2b96926f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d-thumb.webp new file mode 100644 index 00000000..6c9614ab Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d.webp new file mode 100644 index 00000000..58ea75b6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f4-33b40b3d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef-medium.webp new file mode 100644 index 00000000..6d8d210a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef-thumb.webp new file mode 100644 index 00000000..5e37a07e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef.webp new file mode 100644 index 00000000..cf44eaae Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f5-9a4437ef.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae-medium.webp new file mode 100644 index 00000000..adbc09c2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae-thumb.webp new file mode 100644 index 00000000..c6a914a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae.webp new file mode 100644 index 00000000..6154a653 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f6-5f923eae.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712-medium.webp new file mode 100644 index 00000000..e16432d4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712-thumb.webp new file mode 100644 index 00000000..76094bc2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712.webp new file mode 100644 index 00000000..167e5588 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f7-66234712.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19-medium.webp new file mode 100644 index 00000000..905fb61c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19-thumb.webp new file mode 100644 index 00000000..20804da6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19.webp new file mode 100644 index 00000000..e67c21f9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f8-39266f19.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9-medium.webp new file mode 100644 index 00000000..f92e42c7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9-thumb.webp new file mode 100644 index 00000000..e7879e94 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9.webp new file mode 100644 index 00000000..a715f5aa Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351f9-a83479f9.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77-medium.webp new file mode 100644 index 00000000..630d6041 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77-thumb.webp new file mode 100644 index 00000000..f6b5aaac Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77.webp new file mode 100644 index 00000000..4b3d3ea4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351fd-29ca0c77.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba-medium.webp new file mode 100644 index 00000000..b2d128d4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba-thumb.webp new file mode 100644 index 00000000..8e836cc5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba.webp new file mode 100644 index 00000000..9bbfc778 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f351ff-33d446ba.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b-medium.webp new file mode 100644 index 00000000..b61ace67 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b-thumb.webp new file mode 100644 index 00000000..b1895468 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b.webp new file mode 100644 index 00000000..da7301b6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35203-5b90f45b.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4-medium.webp new file mode 100644 index 00000000..b991e2f1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4-thumb.webp new file mode 100644 index 00000000..af928ff6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4.webp new file mode 100644 index 00000000..ae2e2e12 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35207-35a376b4.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2-medium.webp new file mode 100644 index 00000000..c24fc097 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2-thumb.webp new file mode 100644 index 00000000..df2ad4f8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2.webp new file mode 100644 index 00000000..8642bad2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35208-39f85ef2.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c-medium.webp new file mode 100644 index 00000000..f47c1678 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c-thumb.webp new file mode 100644 index 00000000..ff3e733a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c.webp new file mode 100644 index 00000000..25a8d29f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520d-405a3e7c.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0-medium.webp new file mode 100644 index 00000000..308cc2e4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0-thumb.webp new file mode 100644 index 00000000..9808a06c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0.webp new file mode 100644 index 00000000..cd643344 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520e-dcf251c0.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d-medium.webp new file mode 100644 index 00000000..e66f07e5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d-thumb.webp new file mode 100644 index 00000000..c8e7df57 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d.webp new file mode 100644 index 00000000..f03ac909 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3520f-a60a737d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139-medium.webp new file mode 100644 index 00000000..8a80107e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139-thumb.webp new file mode 100644 index 00000000..acb5a8d8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139.webp new file mode 100644 index 00000000..ca3e9fce Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35211-1fc7e139.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba-medium.webp new file mode 100644 index 00000000..b2d128d4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba-thumb.webp new file mode 100644 index 00000000..8e836cc5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba.webp new file mode 100644 index 00000000..9bbfc778 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35213-33d446ba.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7-medium.webp new file mode 100644 index 00000000..481486fe Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7-thumb.webp new file mode 100644 index 00000000..5161d8bc Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7.webp new file mode 100644 index 00000000..0248b999 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35214-f136b2b7.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5-medium.webp new file mode 100644 index 00000000..3862825e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5-thumb.webp new file mode 100644 index 00000000..a6dd3c2f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5.webp new file mode 100644 index 00000000..5c9ea60f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35216-425804e5.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c-medium.webp new file mode 100644 index 00000000..26c981a1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c-thumb.webp new file mode 100644 index 00000000..9dcb7147 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c.webp new file mode 100644 index 00000000..ed83bbf0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35217-6598d90c.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0-medium.webp new file mode 100644 index 00000000..deba59d0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0-thumb.webp new file mode 100644 index 00000000..9a6c3948 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0.webp new file mode 100644 index 00000000..a7e2eb27 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35218-673e89e0.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521a-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521b-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322-medium.webp new file mode 100644 index 00000000..eacaa463 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322-thumb.webp new file mode 100644 index 00000000..66060cfa Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322.webp new file mode 100644 index 00000000..a5be98f8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521c-62ed5322.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a-medium.webp new file mode 100644 index 00000000..5fa41813 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a-thumb.webp new file mode 100644 index 00000000..49e8d3c8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a.webp new file mode 100644 index 00000000..fd007905 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3521e-f764f74a.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba-medium.webp new file mode 100644 index 00000000..b2d128d4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba-thumb.webp new file mode 100644 index 00000000..8e836cc5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba.webp new file mode 100644 index 00000000..9bbfc778 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35220-33d446ba.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66-medium.webp new file mode 100644 index 00000000..ece692da Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66-thumb.webp new file mode 100644 index 00000000..f84fbde4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66.webp new file mode 100644 index 00000000..06b53da5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35221-b4dfdc66.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39-medium.webp new file mode 100644 index 00000000..4d12c14b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39-thumb.webp new file mode 100644 index 00000000..67f9de0f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39.webp new file mode 100644 index 00000000..ed70a045 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35224-908cda39.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598-medium.webp new file mode 100644 index 00000000..11c7435e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598-thumb.webp new file mode 100644 index 00000000..6cd34ae1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598.webp new file mode 100644 index 00000000..4698218f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35225-12852598.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39-medium.webp new file mode 100644 index 00000000..4d12c14b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39-thumb.webp new file mode 100644 index 00000000..67f9de0f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39.webp new file mode 100644 index 00000000..ed70a045 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522a-908cda39.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b-medium.webp new file mode 100644 index 00000000..5acc83eb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b-thumb.webp new file mode 100644 index 00000000..b2d82a21 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b.webp new file mode 100644 index 00000000..29cfaf80 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522c-28023b6b.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522d-2b235e95.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f-medium.webp new file mode 100644 index 00000000..97806417 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f-thumb.webp new file mode 100644 index 00000000..dc730719 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f.webp new file mode 100644 index 00000000..a7b62337 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3522e-b62f668f.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39-medium.webp new file mode 100644 index 00000000..4d12c14b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39-thumb.webp new file mode 100644 index 00000000..67f9de0f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39.webp new file mode 100644 index 00000000..ed70a045 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35231-908cda39.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa-medium.webp new file mode 100644 index 00000000..b335ee10 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa-thumb.webp new file mode 100644 index 00000000..520cde73 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa.webp new file mode 100644 index 00000000..e7c20882 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35235-664a0caa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d-medium.webp new file mode 100644 index 00000000..f8fe9ba1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d-thumb.webp new file mode 100644 index 00000000..9de772c7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d.webp new file mode 100644 index 00000000..f4838a2c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35239-15afe53d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01-medium.webp new file mode 100644 index 00000000..843d32f0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01-thumb.webp new file mode 100644 index 00000000..650d9e40 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01.webp new file mode 100644 index 00000000..49ece2ef Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35241-3ff96d01.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39-medium.webp new file mode 100644 index 00000000..4d12c14b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39-thumb.webp new file mode 100644 index 00000000..67f9de0f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39.webp new file mode 100644 index 00000000..ed70a045 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35242-908cda39.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d-medium.webp new file mode 100644 index 00000000..e66f07e5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d-thumb.webp new file mode 100644 index 00000000..c8e7df57 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d.webp new file mode 100644 index 00000000..f03ac909 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35245-a60a737d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c-medium.webp new file mode 100644 index 00000000..1413b5a1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c-thumb.webp new file mode 100644 index 00000000..0fb7fa40 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c.webp new file mode 100644 index 00000000..69d58d53 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35246-01b8dc8c.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff-medium.webp new file mode 100644 index 00000000..917ab523 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff-thumb.webp new file mode 100644 index 00000000..f45bb96a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff.webp new file mode 100644 index 00000000..e6228642 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35248-cd8661ff.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8-medium.webp new file mode 100644 index 00000000..96e73f21 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8-thumb.webp new file mode 100644 index 00000000..daa06813 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8.webp new file mode 100644 index 00000000..298e83d9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35250-fbe4d8c8.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046-medium.webp new file mode 100644 index 00000000..9c4e4405 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046-thumb.webp new file mode 100644 index 00000000..a29e53f3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046.webp new file mode 100644 index 00000000..bf9f7ea5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35251-d92fb046.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4-medium.webp new file mode 100644 index 00000000..f8255ba4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4-thumb.webp new file mode 100644 index 00000000..36f1b4ea Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4.webp new file mode 100644 index 00000000..eb4e32a7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35255-f3b605c4.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf-medium.webp new file mode 100644 index 00000000..119650ad Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf-thumb.webp new file mode 100644 index 00000000..2dfbf6ff Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf.webp new file mode 100644 index 00000000..5cbf8c70 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35256-520c52cf.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509-medium.webp new file mode 100644 index 00000000..5b049676 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509-thumb.webp new file mode 100644 index 00000000..7fa0ab03 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509.webp new file mode 100644 index 00000000..0903aa71 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3525f-0883e509.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d-medium.webp new file mode 100644 index 00000000..fd54c90d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d-thumb.webp new file mode 100644 index 00000000..0dff67dc Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d.webp new file mode 100644 index 00000000..24450991 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35266-20c3550d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e-medium.webp new file mode 100644 index 00000000..122efced Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e-thumb.webp new file mode 100644 index 00000000..ede14c2a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e.webp new file mode 100644 index 00000000..fef80bac Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35267-10eec14e.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e-medium.webp new file mode 100644 index 00000000..23f67bdd Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e-thumb.webp new file mode 100644 index 00000000..58b26947 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e.webp new file mode 100644 index 00000000..b17d86c6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35268-fff2585e.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01-medium.webp new file mode 100644 index 00000000..843d32f0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01-thumb.webp new file mode 100644 index 00000000..650d9e40 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01.webp new file mode 100644 index 00000000..49ece2ef Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35276-3ff96d01.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc-medium.webp new file mode 100644 index 00000000..21e523a4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc-thumb.webp new file mode 100644 index 00000000..8290937f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc.webp new file mode 100644 index 00000000..5ac1ee30 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527d-9f78b7bc.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6-medium.webp new file mode 100644 index 00000000..12b3b22b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6-thumb.webp new file mode 100644 index 00000000..d0dd8256 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6.webp new file mode 100644 index 00000000..4e35bdf2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3527e-ebd6c3f6.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356-medium.webp new file mode 100644 index 00000000..05ab0003 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356-thumb.webp new file mode 100644 index 00000000..3d7108e3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356.webp new file mode 100644 index 00000000..d535e1ae Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35281-51103356.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01-medium.webp new file mode 100644 index 00000000..843d32f0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01-thumb.webp new file mode 100644 index 00000000..650d9e40 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01.webp new file mode 100644 index 00000000..49ece2ef Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528b-3ff96d01.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f-medium.webp new file mode 100644 index 00000000..cd857036 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f-thumb.webp new file mode 100644 index 00000000..3b6d8df1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f.webp new file mode 100644 index 00000000..7d6b214a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3528f-6a1bbb6f.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351-medium.webp new file mode 100644 index 00000000..8dc67db7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351-thumb.webp new file mode 100644 index 00000000..bf9f9bcf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351.webp new file mode 100644 index 00000000..a2e63182 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35290-171c5351.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12-medium.webp new file mode 100644 index 00000000..3e752675 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12-thumb.webp new file mode 100644 index 00000000..f1b21ca1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12.webp new file mode 100644 index 00000000..f55ee473 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35295-39782b12.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79-medium.webp new file mode 100644 index 00000000..fc551940 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79-thumb.webp new file mode 100644 index 00000000..d96f04bf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79.webp new file mode 100644 index 00000000..0483bce9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35297-64b65a79.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47-medium.webp new file mode 100644 index 00000000..d3e167dc Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47-thumb.webp new file mode 100644 index 00000000..9f527c9f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47.webp new file mode 100644 index 00000000..b811dc90 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35299-d5396e47.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf-medium.webp new file mode 100644 index 00000000..9eeae8b3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf-thumb.webp new file mode 100644 index 00000000..a2db9a68 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf.webp new file mode 100644 index 00000000..cbe6d1a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ab-7d7a99bf.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7-medium.webp new file mode 100644 index 00000000..b7d8abb9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7-thumb.webp new file mode 100644 index 00000000..4aef40af Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7.webp new file mode 100644 index 00000000..9b3275cf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ac-764760a7.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee-medium.webp new file mode 100644 index 00000000..6bf3c7ae Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee-thumb.webp new file mode 100644 index 00000000..ea0f85d0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee.webp new file mode 100644 index 00000000..0a7ae832 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b6-8ed1c3ee.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097-medium.webp new file mode 100644 index 00000000..392178b5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097-thumb.webp new file mode 100644 index 00000000..9e9f0276 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097.webp new file mode 100644 index 00000000..10c322e4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352b9-752a1097.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa-medium.webp new file mode 100644 index 00000000..57390a95 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa-thumb.webp new file mode 100644 index 00000000..d07f2896 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa.webp new file mode 100644 index 00000000..e4ea0e6d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352c0-dbf8d0aa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8-medium.webp new file mode 100644 index 00000000..cfbb9414 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8-thumb.webp new file mode 100644 index 00000000..870319e7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8.webp new file mode 100644 index 00000000..9584fca0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e8-6b1acfa8.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d-medium.webp new file mode 100644 index 00000000..d87a6e60 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d-thumb.webp new file mode 100644 index 00000000..dcc31165 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d.webp new file mode 100644 index 00000000..3a7bc3fa Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352e9-327bf72d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385-medium.webp new file mode 100644 index 00000000..94409d05 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385-thumb.webp new file mode 100644 index 00000000..4e4bf2ce Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385.webp new file mode 100644 index 00000000..b4a8672d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352ed-e0508385.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223-medium.webp new file mode 100644 index 00000000..602dfae4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223-thumb.webp new file mode 100644 index 00000000..721b019c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223.webp new file mode 100644 index 00000000..d3ea4561 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f1-79ac2223.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0-medium.webp new file mode 100644 index 00000000..64bad49e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0-thumb.webp new file mode 100644 index 00000000..5d59cee6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0.webp new file mode 100644 index 00000000..2f37530b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352f9-6ada33a0.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea-medium.webp new file mode 100644 index 00000000..bc033310 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea-thumb.webp new file mode 100644 index 00000000..4ebcd630 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea.webp new file mode 100644 index 00000000..c8672bc4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f352fc-e324ddea.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699-medium.webp new file mode 100644 index 00000000..ec328dbd Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699-thumb.webp new file mode 100644 index 00000000..83a37b88 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699.webp new file mode 100644 index 00000000..7f994163 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3530b-ecc97699.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270-medium.webp new file mode 100644 index 00000000..ec305806 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270-thumb.webp new file mode 100644 index 00000000..4c7dbdeb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270.webp new file mode 100644 index 00000000..92827f37 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35312-67299270.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35313-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6-medium.webp new file mode 100644 index 00000000..d6b3d4c5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6-thumb.webp new file mode 100644 index 00000000..71a9105c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6.webp new file mode 100644 index 00000000..1c3cbecf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35315-60bde2c6.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4-medium.webp new file mode 100644 index 00000000..83a19287 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4-thumb.webp new file mode 100644 index 00000000..ae6ee5f3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4.webp new file mode 100644 index 00000000..0a8e166d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35316-c56522e4.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2-medium.webp new file mode 100644 index 00000000..63cac5ee Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2-thumb.webp new file mode 100644 index 00000000..a182f1a5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2.webp new file mode 100644 index 00000000..c3ebac79 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35317-0594a7c2.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35318-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35319-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c-medium.webp new file mode 100644 index 00000000..fc88ee39 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c-thumb.webp new file mode 100644 index 00000000..057f671d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c.webp new file mode 100644 index 00000000..fb140bce Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3531e-e8e2f60c.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed-medium.webp new file mode 100644 index 00000000..3d11107e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed-thumb.webp new file mode 100644 index 00000000..7256ee78 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed.webp new file mode 100644 index 00000000..e20f9c12 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35333-ffcdefed.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8-medium.webp new file mode 100644 index 00000000..1791e860 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8-thumb.webp new file mode 100644 index 00000000..d0a12fce Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8.webp new file mode 100644 index 00000000..5a0a278d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35337-5b34e5d8.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550-medium.webp new file mode 100644 index 00000000..5c8257d4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550-thumb.webp new file mode 100644 index 00000000..e565cf10 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550.webp new file mode 100644 index 00000000..82429523 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35338-33e83550.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152-medium.webp new file mode 100644 index 00000000..d23aca2a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152-thumb.webp new file mode 100644 index 00000000..86cfe22f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152.webp new file mode 100644 index 00000000..771476cd Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3535d-76af0152.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc-medium.webp new file mode 100644 index 00000000..21e523a4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc-thumb.webp new file mode 100644 index 00000000..8290937f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc.webp new file mode 100644 index 00000000..5ac1ee30 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3536c-9f78b7bc.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf-medium.webp new file mode 100644 index 00000000..cf17f5e8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf-thumb.webp new file mode 100644 index 00000000..d62ae0d1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf.webp new file mode 100644 index 00000000..c115aec2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35370-8fa4aacf.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9-medium.webp new file mode 100644 index 00000000..fd8e90d2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9-thumb.webp new file mode 100644 index 00000000..6be20d4d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9.webp new file mode 100644 index 00000000..9a18ad13 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35374-933a0df9.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b-medium.webp new file mode 100644 index 00000000..1f4bdf5a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b-thumb.webp new file mode 100644 index 00000000..55a3f6a3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b.webp new file mode 100644 index 00000000..34f19f11 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35376-8a96059b.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b-medium.webp new file mode 100644 index 00000000..1f4bdf5a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b-thumb.webp new file mode 100644 index 00000000..55a3f6a3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b.webp new file mode 100644 index 00000000..34f19f11 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35377-8a96059b.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a-medium.webp new file mode 100644 index 00000000..49c91590 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a-thumb.webp new file mode 100644 index 00000000..1b2579fd Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a.webp new file mode 100644 index 00000000..53a96648 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3537e-51824c3a.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793-medium.webp new file mode 100644 index 00000000..5857d1e2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793-thumb.webp new file mode 100644 index 00000000..50afb243 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793.webp new file mode 100644 index 00000000..e64d3ecf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35380-c2e11793.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb-medium.webp new file mode 100644 index 00000000..b567f0fb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb-thumb.webp new file mode 100644 index 00000000..f550105d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb.webp new file mode 100644 index 00000000..2b82c048 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a4-624b5fcb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e-medium.webp new file mode 100644 index 00000000..c01de3c4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e-thumb.webp new file mode 100644 index 00000000..3ff506c4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e.webp new file mode 100644 index 00000000..9e39e24c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a8-5175b53e.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37-medium.webp new file mode 100644 index 00000000..f6323bc3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37-thumb.webp new file mode 100644 index 00000000..fdb07258 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37.webp new file mode 100644 index 00000000..6f48e647 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353a9-38531c37.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51-medium.webp new file mode 100644 index 00000000..3e17895b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51-thumb.webp new file mode 100644 index 00000000..90a2420e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51.webp new file mode 100644 index 00000000..2b8aa480 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ae-4ad42f51.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4-medium.webp new file mode 100644 index 00000000..f56d9989 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4-thumb.webp new file mode 100644 index 00000000..ad86e199 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4.webp new file mode 100644 index 00000000..c7ea5ef3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353b2-284acec4.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8-medium.webp new file mode 100644 index 00000000..1dcd9417 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8-thumb.webp new file mode 100644 index 00000000..2ac69b06 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8.webp new file mode 100644 index 00000000..ae1d3f87 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353bb-e04e6ea8.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6-medium.webp new file mode 100644 index 00000000..6470c2d4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6-thumb.webp new file mode 100644 index 00000000..23304208 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6.webp new file mode 100644 index 00000000..fd8e3ca8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353c8-6f945de6.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f-medium.webp new file mode 100644 index 00000000..332cfa29 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f-thumb.webp new file mode 100644 index 00000000..00c1e13d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f.webp new file mode 100644 index 00000000..8ccade9e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d6-cd218c6f.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d-medium.webp new file mode 100644 index 00000000..a96895c3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d-thumb.webp new file mode 100644 index 00000000..679c35b3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d.webp new file mode 100644 index 00000000..1fa585dc Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353d8-a8b8e38d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992-medium.webp new file mode 100644 index 00000000..4f79b487 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992-thumb.webp new file mode 100644 index 00000000..4ec5d983 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992.webp new file mode 100644 index 00000000..6e00957a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353da-eebd2992.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9-medium.webp new file mode 100644 index 00000000..141ff19c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9-thumb.webp new file mode 100644 index 00000000..958979ae Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9.webp new file mode 100644 index 00000000..d309e8a3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e1-8477cfc9.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5-medium.webp new file mode 100644 index 00000000..c6a9cac3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5-thumb.webp new file mode 100644 index 00000000..17e5040c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5.webp new file mode 100644 index 00000000..da252c63 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353e2-fbe214a5.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51-medium.webp new file mode 100644 index 00000000..3e17895b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51-thumb.webp new file mode 100644 index 00000000..90a2420e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51.webp new file mode 100644 index 00000000..2b8aa480 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f2-4ad42f51.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9-medium.webp new file mode 100644 index 00000000..1551a6af Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9-thumb.webp new file mode 100644 index 00000000..218016b3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9.webp new file mode 100644 index 00000000..3a8e6e8d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353f6-1fef2dc9.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509-medium.webp new file mode 100644 index 00000000..5b049676 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509-thumb.webp new file mode 100644 index 00000000..7fa0ab03 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509.webp new file mode 100644 index 00000000..0903aa71 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353fd-0883e509.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d-medium.webp new file mode 100644 index 00000000..3c95e511 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d-thumb.webp new file mode 100644 index 00000000..fe84fa52 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d.webp new file mode 100644 index 00000000..1512f040 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f353ff-518cea6d.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b-medium.webp new file mode 100644 index 00000000..24aa3890 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b-thumb.webp new file mode 100644 index 00000000..a243a83b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b.webp new file mode 100644 index 00000000..ddcf602b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35400-9039529b.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798-medium.webp new file mode 100644 index 00000000..0fd57b6c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798-thumb.webp new file mode 100644 index 00000000..d765c580 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798.webp new file mode 100644 index 00000000..17031a33 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35401-d9f4c798.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db-medium.webp new file mode 100644 index 00000000..f7d73218 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db-thumb.webp new file mode 100644 index 00000000..9a067c5a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db.webp new file mode 100644 index 00000000..a59301f4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35403-a20d62db.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581-medium.webp new file mode 100644 index 00000000..5896147f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581-thumb.webp new file mode 100644 index 00000000..a2bd6513 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581.webp new file mode 100644 index 00000000..d054e5bb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35411-718da581.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9-medium.webp new file mode 100644 index 00000000..c9a8f94a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9-thumb.webp new file mode 100644 index 00000000..2c9e150d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9.webp new file mode 100644 index 00000000..cb7a2a4f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35415-ab4fc6e9.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19-medium.webp new file mode 100644 index 00000000..643d53dd Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19-thumb.webp new file mode 100644 index 00000000..0b8afac4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19.webp new file mode 100644 index 00000000..910c04e5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35418-0ac3dd19.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17-medium.webp new file mode 100644 index 00000000..7f83b4a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17-thumb.webp new file mode 100644 index 00000000..9b1b14d8 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17.webp new file mode 100644 index 00000000..2747f101 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3541f-cc4efd17.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae-medium.webp new file mode 100644 index 00000000..adbc09c2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae-thumb.webp new file mode 100644 index 00000000..c6a914a9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae.webp new file mode 100644 index 00000000..6154a653 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35425-5f923eae.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15-medium.webp new file mode 100644 index 00000000..399a9ff0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15-thumb.webp new file mode 100644 index 00000000..ba00c87f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15.webp new file mode 100644 index 00000000..d66c87ce Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35426-29eaad15.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84-medium.webp new file mode 100644 index 00000000..2ad62110 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84-thumb.webp new file mode 100644 index 00000000..78ccdb08 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84.webp new file mode 100644 index 00000000..489e811f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35427-2da11f84.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018-medium.webp new file mode 100644 index 00000000..05671e72 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018-thumb.webp new file mode 100644 index 00000000..ec43161a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018.webp new file mode 100644 index 00000000..ba76feae Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3542a-80924018.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35433-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543a-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793-medium.webp new file mode 100644 index 00000000..5857d1e2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793-thumb.webp new file mode 100644 index 00000000..50afb243 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793.webp new file mode 100644 index 00000000..e64d3ecf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3543e-c2e11793.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246-medium.webp new file mode 100644 index 00000000..6bf29d67 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246-thumb.webp new file mode 100644 index 00000000..979917b6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246.webp new file mode 100644 index 00000000..db205667 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35440-9ae00246.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97-medium.webp new file mode 100644 index 00000000..76e01ec9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97-thumb.webp new file mode 100644 index 00000000..77d349da Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97.webp new file mode 100644 index 00000000..7b29cf23 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35441-b4563a97.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f-medium.webp new file mode 100644 index 00000000..62e172d3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f-thumb.webp new file mode 100644 index 00000000..5cfd1fc7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f.webp new file mode 100644 index 00000000..e91feb2c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35448-970d122f.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3-medium.webp new file mode 100644 index 00000000..94033ef4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3-thumb.webp new file mode 100644 index 00000000..bf5cd731 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3.webp new file mode 100644 index 00000000..197951d9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544a-b57095b3.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793-medium.webp new file mode 100644 index 00000000..5857d1e2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793-thumb.webp new file mode 100644 index 00000000..50afb243 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793.webp new file mode 100644 index 00000000..e64d3ecf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544b-c2e11793.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246-medium.webp new file mode 100644 index 00000000..6bf29d67 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246-thumb.webp new file mode 100644 index 00000000..979917b6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246.webp new file mode 100644 index 00000000..db205667 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544c-9ae00246.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e-medium.webp new file mode 100644 index 00000000..c01de3c4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e-thumb.webp new file mode 100644 index 00000000..3ff506c4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e.webp new file mode 100644 index 00000000..9e39e24c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544d-5175b53e.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e-medium.webp new file mode 100644 index 00000000..c01de3c4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e-thumb.webp new file mode 100644 index 00000000..3ff506c4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e.webp new file mode 100644 index 00000000..9e39e24c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3544f-5175b53e.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246-medium.webp new file mode 100644 index 00000000..6bf29d67 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246-thumb.webp new file mode 100644 index 00000000..979917b6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246.webp new file mode 100644 index 00000000..db205667 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35450-9ae00246.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97-medium.webp new file mode 100644 index 00000000..76e01ec9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97-thumb.webp new file mode 100644 index 00000000..77d349da Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97.webp new file mode 100644 index 00000000..7b29cf23 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35451-b4563a97.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97-medium.webp new file mode 100644 index 00000000..76e01ec9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97-thumb.webp new file mode 100644 index 00000000..77d349da Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97.webp new file mode 100644 index 00000000..7b29cf23 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35452-b4563a97.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3-medium.webp new file mode 100644 index 00000000..94033ef4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3-thumb.webp new file mode 100644 index 00000000..bf5cd731 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3.webp new file mode 100644 index 00000000..197951d9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35453-b57095b3.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97-medium.webp new file mode 100644 index 00000000..76e01ec9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97-thumb.webp new file mode 100644 index 00000000..77d349da Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97.webp new file mode 100644 index 00000000..7b29cf23 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35455-b4563a97.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793-medium.webp new file mode 100644 index 00000000..5857d1e2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793-thumb.webp new file mode 100644 index 00000000..50afb243 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793.webp new file mode 100644 index 00000000..e64d3ecf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35456-c2e11793.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702-medium.webp new file mode 100644 index 00000000..67391148 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702-thumb.webp new file mode 100644 index 00000000..5cb4d4de Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702.webp new file mode 100644 index 00000000..6f3e0daa Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35459-27f12702.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a-medium.webp new file mode 100644 index 00000000..09401ddc Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a-thumb.webp new file mode 100644 index 00000000..b2fd5c7f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a.webp new file mode 100644 index 00000000..b73141b5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545b-025b3b5a.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8-medium.webp new file mode 100644 index 00000000..a1309fcc Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8-thumb.webp new file mode 100644 index 00000000..cc83cbfa Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8.webp new file mode 100644 index 00000000..0d94414c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3545f-121285f8.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b-medium.webp new file mode 100644 index 00000000..beb21ebb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b-thumb.webp new file mode 100644 index 00000000..4f1947cb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b.webp new file mode 100644 index 00000000..0cdce7d2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35460-adad6b3b.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17-medium.webp new file mode 100644 index 00000000..8a1da8b0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17-thumb.webp new file mode 100644 index 00000000..4f793f1d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17.webp new file mode 100644 index 00000000..0fe9c21b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35462-ef19ac17.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c-medium.webp new file mode 100644 index 00000000..1bc8e4e6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c-thumb.webp new file mode 100644 index 00000000..195d60f9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c.webp new file mode 100644 index 00000000..59441eb7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35464-2cd31c3c.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6-medium.webp new file mode 100644 index 00000000..6a7e4649 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6-thumb.webp new file mode 100644 index 00000000..c42a9ad1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6.webp new file mode 100644 index 00000000..6b8bbe34 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35465-81f2e2b6.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a-medium.webp new file mode 100644 index 00000000..49c82521 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a-thumb.webp new file mode 100644 index 00000000..88f8b60b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a.webp new file mode 100644 index 00000000..4236981e Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35468-b701864a.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37-medium.webp new file mode 100644 index 00000000..e027b31f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37-thumb.webp new file mode 100644 index 00000000..6ffddd27 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37.webp new file mode 100644 index 00000000..f0fafce6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3546a-07b25d37.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de-medium.webp new file mode 100644 index 00000000..dfd84c2f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de-thumb.webp new file mode 100644 index 00000000..fd35df4d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de.webp new file mode 100644 index 00000000..c395d7d5 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547b-4afec2de.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754-medium.webp new file mode 100644 index 00000000..e2767fd1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754-thumb.webp new file mode 100644 index 00000000..b9c73085 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754.webp new file mode 100644 index 00000000..46925239 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547c-0e836754.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8-medium.webp new file mode 100644 index 00000000..8d079cd3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8-thumb.webp new file mode 100644 index 00000000..6cde0f2c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8.webp new file mode 100644 index 00000000..93499a0b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547d-368798f8.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc-medium.webp new file mode 100644 index 00000000..b017053a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc-thumb.webp new file mode 100644 index 00000000..b5a30e47 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc.webp new file mode 100644 index 00000000..96110c92 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547e-61995bdc.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a-medium.webp new file mode 100644 index 00000000..5c6bb0af Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a-thumb.webp new file mode 100644 index 00000000..70fe42b1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a.webp new file mode 100644 index 00000000..a9bafc4c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3547f-d43b589a.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35497-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f-medium.webp new file mode 100644 index 00000000..4fc08672 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f-thumb.webp new file mode 100644 index 00000000..ce3286e2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f.webp new file mode 100644 index 00000000..e283b2c2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f3549e-63647b6f.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8-medium.webp new file mode 100644 index 00000000..d7bda861 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8-thumb.webp new file mode 100644 index 00000000..fe7a2e01 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8.webp new file mode 100644 index 00000000..6eb5b775 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354aa-dca1f6a8.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb-medium.webp new file mode 100644 index 00000000..b567f0fb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb-thumb.webp new file mode 100644 index 00000000..f550105d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb.webp new file mode 100644 index 00000000..2b82c048 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b8-624b5fcb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1-medium.webp new file mode 100644 index 00000000..210c0026 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1-thumb.webp new file mode 100644 index 00000000..fb7573bb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1.webp new file mode 100644 index 00000000..8801523d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354b9-e46f13d1.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223-medium.webp new file mode 100644 index 00000000..602dfae4 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223-thumb.webp new file mode 100644 index 00000000..721b019c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223.webp new file mode 100644 index 00000000..d3ea4561 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bb-79ac2223.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c-medium.webp new file mode 100644 index 00000000..846ab196 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c-thumb.webp new file mode 100644 index 00000000..ebe2c633 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c.webp new file mode 100644 index 00000000..4c5917c9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bc-c747c61c.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9-medium.webp new file mode 100644 index 00000000..3d33e4f0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9-thumb.webp new file mode 100644 index 00000000..c65b3d39 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9.webp new file mode 100644 index 00000000..c17f6861 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bd-bea881e9.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db-medium.webp new file mode 100644 index 00000000..b04488ab Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db-thumb.webp new file mode 100644 index 00000000..4f02089f Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db.webp new file mode 100644 index 00000000..9389a5f1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354bf-7824b3db.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8-medium.webp new file mode 100644 index 00000000..5295f7ea Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8-thumb.webp new file mode 100644 index 00000000..7a98f242 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8.webp new file mode 100644 index 00000000..4a5b1f48 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c0-8781d2a8.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46-medium.webp new file mode 100644 index 00000000..f03efa71 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46-thumb.webp new file mode 100644 index 00000000..5c69cbec Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46.webp new file mode 100644 index 00000000..317fe1d9 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c2-ca6aaf46.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858-medium.webp new file mode 100644 index 00000000..9c82b118 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858-thumb.webp new file mode 100644 index 00000000..ad1f3c5c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858.webp new file mode 100644 index 00000000..003ac106 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c5-c68de858.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49-medium.webp new file mode 100644 index 00000000..6c036ada Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49-thumb.webp new file mode 100644 index 00000000..5f74ae72 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49.webp new file mode 100644 index 00000000..1f912b53 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c8-8be6bb49.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0-medium.webp new file mode 100644 index 00000000..8e0e63de Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0-thumb.webp new file mode 100644 index 00000000..e394e025 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0.webp new file mode 100644 index 00000000..c7cfcc29 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354c9-999cb9f0.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb-medium.webp new file mode 100644 index 00000000..fd0bd05c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb-thumb.webp new file mode 100644 index 00000000..e6bbf2cf Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb.webp new file mode 100644 index 00000000..dc4972db Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cd-092053eb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd-medium.webp new file mode 100644 index 00000000..783370de Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd-thumb.webp new file mode 100644 index 00000000..37504922 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd.webp new file mode 100644 index 00000000..f729a4c6 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354cf-9f0b55bd.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845-medium.webp new file mode 100644 index 00000000..e67ed03d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845-thumb.webp new file mode 100644 index 00000000..5fe1ce23 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845.webp new file mode 100644 index 00000000..a9f6f2f7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d4-dead9845.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845-medium.webp new file mode 100644 index 00000000..e67ed03d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845-thumb.webp new file mode 100644 index 00000000..5fe1ce23 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845.webp new file mode 100644 index 00000000..a9f6f2f7 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d5-dead9845.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d6-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966-medium.webp new file mode 100644 index 00000000..b676e451 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966-thumb.webp new file mode 100644 index 00000000..290c081c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966.webp new file mode 100644 index 00000000..b2440bf1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d8-6f30d966.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680-medium.webp new file mode 100644 index 00000000..c0f91bfb Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680-thumb.webp new file mode 100644 index 00000000..c447185a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680.webp new file mode 100644 index 00000000..a0f2a38c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354d9-a740f680.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff-medium.webp new file mode 100644 index 00000000..f27a2751 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff-thumb.webp new file mode 100644 index 00000000..0f320416 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff.webp new file mode 100644 index 00000000..e512755b Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354da-984babff.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746-medium.webp new file mode 100644 index 00000000..25b81950 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746-thumb.webp new file mode 100644 index 00000000..620f8de2 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746.webp new file mode 100644 index 00000000..b1bf4ed3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354de-f5489746.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb-medium.webp new file mode 100644 index 00000000..bf09742a Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb-thumb.webp new file mode 100644 index 00000000..da6b12b1 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb.webp new file mode 100644 index 00000000..592bbe31 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354df-04f781fb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494-medium.webp new file mode 100644 index 00000000..4938f977 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494-thumb.webp new file mode 100644 index 00000000..ec888673 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494.webp new file mode 100644 index 00000000..b93fc29c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e0-534c0494.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c-medium.webp new file mode 100644 index 00000000..7ecffa55 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c-thumb.webp new file mode 100644 index 00000000..536112f0 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c.webp new file mode 100644 index 00000000..8c23581d Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354e1-263f0c1c.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62-medium.webp new file mode 100644 index 00000000..f0c975ad Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62-thumb.webp new file mode 100644 index 00000000..773cad62 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62.webp new file mode 100644 index 00000000..6e63c4e3 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f354fa-5122df62.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83-medium.webp new file mode 100644 index 00000000..3874dc2c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83-thumb.webp new file mode 100644 index 00000000..58edc397 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83.webp new file mode 100644 index 00000000..eb821e8c Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35500-bbb48d83.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd-medium.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd-thumb.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd.webp b/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/6841a1ee06ef64a2f9f35502-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363-medium.webp b/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363-medium.webp new file mode 100644 index 00000000..7bce330e Binary files /dev/null and b/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363-medium.webp differ diff --git a/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363-thumb.webp b/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363-thumb.webp new file mode 100644 index 00000000..b210343f Binary files /dev/null and b/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363-thumb.webp differ diff --git a/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363.webp b/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363.webp new file mode 100644 index 00000000..3e148567 Binary files /dev/null and b/backend/public/images/products/77/6841bc4aba5a5cce2791a837-44429363.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e-medium.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e-medium.webp new file mode 100644 index 00000000..502a712b Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e-medium.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e-thumb.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e-thumb.webp new file mode 100644 index 00000000..a03faf95 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e-thumb.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e.webp new file mode 100644 index 00000000..2f5a2685 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d66e-24efa60e.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509-medium.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509-medium.webp new file mode 100644 index 00000000..5b049676 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509-medium.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509-thumb.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509-thumb.webp new file mode 100644 index 00000000..7fa0ab03 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509-thumb.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509.webp new file mode 100644 index 00000000..0903aa71 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d66f-0883e509.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363-medium.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363-medium.webp new file mode 100644 index 00000000..7bce330e Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363-medium.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363-thumb.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363-thumb.webp new file mode 100644 index 00000000..b210343f Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363-thumb.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363.webp new file mode 100644 index 00000000..3e148567 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d670-44429363.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68-medium.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68-medium.webp new file mode 100644 index 00000000..e5bab682 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68-medium.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68-thumb.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68-thumb.webp new file mode 100644 index 00000000..c7a6a922 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68-thumb.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68.webp new file mode 100644 index 00000000..bf1dcac0 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d675-0de5dd68.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949-medium.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949-medium.webp new file mode 100644 index 00000000..6b8210c2 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949-medium.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949-thumb.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949-thumb.webp new file mode 100644 index 00000000..e36bbdc1 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949-thumb.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949.webp new file mode 100644 index 00000000..cd6be586 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d676-8440d949.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640-medium.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640-medium.webp new file mode 100644 index 00000000..94bd7493 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640-medium.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640-thumb.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640-thumb.webp new file mode 100644 index 00000000..2800a7d9 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640-thumb.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640.webp new file mode 100644 index 00000000..f047c4aa Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d679-de2c1640.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4-medium.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4-thumb.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4.webp b/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/6841c0c6b07558b9a182d67a-752aa3a4.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37-medium.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37-medium.webp new file mode 100644 index 00000000..f6323bc3 Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37-medium.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37-thumb.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37-thumb.webp new file mode 100644 index 00000000..fdb07258 Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37-thumb.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37.webp new file mode 100644 index 00000000..6f48e647 Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e2-38531c37.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f-medium.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f-medium.webp new file mode 100644 index 00000000..6c6084b0 Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f-medium.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f-thumb.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f-thumb.webp new file mode 100644 index 00000000..88d95e9d Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f-thumb.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f.webp new file mode 100644 index 00000000..520af7a3 Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e7-97df867f.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b-medium.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b-medium.webp new file mode 100644 index 00000000..1b74dd50 Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b-medium.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b-thumb.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b-thumb.webp new file mode 100644 index 00000000..48950e05 Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b-thumb.webp differ diff --git a/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b.webp b/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b.webp new file mode 100644 index 00000000..137731d5 Binary files /dev/null and b/backend/public/images/products/77/6841cca50b64e1e4468160e8-7cdce49b.webp differ diff --git a/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2-medium.webp b/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2-medium.webp new file mode 100644 index 00000000..7b63ec83 Binary files /dev/null and b/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2-medium.webp differ diff --git a/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2-thumb.webp b/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2-thumb.webp new file mode 100644 index 00000000..693a71ab Binary files /dev/null and b/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2-thumb.webp differ diff --git a/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2.webp b/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2.webp new file mode 100644 index 00000000..bcd9d5b9 Binary files /dev/null and b/backend/public/images/products/77/6841cef485904c8beeab1c83-af349fb2.webp differ diff --git a/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c-medium.webp b/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c-medium.webp new file mode 100644 index 00000000..5f9f4c81 Binary files /dev/null and b/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c-medium.webp differ diff --git a/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c-thumb.webp b/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c-thumb.webp new file mode 100644 index 00000000..cb81d545 Binary files /dev/null and b/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c-thumb.webp differ diff --git a/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c.webp b/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c.webp new file mode 100644 index 00000000..6220c437 Binary files /dev/null and b/backend/public/images/products/77/6841cef485904c8beeab1c84-1977707c.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020-medium.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020-medium.webp new file mode 100644 index 00000000..eca818cb Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020-medium.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020-thumb.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020-thumb.webp new file mode 100644 index 00000000..147168e3 Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020-thumb.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020.webp new file mode 100644 index 00000000..199e05cc Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790c-10951020.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e-medium.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e-medium.webp new file mode 100644 index 00000000..5d3dcd2a Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e-medium.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e-thumb.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e-thumb.webp new file mode 100644 index 00000000..fbe6cf7f Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e-thumb.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e.webp new file mode 100644 index 00000000..db6c43dd Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790d-2afafd0e.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416-medium.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416-medium.webp new file mode 100644 index 00000000..dabff3c3 Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416-medium.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416-thumb.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416-thumb.webp new file mode 100644 index 00000000..f66da2c7 Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416-thumb.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416.webp new file mode 100644 index 00000000..2d40075c Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790e-0ba84416.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696-medium.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696-medium.webp new file mode 100644 index 00000000..ba4a6af0 Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696-medium.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696-thumb.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696-thumb.webp new file mode 100644 index 00000000..c8c443e0 Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696-thumb.webp differ diff --git a/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696.webp b/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696.webp new file mode 100644 index 00000000..7a4d9a23 Binary files /dev/null and b/backend/public/images/products/77/6841d854a2ce766f63c3790f-b4f1c696.webp differ diff --git a/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a-medium.webp b/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a-medium.webp new file mode 100644 index 00000000..69dd93da Binary files /dev/null and b/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a-medium.webp differ diff --git a/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a-thumb.webp b/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a-thumb.webp new file mode 100644 index 00000000..53080a73 Binary files /dev/null and b/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a-thumb.webp differ diff --git a/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a.webp b/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a.webp new file mode 100644 index 00000000..d8a98a37 Binary files /dev/null and b/backend/public/images/products/77/684324434523c67f3791e31a-775fac2a.webp differ diff --git a/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737-medium.webp b/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737-medium.webp new file mode 100644 index 00000000..8921da06 Binary files /dev/null and b/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737-medium.webp differ diff --git a/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737-thumb.webp b/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737-thumb.webp new file mode 100644 index 00000000..d63e0d4b Binary files /dev/null and b/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737-thumb.webp differ diff --git a/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737.webp b/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737.webp new file mode 100644 index 00000000..77047348 Binary files /dev/null and b/backend/public/images/products/77/6843292b442b4f15c9e16a64-84659737.webp differ diff --git a/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882-medium.webp b/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882-medium.webp new file mode 100644 index 00000000..7671cfa7 Binary files /dev/null and b/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882-medium.webp differ diff --git a/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882-thumb.webp b/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882-thumb.webp new file mode 100644 index 00000000..42513545 Binary files /dev/null and b/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882-thumb.webp differ diff --git a/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882.webp b/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882.webp new file mode 100644 index 00000000..563ed76d Binary files /dev/null and b/backend/public/images/products/77/684334d4678664fd540eb21d-f2600882.webp differ diff --git a/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08-medium.webp b/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08-medium.webp new file mode 100644 index 00000000..a6f9d3c9 Binary files /dev/null and b/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08-medium.webp differ diff --git a/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08-thumb.webp b/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08-thumb.webp new file mode 100644 index 00000000..af3b74ec Binary files /dev/null and b/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08-thumb.webp differ diff --git a/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08.webp b/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08.webp new file mode 100644 index 00000000..786e2a3c Binary files /dev/null and b/backend/public/images/products/77/68433c27685969ee97d01c16-bc55af08.webp differ diff --git a/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2-medium.webp b/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2-medium.webp new file mode 100644 index 00000000..51283718 Binary files /dev/null and b/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2-medium.webp differ diff --git a/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2-thumb.webp b/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2-thumb.webp new file mode 100644 index 00000000..684c13ac Binary files /dev/null and b/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2-thumb.webp differ diff --git a/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2.webp b/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2.webp new file mode 100644 index 00000000..4a748609 Binary files /dev/null and b/backend/public/images/products/77/68433c27685969ee97d01c17-4c5f2ac2.webp differ diff --git a/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69-medium.webp b/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69-medium.webp new file mode 100644 index 00000000..86c1fa86 Binary files /dev/null and b/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69-medium.webp differ diff --git a/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69-thumb.webp b/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69-thumb.webp new file mode 100644 index 00000000..22d87c7c Binary files /dev/null and b/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69-thumb.webp differ diff --git a/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69.webp b/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69.webp new file mode 100644 index 00000000..b196b43f Binary files /dev/null and b/backend/public/images/products/77/68434126a782dcbe6968da79-c8f27c69.webp differ diff --git a/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e-medium.webp b/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e-medium.webp new file mode 100644 index 00000000..502a712b Binary files /dev/null and b/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e-medium.webp differ diff --git a/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e-thumb.webp b/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e-thumb.webp new file mode 100644 index 00000000..a03faf95 Binary files /dev/null and b/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e-thumb.webp differ diff --git a/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e.webp b/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e.webp new file mode 100644 index 00000000..2f5a2685 Binary files /dev/null and b/backend/public/images/products/77/684343c04935bc4f0eecfc2b-24efa60e.webp differ diff --git a/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e-medium.webp b/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e-medium.webp new file mode 100644 index 00000000..502a712b Binary files /dev/null and b/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e-medium.webp differ diff --git a/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e-thumb.webp b/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e-thumb.webp new file mode 100644 index 00000000..a03faf95 Binary files /dev/null and b/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e-thumb.webp differ diff --git a/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e.webp b/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e.webp new file mode 100644 index 00000000..2f5a2685 Binary files /dev/null and b/backend/public/images/products/77/684343c04935bc4f0eecfc2c-24efa60e.webp differ diff --git a/backend/public/images/products/77/6843460063016304885529e2-44429363-medium.webp b/backend/public/images/products/77/6843460063016304885529e2-44429363-medium.webp new file mode 100644 index 00000000..7bce330e Binary files /dev/null and b/backend/public/images/products/77/6843460063016304885529e2-44429363-medium.webp differ diff --git a/backend/public/images/products/77/6843460063016304885529e2-44429363-thumb.webp b/backend/public/images/products/77/6843460063016304885529e2-44429363-thumb.webp new file mode 100644 index 00000000..b210343f Binary files /dev/null and b/backend/public/images/products/77/6843460063016304885529e2-44429363-thumb.webp differ diff --git a/backend/public/images/products/77/6843460063016304885529e2-44429363.webp b/backend/public/images/products/77/6843460063016304885529e2-44429363.webp new file mode 100644 index 00000000..3e148567 Binary files /dev/null and b/backend/public/images/products/77/6843460063016304885529e2-44429363.webp differ diff --git a/backend/public/images/products/77/6843460063016304885529e4-44429363-medium.webp b/backend/public/images/products/77/6843460063016304885529e4-44429363-medium.webp new file mode 100644 index 00000000..7bce330e Binary files /dev/null and b/backend/public/images/products/77/6843460063016304885529e4-44429363-medium.webp differ diff --git a/backend/public/images/products/77/6843460063016304885529e4-44429363-thumb.webp b/backend/public/images/products/77/6843460063016304885529e4-44429363-thumb.webp new file mode 100644 index 00000000..b210343f Binary files /dev/null and b/backend/public/images/products/77/6843460063016304885529e4-44429363-thumb.webp differ diff --git a/backend/public/images/products/77/6843460063016304885529e4-44429363.webp b/backend/public/images/products/77/6843460063016304885529e4-44429363.webp new file mode 100644 index 00000000..3e148567 Binary files /dev/null and b/backend/public/images/products/77/6843460063016304885529e4-44429363.webp differ diff --git a/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202-medium.webp b/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202-medium.webp new file mode 100644 index 00000000..9a74682b Binary files /dev/null and b/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202-medium.webp differ diff --git a/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202-thumb.webp b/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202-thumb.webp new file mode 100644 index 00000000..147ef2b6 Binary files /dev/null and b/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202-thumb.webp differ diff --git a/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202.webp b/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202.webp new file mode 100644 index 00000000..2483ef42 Binary files /dev/null and b/backend/public/images/products/77/6844520789dde710f5e8a4cb-fad9f202.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b-medium.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b-medium.webp new file mode 100644 index 00000000..33c87ae9 Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b-medium.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b-thumb.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b-thumb.webp new file mode 100644 index 00000000..c4c4621f Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b-thumb.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b.webp new file mode 100644 index 00000000..efcce841 Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b1-8146401b.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5-medium.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5-medium.webp new file mode 100644 index 00000000..ff60e66f Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5-medium.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5-thumb.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5-thumb.webp new file mode 100644 index 00000000..df6433c3 Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5-thumb.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5.webp new file mode 100644 index 00000000..bd18f875 Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b2-ddc6b8b5.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225-medium.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225-medium.webp new file mode 100644 index 00000000..1e2e462f Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225-medium.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225-thumb.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225-thumb.webp new file mode 100644 index 00000000..639d1147 Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225-thumb.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225.webp new file mode 100644 index 00000000..01e46af8 Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b3-6babb225.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e-medium.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e-medium.webp new file mode 100644 index 00000000..502a712b Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e-medium.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e-thumb.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e-thumb.webp new file mode 100644 index 00000000..a03faf95 Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e-thumb.webp differ diff --git a/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e.webp b/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e.webp new file mode 100644 index 00000000..2f5a2685 Binary files /dev/null and b/backend/public/images/products/77/68471b1cf43c2e28908cd2b4-24efa60e.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c-medium.webp b/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c-medium.webp new file mode 100644 index 00000000..aeb9de54 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c-medium.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c-thumb.webp b/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c-thumb.webp new file mode 100644 index 00000000..8a19c6fe Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c-thumb.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c.webp b/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c.webp new file mode 100644 index 00000000..b874cf99 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da55f-43d4180c.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35-medium.webp b/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35-medium.webp new file mode 100644 index 00000000..ba2b2c5b Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35-medium.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35-thumb.webp b/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35-thumb.webp new file mode 100644 index 00000000..aec0c115 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35-thumb.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35.webp b/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35.webp new file mode 100644 index 00000000..ac5ba131 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da560-9615ae35.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49-medium.webp b/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49-medium.webp new file mode 100644 index 00000000..fff31cef Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49-medium.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49-thumb.webp b/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49-thumb.webp new file mode 100644 index 00000000..2f9bd8b3 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49-thumb.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49.webp b/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49.webp new file mode 100644 index 00000000..179cc4da Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da561-fe03de49.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e-medium.webp b/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e-medium.webp new file mode 100644 index 00000000..379a04aa Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e-medium.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e-thumb.webp b/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e-thumb.webp new file mode 100644 index 00000000..20731a4a Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e-thumb.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e.webp b/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e.webp new file mode 100644 index 00000000..95d916df Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da563-7fff876e.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba-medium.webp b/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba-medium.webp new file mode 100644 index 00000000..1a454456 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba-medium.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba-thumb.webp b/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba-thumb.webp new file mode 100644 index 00000000..de1a3e2f Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba-thumb.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba.webp b/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba.webp new file mode 100644 index 00000000..9af68ab2 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da564-aab30fba.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa-medium.webp b/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa-medium.webp new file mode 100644 index 00000000..fb1569f8 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa-medium.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa-thumb.webp b/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa-thumb.webp new file mode 100644 index 00000000..35c39478 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa-thumb.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa.webp b/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa.webp new file mode 100644 index 00000000..6710d0ca Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da565-ab1514fa.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da566-5da482df-medium.webp b/backend/public/images/products/77/68472514c93ed56e495da566-5da482df-medium.webp new file mode 100644 index 00000000..73c97cb1 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da566-5da482df-medium.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da566-5da482df-thumb.webp b/backend/public/images/products/77/68472514c93ed56e495da566-5da482df-thumb.webp new file mode 100644 index 00000000..be6c4780 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da566-5da482df-thumb.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da566-5da482df.webp b/backend/public/images/products/77/68472514c93ed56e495da566-5da482df.webp new file mode 100644 index 00000000..119c34b7 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da566-5da482df.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215-medium.webp b/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215-medium.webp new file mode 100644 index 00000000..1606f507 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215-medium.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215-thumb.webp b/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215-thumb.webp new file mode 100644 index 00000000..3c836f27 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215-thumb.webp differ diff --git a/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215.webp b/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215.webp new file mode 100644 index 00000000..a71045c8 Binary files /dev/null and b/backend/public/images/products/77/68472514c93ed56e495da569-9c0c7215.webp differ diff --git a/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2-medium.webp b/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2-medium.webp new file mode 100644 index 00000000..f2e80adc Binary files /dev/null and b/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2-medium.webp differ diff --git a/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2-thumb.webp b/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2-thumb.webp new file mode 100644 index 00000000..768d70dd Binary files /dev/null and b/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2-thumb.webp differ diff --git a/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2.webp b/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2.webp new file mode 100644 index 00000000..ddda96bf Binary files /dev/null and b/backend/public/images/products/77/6848714fcd70ec00618619f8-578662b2.webp differ diff --git a/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5-medium.webp b/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5-thumb.webp b/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5.webp b/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/684873b767da5bf004b8892b-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9-medium.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9-medium.webp new file mode 100644 index 00000000..f5bfa84e Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9-medium.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9-thumb.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9-thumb.webp new file mode 100644 index 00000000..e9c3b602 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9-thumb.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9.webp new file mode 100644 index 00000000..224b972c Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df8f-36a9eea9.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5-medium.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5-medium.webp new file mode 100644 index 00000000..45c27aee Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5-medium.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5-thumb.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5-thumb.webp new file mode 100644 index 00000000..52095dd8 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5-thumb.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5.webp new file mode 100644 index 00000000..9888a676 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df90-d609d5a5.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297-medium.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297-medium.webp new file mode 100644 index 00000000..ca04ffdb Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297-medium.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297-thumb.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297-thumb.webp new file mode 100644 index 00000000..507376d1 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297-thumb.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297.webp new file mode 100644 index 00000000..6063f0b9 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df91-00e8f297.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded-medium.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded-medium.webp new file mode 100644 index 00000000..84df8ec6 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded-medium.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded-thumb.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded-thumb.webp new file mode 100644 index 00000000..5b03bc17 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded-thumb.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded.webp new file mode 100644 index 00000000..be411e93 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df93-ffdacded.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079-medium.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079-medium.webp new file mode 100644 index 00000000..5685006c Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079-medium.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079-thumb.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079-thumb.webp new file mode 100644 index 00000000..c72fcf29 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079-thumb.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079.webp new file mode 100644 index 00000000..01f28ff7 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df94-9fce0079.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a-medium.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a-medium.webp new file mode 100644 index 00000000..05fe2e52 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a-medium.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a-thumb.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a-thumb.webp new file mode 100644 index 00000000..1332e14d Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a-thumb.webp differ diff --git a/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a.webp b/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a.webp new file mode 100644 index 00000000..c31ab279 Binary files /dev/null and b/backend/public/images/products/77/68488269afcd9b6bdac1df95-7b99307a.webp differ diff --git a/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2-medium.webp b/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2-medium.webp new file mode 100644 index 00000000..36ed4818 Binary files /dev/null and b/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2-medium.webp differ diff --git a/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2-thumb.webp b/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2-thumb.webp new file mode 100644 index 00000000..7614314a Binary files /dev/null and b/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2-thumb.webp differ diff --git a/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2.webp b/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2.webp new file mode 100644 index 00000000..7e7e46b4 Binary files /dev/null and b/backend/public/images/products/77/684884f44734a131e8958343-ab375ef2.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd-medium.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd-thumb.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f38-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd-medium.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd-thumb.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f39-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34-medium.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34-medium.webp new file mode 100644 index 00000000..ff3330c6 Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34-medium.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34-thumb.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34-thumb.webp new file mode 100644 index 00000000..b036ae5c Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34-thumb.webp differ diff --git a/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34.webp b/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34.webp new file mode 100644 index 00000000..ccd3600c Binary files /dev/null and b/backend/public/images/products/77/684890dd53bfb7d68b3b7f3e-09584f34.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b-medium.webp b/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b-medium.webp new file mode 100644 index 00000000..82ef9793 Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b-medium.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b-thumb.webp b/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b-thumb.webp new file mode 100644 index 00000000..81d16272 Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b-thumb.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b.webp b/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b.webp new file mode 100644 index 00000000..237fb298 Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f183116-520e4e9b.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f-medium.webp b/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f-medium.webp new file mode 100644 index 00000000..593e3e1f Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f-medium.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f-thumb.webp b/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f-thumb.webp new file mode 100644 index 00000000..4320c30a Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f-thumb.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f.webp b/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f.webp new file mode 100644 index 00000000..63fa382a Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f18311b-7e69382f.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d-medium.webp b/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d-medium.webp new file mode 100644 index 00000000..e9997cd9 Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d-medium.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d-thumb.webp b/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d-thumb.webp new file mode 100644 index 00000000..12c72dfd Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d-thumb.webp differ diff --git a/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d.webp b/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d.webp new file mode 100644 index 00000000..60ae46ff Binary files /dev/null and b/backend/public/images/products/77/684893021268fc0c8f18311d-50beda1d.webp differ diff --git a/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623-medium.webp b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623-medium.webp new file mode 100644 index 00000000..3aeb60b8 Binary files /dev/null and b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623-medium.webp differ diff --git a/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623-thumb.webp b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623-thumb.webp new file mode 100644 index 00000000..2978940a Binary files /dev/null and b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623-thumb.webp differ diff --git a/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623.webp b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623.webp new file mode 100644 index 00000000..9f2b5b07 Binary files /dev/null and b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d0-b76a6623.webp differ diff --git a/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08-medium.webp b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08-medium.webp new file mode 100644 index 00000000..14be66b2 Binary files /dev/null and b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08-medium.webp differ diff --git a/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08-thumb.webp b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08-thumb.webp new file mode 100644 index 00000000..82962a3f Binary files /dev/null and b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08-thumb.webp differ diff --git a/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08.webp b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08.webp new file mode 100644 index 00000000..9b324311 Binary files /dev/null and b/backend/public/images/products/77/6849a7e8bbf2a91199bc70d2-ea359d08.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c-medium.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c-medium.webp new file mode 100644 index 00000000..34446640 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c-medium.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c-thumb.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c-thumb.webp new file mode 100644 index 00000000..3cd09fe4 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c-thumb.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c.webp new file mode 100644 index 00000000..cd8eaaf2 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7ab9-b119106c.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc-medium.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc-medium.webp new file mode 100644 index 00000000..f81c6851 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc-medium.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc-thumb.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc-thumb.webp new file mode 100644 index 00000000..1afed7d6 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc-thumb.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc.webp new file mode 100644 index 00000000..c1b20088 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7aba-1b5811cc.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357-medium.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357-medium.webp new file mode 100644 index 00000000..812d87d5 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357-medium.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357-thumb.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357-thumb.webp new file mode 100644 index 00000000..bc3febad Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357-thumb.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357.webp new file mode 100644 index 00000000..12fccf56 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abb-4ed76357.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d-medium.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d-medium.webp new file mode 100644 index 00000000..d5998b2a Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d-medium.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d-thumb.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d-thumb.webp new file mode 100644 index 00000000..d40ddd46 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d-thumb.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d.webp new file mode 100644 index 00000000..b4d8bd9d Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abc-8b81094d.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64-medium.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64-medium.webp new file mode 100644 index 00000000..6c5f978e Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64-medium.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64-thumb.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64-thumb.webp new file mode 100644 index 00000000..9de803f8 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64-thumb.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64.webp new file mode 100644 index 00000000..373bf029 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abd-3898ac64.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512-medium.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512-medium.webp new file mode 100644 index 00000000..dd67d0d6 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512-medium.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512-thumb.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512-thumb.webp new file mode 100644 index 00000000..a79b4b14 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512-thumb.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512.webp new file mode 100644 index 00000000..cdea4ea1 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abe-ba563512.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7-medium.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7-medium.webp new file mode 100644 index 00000000..abaad3df Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7-medium.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7-thumb.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7-thumb.webp new file mode 100644 index 00000000..346137a2 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7-thumb.webp differ diff --git a/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7.webp b/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7.webp new file mode 100644 index 00000000..7b107951 Binary files /dev/null and b/backend/public/images/products/77/6849b8c1d94151c8972b7abf-0c7d55a7.webp differ diff --git a/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70-medium.webp b/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70-medium.webp new file mode 100644 index 00000000..0da71289 Binary files /dev/null and b/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70-medium.webp differ diff --git a/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70-thumb.webp b/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70-thumb.webp new file mode 100644 index 00000000..bcd59072 Binary files /dev/null and b/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70-thumb.webp differ diff --git a/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70.webp b/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70.webp new file mode 100644 index 00000000..9f881f7e Binary files /dev/null and b/backend/public/images/products/77/6849c50c14c09aca39bc2b02-ffe4ef70.webp differ diff --git a/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72-medium.webp b/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72-medium.webp new file mode 100644 index 00000000..136782ad Binary files /dev/null and b/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72-medium.webp differ diff --git a/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72-thumb.webp b/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72-thumb.webp new file mode 100644 index 00000000..25ac496f Binary files /dev/null and b/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72-thumb.webp differ diff --git a/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72.webp b/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72.webp new file mode 100644 index 00000000..185ea7b8 Binary files /dev/null and b/backend/public/images/products/77/6849d5ff5e967fdeb98eb700-73ed6b72.webp differ diff --git a/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459-medium.webp b/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459-medium.webp new file mode 100644 index 00000000..d29b8a35 Binary files /dev/null and b/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459-medium.webp differ diff --git a/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459-thumb.webp b/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459-thumb.webp new file mode 100644 index 00000000..ce0e585f Binary files /dev/null and b/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459-thumb.webp differ diff --git a/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459.webp b/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459.webp new file mode 100644 index 00000000..f85fa24d Binary files /dev/null and b/backend/public/images/products/77/684b0e197b7326b43a09951c-a7919459.webp differ diff --git a/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e-medium.webp b/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e-medium.webp new file mode 100644 index 00000000..99a8b652 Binary files /dev/null and b/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e-medium.webp differ diff --git a/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e-thumb.webp b/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e-thumb.webp new file mode 100644 index 00000000..0537d2b8 Binary files /dev/null and b/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e-thumb.webp differ diff --git a/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e.webp b/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e.webp new file mode 100644 index 00000000..ff000a98 Binary files /dev/null and b/backend/public/images/products/77/684b13713007875d9dee7375-42c1403e.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea-medium.webp b/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea-medium.webp new file mode 100644 index 00000000..bc033310 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea-medium.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea-thumb.webp b/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea-thumb.webp new file mode 100644 index 00000000..4ebcd630 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea-thumb.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea.webp b/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea.webp new file mode 100644 index 00000000..c8672bc4 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a13-e324ddea.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6-medium.webp b/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6-thumb.webp b/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6.webp b/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a16-701c49c6.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6-medium.webp b/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6-thumb.webp b/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6.webp b/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a17-701c49c6.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370-medium.webp b/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370-medium.webp new file mode 100644 index 00000000..71fd4c68 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370-medium.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370-thumb.webp b/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370-thumb.webp new file mode 100644 index 00000000..ae3a8ff8 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370-thumb.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370.webp b/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370.webp new file mode 100644 index 00000000..41a47236 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a1e-51d69370.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91-medium.webp b/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91-medium.webp new file mode 100644 index 00000000..b66dd76b Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91-medium.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91-thumb.webp b/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91-thumb.webp new file mode 100644 index 00000000..8b3ee710 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91-thumb.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91.webp b/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91.webp new file mode 100644 index 00000000..d1622a23 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a21-8af18c91.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292-medium.webp b/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292-medium.webp new file mode 100644 index 00000000..609bb5e8 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292-medium.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292-thumb.webp b/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292-thumb.webp new file mode 100644 index 00000000..afd013b9 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292-thumb.webp differ diff --git a/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292.webp b/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292.webp new file mode 100644 index 00000000..82eef740 Binary files /dev/null and b/backend/public/images/products/77/684b2981aa5a39f624573a28-d4091292.webp differ diff --git a/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef-medium.webp b/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef-medium.webp new file mode 100644 index 00000000..d4f08548 Binary files /dev/null and b/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef-medium.webp differ diff --git a/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef-thumb.webp b/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef-thumb.webp new file mode 100644 index 00000000..4e21681e Binary files /dev/null and b/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef-thumb.webp differ diff --git a/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef.webp b/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef.webp new file mode 100644 index 00000000..0c234048 Binary files /dev/null and b/backend/public/images/products/77/684c826837eb5342b7d17c5b-3fbfd6ef.webp differ diff --git a/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae-medium.webp b/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae-medium.webp new file mode 100644 index 00000000..4f389d0a Binary files /dev/null and b/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae-medium.webp differ diff --git a/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae-thumb.webp b/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae-thumb.webp new file mode 100644 index 00000000..e1b4dd5b Binary files /dev/null and b/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae-thumb.webp differ diff --git a/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae.webp b/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae.webp new file mode 100644 index 00000000..961cc8fc Binary files /dev/null and b/backend/public/images/products/77/684c84ccf8f74fdf996fbccc-a501f2ae.webp differ diff --git a/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952-medium.webp b/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952-medium.webp new file mode 100644 index 00000000..b484a50d Binary files /dev/null and b/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952-medium.webp differ diff --git a/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952-thumb.webp b/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952-thumb.webp new file mode 100644 index 00000000..8114d95e Binary files /dev/null and b/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952-thumb.webp differ diff --git a/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952.webp b/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952.webp new file mode 100644 index 00000000..bbc55cf7 Binary files /dev/null and b/backend/public/images/products/77/684f9e2246f27a1722153f67-f0ea2952.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940-medium.webp b/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940-medium.webp new file mode 100644 index 00000000..097633b3 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940-medium.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940-thumb.webp b/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940-thumb.webp new file mode 100644 index 00000000..510ca6d3 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940-thumb.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940.webp b/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940.webp new file mode 100644 index 00000000..fcf3aebf Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728620-cc0f0940.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00-medium.webp b/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00-medium.webp new file mode 100644 index 00000000..6fe13f37 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00-medium.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00-thumb.webp b/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00-thumb.webp new file mode 100644 index 00000000..e90e24c1 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00-thumb.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00.webp b/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00.webp new file mode 100644 index 00000000..b268212c Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728623-7748ba00.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f-medium.webp b/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f-medium.webp new file mode 100644 index 00000000..97525985 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f-medium.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f-thumb.webp b/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f-thumb.webp new file mode 100644 index 00000000..22afc420 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f-thumb.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f.webp b/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f.webp new file mode 100644 index 00000000..2bc436a0 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728624-3ddb567f.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef-medium.webp b/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef-medium.webp new file mode 100644 index 00000000..2b7d9768 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef-medium.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef-thumb.webp b/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef-thumb.webp new file mode 100644 index 00000000..7847ff12 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef-thumb.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef.webp b/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef.webp new file mode 100644 index 00000000..dabe32da Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec728628-7a90ccef.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076-medium.webp b/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076-medium.webp new file mode 100644 index 00000000..827d893e Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076-medium.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076-thumb.webp b/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076-thumb.webp new file mode 100644 index 00000000..7abe74b1 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076-thumb.webp differ diff --git a/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076.webp b/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076.webp new file mode 100644 index 00000000..60952841 Binary files /dev/null and b/backend/public/images/products/77/68504d0752cfe862ec72862b-90237076.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f-medium.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f-medium.webp new file mode 100644 index 00000000..f72eb145 Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f-medium.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f-thumb.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f-thumb.webp new file mode 100644 index 00000000..ab2765eb Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f-thumb.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f.webp new file mode 100644 index 00000000..e8a07c68 Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d6f9-18c6e59f.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad-medium.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad-medium.webp new file mode 100644 index 00000000..1d1b74fb Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad-medium.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad-thumb.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad-thumb.webp new file mode 100644 index 00000000..ff4fd21e Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad-thumb.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad.webp new file mode 100644 index 00000000..edd3fe81 Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d705-bfc3fbad.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad-medium.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad-medium.webp new file mode 100644 index 00000000..1d1b74fb Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad-medium.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad-thumb.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad-thumb.webp new file mode 100644 index 00000000..ff4fd21e Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad-thumb.webp differ diff --git a/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad.webp b/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad.webp new file mode 100644 index 00000000..edd3fe81 Binary files /dev/null and b/backend/public/images/products/77/68504fd18a2f506c78a7d706-bfc3fbad.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168-medium.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168-medium.webp new file mode 100644 index 00000000..d32d4508 Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168-medium.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168-thumb.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168-thumb.webp new file mode 100644 index 00000000..d4cdb740 Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168-thumb.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168.webp new file mode 100644 index 00000000..9af307e4 Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ab-ae1b6168.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed-medium.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed-medium.webp new file mode 100644 index 00000000..3d11107e Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed-medium.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed-thumb.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed-thumb.webp new file mode 100644 index 00000000..7256ee78 Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed-thumb.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed.webp new file mode 100644 index 00000000..e20f9c12 Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ac-ffcdefed.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2-medium.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2-medium.webp new file mode 100644 index 00000000..c61ce919 Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2-medium.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2-thumb.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2-thumb.webp new file mode 100644 index 00000000..3b347fbb Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2-thumb.webp differ diff --git a/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2.webp b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2.webp new file mode 100644 index 00000000..0e4754b7 Binary files /dev/null and b/backend/public/images/products/77/685056ec8246d4ca4e3ff7ad-6f979cf2.webp differ diff --git a/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b-medium.webp b/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b-medium.webp new file mode 100644 index 00000000..0626e28c Binary files /dev/null and b/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b-medium.webp differ diff --git a/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b-thumb.webp b/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b-thumb.webp new file mode 100644 index 00000000..4ab38801 Binary files /dev/null and b/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b-thumb.webp differ diff --git a/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b.webp b/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b.webp new file mode 100644 index 00000000..26b67c5b Binary files /dev/null and b/backend/public/images/products/77/68505b4d1dee83bc39361243-7473b02b.webp differ diff --git a/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01-medium.webp b/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01-medium.webp new file mode 100644 index 00000000..843d32f0 Binary files /dev/null and b/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01-medium.webp differ diff --git a/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01-thumb.webp b/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01-thumb.webp new file mode 100644 index 00000000..650d9e40 Binary files /dev/null and b/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01-thumb.webp differ diff --git a/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01.webp b/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01.webp new file mode 100644 index 00000000..49ece2ef Binary files /dev/null and b/backend/public/images/products/77/68518c2b694591c334194177-3ff96d01.webp differ diff --git a/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4-medium.webp b/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4-thumb.webp b/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4.webp b/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/6851afe9ebb23679e309d07c-752aa3a4.webp differ diff --git a/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4-medium.webp b/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4-thumb.webp b/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4.webp b/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/6851afe9ebb23679e309d07d-752aa3a4.webp differ diff --git a/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363-medium.webp b/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363-medium.webp new file mode 100644 index 00000000..7bce330e Binary files /dev/null and b/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363-medium.webp differ diff --git a/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363-thumb.webp b/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363-thumb.webp new file mode 100644 index 00000000..b210343f Binary files /dev/null and b/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363-thumb.webp differ diff --git a/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363.webp b/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363.webp new file mode 100644 index 00000000..3e148567 Binary files /dev/null and b/backend/public/images/products/77/6851bc121ac0dc3eefc6359f-44429363.webp differ diff --git a/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158-medium.webp b/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158-medium.webp new file mode 100644 index 00000000..377899da Binary files /dev/null and b/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158-medium.webp differ diff --git a/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158-thumb.webp b/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158-thumb.webp new file mode 100644 index 00000000..124c4827 Binary files /dev/null and b/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158-thumb.webp differ diff --git a/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158.webp b/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158.webp new file mode 100644 index 00000000..00a8537d Binary files /dev/null and b/backend/public/images/products/77/6851c3aea3ee5ddf131b116e-3a6f4158.webp differ diff --git a/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49-medium.webp b/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49-medium.webp new file mode 100644 index 00000000..3695b191 Binary files /dev/null and b/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49-medium.webp differ diff --git a/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49-thumb.webp b/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49-thumb.webp new file mode 100644 index 00000000..ba5488ae Binary files /dev/null and b/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49-thumb.webp differ diff --git a/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49.webp b/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49.webp new file mode 100644 index 00000000..fec511f4 Binary files /dev/null and b/backend/public/images/products/77/6851c3aea3ee5ddf131b1171-471dfd49.webp differ diff --git a/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80-medium.webp b/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80-medium.webp new file mode 100644 index 00000000..b6829013 Binary files /dev/null and b/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80-medium.webp differ diff --git a/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80-thumb.webp b/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80-thumb.webp new file mode 100644 index 00000000..95e6ae47 Binary files /dev/null and b/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80-thumb.webp differ diff --git a/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80.webp b/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80.webp new file mode 100644 index 00000000..4f372bf7 Binary files /dev/null and b/backend/public/images/products/77/6852e6531bdc0a28a9defa45-46a8fb80.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6-medium.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6-thumb.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c1-701c49c6.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6-medium.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6-thumb.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c2-701c49c6.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6-medium.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6-thumb.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c6-701c49c6.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6-medium.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6-thumb.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6.webp b/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/685323658e7b2e8611e0c7c7-701c49c6.webp differ diff --git a/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f-medium.webp b/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f-medium.webp new file mode 100644 index 00000000..11d585c9 Binary files /dev/null and b/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f-medium.webp differ diff --git a/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f-thumb.webp b/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f-thumb.webp new file mode 100644 index 00000000..62495cd9 Binary files /dev/null and b/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f-thumb.webp differ diff --git a/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f.webp b/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f.webp new file mode 100644 index 00000000..fc69ada8 Binary files /dev/null and b/backend/public/images/products/77/6854de2d704586fc71fa5680-4e71323f.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5-medium.webp b/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5-medium.webp new file mode 100644 index 00000000..317c8701 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5-medium.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5-thumb.webp b/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5-thumb.webp new file mode 100644 index 00000000..decfe949 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5-thumb.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5.webp b/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5.webp new file mode 100644 index 00000000..4c1b3ba4 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c5-99efaed5.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a-medium.webp b/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a-medium.webp new file mode 100644 index 00000000..37293c30 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a-medium.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a-thumb.webp b/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a-thumb.webp new file mode 100644 index 00000000..42eb77a8 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a-thumb.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a.webp b/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a.webp new file mode 100644 index 00000000..fe041241 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c7-8061450a.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39-medium.webp b/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39-medium.webp new file mode 100644 index 00000000..af87fe64 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39-medium.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39-thumb.webp b/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39-thumb.webp new file mode 100644 index 00000000..3bf56933 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39-thumb.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39.webp b/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39.webp new file mode 100644 index 00000000..fbb2cc44 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c8-957bef39.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d-medium.webp b/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d-medium.webp new file mode 100644 index 00000000..5324b768 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d-medium.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d-thumb.webp b/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d-thumb.webp new file mode 100644 index 00000000..4fec3975 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d-thumb.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d.webp b/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d.webp new file mode 100644 index 00000000..3ff2de53 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869c9-76731d2d.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6-medium.webp b/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6-medium.webp new file mode 100644 index 00000000..be9dc6a7 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6-medium.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6-thumb.webp b/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6-thumb.webp new file mode 100644 index 00000000..1b7708ba Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6-thumb.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6.webp b/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6.webp new file mode 100644 index 00000000..7a527e03 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869ca-88a859b6.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d-medium.webp b/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d-medium.webp new file mode 100644 index 00000000..d9f92220 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d-medium.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d-thumb.webp b/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d-thumb.webp new file mode 100644 index 00000000..69b22bfd Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d-thumb.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d.webp b/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d.webp new file mode 100644 index 00000000..4708c088 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869cb-abca866d.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d-medium.webp b/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d-medium.webp new file mode 100644 index 00000000..d9f92220 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d-medium.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d-thumb.webp b/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d-thumb.webp new file mode 100644 index 00000000..69b22bfd Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d-thumb.webp differ diff --git a/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d.webp b/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d.webp new file mode 100644 index 00000000..4708c088 Binary files /dev/null and b/backend/public/images/products/77/6855cf10dd9626625df869cd-abca866d.webp differ diff --git a/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621-medium.webp b/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621-medium.webp new file mode 100644 index 00000000..7c39c927 Binary files /dev/null and b/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621-medium.webp differ diff --git a/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621-thumb.webp b/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621-thumb.webp new file mode 100644 index 00000000..ba24b9dd Binary files /dev/null and b/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621-thumb.webp differ diff --git a/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621.webp b/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621.webp new file mode 100644 index 00000000..caed786c Binary files /dev/null and b/backend/public/images/products/77/6855d866389d4bc1743ea63b-3f49f621.webp differ diff --git a/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509-medium.webp b/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509-medium.webp new file mode 100644 index 00000000..5b049676 Binary files /dev/null and b/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509-medium.webp differ diff --git a/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509-thumb.webp b/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509-thumb.webp new file mode 100644 index 00000000..7fa0ab03 Binary files /dev/null and b/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509-thumb.webp differ diff --git a/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509.webp b/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509.webp new file mode 100644 index 00000000..0903aa71 Binary files /dev/null and b/backend/public/images/products/77/6856a9132ec5e77067b22b40-0883e509.webp differ diff --git a/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533-medium.webp b/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533-medium.webp new file mode 100644 index 00000000..df31525b Binary files /dev/null and b/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533-medium.webp differ diff --git a/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533-thumb.webp b/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533-thumb.webp new file mode 100644 index 00000000..532d45b6 Binary files /dev/null and b/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533-thumb.webp differ diff --git a/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533.webp b/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533.webp new file mode 100644 index 00000000..fff5dd98 Binary files /dev/null and b/backend/public/images/products/77/68597be78a2f506c781beb36-9a57f533.webp differ diff --git a/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70-medium.webp b/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70-medium.webp new file mode 100644 index 00000000..b70ea694 Binary files /dev/null and b/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70-medium.webp differ diff --git a/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70-thumb.webp b/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70-thumb.webp new file mode 100644 index 00000000..95195241 Binary files /dev/null and b/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70-thumb.webp differ diff --git a/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70.webp b/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70.webp new file mode 100644 index 00000000..e15cb1bf Binary files /dev/null and b/backend/public/images/products/77/68597be78a2f506c781beb38-4e1dbc70.webp differ diff --git a/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911-medium.webp b/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911-medium.webp new file mode 100644 index 00000000..1d815e9a Binary files /dev/null and b/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911-medium.webp differ diff --git a/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911-thumb.webp b/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911-thumb.webp new file mode 100644 index 00000000..e524af4b Binary files /dev/null and b/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911-thumb.webp differ diff --git a/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911.webp b/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911.webp new file mode 100644 index 00000000..42d444b8 Binary files /dev/null and b/backend/public/images/products/77/68599dc016d4edfc3c8d20fc-73065911.webp differ diff --git a/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5-medium.webp b/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5-medium.webp new file mode 100644 index 00000000..a94d363b Binary files /dev/null and b/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5-medium.webp differ diff --git a/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5-thumb.webp b/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5-thumb.webp new file mode 100644 index 00000000..a49bba72 Binary files /dev/null and b/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5-thumb.webp differ diff --git a/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5.webp b/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5.webp new file mode 100644 index 00000000..0c07656a Binary files /dev/null and b/backend/public/images/products/77/685acf0cc7a90e8a1322c26c-e6555fc5.webp differ diff --git a/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6-medium.webp b/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6-thumb.webp b/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6.webp b/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/685ad607e2a07e4149984ef7-701c49c6.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139-medium.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139-medium.webp new file mode 100644 index 00000000..8a80107e Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139-medium.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139-thumb.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139-thumb.webp new file mode 100644 index 00000000..acb5a8d8 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139-thumb.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139.webp new file mode 100644 index 00000000..ca3e9fce Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b33-1fc7e139.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf-medium.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf-medium.webp new file mode 100644 index 00000000..3145d733 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf-medium.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf-thumb.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf-thumb.webp new file mode 100644 index 00000000..e3b16af2 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf-thumb.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf.webp new file mode 100644 index 00000000..04e90408 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b37-971d4ebf.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17-medium.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17-medium.webp new file mode 100644 index 00000000..7f83b4a9 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17-medium.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17-thumb.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17-thumb.webp new file mode 100644 index 00000000..9b1b14d8 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17-thumb.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17.webp new file mode 100644 index 00000000..2747f101 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b38-cc4efd17.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2-medium.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2-medium.webp new file mode 100644 index 00000000..25e28a25 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2-medium.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2-thumb.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2-thumb.webp new file mode 100644 index 00000000..136d67cf Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2-thumb.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2.webp new file mode 100644 index 00000000..eea406ed Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b3a-a1df1ab2.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19-medium.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19-medium.webp new file mode 100644 index 00000000..40113fa2 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19-medium.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19-thumb.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19-thumb.webp new file mode 100644 index 00000000..a3284698 Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19-thumb.webp differ diff --git a/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19.webp b/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19.webp new file mode 100644 index 00000000..4669f83d Binary files /dev/null and b/backend/public/images/products/77/685c2a5ce2a07e4149080b3b-f8239c19.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d-medium.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d-medium.webp new file mode 100644 index 00000000..a96895c3 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d-medium.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d-thumb.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d-thumb.webp new file mode 100644 index 00000000..679c35b3 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d-thumb.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d.webp new file mode 100644 index 00000000..1fa585dc Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d1-a8b8e38d.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6-medium.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6-medium.webp new file mode 100644 index 00000000..e50c76dd Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6-medium.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6-thumb.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6-thumb.webp new file mode 100644 index 00000000..fb9e0b07 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6-thumb.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6.webp new file mode 100644 index 00000000..0af96882 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d2-277b72d6.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817-medium.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817-medium.webp new file mode 100644 index 00000000..64bb27d5 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817-medium.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817-thumb.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817-thumb.webp new file mode 100644 index 00000000..33277e0e Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817-thumb.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817.webp new file mode 100644 index 00000000..5562a25d Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d3-f56cc817.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208-medium.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208-medium.webp new file mode 100644 index 00000000..4259d25a Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208-medium.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208-thumb.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208-thumb.webp new file mode 100644 index 00000000..0e005086 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208-thumb.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208.webp new file mode 100644 index 00000000..d68a81a4 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d4-84ed1208.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e-medium.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e-medium.webp new file mode 100644 index 00000000..890cea18 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e-medium.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e-thumb.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e-thumb.webp new file mode 100644 index 00000000..6935ff23 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e-thumb.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e.webp new file mode 100644 index 00000000..182d9308 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d5-fa930d9e.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed-medium.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed-medium.webp new file mode 100644 index 00000000..5a1bf55c Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed-medium.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed-thumb.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed-thumb.webp new file mode 100644 index 00000000..5e46fde6 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed-thumb.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed.webp new file mode 100644 index 00000000..b33769a1 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d6-166e7fed.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977-medium.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977-medium.webp new file mode 100644 index 00000000..bd46ac7f Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977-medium.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977-thumb.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977-thumb.webp new file mode 100644 index 00000000..1b2ef0fb Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977-thumb.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977.webp new file mode 100644 index 00000000..2277a99c Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d8-aab8a977.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd-medium.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd-medium.webp new file mode 100644 index 00000000..1a5ec4af Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd-medium.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd-thumb.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd-thumb.webp new file mode 100644 index 00000000..cae38462 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd-thumb.webp differ diff --git a/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd.webp b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd.webp new file mode 100644 index 00000000..dd6985c6 Binary files /dev/null and b/backend/public/images/products/77/685c3c0b1b4b906c2b6f00d9-c25820cd.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6-medium.webp b/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6-thumb.webp b/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6.webp b/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90d9-701c49c6.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413-medium.webp b/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413-medium.webp new file mode 100644 index 00000000..5681ea8b Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413-medium.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413-thumb.webp b/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413-thumb.webp new file mode 100644 index 00000000..e8e80ae6 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413-thumb.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413.webp b/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413.webp new file mode 100644 index 00000000..10ebc83c Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90dc-46c1e413.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd-medium.webp b/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd-thumb.webp b/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd.webp b/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90dd-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd-medium.webp b/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd-thumb.webp b/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd.webp b/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90de-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd-medium.webp b/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd-thumb.webp b/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd.webp b/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90df-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080-medium.webp b/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080-medium.webp new file mode 100644 index 00000000..0f49c3c4 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080-medium.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080-thumb.webp b/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080-thumb.webp new file mode 100644 index 00000000..f17fc236 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080-thumb.webp differ diff --git a/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080.webp b/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080.webp new file mode 100644 index 00000000..df7f01f4 Binary files /dev/null and b/backend/public/images/products/77/685c45bccf2d358d175a90e0-dd854080.webp differ diff --git a/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd-medium.webp b/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd-thumb.webp b/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd.webp b/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/685c487a7bd5ccec58ec5ba7-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2-medium.webp b/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2-medium.webp new file mode 100644 index 00000000..41d7d525 Binary files /dev/null and b/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2-medium.webp differ diff --git a/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2-thumb.webp b/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2-thumb.webp new file mode 100644 index 00000000..da8abcf1 Binary files /dev/null and b/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2-thumb.webp differ diff --git a/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2.webp b/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2.webp new file mode 100644 index 00000000..b2a2dddf Binary files /dev/null and b/backend/public/images/products/77/685c4d2456e9bb705602826d-058186f2.webp differ diff --git a/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9-medium.webp b/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9-medium.webp new file mode 100644 index 00000000..c9a8f94a Binary files /dev/null and b/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9-medium.webp differ diff --git a/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9-thumb.webp b/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9-thumb.webp new file mode 100644 index 00000000..2c9e150d Binary files /dev/null and b/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9-thumb.webp differ diff --git a/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9.webp b/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9.webp new file mode 100644 index 00000000..cb7a2a4f Binary files /dev/null and b/backend/public/images/products/77/685d78bd14d9a886ede5dfc5-ab4fc6e9.webp differ diff --git a/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf-medium.webp b/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf-medium.webp new file mode 100644 index 00000000..3145d733 Binary files /dev/null and b/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf-medium.webp differ diff --git a/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf-thumb.webp b/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf-thumb.webp new file mode 100644 index 00000000..e3b16af2 Binary files /dev/null and b/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf-thumb.webp differ diff --git a/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf.webp b/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf.webp new file mode 100644 index 00000000..04e90408 Binary files /dev/null and b/backend/public/images/products/77/685d78bd14d9a886ede5dfc6-971d4ebf.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4-medium.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4-thumb.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14b8-752aa3a4.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4-medium.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4-thumb.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14ba-752aa3a4.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4-medium.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4-thumb.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4.webp b/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/685ebde72c9d06fdeece14bb-752aa3a4.webp differ diff --git a/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc-medium.webp b/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc-medium.webp new file mode 100644 index 00000000..b570685d Binary files /dev/null and b/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc-medium.webp differ diff --git a/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc-thumb.webp b/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc-thumb.webp new file mode 100644 index 00000000..9edaf348 Binary files /dev/null and b/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc-thumb.webp differ diff --git a/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc.webp b/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc.webp new file mode 100644 index 00000000..2d2834b4 Binary files /dev/null and b/backend/public/images/products/77/685ebe3c20884ca53d39ee71-7ddcfecc.webp differ diff --git a/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6-medium.webp b/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6-thumb.webp b/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6.webp b/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/685ee27002effc26b0d369d2-701c49c6.webp differ diff --git a/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412-medium.webp b/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412-medium.webp new file mode 100644 index 00000000..2686cc4b Binary files /dev/null and b/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412-medium.webp differ diff --git a/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412-thumb.webp b/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412-thumb.webp new file mode 100644 index 00000000..ba44dd18 Binary files /dev/null and b/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412-thumb.webp differ diff --git a/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412.webp b/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412.webp new file mode 100644 index 00000000..ec91d6b8 Binary files /dev/null and b/backend/public/images/products/77/685eef19fa048180b23c8851-c0343412.webp differ diff --git a/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39-medium.webp b/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39-medium.webp new file mode 100644 index 00000000..4d12c14b Binary files /dev/null and b/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39-medium.webp differ diff --git a/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39-thumb.webp b/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39-thumb.webp new file mode 100644 index 00000000..67f9de0f Binary files /dev/null and b/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39-thumb.webp differ diff --git a/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39.webp b/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39.webp new file mode 100644 index 00000000..ed70a045 Binary files /dev/null and b/backend/public/images/products/77/686174e928ade8ee53f689d6-908cda39.webp differ diff --git a/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139-medium.webp b/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139-medium.webp new file mode 100644 index 00000000..8a80107e Binary files /dev/null and b/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139-medium.webp differ diff --git a/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139-thumb.webp b/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139-thumb.webp new file mode 100644 index 00000000..acb5a8d8 Binary files /dev/null and b/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139-thumb.webp differ diff --git a/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139.webp b/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139.webp new file mode 100644 index 00000000..ca3e9fce Binary files /dev/null and b/backend/public/images/products/77/686403ea78b3343e6b35b17d-1fc7e139.webp differ diff --git a/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6-medium.webp b/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6-medium.webp new file mode 100644 index 00000000..55573651 Binary files /dev/null and b/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6-medium.webp differ diff --git a/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6-thumb.webp b/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6-thumb.webp new file mode 100644 index 00000000..4e9eee91 Binary files /dev/null and b/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6-thumb.webp differ diff --git a/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6.webp b/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6.webp new file mode 100644 index 00000000..774095f4 Binary files /dev/null and b/backend/public/images/products/77/686413461763122e4dd34824-27cad1e6.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba-medium.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba-medium.webp new file mode 100644 index 00000000..a82f5181 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba-medium.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba-thumb.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba-thumb.webp new file mode 100644 index 00000000..bafc3f6e Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba-thumb.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba.webp new file mode 100644 index 00000000..55664a2f Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9596-f0b484ba.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910-medium.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910-medium.webp new file mode 100644 index 00000000..258004cc Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910-medium.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910-thumb.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910-thumb.webp new file mode 100644 index 00000000..5b474566 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910-thumb.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910.webp new file mode 100644 index 00000000..ba1e8a42 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9597-93e28910.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4-medium.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4-thumb.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9598-752aa3a4.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4-medium.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4-thumb.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf9599-752aa3a4.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4-medium.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4-thumb.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf959b-752aa3a4.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49-medium.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49-medium.webp new file mode 100644 index 00000000..beef9556 Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49-medium.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49-thumb.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49-thumb.webp new file mode 100644 index 00000000..5eba3aed Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49-thumb.webp differ diff --git a/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49.webp b/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49.webp new file mode 100644 index 00000000..5be425fc Binary files /dev/null and b/backend/public/images/products/77/6864181b1df0b22b5ebf959e-4c489e49.webp differ diff --git a/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67-medium.webp b/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67-medium.webp new file mode 100644 index 00000000..3c81a2db Binary files /dev/null and b/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67-medium.webp differ diff --git a/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67-thumb.webp b/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67-thumb.webp new file mode 100644 index 00000000..1239c523 Binary files /dev/null and b/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67-thumb.webp differ diff --git a/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67.webp b/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67.webp new file mode 100644 index 00000000..904935d1 Binary files /dev/null and b/backend/public/images/products/77/6864217eb6cc66aecea24822-251d7d67.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13-medium.webp b/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13-medium.webp new file mode 100644 index 00000000..9f8aa2b0 Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13-medium.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13-thumb.webp b/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13-thumb.webp new file mode 100644 index 00000000..55f1f14a Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13-thumb.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13.webp b/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13.webp new file mode 100644 index 00000000..000df19e Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c03-1fb14f13.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787-medium.webp b/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787-medium.webp new file mode 100644 index 00000000..c8ab5f82 Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787-medium.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787-thumb.webp b/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787-thumb.webp new file mode 100644 index 00000000..dc897b56 Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787-thumb.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787.webp b/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787.webp new file mode 100644 index 00000000..4560a2ad Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c04-5ce7b787.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa-medium.webp b/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa-medium.webp new file mode 100644 index 00000000..41238d39 Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa-medium.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa-thumb.webp b/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa-thumb.webp new file mode 100644 index 00000000..1dd5a01f Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa-thumb.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa.webp b/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa.webp new file mode 100644 index 00000000..87d1ba0a Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c05-6bf0e3fa.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f-medium.webp b/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f-medium.webp new file mode 100644 index 00000000..5bb50b3d Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f-medium.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f-thumb.webp b/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f-thumb.webp new file mode 100644 index 00000000..85f64493 Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f-thumb.webp differ diff --git a/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f.webp b/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f.webp new file mode 100644 index 00000000..82af9f23 Binary files /dev/null and b/backend/public/images/products/77/686424011f9af5e1575f7c06-93c6712f.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba-medium.webp b/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba-medium.webp new file mode 100644 index 00000000..0bd2bde2 Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba-medium.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba-thumb.webp b/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba-thumb.webp new file mode 100644 index 00000000..bc122b78 Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba-thumb.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba.webp b/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba.webp new file mode 100644 index 00000000..ed6957b7 Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011c-7b9233ba.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796-medium.webp b/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796-medium.webp new file mode 100644 index 00000000..ab1b382e Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796-medium.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796-thumb.webp b/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796-thumb.webp new file mode 100644 index 00000000..6ed24a2f Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796-thumb.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796.webp b/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796.webp new file mode 100644 index 00000000..2b2d1186 Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011d-fe069796.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d-medium.webp b/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d-medium.webp new file mode 100644 index 00000000..373b642a Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d-medium.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d-thumb.webp b/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d-thumb.webp new file mode 100644 index 00000000..ea3872a0 Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d-thumb.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d.webp b/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d.webp new file mode 100644 index 00000000..a7d301ed Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb011f-d0fc535d.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695-medium.webp b/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695-medium.webp new file mode 100644 index 00000000..7e610901 Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695-medium.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695-thumb.webp b/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695-thumb.webp new file mode 100644 index 00000000..29f699e6 Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695-thumb.webp differ diff --git a/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695.webp b/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695.webp new file mode 100644 index 00000000..4d76d5a8 Binary files /dev/null and b/backend/public/images/products/77/68658304a860a59b92fb0122-58a7b695.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f953448-5295376a-medium.webp b/backend/public/images/products/77/68658cb4b50404044f953448-5295376a-medium.webp new file mode 100644 index 00000000..be0e2ba0 Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f953448-5295376a-medium.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f953448-5295376a-thumb.webp b/backend/public/images/products/77/68658cb4b50404044f953448-5295376a-thumb.webp new file mode 100644 index 00000000..1715d466 Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f953448-5295376a-thumb.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f953448-5295376a.webp b/backend/public/images/products/77/68658cb4b50404044f953448-5295376a.webp new file mode 100644 index 00000000..ae9ec704 Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f953448-5295376a.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c-medium.webp b/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c-medium.webp new file mode 100644 index 00000000..4b7858a7 Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c-medium.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c-thumb.webp b/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c-thumb.webp new file mode 100644 index 00000000..3d9f1e2c Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c-thumb.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c.webp b/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c.webp new file mode 100644 index 00000000..c6a9dce8 Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f953449-f40f218c.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa-medium.webp b/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa-medium.webp new file mode 100644 index 00000000..3438f741 Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa-medium.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa-thumb.webp b/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa-thumb.webp new file mode 100644 index 00000000..7c92a67f Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa-thumb.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa.webp b/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa.webp new file mode 100644 index 00000000..abaf51cc Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f95344a-01701caa.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936-medium.webp b/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936-medium.webp new file mode 100644 index 00000000..b62e8c45 Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936-medium.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936-thumb.webp b/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936-thumb.webp new file mode 100644 index 00000000..bce4eb40 Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936-thumb.webp differ diff --git a/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936.webp b/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936.webp new file mode 100644 index 00000000..d52b2f9c Binary files /dev/null and b/backend/public/images/products/77/68658cb4b50404044f95344b-4a00f936.webp differ diff --git a/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529-medium.webp b/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529-thumb.webp b/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529.webp b/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/6866abf91ab8e6dca7bb51db-2a320529.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74-medium.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74-medium.webp new file mode 100644 index 00000000..988cb6c3 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74-medium.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74-thumb.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74-thumb.webp new file mode 100644 index 00000000..a4ce4fd2 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74-thumb.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74.webp new file mode 100644 index 00000000..a77f39dd Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9a-f794ff74.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029-medium.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029-medium.webp new file mode 100644 index 00000000..92a5deee Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029-medium.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029-thumb.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029-thumb.webp new file mode 100644 index 00000000..b67e209c Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029-thumb.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029.webp new file mode 100644 index 00000000..c3a526d3 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9b-d7e6e029.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db-medium.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db-medium.webp new file mode 100644 index 00000000..9c67e895 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db-medium.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db-thumb.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db-thumb.webp new file mode 100644 index 00000000..f9452939 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db-thumb.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db.webp b/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db.webp new file mode 100644 index 00000000..930c1c05 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78f9f-04fd41db.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13-medium.webp b/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13-medium.webp new file mode 100644 index 00000000..bbd42926 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13-medium.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13-thumb.webp b/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13-thumb.webp new file mode 100644 index 00000000..9d0a779b Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13-thumb.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13.webp b/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13.webp new file mode 100644 index 00000000..5defbf00 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78fa0-c7ef3e13.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f-medium.webp b/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f-medium.webp new file mode 100644 index 00000000..7d6d9c47 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f-medium.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f-thumb.webp b/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f-thumb.webp new file mode 100644 index 00000000..52164b83 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f-thumb.webp differ diff --git a/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f.webp b/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f.webp new file mode 100644 index 00000000..2baf3192 Binary files /dev/null and b/backend/public/images/products/77/6866d9b08b67ed118de78fa2-e785703f.webp differ diff --git a/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c-medium.webp b/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c-medium.webp new file mode 100644 index 00000000..c9ece984 Binary files /dev/null and b/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c-medium.webp differ diff --git a/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c-thumb.webp b/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c-thumb.webp new file mode 100644 index 00000000..70c1dd8e Binary files /dev/null and b/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c-thumb.webp differ diff --git a/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c.webp b/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c.webp new file mode 100644 index 00000000..5bcf3271 Binary files /dev/null and b/backend/public/images/products/77/686d74d6614ed587b947e858-b04ec21c.webp differ diff --git a/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860-medium.webp b/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860-medium.webp new file mode 100644 index 00000000..5c1bf130 Binary files /dev/null and b/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860-medium.webp differ diff --git a/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860-thumb.webp b/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860-thumb.webp new file mode 100644 index 00000000..c380324b Binary files /dev/null and b/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860-thumb.webp differ diff --git a/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860.webp b/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860.webp new file mode 100644 index 00000000..36453054 Binary files /dev/null and b/backend/public/images/products/77/686d8aecf020198f65bd3173-5598a860.webp differ diff --git a/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860-medium.webp b/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860-medium.webp new file mode 100644 index 00000000..5c1bf130 Binary files /dev/null and b/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860-medium.webp differ diff --git a/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860-thumb.webp b/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860-thumb.webp new file mode 100644 index 00000000..c380324b Binary files /dev/null and b/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860-thumb.webp differ diff --git a/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860.webp b/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860.webp new file mode 100644 index 00000000..36453054 Binary files /dev/null and b/backend/public/images/products/77/686d8aecf020198f65bd3175-5598a860.webp differ diff --git a/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8-medium.webp b/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8-medium.webp new file mode 100644 index 00000000..dadc2440 Binary files /dev/null and b/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8-medium.webp differ diff --git a/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8-thumb.webp b/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8-thumb.webp new file mode 100644 index 00000000..95b7d076 Binary files /dev/null and b/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8-thumb.webp differ diff --git a/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8.webp b/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8.webp new file mode 100644 index 00000000..e1a413fb Binary files /dev/null and b/backend/public/images/products/77/686e8559241573ac2eb0de00-28c44df8.webp differ diff --git a/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7-medium.webp b/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7-medium.webp new file mode 100644 index 00000000..ececf002 Binary files /dev/null and b/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7-medium.webp differ diff --git a/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7-thumb.webp b/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7-thumb.webp new file mode 100644 index 00000000..335cda0c Binary files /dev/null and b/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7-thumb.webp differ diff --git a/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7.webp b/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7.webp new file mode 100644 index 00000000..b1475245 Binary files /dev/null and b/backend/public/images/products/77/686e8559241573ac2eb0de02-fe8013e7.webp differ diff --git a/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4-medium.webp b/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4-thumb.webp b/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4.webp b/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/686ea8f29048ef3d51c006e3-752aa3a4.webp differ diff --git a/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4-medium.webp b/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4-thumb.webp b/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4.webp b/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/686ea8f29048ef3d51c006e4-752aa3a4.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35-medium.webp b/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35-medium.webp new file mode 100644 index 00000000..f60eaa2a Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35-medium.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35-thumb.webp b/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35-thumb.webp new file mode 100644 index 00000000..15181c3e Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35-thumb.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35.webp b/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35.webp new file mode 100644 index 00000000..a4c9a2bf Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc83628d-24369c35.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd-medium.webp b/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd-medium.webp new file mode 100644 index 00000000..62653b5f Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd-medium.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd-thumb.webp b/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd-thumb.webp new file mode 100644 index 00000000..73abf913 Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd-thumb.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd.webp b/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd.webp new file mode 100644 index 00000000..298ee0c6 Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc83628e-071edbcd.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29-medium.webp b/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29-medium.webp new file mode 100644 index 00000000..c61b1dc5 Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29-medium.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29-thumb.webp b/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29-thumb.webp new file mode 100644 index 00000000..03b61296 Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29-thumb.webp differ diff --git a/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29.webp b/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29.webp new file mode 100644 index 00000000..de090d3c Binary files /dev/null and b/backend/public/images/products/77/686ec046e00b49f7bc836291-dada8a29.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09-medium.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09-medium.webp new file mode 100644 index 00000000..63ca4afe Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09-medium.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09-thumb.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09-thumb.webp new file mode 100644 index 00000000..c83223e7 Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09-thumb.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09.webp new file mode 100644 index 00000000..91f876c0 Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75a-fde9cd09.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891-medium.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891-medium.webp new file mode 100644 index 00000000..d498b8a5 Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891-medium.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891-thumb.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891-thumb.webp new file mode 100644 index 00000000..ac85bbd3 Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891-thumb.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891.webp new file mode 100644 index 00000000..cb92d7e8 Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75c-79935891.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09-medium.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09-medium.webp new file mode 100644 index 00000000..63ca4afe Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09-medium.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09-thumb.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09-thumb.webp new file mode 100644 index 00000000..c83223e7 Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09-thumb.webp differ diff --git a/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09.webp b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09.webp new file mode 100644 index 00000000..91f876c0 Binary files /dev/null and b/backend/public/images/products/77/686ec9f0768fe2fe92eeb75d-fde9cd09.webp differ diff --git a/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05-medium.webp b/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05-medium.webp new file mode 100644 index 00000000..20206c11 Binary files /dev/null and b/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05-medium.webp differ diff --git a/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05-thumb.webp b/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05-thumb.webp new file mode 100644 index 00000000..594e8390 Binary files /dev/null and b/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05-thumb.webp differ diff --git a/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05.webp b/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05.webp new file mode 100644 index 00000000..7a816f8c Binary files /dev/null and b/backend/public/images/products/77/686ed57c70df84dbc14e4637-5860da05.webp differ diff --git a/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05-medium.webp b/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05-medium.webp new file mode 100644 index 00000000..20206c11 Binary files /dev/null and b/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05-medium.webp differ diff --git a/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05-thumb.webp b/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05-thumb.webp new file mode 100644 index 00000000..594e8390 Binary files /dev/null and b/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05-thumb.webp differ diff --git a/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05.webp b/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05.webp new file mode 100644 index 00000000..7a816f8c Binary files /dev/null and b/backend/public/images/products/77/686ed57c70df84dbc14e463a-5860da05.webp differ diff --git a/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961-medium.webp b/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961-medium.webp new file mode 100644 index 00000000..5b65df49 Binary files /dev/null and b/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961-medium.webp differ diff --git a/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961-thumb.webp b/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961-thumb.webp new file mode 100644 index 00000000..92216df6 Binary files /dev/null and b/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961-thumb.webp differ diff --git a/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961.webp b/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961.webp new file mode 100644 index 00000000..8f164650 Binary files /dev/null and b/backend/public/images/products/77/686f21e4c480e3b5723818ae-9b617961.webp differ diff --git a/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9-medium.webp b/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9-medium.webp new file mode 100644 index 00000000..ec5bb5ba Binary files /dev/null and b/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9-medium.webp differ diff --git a/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9-thumb.webp b/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9-thumb.webp new file mode 100644 index 00000000..9499fabe Binary files /dev/null and b/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9-thumb.webp differ diff --git a/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9.webp b/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9.webp new file mode 100644 index 00000000..bd41cfe3 Binary files /dev/null and b/backend/public/images/products/77/686fd1cba2fbc6cf5dfbe90f-8cd39df9.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544-medium.webp b/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544-thumb.webp b/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544.webp b/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cb-feef4544.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544-medium.webp b/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544-thumb.webp b/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544.webp b/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cc-feef4544.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544-medium.webp b/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544-thumb.webp b/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544.webp b/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/68700e71ed627ac542db53cd-feef4544.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1-medium.webp b/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1-medium.webp new file mode 100644 index 00000000..e33ec96d Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1-medium.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1-thumb.webp b/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1-thumb.webp new file mode 100644 index 00000000..b34f1132 Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1-thumb.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1.webp b/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1.webp new file mode 100644 index 00000000..bafaa46b Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354c8-1c6064a1.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1-medium.webp b/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1-medium.webp new file mode 100644 index 00000000..e33ec96d Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1-medium.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1-thumb.webp b/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1-thumb.webp new file mode 100644 index 00000000..b34f1132 Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1-thumb.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1.webp b/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1.webp new file mode 100644 index 00000000..bafaa46b Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354ca-1c6064a1.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1-medium.webp b/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1-medium.webp new file mode 100644 index 00000000..e33ec96d Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1-medium.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1-thumb.webp b/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1-thumb.webp new file mode 100644 index 00000000..b34f1132 Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1-thumb.webp differ diff --git a/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1.webp b/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1.webp new file mode 100644 index 00000000..bafaa46b Binary files /dev/null and b/backend/public/images/products/77/6871365f3357a01f121354cb-1c6064a1.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3-medium.webp b/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3-medium.webp new file mode 100644 index 00000000..b22da847 Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3-medium.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3-thumb.webp b/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3-thumb.webp new file mode 100644 index 00000000..9fae2b30 Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3-thumb.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3.webp b/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3.webp new file mode 100644 index 00000000..97f2b0bc Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff117d-a68426e3.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff117e-fee24228-medium.webp b/backend/public/images/products/77/68713b561153d30281ff117e-fee24228-medium.webp new file mode 100644 index 00000000..39caa8fd Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff117e-fee24228-medium.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff117e-fee24228-thumb.webp b/backend/public/images/products/77/68713b561153d30281ff117e-fee24228-thumb.webp new file mode 100644 index 00000000..fa58e530 Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff117e-fee24228-thumb.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff117e-fee24228.webp b/backend/public/images/products/77/68713b561153d30281ff117e-fee24228.webp new file mode 100644 index 00000000..cb351eeb Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff117e-fee24228.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d-medium.webp b/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d-medium.webp new file mode 100644 index 00000000..efc0675e Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d-medium.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d-thumb.webp b/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d-thumb.webp new file mode 100644 index 00000000..e23ab0c3 Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d-thumb.webp differ diff --git a/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d.webp b/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d.webp new file mode 100644 index 00000000..528dd489 Binary files /dev/null and b/backend/public/images/products/77/68713b561153d30281ff1180-674b4e7d.webp differ diff --git a/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66-medium.webp b/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66-medium.webp new file mode 100644 index 00000000..700e2d1f Binary files /dev/null and b/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66-medium.webp differ diff --git a/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66-thumb.webp b/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66-thumb.webp new file mode 100644 index 00000000..7997bfe0 Binary files /dev/null and b/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66-thumb.webp differ diff --git a/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66.webp b/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66.webp new file mode 100644 index 00000000..a73a0cc5 Binary files /dev/null and b/backend/public/images/products/77/687144c072905bc7d0adc0b4-62234d66.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66-medium.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66-medium.webp new file mode 100644 index 00000000..ed4c5d04 Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66-medium.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66-thumb.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66-thumb.webp new file mode 100644 index 00000000..856e32a0 Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66-thumb.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66.webp new file mode 100644 index 00000000..9d812e2b Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf2-ce520f66.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b-medium.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b-medium.webp new file mode 100644 index 00000000..8f5efb54 Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b-medium.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b-thumb.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b-thumb.webp new file mode 100644 index 00000000..27df3d0b Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b-thumb.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b.webp new file mode 100644 index 00000000..9702434b Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf4-e54ab65b.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5-medium.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5-medium.webp new file mode 100644 index 00000000..3c671600 Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5-medium.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5-thumb.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5-thumb.webp new file mode 100644 index 00000000..11217e75 Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5-thumb.webp differ diff --git a/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5.webp b/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5.webp new file mode 100644 index 00000000..cf97c0aa Binary files /dev/null and b/backend/public/images/products/77/68714e5770df84dbc1f8aaf6-7d8d8fc5.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e-medium.webp b/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e-medium.webp new file mode 100644 index 00000000..fd2116e9 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e-medium.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e-thumb.webp b/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e-thumb.webp new file mode 100644 index 00000000..28fd1186 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e-thumb.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e.webp b/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e.webp new file mode 100644 index 00000000..c4c701cd Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f3-b19f8b7e.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68-medium.webp b/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68-medium.webp new file mode 100644 index 00000000..c74f719d Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68-medium.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68-thumb.webp b/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68-thumb.webp new file mode 100644 index 00000000..4c21f5bb Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68-thumb.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68.webp b/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68.webp new file mode 100644 index 00000000..a0056d9c Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f4-78273f68.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae-medium.webp b/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae-medium.webp new file mode 100644 index 00000000..adbc09c2 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae-medium.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae-thumb.webp b/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae-thumb.webp new file mode 100644 index 00000000..c6a914a9 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae-thumb.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae.webp b/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae.webp new file mode 100644 index 00000000..6154a653 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f5-5f923eae.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634-medium.webp b/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634-medium.webp new file mode 100644 index 00000000..11de9d0f Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634-medium.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634-thumb.webp b/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634-thumb.webp new file mode 100644 index 00000000..f11d6cc3 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634-thumb.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634.webp b/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634.webp new file mode 100644 index 00000000..85b417bd Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f6-27aaf634.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae-medium.webp b/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae-medium.webp new file mode 100644 index 00000000..adbc09c2 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae-medium.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae-thumb.webp b/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae-thumb.webp new file mode 100644 index 00000000..c6a914a9 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae-thumb.webp differ diff --git a/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae.webp b/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae.webp new file mode 100644 index 00000000..6154a653 Binary files /dev/null and b/backend/public/images/products/77/687573717e36e4caa7e929f7-5f923eae.webp differ diff --git a/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3-medium.webp b/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3-medium.webp new file mode 100644 index 00000000..47a631fa Binary files /dev/null and b/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3-medium.webp differ diff --git a/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3-thumb.webp b/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3-thumb.webp new file mode 100644 index 00000000..42641853 Binary files /dev/null and b/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3-thumb.webp differ diff --git a/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3.webp b/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3.webp new file mode 100644 index 00000000..c0610c30 Binary files /dev/null and b/backend/public/images/products/77/687690a8b7e48b4f78fb2a08-befd40f3.webp differ diff --git a/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d-medium.webp b/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d-medium.webp new file mode 100644 index 00000000..7c2dfd3b Binary files /dev/null and b/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d-medium.webp differ diff --git a/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d-thumb.webp b/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d-thumb.webp new file mode 100644 index 00000000..9c3dfe22 Binary files /dev/null and b/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d-thumb.webp differ diff --git a/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d.webp b/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d.webp new file mode 100644 index 00000000..23c970e7 Binary files /dev/null and b/backend/public/images/products/77/687949b0997ba89b1b27ca44-b1c0ce4d.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f-medium.webp b/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f-medium.webp new file mode 100644 index 00000000..f3cbee11 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f-medium.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f-thumb.webp b/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f-thumb.webp new file mode 100644 index 00000000..b5f89362 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f-thumb.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f.webp b/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f.webp new file mode 100644 index 00000000..7ecea370 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eaca-52a6959f.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f-medium.webp b/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f-medium.webp new file mode 100644 index 00000000..f3cbee11 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f-medium.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f-thumb.webp b/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f-thumb.webp new file mode 100644 index 00000000..b5f89362 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f-thumb.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f.webp b/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f.webp new file mode 100644 index 00000000..7ecea370 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eacb-52a6959f.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f-medium.webp b/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f-medium.webp new file mode 100644 index 00000000..f3cbee11 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f-medium.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f-thumb.webp b/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f-thumb.webp new file mode 100644 index 00000000..b5f89362 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f-thumb.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f.webp b/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f.webp new file mode 100644 index 00000000..7ecea370 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4eacc-52a6959f.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f-medium.webp b/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f-medium.webp new file mode 100644 index 00000000..f3cbee11 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f-medium.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f-thumb.webp b/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f-thumb.webp new file mode 100644 index 00000000..b5f89362 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f-thumb.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f.webp b/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f.webp new file mode 100644 index 00000000..7ecea370 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead0-52a6959f.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f-medium.webp b/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f-medium.webp new file mode 100644 index 00000000..f3cbee11 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f-medium.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f-thumb.webp b/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f-thumb.webp new file mode 100644 index 00000000..b5f89362 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f-thumb.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f.webp b/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f.webp new file mode 100644 index 00000000..7ecea370 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead2-52a6959f.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f-medium.webp b/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f-medium.webp new file mode 100644 index 00000000..f3cbee11 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f-medium.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f-thumb.webp b/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f-thumb.webp new file mode 100644 index 00000000..b5f89362 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f-thumb.webp differ diff --git a/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f.webp b/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f.webp new file mode 100644 index 00000000..7ecea370 Binary files /dev/null and b/backend/public/images/products/77/687a724cda642c2620e4ead3-52a6959f.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6-medium.webp b/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6-medium.webp new file mode 100644 index 00000000..e50c76dd Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6-medium.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6-thumb.webp b/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6-thumb.webp new file mode 100644 index 00000000..fb9e0b07 Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6-thumb.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6.webp b/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6.webp new file mode 100644 index 00000000..0af96882 Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a941-277b72d6.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6-medium.webp b/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6-medium.webp new file mode 100644 index 00000000..0e99a412 Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6-medium.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6-thumb.webp b/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6-thumb.webp new file mode 100644 index 00000000..308ddc94 Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6-thumb.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6.webp b/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6.webp new file mode 100644 index 00000000..d90cc52f Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a942-f24d4eb6.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6-medium.webp b/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6-medium.webp new file mode 100644 index 00000000..e50c76dd Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6-medium.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6-thumb.webp b/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6-thumb.webp new file mode 100644 index 00000000..fb9e0b07 Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6-thumb.webp differ diff --git a/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6.webp b/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6.webp new file mode 100644 index 00000000..0af96882 Binary files /dev/null and b/backend/public/images/products/77/687a77220a41528e8ea4a944-277b72d6.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a-medium.webp b/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a-medium.webp new file mode 100644 index 00000000..571822d7 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a-medium.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a-thumb.webp b/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a-thumb.webp new file mode 100644 index 00000000..41dc9798 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a-thumb.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a.webp b/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a.webp new file mode 100644 index 00000000..cac4cd40 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436bc-0554ef5a.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601-medium.webp b/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601-medium.webp new file mode 100644 index 00000000..0ece5dbb Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601-medium.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601-thumb.webp b/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601-thumb.webp new file mode 100644 index 00000000..5dfd8de3 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601-thumb.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601.webp b/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601.webp new file mode 100644 index 00000000..bd7bba91 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436bd-84ad5601.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42-medium.webp b/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42-medium.webp new file mode 100644 index 00000000..d8c7d873 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42-medium.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42-thumb.webp b/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42-thumb.webp new file mode 100644 index 00000000..28c734d4 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42-thumb.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42.webp b/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42.webp new file mode 100644 index 00000000..e1c3ef69 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c2-6b90ed42.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98-medium.webp b/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98-medium.webp new file mode 100644 index 00000000..dbab0174 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98-medium.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98-thumb.webp b/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98-thumb.webp new file mode 100644 index 00000000..bf7a9b21 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98-thumb.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98.webp b/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98.webp new file mode 100644 index 00000000..f524eecd Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c4-6cba2b98.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b-medium.webp b/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b-medium.webp new file mode 100644 index 00000000..76334237 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b-medium.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b-thumb.webp b/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b-thumb.webp new file mode 100644 index 00000000..7fa8fa24 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b-thumb.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b.webp b/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b.webp new file mode 100644 index 00000000..5c41032a Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c6-a722c23b.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c-medium.webp b/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c-medium.webp new file mode 100644 index 00000000..3006f799 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c-medium.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c-thumb.webp b/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c-thumb.webp new file mode 100644 index 00000000..1655e210 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c-thumb.webp differ diff --git a/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c.webp b/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c.webp new file mode 100644 index 00000000..c9091e96 Binary files /dev/null and b/backend/public/images/products/77/687a8816ab9b6527478436c7-687c255c.webp differ diff --git a/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db-medium.webp b/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db-medium.webp new file mode 100644 index 00000000..948f06f5 Binary files /dev/null and b/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db-medium.webp differ diff --git a/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db-thumb.webp b/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db-thumb.webp new file mode 100644 index 00000000..1eda1d02 Binary files /dev/null and b/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db-thumb.webp differ diff --git a/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db.webp b/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db.webp new file mode 100644 index 00000000..0d31699e Binary files /dev/null and b/backend/public/images/products/77/687e734a88a4e22bdb6efb21-751242db.webp differ diff --git a/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f-medium.webp b/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f-medium.webp new file mode 100644 index 00000000..cdb10ffa Binary files /dev/null and b/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f-medium.webp differ diff --git a/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f-thumb.webp b/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f-thumb.webp new file mode 100644 index 00000000..f5696aeb Binary files /dev/null and b/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f-thumb.webp differ diff --git a/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f.webp b/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f.webp new file mode 100644 index 00000000..5e1506b3 Binary files /dev/null and b/backend/public/images/products/77/687e75c330ff2d9b6061a166-c9d2576f.webp differ diff --git a/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e-medium.webp b/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e-medium.webp new file mode 100644 index 00000000..502a712b Binary files /dev/null and b/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e-medium.webp differ diff --git a/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e-thumb.webp b/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e-thumb.webp new file mode 100644 index 00000000..a03faf95 Binary files /dev/null and b/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e-thumb.webp differ diff --git a/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e.webp b/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e.webp new file mode 100644 index 00000000..2f5a2685 Binary files /dev/null and b/backend/public/images/products/77/687fcadaf3991d4190ae36b5-24efa60e.webp differ diff --git a/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d-medium.webp b/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d-medium.webp new file mode 100644 index 00000000..2194ba29 Binary files /dev/null and b/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d-medium.webp differ diff --git a/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d-thumb.webp b/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d-thumb.webp new file mode 100644 index 00000000..2a1b6103 Binary files /dev/null and b/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d-thumb.webp differ diff --git a/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d.webp b/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d.webp new file mode 100644 index 00000000..d4408e82 Binary files /dev/null and b/backend/public/images/products/77/687fcadaf3991d4190ae36b7-cf29573d.webp differ diff --git a/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504-medium.webp b/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504-medium.webp new file mode 100644 index 00000000..abc2d4d4 Binary files /dev/null and b/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504-medium.webp differ diff --git a/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504-thumb.webp b/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504-thumb.webp new file mode 100644 index 00000000..6dd4f460 Binary files /dev/null and b/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504-thumb.webp differ diff --git a/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504.webp b/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504.webp new file mode 100644 index 00000000..0a82e0a6 Binary files /dev/null and b/backend/public/images/products/77/687fdbcd35fec753e5e6112c-0789b504.webp differ diff --git a/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db-medium.webp b/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db-medium.webp new file mode 100644 index 00000000..97aab8ff Binary files /dev/null and b/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db-medium.webp differ diff --git a/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db-thumb.webp b/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db-thumb.webp new file mode 100644 index 00000000..65d980e7 Binary files /dev/null and b/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db-thumb.webp differ diff --git a/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db.webp b/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db.webp new file mode 100644 index 00000000..18eb84e6 Binary files /dev/null and b/backend/public/images/products/77/687ff6856d11e281bce97d47-969514db.webp differ diff --git a/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc-medium.webp b/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc-medium.webp new file mode 100644 index 00000000..21e523a4 Binary files /dev/null and b/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc-medium.webp differ diff --git a/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc-thumb.webp b/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc-thumb.webp new file mode 100644 index 00000000..8290937f Binary files /dev/null and b/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc-thumb.webp differ diff --git a/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc.webp b/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc.webp new file mode 100644 index 00000000..5ac1ee30 Binary files /dev/null and b/backend/public/images/products/77/688100f15519c5b174a16b36-9f78b7bc.webp differ diff --git a/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc-medium.webp b/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc-medium.webp new file mode 100644 index 00000000..21e523a4 Binary files /dev/null and b/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc-medium.webp differ diff --git a/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc-thumb.webp b/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc-thumb.webp new file mode 100644 index 00000000..8290937f Binary files /dev/null and b/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc-thumb.webp differ diff --git a/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc.webp b/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc.webp new file mode 100644 index 00000000..5ac1ee30 Binary files /dev/null and b/backend/public/images/products/77/688100f15519c5b174a16b37-9f78b7bc.webp differ diff --git a/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f-medium.webp b/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f-medium.webp new file mode 100644 index 00000000..cdb10ffa Binary files /dev/null and b/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f-medium.webp differ diff --git a/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f-thumb.webp b/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f-thumb.webp new file mode 100644 index 00000000..f5696aeb Binary files /dev/null and b/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f-thumb.webp differ diff --git a/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f.webp b/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f.webp new file mode 100644 index 00000000..5e1506b3 Binary files /dev/null and b/backend/public/images/products/77/688105b36aaefab61507cfad-c9d2576f.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d-medium.webp b/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d-medium.webp new file mode 100644 index 00000000..6fca60fc Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d-medium.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d-thumb.webp b/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d-thumb.webp new file mode 100644 index 00000000..39120786 Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d-thumb.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d.webp b/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d.webp new file mode 100644 index 00000000..8a9bc860 Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98be-b94d755d.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1-medium.webp b/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1-medium.webp new file mode 100644 index 00000000..3a0817f7 Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1-medium.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1-thumb.webp b/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1-thumb.webp new file mode 100644 index 00000000..d613ee86 Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1-thumb.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1.webp b/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1.webp new file mode 100644 index 00000000..9b99399c Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98bf-a705bbc1.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b-medium.webp b/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b-medium.webp new file mode 100644 index 00000000..ef590add Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b-medium.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b-thumb.webp b/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b-thumb.webp new file mode 100644 index 00000000..74e5e9ba Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b-thumb.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b.webp b/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b.webp new file mode 100644 index 00000000..1759052f Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98c0-cfed539b.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2-medium.webp b/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2-medium.webp new file mode 100644 index 00000000..b5011267 Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2-medium.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2-thumb.webp b/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2-thumb.webp new file mode 100644 index 00000000..43b42815 Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2-thumb.webp differ diff --git a/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2.webp b/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2.webp new file mode 100644 index 00000000..18dc7655 Binary files /dev/null and b/backend/public/images/products/77/68810810301ccc240a6e98c1-34af2dd2.webp differ diff --git a/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6-medium.webp b/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6-thumb.webp b/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6.webp b/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/6882592a2ee3d00a28e30e01-701c49c6.webp differ diff --git a/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa-medium.webp b/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa-thumb.webp b/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa.webp b/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/688280b4632f2856aedb4b3d-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59-medium.webp b/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59-medium.webp new file mode 100644 index 00000000..d8c38485 Binary files /dev/null and b/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59-medium.webp differ diff --git a/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59-thumb.webp b/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59-thumb.webp new file mode 100644 index 00000000..863d2e69 Binary files /dev/null and b/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59-thumb.webp differ diff --git a/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59.webp b/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59.webp new file mode 100644 index 00000000..873f716b Binary files /dev/null and b/backend/public/images/products/77/6883b38869dcb6b28de7c2dc-da16cf59.webp differ diff --git a/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c-medium.webp b/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c-medium.webp new file mode 100644 index 00000000..cdb4525d Binary files /dev/null and b/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c-medium.webp differ diff --git a/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c-thumb.webp b/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c-thumb.webp new file mode 100644 index 00000000..abc1a3cd Binary files /dev/null and b/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c-thumb.webp differ diff --git a/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c.webp b/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c.webp new file mode 100644 index 00000000..66a156a7 Binary files /dev/null and b/backend/public/images/products/77/6883c4e3dfec80df59ef1747-ce3cbf8c.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f-medium.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f-medium.webp new file mode 100644 index 00000000..3f2250ab Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f-medium.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f-thumb.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f-thumb.webp new file mode 100644 index 00000000..0c1f8106 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f-thumb.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f.webp new file mode 100644 index 00000000..36d835a2 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf234-6b097e1f.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e-medium.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e-medium.webp new file mode 100644 index 00000000..476c86a7 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e-medium.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e-thumb.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e-thumb.webp new file mode 100644 index 00000000..0c1d4cb2 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e-thumb.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e.webp new file mode 100644 index 00000000..863369b8 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf235-f960693e.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434-medium.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434-medium.webp new file mode 100644 index 00000000..8a5ec6c6 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434-medium.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434-thumb.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434-thumb.webp new file mode 100644 index 00000000..6834faea Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434-thumb.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434.webp new file mode 100644 index 00000000..992b55d3 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf236-beb73434.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0-medium.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0-medium.webp new file mode 100644 index 00000000..ea1ccc45 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0-medium.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0-thumb.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0-thumb.webp new file mode 100644 index 00000000..92fe8c6e Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0-thumb.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0.webp new file mode 100644 index 00000000..f7f3de19 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf237-c31495d0.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81-medium.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81-medium.webp new file mode 100644 index 00000000..cf86da45 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81-medium.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81-thumb.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81-thumb.webp new file mode 100644 index 00000000..45ab19ff Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81-thumb.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81.webp new file mode 100644 index 00000000..1846f036 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf238-47803e81.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c-medium.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c-medium.webp new file mode 100644 index 00000000..c67150d3 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c-medium.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c-thumb.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c-thumb.webp new file mode 100644 index 00000000..d841a279 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c-thumb.webp differ diff --git a/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c.webp b/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c.webp new file mode 100644 index 00000000..d4b08c24 Binary files /dev/null and b/backend/public/images/products/77/6883d4ba69dec1329cdcf23a-df6cda1c.webp differ diff --git a/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69-medium.webp b/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69-medium.webp new file mode 100644 index 00000000..97c269b0 Binary files /dev/null and b/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69-medium.webp differ diff --git a/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69-thumb.webp b/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69-thumb.webp new file mode 100644 index 00000000..cdde6f79 Binary files /dev/null and b/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69-thumb.webp differ diff --git a/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69.webp b/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69.webp new file mode 100644 index 00000000..c8ac6b5f Binary files /dev/null and b/backend/public/images/products/77/6887a1c7f55b887f7fa98cc2-06d2bd69.webp differ diff --git a/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c-medium.webp b/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c-medium.webp new file mode 100644 index 00000000..555782fe Binary files /dev/null and b/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c-medium.webp differ diff --git a/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c-thumb.webp b/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c-thumb.webp new file mode 100644 index 00000000..2ef110ee Binary files /dev/null and b/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c-thumb.webp differ diff --git a/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c.webp b/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c.webp new file mode 100644 index 00000000..7455b401 Binary files /dev/null and b/backend/public/images/products/77/688a53d58afde75b6608853e-26fd710c.webp differ diff --git a/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f-medium.webp b/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f-medium.webp new file mode 100644 index 00000000..847d5bbb Binary files /dev/null and b/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f-medium.webp differ diff --git a/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f-thumb.webp b/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f-thumb.webp new file mode 100644 index 00000000..b6d7c497 Binary files /dev/null and b/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f-thumb.webp differ diff --git a/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f.webp b/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f.webp new file mode 100644 index 00000000..7886f36f Binary files /dev/null and b/backend/public/images/products/77/688a58d5d51c6eda281cfe4e-94bd430f.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d-medium.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d-medium.webp new file mode 100644 index 00000000..3fae3e89 Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d-medium.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d-thumb.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d-thumb.webp new file mode 100644 index 00000000..29cbbb47 Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d-thumb.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d.webp new file mode 100644 index 00000000..8c1c86dc Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400252-5cf9831d.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2-medium.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2-medium.webp new file mode 100644 index 00000000..36ed4818 Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2-medium.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2-thumb.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2-thumb.webp new file mode 100644 index 00000000..7614314a Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2-thumb.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2.webp new file mode 100644 index 00000000..7e7e46b4 Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400253-ab375ef2.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2-medium.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2-medium.webp new file mode 100644 index 00000000..36ed4818 Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2-medium.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2-thumb.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2-thumb.webp new file mode 100644 index 00000000..7614314a Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2-thumb.webp differ diff --git a/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2.webp b/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2.webp new file mode 100644 index 00000000..7e7e46b4 Binary files /dev/null and b/backend/public/images/products/77/688a6ecbbdf7a540af400255-ab375ef2.webp differ diff --git a/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b-medium.webp b/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b-medium.webp new file mode 100644 index 00000000..6535bdf1 Binary files /dev/null and b/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b-medium.webp differ diff --git a/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b-thumb.webp b/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b-thumb.webp new file mode 100644 index 00000000..a4c2eb4b Binary files /dev/null and b/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b-thumb.webp differ diff --git a/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b.webp b/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b.webp new file mode 100644 index 00000000..4ac014df Binary files /dev/null and b/backend/public/images/products/77/688a78c640628ce43e692537-e0549f2b.webp differ diff --git a/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b-medium.webp b/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b-medium.webp new file mode 100644 index 00000000..e55247b8 Binary files /dev/null and b/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b-medium.webp differ diff --git a/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b-thumb.webp b/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b-thumb.webp new file mode 100644 index 00000000..52011ca5 Binary files /dev/null and b/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b-thumb.webp differ diff --git a/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b.webp b/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b.webp new file mode 100644 index 00000000..36f73857 Binary files /dev/null and b/backend/public/images/products/77/688a78c640628ce43e692539-f8c3ee9b.webp differ diff --git a/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb-medium.webp b/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb-medium.webp new file mode 100644 index 00000000..c6669e3d Binary files /dev/null and b/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb-medium.webp differ diff --git a/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb-thumb.webp b/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb-thumb.webp new file mode 100644 index 00000000..1a7daa67 Binary files /dev/null and b/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb-thumb.webp differ diff --git a/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb.webp b/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb.webp new file mode 100644 index 00000000..b6db7c0c Binary files /dev/null and b/backend/public/images/products/77/688a7de0775f933d13a55e05-a52d5abb.webp differ diff --git a/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb-medium.webp b/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb-medium.webp new file mode 100644 index 00000000..c6669e3d Binary files /dev/null and b/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb-medium.webp differ diff --git a/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb-thumb.webp b/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb-thumb.webp new file mode 100644 index 00000000..1a7daa67 Binary files /dev/null and b/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb-thumb.webp differ diff --git a/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb.webp b/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb.webp new file mode 100644 index 00000000..b6db7c0c Binary files /dev/null and b/backend/public/images/products/77/688a7de0775f933d13a55e06-a52d5abb.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245-medium.webp b/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245-medium.webp new file mode 100644 index 00000000..e2818425 Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245-medium.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245-thumb.webp b/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245-thumb.webp new file mode 100644 index 00000000..b6bf635b Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245-thumb.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245.webp b/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245.webp new file mode 100644 index 00000000..e3bf921d Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f695-f0276245.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe-medium.webp b/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe-medium.webp new file mode 100644 index 00000000..bce329f7 Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe-medium.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe-thumb.webp b/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe-thumb.webp new file mode 100644 index 00000000..85717018 Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe-thumb.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe.webp b/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe.webp new file mode 100644 index 00000000..bf970485 Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f696-4141bebe.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce-medium.webp b/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce-medium.webp new file mode 100644 index 00000000..81d8aa43 Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce-medium.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce-thumb.webp b/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce-thumb.webp new file mode 100644 index 00000000..85baa252 Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce-thumb.webp differ diff --git a/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce.webp b/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce.webp new file mode 100644 index 00000000..188ec8a0 Binary files /dev/null and b/backend/public/images/products/77/688a8cecd09464f925f4f698-8a7c21ce.webp differ diff --git a/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa-medium.webp b/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa-thumb.webp b/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa.webp b/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/688b825adc7a016450f769e6-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0-medium.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0-thumb.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca44-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0-medium.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0-thumb.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca45-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d-medium.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d-medium.webp new file mode 100644 index 00000000..9a085894 Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d-medium.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d-thumb.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d-thumb.webp new file mode 100644 index 00000000..fcf649e4 Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d-thumb.webp differ diff --git a/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d.webp b/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d.webp new file mode 100644 index 00000000..508d85ee Binary files /dev/null and b/backend/public/images/products/77/688ba2ec0c34217fbabeca4b-5904972d.webp differ diff --git a/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51-medium.webp b/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51-medium.webp new file mode 100644 index 00000000..3e17895b Binary files /dev/null and b/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51-medium.webp differ diff --git a/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51-thumb.webp b/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51-thumb.webp new file mode 100644 index 00000000..90a2420e Binary files /dev/null and b/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51-thumb.webp differ diff --git a/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51.webp b/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51.webp new file mode 100644 index 00000000..2b8aa480 Binary files /dev/null and b/backend/public/images/products/77/688baca1ab9911e2588b63d9-4ad42f51.webp differ diff --git a/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37-medium.webp b/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37-medium.webp new file mode 100644 index 00000000..f6323bc3 Binary files /dev/null and b/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37-medium.webp differ diff --git a/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37-thumb.webp b/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37-thumb.webp new file mode 100644 index 00000000..fdb07258 Binary files /dev/null and b/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37-thumb.webp differ diff --git a/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37.webp b/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37.webp new file mode 100644 index 00000000..6f48e647 Binary files /dev/null and b/backend/public/images/products/77/688bc68158a3c83d0322553e-38531c37.webp differ diff --git a/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa-medium.webp b/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa-thumb.webp b/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa.webp b/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/688bd9e50b7ec5a9907f0994-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699-medium.webp new file mode 100644 index 00000000..ec328dbd Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699-thumb.webp new file mode 100644 index 00000000..83a37b88 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699.webp new file mode 100644 index 00000000..7f994163 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ec-ecc97699.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331-medium.webp new file mode 100644 index 00000000..870ec4be Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331-thumb.webp new file mode 100644 index 00000000..174ea88b Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331.webp new file mode 100644 index 00000000..5998bae9 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ed-a32d0331.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594-medium.webp new file mode 100644 index 00000000..ded7648c Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594-thumb.webp new file mode 100644 index 00000000..041d0ea0 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594.webp b/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594.webp new file mode 100644 index 00000000..18f922c0 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505ef-cab90594.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b-medium.webp new file mode 100644 index 00000000..c241e794 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b-thumb.webp new file mode 100644 index 00000000..22ccdfd1 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b.webp new file mode 100644 index 00000000..64558731 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f1-4ad3fb3b.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49-medium.webp new file mode 100644 index 00000000..9254eab3 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49-thumb.webp new file mode 100644 index 00000000..9c893eb0 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49.webp new file mode 100644 index 00000000..d298f6f9 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f2-49065c49.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53-medium.webp new file mode 100644 index 00000000..5eeaa187 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53-thumb.webp new file mode 100644 index 00000000..1fcfbd82 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53.webp new file mode 100644 index 00000000..8a5aba7f Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f3-0e5c0f53.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699-medium.webp new file mode 100644 index 00000000..ec328dbd Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699-thumb.webp new file mode 100644 index 00000000..83a37b88 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699.webp new file mode 100644 index 00000000..7f994163 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f4-ecc97699.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180-medium.webp new file mode 100644 index 00000000..d33aaa33 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180-thumb.webp new file mode 100644 index 00000000..ad934c3c Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180.webp new file mode 100644 index 00000000..b88deee7 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f5-1aea6180.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b-medium.webp new file mode 100644 index 00000000..f9830da7 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b-thumb.webp new file mode 100644 index 00000000..99065a0d Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b.webp new file mode 100644 index 00000000..f66e5efc Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f6-4e52343b.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092-medium.webp new file mode 100644 index 00000000..10944d85 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092-thumb.webp new file mode 100644 index 00000000..54e009af Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092.webp new file mode 100644 index 00000000..9fcfa132 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f7-cb942092.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67-medium.webp new file mode 100644 index 00000000..81465c04 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67-thumb.webp new file mode 100644 index 00000000..37f0f1cf Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67.webp b/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67.webp new file mode 100644 index 00000000..23036feb Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505f9-eef9bc67.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9-medium.webp new file mode 100644 index 00000000..d55105a5 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9-thumb.webp new file mode 100644 index 00000000..e00c1cc4 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9.webp new file mode 100644 index 00000000..943fadcb Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fa-caa407f9.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f-medium.webp new file mode 100644 index 00000000..7d6322d6 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f-thumb.webp new file mode 100644 index 00000000..10a271f5 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f.webp new file mode 100644 index 00000000..37735ec5 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fb-155b418f.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4-medium.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4-medium.webp new file mode 100644 index 00000000..c276e840 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4-medium.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4-thumb.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4-thumb.webp new file mode 100644 index 00000000..bffa300f Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4-thumb.webp differ diff --git a/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4.webp b/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4.webp new file mode 100644 index 00000000..189325f7 Binary files /dev/null and b/backend/public/images/products/77/688be3c1dfbc172bead505fc-ca2766d4.webp differ diff --git a/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6-medium.webp b/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6-medium.webp new file mode 100644 index 00000000..74e92a45 Binary files /dev/null and b/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6-medium.webp differ diff --git a/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6-thumb.webp b/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6-thumb.webp new file mode 100644 index 00000000..315c080b Binary files /dev/null and b/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6-thumb.webp differ diff --git a/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6.webp b/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6.webp new file mode 100644 index 00000000..387d71a0 Binary files /dev/null and b/backend/public/images/products/77/688d0dbbbff14cfd4771dcce-040095d6.webp differ diff --git a/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9-medium.webp b/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9-medium.webp new file mode 100644 index 00000000..ac48fbda Binary files /dev/null and b/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9-medium.webp differ diff --git a/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9-thumb.webp b/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9-thumb.webp new file mode 100644 index 00000000..72c38552 Binary files /dev/null and b/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9-thumb.webp differ diff --git a/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9.webp b/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9.webp new file mode 100644 index 00000000..bde82e75 Binary files /dev/null and b/backend/public/images/products/77/688d0dbbbff14cfd4771dcd0-6010e8d9.webp differ diff --git a/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4-medium.webp b/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4-medium.webp new file mode 100644 index 00000000..83c9145d Binary files /dev/null and b/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4-medium.webp differ diff --git a/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4-thumb.webp b/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4-thumb.webp new file mode 100644 index 00000000..f672014d Binary files /dev/null and b/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4-thumb.webp differ diff --git a/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4.webp b/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4.webp new file mode 100644 index 00000000..8a0a469a Binary files /dev/null and b/backend/public/images/products/77/688d0fff853fa67c3806bc33-dcea9ad4.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5-medium.webp b/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5-medium.webp new file mode 100644 index 00000000..f2d71a81 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5-medium.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5-thumb.webp b/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5-thumb.webp new file mode 100644 index 00000000..aa228b22 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5-thumb.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5.webp b/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5.webp new file mode 100644 index 00000000..16060e88 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa06-911fe4f5.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119-medium.webp b/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119-medium.webp new file mode 100644 index 00000000..726c0143 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119-medium.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119-thumb.webp b/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119-thumb.webp new file mode 100644 index 00000000..66b0a52e Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119-thumb.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119.webp b/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119.webp new file mode 100644 index 00000000..340458fd Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa07-904d7119.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae-medium.webp b/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae-medium.webp new file mode 100644 index 00000000..c50c24f2 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae-medium.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae-thumb.webp b/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae-thumb.webp new file mode 100644 index 00000000..fe59a818 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae-thumb.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae.webp b/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae.webp new file mode 100644 index 00000000..3dca100c Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa08-3e525eae.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8-medium.webp b/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8-medium.webp new file mode 100644 index 00000000..9ffb31fd Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8-medium.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8-thumb.webp b/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8-thumb.webp new file mode 100644 index 00000000..bcb2f8ea Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8-thumb.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8.webp b/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8.webp new file mode 100644 index 00000000..bf9da631 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa09-67c285b8.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5-medium.webp b/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5-medium.webp new file mode 100644 index 00000000..498b3fc3 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5-medium.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5-thumb.webp b/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5-thumb.webp new file mode 100644 index 00000000..c832def0 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5-thumb.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5.webp b/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5.webp new file mode 100644 index 00000000..c9d9514a Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa11-17ecebe5.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49-medium.webp b/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49-medium.webp new file mode 100644 index 00000000..e7205c68 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49-medium.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49-thumb.webp b/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49-thumb.webp new file mode 100644 index 00000000..839ea784 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49-thumb.webp differ diff --git a/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49.webp b/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49.webp new file mode 100644 index 00000000..2918b568 Binary files /dev/null and b/backend/public/images/products/77/688d196e8f17abab8409aa13-0abeae49.webp differ diff --git a/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d-medium.webp b/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d-medium.webp new file mode 100644 index 00000000..90fb98cb Binary files /dev/null and b/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d-medium.webp differ diff --git a/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d-thumb.webp b/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d-thumb.webp new file mode 100644 index 00000000..e4b64a89 Binary files /dev/null and b/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d-thumb.webp differ diff --git a/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d.webp b/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d.webp new file mode 100644 index 00000000..b03fdea2 Binary files /dev/null and b/backend/public/images/products/77/688f9492c265b39a250edbe6-5b4ab94d.webp differ diff --git a/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1-medium.webp b/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1-medium.webp new file mode 100644 index 00000000..13f6b0f7 Binary files /dev/null and b/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1-medium.webp differ diff --git a/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1-thumb.webp b/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1-thumb.webp new file mode 100644 index 00000000..ffff6d40 Binary files /dev/null and b/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1-thumb.webp differ diff --git a/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1.webp b/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1.webp new file mode 100644 index 00000000..74e2e6d0 Binary files /dev/null and b/backend/public/images/products/77/688f9492c265b39a250edbe7-c22c51c1.webp differ diff --git a/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8-medium.webp b/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8-medium.webp new file mode 100644 index 00000000..7242b18b Binary files /dev/null and b/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8-medium.webp differ diff --git a/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8-thumb.webp b/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8-thumb.webp new file mode 100644 index 00000000..11668618 Binary files /dev/null and b/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8-thumb.webp differ diff --git a/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8.webp b/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8.webp new file mode 100644 index 00000000..8a5161b5 Binary files /dev/null and b/backend/public/images/products/77/688fa6b7ee23bd75f1a0ca67-91fa61b8.webp differ diff --git a/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6-medium.webp b/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6-thumb.webp b/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6.webp b/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/68925ffe24cfb30d38df8ae4-701c49c6.webp differ diff --git a/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370-medium.webp b/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370-medium.webp new file mode 100644 index 00000000..e88dd3e8 Binary files /dev/null and b/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370-medium.webp differ diff --git a/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370-thumb.webp b/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370-thumb.webp new file mode 100644 index 00000000..cf4513aa Binary files /dev/null and b/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370-thumb.webp differ diff --git a/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370.webp b/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370.webp new file mode 100644 index 00000000..72b9d72e Binary files /dev/null and b/backend/public/images/products/77/68925ffe24cfb30d38df8ae5-6c518370.webp differ diff --git a/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd-medium.webp b/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd-thumb.webp b/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd.webp b/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/68926bf0bdcaf9804de7c59b-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a-medium.webp b/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a-medium.webp new file mode 100644 index 00000000..9789d6e6 Binary files /dev/null and b/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a-medium.webp differ diff --git a/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a-thumb.webp b/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a-thumb.webp new file mode 100644 index 00000000..48929dfa Binary files /dev/null and b/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a-thumb.webp differ diff --git a/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a.webp b/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a.webp new file mode 100644 index 00000000..631d0616 Binary files /dev/null and b/backend/public/images/products/77/68939a5c42a96e046768a60c-8115683a.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462fee-feef4544-medium.webp b/backend/public/images/products/77/6893b2368413b95623462fee-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462fee-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462fee-feef4544-thumb.webp b/backend/public/images/products/77/6893b2368413b95623462fee-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462fee-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462fee-feef4544.webp b/backend/public/images/products/77/6893b2368413b95623462fee-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462fee-feef4544.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462fef-feef4544-medium.webp b/backend/public/images/products/77/6893b2368413b95623462fef-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462fef-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462fef-feef4544-thumb.webp b/backend/public/images/products/77/6893b2368413b95623462fef-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462fef-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462fef-feef4544.webp b/backend/public/images/products/77/6893b2368413b95623462fef-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462fef-feef4544.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f-medium.webp b/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f-medium.webp new file mode 100644 index 00000000..4fc08672 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f-medium.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f-thumb.webp b/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f-thumb.webp new file mode 100644 index 00000000..ce3286e2 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f-thumb.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f.webp b/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f.webp new file mode 100644 index 00000000..e283b2c2 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff0-63647b6f.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02-medium.webp b/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02-medium.webp new file mode 100644 index 00000000..396d0a1e Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02-medium.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02-thumb.webp b/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02-thumb.webp new file mode 100644 index 00000000..348c6dfb Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02-thumb.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02.webp b/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02.webp new file mode 100644 index 00000000..4b0db624 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff1-aad17e02.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70-medium.webp b/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70-medium.webp new file mode 100644 index 00000000..0da71289 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70-medium.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70-thumb.webp b/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70-thumb.webp new file mode 100644 index 00000000..bcd59072 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70-thumb.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70.webp b/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70.webp new file mode 100644 index 00000000..9f881f7e Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff7-ffe4ef70.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154-medium.webp b/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154-medium.webp new file mode 100644 index 00000000..aa24df2b Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154-medium.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154-thumb.webp b/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154-thumb.webp new file mode 100644 index 00000000..42b15e36 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154-thumb.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154.webp b/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154.webp new file mode 100644 index 00000000..7e15489c Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623462ff8-d4d72154.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623463001-aad17e02-medium.webp b/backend/public/images/products/77/6893b2368413b95623463001-aad17e02-medium.webp new file mode 100644 index 00000000..396d0a1e Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623463001-aad17e02-medium.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623463001-aad17e02-thumb.webp b/backend/public/images/products/77/6893b2368413b95623463001-aad17e02-thumb.webp new file mode 100644 index 00000000..348c6dfb Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623463001-aad17e02-thumb.webp differ diff --git a/backend/public/images/products/77/6893b2368413b95623463001-aad17e02.webp b/backend/public/images/products/77/6893b2368413b95623463001-aad17e02.webp new file mode 100644 index 00000000..4b0db624 Binary files /dev/null and b/backend/public/images/products/77/6893b2368413b95623463001-aad17e02.webp differ diff --git a/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6-medium.webp b/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6-thumb.webp b/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6.webp b/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/6893b70abc6425d173f28d0b-701c49c6.webp differ diff --git a/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36-medium.webp b/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36-medium.webp new file mode 100644 index 00000000..8d57a6d2 Binary files /dev/null and b/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36-medium.webp differ diff --git a/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36-thumb.webp b/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36-thumb.webp new file mode 100644 index 00000000..07d96f42 Binary files /dev/null and b/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36-thumb.webp differ diff --git a/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36.webp b/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36.webp new file mode 100644 index 00000000..c8410194 Binary files /dev/null and b/backend/public/images/products/77/6893c31da3d5c838f30b51ba-df6bcb36.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e-medium.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e-medium.webp new file mode 100644 index 00000000..888c6308 Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e-medium.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e-thumb.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e-thumb.webp new file mode 100644 index 00000000..8b2f85a0 Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e-thumb.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e.webp new file mode 100644 index 00000000..129c27e8 Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f1e-927e243e.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e-medium.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e-medium.webp new file mode 100644 index 00000000..4b3ba056 Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e-medium.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e-thumb.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e-thumb.webp new file mode 100644 index 00000000..844913c9 Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e-thumb.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e.webp new file mode 100644 index 00000000..77fe5832 Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f20-97411f5e.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194-medium.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194-medium.webp new file mode 100644 index 00000000..73838a70 Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194-medium.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194-thumb.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194-thumb.webp new file mode 100644 index 00000000..3051d69b Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194-thumb.webp differ diff --git a/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194.webp b/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194.webp new file mode 100644 index 00000000..dbfa60f1 Binary files /dev/null and b/backend/public/images/products/77/6894db2b1a8561ba4cf10f26-7d0ac194.webp differ diff --git a/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0-medium.webp b/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0-thumb.webp b/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0.webp b/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/6894e4dc4c781f8492ccdcae-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05-medium.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05-medium.webp new file mode 100644 index 00000000..20206c11 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05-medium.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05-thumb.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05-thumb.webp new file mode 100644 index 00000000..594e8390 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05-thumb.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05.webp new file mode 100644 index 00000000..7a816f8c Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0d-5860da05.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05-medium.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05-medium.webp new file mode 100644 index 00000000..20206c11 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05-medium.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05-thumb.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05-thumb.webp new file mode 100644 index 00000000..594e8390 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05-thumb.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05.webp new file mode 100644 index 00000000..7a816f8c Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0e-5860da05.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940-medium.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940-medium.webp new file mode 100644 index 00000000..f5fe7bc7 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940-medium.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940-thumb.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940-thumb.webp new file mode 100644 index 00000000..4a8493f1 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940-thumb.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940.webp b/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940.webp new file mode 100644 index 00000000..8fa6df87 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a0f-1aad0940.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8-medium.webp b/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8-medium.webp new file mode 100644 index 00000000..fc9a0bc2 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8-medium.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8-thumb.webp b/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8-thumb.webp new file mode 100644 index 00000000..01b10289 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8-thumb.webp differ diff --git a/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8.webp b/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8.webp new file mode 100644 index 00000000..4d29d9d3 Binary files /dev/null and b/backend/public/images/products/77/689513068b37ba4c1f543a13-0b3776c8.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e-medium.webp new file mode 100644 index 00000000..8c841539 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e-thumb.webp new file mode 100644 index 00000000..c09a1a15 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e.webp new file mode 100644 index 00000000..038951c9 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97d-0f57c62e.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d-medium.webp new file mode 100644 index 00000000..2da4c2f4 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d-thumb.webp new file mode 100644 index 00000000..571566e6 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d.webp new file mode 100644 index 00000000..63aa412e Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97e-864c412d.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf-medium.webp new file mode 100644 index 00000000..620282d2 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf-thumb.webp new file mode 100644 index 00000000..d133f735 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf.webp new file mode 100644 index 00000000..ee5caf03 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac97f-2402afaf.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a-medium.webp new file mode 100644 index 00000000..017abb34 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a-thumb.webp new file mode 100644 index 00000000..0b09a06d Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a.webp new file mode 100644 index 00000000..64774dda Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac980-0929d68a.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4-medium.webp new file mode 100644 index 00000000..83f9f37e Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4-thumb.webp new file mode 100644 index 00000000..8ad6022b Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4.webp new file mode 100644 index 00000000..f9320f9b Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac981-752220a4.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba-medium.webp new file mode 100644 index 00000000..26f0024a Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba-thumb.webp new file mode 100644 index 00000000..fcb01533 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba.webp new file mode 100644 index 00000000..4bf85f69 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac982-55b845ba.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37-medium.webp new file mode 100644 index 00000000..877f8bba Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37-thumb.webp new file mode 100644 index 00000000..312496de Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37.webp new file mode 100644 index 00000000..5a62dc5d Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac983-ef24de37.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017-medium.webp new file mode 100644 index 00000000..554f68c6 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017-thumb.webp new file mode 100644 index 00000000..a9733a0d Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017.webp new file mode 100644 index 00000000..d3c22da0 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac984-51657017.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265-medium.webp new file mode 100644 index 00000000..f7968f51 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265-thumb.webp new file mode 100644 index 00000000..40ccdbb4 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265.webp new file mode 100644 index 00000000..c6e08c22 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac985-b53e3265.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47-medium.webp new file mode 100644 index 00000000..aa05d4b8 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47-thumb.webp new file mode 100644 index 00000000..3d70259a Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47.webp new file mode 100644 index 00000000..70cffa96 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac987-0edb7f47.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3-medium.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3-medium.webp new file mode 100644 index 00000000..2417d833 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3-medium.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3-thumb.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3-thumb.webp new file mode 100644 index 00000000..7fb8c614 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3-thumb.webp differ diff --git a/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3.webp b/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3.webp new file mode 100644 index 00000000..446a9096 Binary files /dev/null and b/backend/public/images/products/77/68960e50b2de0bb0df2ac988-a7ff3db3.webp differ diff --git a/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e-medium.webp b/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e-medium.webp new file mode 100644 index 00000000..4b3ba056 Binary files /dev/null and b/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e-medium.webp differ diff --git a/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e-thumb.webp b/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e-thumb.webp new file mode 100644 index 00000000..844913c9 Binary files /dev/null and b/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e-thumb.webp differ diff --git a/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e.webp b/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e.webp new file mode 100644 index 00000000..77fe5832 Binary files /dev/null and b/backend/public/images/products/77/689620bf2396276da48c45c8-97411f5e.webp differ diff --git a/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c-medium.webp b/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c-medium.webp new file mode 100644 index 00000000..6ed37a70 Binary files /dev/null and b/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c-medium.webp differ diff --git a/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c-thumb.webp b/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c-thumb.webp new file mode 100644 index 00000000..67523a75 Binary files /dev/null and b/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c-thumb.webp differ diff --git a/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c.webp b/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c.webp new file mode 100644 index 00000000..f8ecd5a4 Binary files /dev/null and b/backend/public/images/products/77/68963f37ad273f37628ff6bf-38ba182c.webp differ diff --git a/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5-medium.webp b/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5-medium.webp new file mode 100644 index 00000000..7fe34e03 Binary files /dev/null and b/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5-medium.webp differ diff --git a/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5-thumb.webp b/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5-thumb.webp new file mode 100644 index 00000000..0075b2ec Binary files /dev/null and b/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5-thumb.webp differ diff --git a/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5.webp b/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5.webp new file mode 100644 index 00000000..d6568a6d Binary files /dev/null and b/backend/public/images/products/77/6896417ec8373a79ac0926cb-0a181ca5.webp differ diff --git a/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504-medium.webp b/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504-medium.webp new file mode 100644 index 00000000..abc2d4d4 Binary files /dev/null and b/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504-medium.webp differ diff --git a/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504-thumb.webp b/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504-thumb.webp new file mode 100644 index 00000000..6dd4f460 Binary files /dev/null and b/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504-thumb.webp differ diff --git a/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504.webp b/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504.webp new file mode 100644 index 00000000..0a82e0a6 Binary files /dev/null and b/backend/public/images/products/77/689a31b0c5d322bb42e6ad61-0789b504.webp differ diff --git a/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0-medium.webp b/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0-medium.webp new file mode 100644 index 00000000..824ff478 Binary files /dev/null and b/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0-medium.webp differ diff --git a/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0-thumb.webp b/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0-thumb.webp new file mode 100644 index 00000000..13c57356 Binary files /dev/null and b/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0-thumb.webp differ diff --git a/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0.webp b/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0.webp new file mode 100644 index 00000000..a34c3f16 Binary files /dev/null and b/backend/public/images/products/77/689b8e172a210770e97da205-44065ab0.webp differ diff --git a/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850-medium.webp b/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850-medium.webp new file mode 100644 index 00000000..37ff4508 Binary files /dev/null and b/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850-medium.webp differ diff --git a/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850-thumb.webp b/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850-thumb.webp new file mode 100644 index 00000000..77a914d1 Binary files /dev/null and b/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850-thumb.webp differ diff --git a/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850.webp b/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850.webp new file mode 100644 index 00000000..e1627ff6 Binary files /dev/null and b/backend/public/images/products/77/689b98af79012c95a28e16f5-986ff850.webp differ diff --git a/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544-medium.webp b/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544-thumb.webp b/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544.webp b/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/689bab27613b3706e675ea50-feef4544.webp differ diff --git a/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287-medium.webp b/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287-medium.webp new file mode 100644 index 00000000..1b7a3414 Binary files /dev/null and b/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287-medium.webp differ diff --git a/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287-thumb.webp b/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287-thumb.webp new file mode 100644 index 00000000..0a7ed19b Binary files /dev/null and b/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287-thumb.webp differ diff --git a/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287.webp b/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287.webp new file mode 100644 index 00000000..f99f8962 Binary files /dev/null and b/backend/public/images/products/77/689bab27613b3706e675ea56-daa74287.webp differ diff --git a/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08-medium.webp b/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08-medium.webp new file mode 100644 index 00000000..ffc07352 Binary files /dev/null and b/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08-medium.webp differ diff --git a/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08-thumb.webp b/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08-thumb.webp new file mode 100644 index 00000000..41a2e9d7 Binary files /dev/null and b/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08-thumb.webp differ diff --git a/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08.webp b/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08.webp new file mode 100644 index 00000000..325b87dd Binary files /dev/null and b/backend/public/images/products/77/689cb3d86c32d0aa5e4e62f3-a6f73d08.webp differ diff --git a/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8-medium.webp b/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8-medium.webp new file mode 100644 index 00000000..5822fc34 Binary files /dev/null and b/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8-medium.webp differ diff --git a/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8-thumb.webp b/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8-thumb.webp new file mode 100644 index 00000000..de722f03 Binary files /dev/null and b/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8-thumb.webp differ diff --git a/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8.webp b/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8.webp new file mode 100644 index 00000000..28ef4c2a Binary files /dev/null and b/backend/public/images/products/77/689e06ce41438791a01ba31c-7ef63ba8.webp differ diff --git a/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce-medium.webp b/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce-medium.webp new file mode 100644 index 00000000..2541f6d7 Binary files /dev/null and b/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce-medium.webp differ diff --git a/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce-thumb.webp b/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce-thumb.webp new file mode 100644 index 00000000..4b2befa3 Binary files /dev/null and b/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce-thumb.webp differ diff --git a/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce.webp b/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce.webp new file mode 100644 index 00000000..0391f9ff Binary files /dev/null and b/backend/public/images/products/77/689e209fee484ecf4832b6f2-c4bb47ce.webp differ diff --git a/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6-medium.webp b/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6-medium.webp new file mode 100644 index 00000000..c67edfe6 Binary files /dev/null and b/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6-medium.webp differ diff --git a/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6-thumb.webp b/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6-thumb.webp new file mode 100644 index 00000000..43b82f38 Binary files /dev/null and b/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6-thumb.webp differ diff --git a/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6.webp b/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6.webp new file mode 100644 index 00000000..1ba01d59 Binary files /dev/null and b/backend/public/images/products/77/689e25bf492cb7352a475beb-ef7239d6.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696-medium.webp b/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696-medium.webp new file mode 100644 index 00000000..f5206351 Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696-medium.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696-thumb.webp b/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696-thumb.webp new file mode 100644 index 00000000..2fb89d3d Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696-thumb.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696.webp b/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696.webp new file mode 100644 index 00000000..2bee71be Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca62737f-c8066696.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696-medium.webp b/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696-medium.webp new file mode 100644 index 00000000..f5206351 Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696-medium.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696-thumb.webp b/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696-thumb.webp new file mode 100644 index 00000000..2fb89d3d Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696-thumb.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696.webp b/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696.webp new file mode 100644 index 00000000..2bee71be Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca627380-c8066696.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696-medium.webp b/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696-medium.webp new file mode 100644 index 00000000..f5206351 Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696-medium.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696-thumb.webp b/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696-thumb.webp new file mode 100644 index 00000000..2fb89d3d Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696-thumb.webp differ diff --git a/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696.webp b/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696.webp new file mode 100644 index 00000000..2bee71be Binary files /dev/null and b/backend/public/images/products/77/68a4d9a66add701cca627386-c8066696.webp differ diff --git a/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce-medium.webp b/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce-medium.webp new file mode 100644 index 00000000..0a31d60f Binary files /dev/null and b/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce-medium.webp differ diff --git a/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce-thumb.webp b/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce-thumb.webp new file mode 100644 index 00000000..e2bc908b Binary files /dev/null and b/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce-thumb.webp differ diff --git a/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce.webp b/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce.webp new file mode 100644 index 00000000..8ba9fe42 Binary files /dev/null and b/backend/public/images/products/77/68a4eb9fd66ee08531c1adf7-b31d19ce.webp differ diff --git a/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760-medium.webp b/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760-medium.webp new file mode 100644 index 00000000..e525a6e6 Binary files /dev/null and b/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760-medium.webp differ diff --git a/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760-thumb.webp b/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760-thumb.webp new file mode 100644 index 00000000..4d0ebdc7 Binary files /dev/null and b/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760-thumb.webp differ diff --git a/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760.webp b/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760.webp new file mode 100644 index 00000000..a833391b Binary files /dev/null and b/backend/public/images/products/77/68a600b1ade228625f7184b7-f8384760.webp differ diff --git a/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd-medium.webp b/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd-medium.webp new file mode 100644 index 00000000..e3a75b99 Binary files /dev/null and b/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd-medium.webp differ diff --git a/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd-thumb.webp b/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd-thumb.webp new file mode 100644 index 00000000..819f7fc5 Binary files /dev/null and b/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd-thumb.webp differ diff --git a/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd.webp b/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd.webp new file mode 100644 index 00000000..f08ae6f9 Binary files /dev/null and b/backend/public/images/products/77/68a6172410b64c6a34ef7ef8-7a66effd.webp differ diff --git a/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee-medium.webp b/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee-medium.webp new file mode 100644 index 00000000..aae4c8b9 Binary files /dev/null and b/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee-medium.webp differ diff --git a/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee-thumb.webp b/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee-thumb.webp new file mode 100644 index 00000000..1e6e5096 Binary files /dev/null and b/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee-thumb.webp differ diff --git a/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee.webp b/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee.webp new file mode 100644 index 00000000..6de9432e Binary files /dev/null and b/backend/public/images/products/77/68a62846a4f81c119120090f-15d90aee.webp differ diff --git a/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b-medium.webp b/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b-medium.webp new file mode 100644 index 00000000..b6b47238 Binary files /dev/null and b/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b-medium.webp differ diff --git a/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b-thumb.webp b/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b-thumb.webp new file mode 100644 index 00000000..352d7fe8 Binary files /dev/null and b/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b-thumb.webp differ diff --git a/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b.webp b/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b.webp new file mode 100644 index 00000000..aa8af80a Binary files /dev/null and b/backend/public/images/products/77/68a62846a4f81c1191200915-062c470b.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b-medium.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b-medium.webp new file mode 100644 index 00000000..3acce891 Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b-medium.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b-thumb.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b-thumb.webp new file mode 100644 index 00000000..6677bfe0 Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b-thumb.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b.webp new file mode 100644 index 00000000..2218fac9 Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b6-c25f1a0b.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e-medium.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e-medium.webp new file mode 100644 index 00000000..3a444e47 Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e-medium.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e-thumb.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e-thumb.webp new file mode 100644 index 00000000..5eedbeb1 Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e-thumb.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e.webp new file mode 100644 index 00000000..afb1bf89 Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b8-e705f09e.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4-medium.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4-medium.webp new file mode 100644 index 00000000..29958076 Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4-medium.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4-thumb.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4-thumb.webp new file mode 100644 index 00000000..982cc825 Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4-thumb.webp differ diff --git a/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4.webp b/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4.webp new file mode 100644 index 00000000..1640a1ba Binary files /dev/null and b/backend/public/images/products/77/68a75539f6aad759e4f483b9-5ebebeb4.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc-medium.webp b/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc-medium.webp new file mode 100644 index 00000000..21e523a4 Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc-medium.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc-thumb.webp b/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc-thumb.webp new file mode 100644 index 00000000..8290937f Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc-thumb.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc.webp b/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc.webp new file mode 100644 index 00000000..5ac1ee30 Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec8e-9f78b7bc.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc-medium.webp b/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc-medium.webp new file mode 100644 index 00000000..21e523a4 Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc-medium.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc-thumb.webp b/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc-thumb.webp new file mode 100644 index 00000000..8290937f Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc-thumb.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc.webp b/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc.webp new file mode 100644 index 00000000..5ac1ee30 Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec8f-9f78b7bc.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc-medium.webp b/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc-medium.webp new file mode 100644 index 00000000..21e523a4 Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc-medium.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc-thumb.webp b/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc-thumb.webp new file mode 100644 index 00000000..8290937f Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc-thumb.webp differ diff --git a/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc.webp b/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc.webp new file mode 100644 index 00000000..5ac1ee30 Binary files /dev/null and b/backend/public/images/products/77/68a88de19521a80abf47ec90-9f78b7bc.webp differ diff --git a/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d-medium.webp b/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d-medium.webp new file mode 100644 index 00000000..3fae3e89 Binary files /dev/null and b/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d-medium.webp differ diff --git a/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d-thumb.webp b/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d-thumb.webp new file mode 100644 index 00000000..29cbbb47 Binary files /dev/null and b/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d-thumb.webp differ diff --git a/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d.webp b/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d.webp new file mode 100644 index 00000000..8c1c86dc Binary files /dev/null and b/backend/public/images/products/77/68a8aae5d713ea35abf0f353-5cf9831d.webp differ diff --git a/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6-medium.webp b/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6-thumb.webp b/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6.webp b/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/68acabcad0ca3b29a56d691d-701c49c6.webp differ diff --git a/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d-medium.webp b/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d-medium.webp new file mode 100644 index 00000000..d9f92220 Binary files /dev/null and b/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d-medium.webp differ diff --git a/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d-thumb.webp b/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d-thumb.webp new file mode 100644 index 00000000..69b22bfd Binary files /dev/null and b/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d-thumb.webp differ diff --git a/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d.webp b/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d.webp new file mode 100644 index 00000000..4708c088 Binary files /dev/null and b/backend/public/images/products/77/68b09a3b3487c1e5404df7e9-abca866d.webp differ diff --git a/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4-medium.webp b/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4-medium.webp new file mode 100644 index 00000000..a9aea5bc Binary files /dev/null and b/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4-medium.webp differ diff --git a/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4-thumb.webp b/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4-thumb.webp new file mode 100644 index 00000000..d14d92aa Binary files /dev/null and b/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4-thumb.webp differ diff --git a/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4.webp b/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4.webp new file mode 100644 index 00000000..61b42538 Binary files /dev/null and b/backend/public/images/products/77/68b09a3b3487c1e5404df7ea-32dff9a4.webp differ diff --git a/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5-medium.webp b/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5-medium.webp new file mode 100644 index 00000000..f0091b81 Binary files /dev/null and b/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5-medium.webp differ diff --git a/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5-thumb.webp b/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5-thumb.webp new file mode 100644 index 00000000..cf3ca006 Binary files /dev/null and b/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5-thumb.webp differ diff --git a/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5.webp b/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5.webp new file mode 100644 index 00000000..ae1147e7 Binary files /dev/null and b/backend/public/images/products/77/68b0a646a521003ac9ec8e6d-7e5fc2c5.webp differ diff --git a/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc-medium.webp b/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc-medium.webp new file mode 100644 index 00000000..68bd0174 Binary files /dev/null and b/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc-medium.webp differ diff --git a/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc-thumb.webp b/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc-thumb.webp new file mode 100644 index 00000000..0c41fa4a Binary files /dev/null and b/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc-thumb.webp differ diff --git a/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc.webp b/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc.webp new file mode 100644 index 00000000..b0b1ddb0 Binary files /dev/null and b/backend/public/images/products/77/68b0ad929739c9531a92485a-920b80bc.webp differ diff --git a/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d-medium.webp b/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d-medium.webp new file mode 100644 index 00000000..3fae3e89 Binary files /dev/null and b/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d-medium.webp differ diff --git a/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d-thumb.webp b/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d-thumb.webp new file mode 100644 index 00000000..29cbbb47 Binary files /dev/null and b/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d-thumb.webp differ diff --git a/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d.webp b/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d.webp new file mode 100644 index 00000000..8c1c86dc Binary files /dev/null and b/backend/public/images/products/77/68b4695d67f1b0d1d545b1c8-5cf9831d.webp differ diff --git a/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70-medium.webp b/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70-medium.webp new file mode 100644 index 00000000..0da71289 Binary files /dev/null and b/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70-medium.webp differ diff --git a/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70-thumb.webp b/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70-thumb.webp new file mode 100644 index 00000000..bcd59072 Binary files /dev/null and b/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70-thumb.webp differ diff --git a/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70.webp b/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70.webp new file mode 100644 index 00000000..9f881f7e Binary files /dev/null and b/backend/public/images/products/77/68b8814e28540326c2e9cbb9-ffe4ef70.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e-medium.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e-medium.webp new file mode 100644 index 00000000..51e6a4d2 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e-medium.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e-thumb.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e-thumb.webp new file mode 100644 index 00000000..230fc5dc Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e-thumb.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e.webp new file mode 100644 index 00000000..a5d997ae Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9584-4a53299e.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1-medium.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1-medium.webp new file mode 100644 index 00000000..c5963e09 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1-medium.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1-thumb.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1-thumb.webp new file mode 100644 index 00000000..7c2b1a47 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1-thumb.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1.webp new file mode 100644 index 00000000..4c617855 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9586-6bdd03e1.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1-medium.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1-medium.webp new file mode 100644 index 00000000..c5963e09 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1-medium.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1-thumb.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1-thumb.webp new file mode 100644 index 00000000..7c2b1a47 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1-thumb.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1.webp new file mode 100644 index 00000000..4c617855 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9587-6bdd03e1.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1-medium.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1-medium.webp new file mode 100644 index 00000000..c5963e09 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1-medium.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1-thumb.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1-thumb.webp new file mode 100644 index 00000000..7c2b1a47 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1-thumb.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1.webp new file mode 100644 index 00000000..4c617855 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9588-6bdd03e1.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1-medium.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1-medium.webp new file mode 100644 index 00000000..c5963e09 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1-medium.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1-thumb.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1-thumb.webp new file mode 100644 index 00000000..7c2b1a47 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1-thumb.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1.webp new file mode 100644 index 00000000..4c617855 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d9589-6bdd03e1.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1-medium.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1-medium.webp new file mode 100644 index 00000000..c5963e09 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1-medium.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1-thumb.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1-thumb.webp new file mode 100644 index 00000000..7c2b1a47 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1-thumb.webp differ diff --git a/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1.webp b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1.webp new file mode 100644 index 00000000..4c617855 Binary files /dev/null and b/backend/public/images/products/77/68bb6d7f34d8f7fc7f5d958a-6bdd03e1.webp differ diff --git a/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d-medium.webp b/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d-medium.webp new file mode 100644 index 00000000..9a085894 Binary files /dev/null and b/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d-medium.webp differ diff --git a/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d-thumb.webp b/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d-thumb.webp new file mode 100644 index 00000000..fcf649e4 Binary files /dev/null and b/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d-thumb.webp differ diff --git a/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d.webp b/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d.webp new file mode 100644 index 00000000..508d85ee Binary files /dev/null and b/backend/public/images/products/77/68bf1a9fdc00af7e9eef1220-5904972d.webp differ diff --git a/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05-medium.webp b/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05-medium.webp new file mode 100644 index 00000000..20206c11 Binary files /dev/null and b/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05-medium.webp differ diff --git a/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05-thumb.webp b/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05-thumb.webp new file mode 100644 index 00000000..594e8390 Binary files /dev/null and b/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05-thumb.webp differ diff --git a/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05.webp b/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05.webp new file mode 100644 index 00000000..7a816f8c Binary files /dev/null and b/backend/public/images/products/77/68bf1f724c7efe7c2ed421d4-5860da05.webp differ diff --git a/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026-medium.webp b/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026-medium.webp new file mode 100644 index 00000000..da5f33bd Binary files /dev/null and b/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026-medium.webp differ diff --git a/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026-thumb.webp b/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026-thumb.webp new file mode 100644 index 00000000..a75ed592 Binary files /dev/null and b/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026-thumb.webp differ diff --git a/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026.webp b/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026.webp new file mode 100644 index 00000000..df432668 Binary files /dev/null and b/backend/public/images/products/77/68bf441616e7ab3e7cf39dcf-5a8e5026.webp differ diff --git a/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01-medium.webp b/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01-medium.webp new file mode 100644 index 00000000..7cdd7511 Binary files /dev/null and b/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01-medium.webp differ diff --git a/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01-thumb.webp b/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01-thumb.webp new file mode 100644 index 00000000..e6eecd49 Binary files /dev/null and b/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01-thumb.webp differ diff --git a/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01.webp b/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01.webp new file mode 100644 index 00000000..61f4fad3 Binary files /dev/null and b/backend/public/images/products/77/68bf441616e7ab3e7cf39dd0-8c9cfc01.webp differ diff --git a/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806-medium.webp b/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806-medium.webp new file mode 100644 index 00000000..47875c5c Binary files /dev/null and b/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806-medium.webp differ diff --git a/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806-thumb.webp b/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806-thumb.webp new file mode 100644 index 00000000..2e4f5a4b Binary files /dev/null and b/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806-thumb.webp differ diff --git a/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806.webp b/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806.webp new file mode 100644 index 00000000..5560c3e6 Binary files /dev/null and b/backend/public/images/products/77/68c05e933c07e972419dcb4b-2bf1f806.webp differ diff --git a/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504-medium.webp b/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504-medium.webp new file mode 100644 index 00000000..abc2d4d4 Binary files /dev/null and b/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504-medium.webp differ diff --git a/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504-thumb.webp b/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504-thumb.webp new file mode 100644 index 00000000..6dd4f460 Binary files /dev/null and b/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504-thumb.webp differ diff --git a/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504.webp b/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504.webp new file mode 100644 index 00000000..0a82e0a6 Binary files /dev/null and b/backend/public/images/products/77/68c06cffbb070502edccc5c0-0789b504.webp differ diff --git a/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8-medium.webp b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8-medium.webp new file mode 100644 index 00000000..fc9a0bc2 Binary files /dev/null and b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8-medium.webp differ diff --git a/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8-thumb.webp b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8-thumb.webp new file mode 100644 index 00000000..01b10289 Binary files /dev/null and b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8-thumb.webp differ diff --git a/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8.webp b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8.webp new file mode 100644 index 00000000..4d29d9d3 Binary files /dev/null and b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7634-0b3776c8.webp differ diff --git a/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270-medium.webp b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270-medium.webp new file mode 100644 index 00000000..aba08f9a Binary files /dev/null and b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270-medium.webp differ diff --git a/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270-thumb.webp b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270-thumb.webp new file mode 100644 index 00000000..113559a7 Binary files /dev/null and b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270-thumb.webp differ diff --git a/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270.webp b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270.webp new file mode 100644 index 00000000..4f402fab Binary files /dev/null and b/backend/public/images/products/77/68c07cb116e7ab3e7c5a7635-a11ae270.webp differ diff --git a/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9-medium.webp b/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9-medium.webp new file mode 100644 index 00000000..ec5bb5ba Binary files /dev/null and b/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9-medium.webp differ diff --git a/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9-thumb.webp b/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9-thumb.webp new file mode 100644 index 00000000..9499fabe Binary files /dev/null and b/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9-thumb.webp differ diff --git a/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9.webp b/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9.webp new file mode 100644 index 00000000..bd41cfe3 Binary files /dev/null and b/backend/public/images/products/77/68c1b52d4c7efe7c2e9c7aa2-8cd39df9.webp differ diff --git a/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572-medium.webp b/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572-medium.webp new file mode 100644 index 00000000..bd0b6569 Binary files /dev/null and b/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572-medium.webp differ diff --git a/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572-thumb.webp b/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572-thumb.webp new file mode 100644 index 00000000..a1da307e Binary files /dev/null and b/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572-thumb.webp differ diff --git a/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572.webp b/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572.webp new file mode 100644 index 00000000..a83c1e46 Binary files /dev/null and b/backend/public/images/products/77/68c2e7cb00d88ae174be5506-bcf46572.webp differ diff --git a/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b-medium.webp b/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b-medium.webp new file mode 100644 index 00000000..224ac1c1 Binary files /dev/null and b/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b-medium.webp differ diff --git a/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b-thumb.webp b/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b-thumb.webp new file mode 100644 index 00000000..5133a847 Binary files /dev/null and b/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b-thumb.webp differ diff --git a/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b.webp b/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b.webp new file mode 100644 index 00000000..b1261a85 Binary files /dev/null and b/backend/public/images/products/77/68c86484108556f2cfe0daa9-0470080b.webp differ diff --git a/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080-medium.webp b/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080-medium.webp new file mode 100644 index 00000000..0f49c3c4 Binary files /dev/null and b/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080-medium.webp differ diff --git a/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080-thumb.webp b/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080-thumb.webp new file mode 100644 index 00000000..f17fc236 Binary files /dev/null and b/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080-thumb.webp differ diff --git a/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080.webp b/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080.webp new file mode 100644 index 00000000..df7f01f4 Binary files /dev/null and b/backend/public/images/products/77/68c86484108556f2cfe0daaa-dd854080.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671-medium.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671-medium.webp new file mode 100644 index 00000000..f49bec65 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671-medium.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671-thumb.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671-thumb.webp new file mode 100644 index 00000000..71692995 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671-thumb.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671.webp new file mode 100644 index 00000000..1b70fe61 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7ca-e3799671.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671-medium.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671-medium.webp new file mode 100644 index 00000000..f49bec65 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671-medium.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671-thumb.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671-thumb.webp new file mode 100644 index 00000000..71692995 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671-thumb.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671.webp new file mode 100644 index 00000000..1b70fe61 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7cb-e3799671.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671-medium.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671-medium.webp new file mode 100644 index 00000000..f49bec65 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671-medium.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671-thumb.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671-thumb.webp new file mode 100644 index 00000000..71692995 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671-thumb.webp differ diff --git a/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671.webp b/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671.webp new file mode 100644 index 00000000..1b70fe61 Binary files /dev/null and b/backend/public/images/products/77/68c880250ac3b0a235d0a7cc-e3799671.webp differ diff --git a/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655-medium.webp b/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655-medium.webp new file mode 100644 index 00000000..f6971622 Binary files /dev/null and b/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655-medium.webp differ diff --git a/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655-thumb.webp b/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655-thumb.webp new file mode 100644 index 00000000..478cccc4 Binary files /dev/null and b/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655-thumb.webp differ diff --git a/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655.webp b/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655.webp new file mode 100644 index 00000000..a91da739 Binary files /dev/null and b/backend/public/images/products/77/68c9b1f173950acd69ecb41b-d2265655.webp differ diff --git a/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22-medium.webp b/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22-medium.webp new file mode 100644 index 00000000..25d7ac46 Binary files /dev/null and b/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22-medium.webp differ diff --git a/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22-thumb.webp b/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22-thumb.webp new file mode 100644 index 00000000..68871baa Binary files /dev/null and b/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22-thumb.webp differ diff --git a/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22.webp b/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22.webp new file mode 100644 index 00000000..168da607 Binary files /dev/null and b/backend/public/images/products/77/68c9cf634a0e08403c226821-b02e6f22.webp differ diff --git a/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd-medium.webp b/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd-medium.webp new file mode 100644 index 00000000..53d35ed4 Binary files /dev/null and b/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd-medium.webp differ diff --git a/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd-thumb.webp b/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd-thumb.webp new file mode 100644 index 00000000..3641ad0d Binary files /dev/null and b/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd-thumb.webp differ diff --git a/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd.webp b/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd.webp new file mode 100644 index 00000000..0d2bb8b3 Binary files /dev/null and b/backend/public/images/products/77/68c9cf634a0e08403c226822-bf330cfd.webp differ diff --git a/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e-medium.webp b/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e-medium.webp new file mode 100644 index 00000000..99a8b652 Binary files /dev/null and b/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e-medium.webp differ diff --git a/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e-thumb.webp b/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e-thumb.webp new file mode 100644 index 00000000..0537d2b8 Binary files /dev/null and b/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e-thumb.webp differ diff --git a/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e.webp b/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e.webp new file mode 100644 index 00000000..ff000a98 Binary files /dev/null and b/backend/public/images/products/77/68c9d1f617e590fd41b4a76d-42c1403e.webp differ diff --git a/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef-medium.webp b/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef-medium.webp new file mode 100644 index 00000000..e21217f2 Binary files /dev/null and b/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef-medium.webp differ diff --git a/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef-thumb.webp b/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef-thumb.webp new file mode 100644 index 00000000..59f070d3 Binary files /dev/null and b/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef-thumb.webp differ diff --git a/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef.webp b/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef.webp new file mode 100644 index 00000000..7cb36d42 Binary files /dev/null and b/backend/public/images/products/77/68cae4e955ea4905ce11cd17-31e481ef.webp differ diff --git a/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038-medium.webp b/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038-medium.webp new file mode 100644 index 00000000..10f8e8ea Binary files /dev/null and b/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038-medium.webp differ diff --git a/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038-thumb.webp b/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038-thumb.webp new file mode 100644 index 00000000..d7820cd6 Binary files /dev/null and b/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038-thumb.webp differ diff --git a/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038.webp b/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038.webp new file mode 100644 index 00000000..537e3931 Binary files /dev/null and b/backend/public/images/products/77/68cb0550bbbce737ea5fc1bd-13edc038.webp differ diff --git a/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13-medium.webp b/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13-medium.webp new file mode 100644 index 00000000..55eff771 Binary files /dev/null and b/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13-medium.webp differ diff --git a/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13-thumb.webp b/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13-thumb.webp new file mode 100644 index 00000000..6b81afea Binary files /dev/null and b/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13-thumb.webp differ diff --git a/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13.webp b/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13.webp new file mode 100644 index 00000000..35ac4114 Binary files /dev/null and b/backend/public/images/products/77/68cb0550bbbce737ea5fc1be-ae176c13.webp differ diff --git a/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79-medium.webp b/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79-medium.webp new file mode 100644 index 00000000..9bc6ccab Binary files /dev/null and b/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79-medium.webp differ diff --git a/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79-thumb.webp b/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79-thumb.webp new file mode 100644 index 00000000..8b44ae04 Binary files /dev/null and b/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79-thumb.webp differ diff --git a/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79.webp b/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79.webp new file mode 100644 index 00000000..fa71fd3d Binary files /dev/null and b/backend/public/images/products/77/68cc44bb68b18e18ad0c5b5c-b4f0eb79.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b-medium.webp new file mode 100644 index 00000000..8efab851 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b-thumb.webp new file mode 100644 index 00000000..e37df535 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b.webp new file mode 100644 index 00000000..552db0db Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc61-0503945b.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3-medium.webp new file mode 100644 index 00000000..817f3fd9 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3-thumb.webp new file mode 100644 index 00000000..cda156e7 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3.webp new file mode 100644 index 00000000..f71407a4 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc62-05a216c3.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733-medium.webp new file mode 100644 index 00000000..b74d4d60 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733-thumb.webp new file mode 100644 index 00000000..182dac7f Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733.webp new file mode 100644 index 00000000..155998bf Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc63-2737d733.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538-medium.webp new file mode 100644 index 00000000..d80788ef Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538-thumb.webp new file mode 100644 index 00000000..e68e68ba Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538.webp new file mode 100644 index 00000000..9dea73a5 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc64-88060538.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d-medium.webp new file mode 100644 index 00000000..bff3fd5a Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d-thumb.webp new file mode 100644 index 00000000..72a1e51c Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d.webp new file mode 100644 index 00000000..7d2bc0c3 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc65-9127273d.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4-medium.webp new file mode 100644 index 00000000..3af6c940 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4-thumb.webp new file mode 100644 index 00000000..d7019ec5 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4.webp new file mode 100644 index 00000000..7c7961ca Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc66-a1269ad4.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1-medium.webp new file mode 100644 index 00000000..a2102ae8 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1-thumb.webp new file mode 100644 index 00000000..848ffe0a Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1.webp new file mode 100644 index 00000000..4bae55eb Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc67-03c625d1.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085-medium.webp new file mode 100644 index 00000000..a5b1bb32 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085-thumb.webp new file mode 100644 index 00000000..07b68c2b Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085.webp new file mode 100644 index 00000000..f64cae75 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc68-b223d085.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0-medium.webp new file mode 100644 index 00000000..c0af943e Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0-thumb.webp new file mode 100644 index 00000000..89998665 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0.webp new file mode 100644 index 00000000..6cd451c3 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc69-7caa1ee0.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7-medium.webp new file mode 100644 index 00000000..5204282d Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7-thumb.webp new file mode 100644 index 00000000..15559fd7 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7.webp new file mode 100644 index 00000000..088af592 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6a-9e4fc4b7.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5-medium.webp new file mode 100644 index 00000000..0d81a3b6 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5-thumb.webp new file mode 100644 index 00000000..43638f52 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5.webp new file mode 100644 index 00000000..96251d57 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6b-8498d1d5.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176-medium.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176-medium.webp new file mode 100644 index 00000000..804f294e Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176-medium.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176-thumb.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176-thumb.webp new file mode 100644 index 00000000..fcf07d3c Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176-thumb.webp differ diff --git a/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176.webp b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176.webp new file mode 100644 index 00000000..bf5d3113 Binary files /dev/null and b/backend/public/images/products/77/68cd60b8dda3e0b48a76cc6c-84119176.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa-medium.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa-thumb.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef56-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de-medium.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de-medium.webp new file mode 100644 index 00000000..969698ed Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de-medium.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de-thumb.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de-thumb.webp new file mode 100644 index 00000000..f0f3abca Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de-thumb.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de.webp new file mode 100644 index 00000000..612c5d1a Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef57-b27f74de.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45-medium.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45-medium.webp new file mode 100644 index 00000000..f9a56e85 Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45-medium.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45-thumb.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45-thumb.webp new file mode 100644 index 00000000..d8d80fad Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45-thumb.webp differ diff --git a/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45.webp b/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45.webp new file mode 100644 index 00000000..06319b26 Binary files /dev/null and b/backend/public/images/products/77/68cdce15db0108d3cb82ef58-b80fde45.webp differ diff --git a/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860-medium.webp b/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860-medium.webp new file mode 100644 index 00000000..5c1bf130 Binary files /dev/null and b/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860-medium.webp differ diff --git a/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860-thumb.webp b/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860-thumb.webp new file mode 100644 index 00000000..c380324b Binary files /dev/null and b/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860-thumb.webp differ diff --git a/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860.webp b/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860.webp new file mode 100644 index 00000000..36453054 Binary files /dev/null and b/backend/public/images/products/77/68d2e795cc404395eeada824-5598a860.webp differ diff --git a/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c-medium.webp b/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c-medium.webp new file mode 100644 index 00000000..c9ece984 Binary files /dev/null and b/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c-medium.webp differ diff --git a/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c-thumb.webp b/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c-thumb.webp new file mode 100644 index 00000000..70c1dd8e Binary files /dev/null and b/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c-thumb.webp differ diff --git a/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c.webp b/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c.webp new file mode 100644 index 00000000..5bcf3271 Binary files /dev/null and b/backend/public/images/products/77/68d42e6bd9027c7211bd4a87-b04ec21c.webp differ diff --git a/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504-medium.webp b/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504-medium.webp new file mode 100644 index 00000000..abc2d4d4 Binary files /dev/null and b/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504-medium.webp differ diff --git a/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504-thumb.webp b/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504-thumb.webp new file mode 100644 index 00000000..6dd4f460 Binary files /dev/null and b/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504-thumb.webp differ diff --git a/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504.webp b/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504.webp new file mode 100644 index 00000000..0a82e0a6 Binary files /dev/null and b/backend/public/images/products/77/68d453b33f279e8aff6335d3-0789b504.webp differ diff --git a/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d-medium.webp b/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d-medium.webp new file mode 100644 index 00000000..495b6462 Binary files /dev/null and b/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d-medium.webp differ diff --git a/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d-thumb.webp b/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d-thumb.webp new file mode 100644 index 00000000..e0625dc4 Binary files /dev/null and b/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d-thumb.webp differ diff --git a/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d.webp b/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d.webp new file mode 100644 index 00000000..6b67e01a Binary files /dev/null and b/backend/public/images/products/77/68d4562c5f1d185186b12b3c-ff93919d.webp differ diff --git a/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5-medium.webp b/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5-medium.webp new file mode 100644 index 00000000..a73ad938 Binary files /dev/null and b/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5-medium.webp differ diff --git a/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5-thumb.webp b/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5-thumb.webp new file mode 100644 index 00000000..7dcd3d98 Binary files /dev/null and b/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5-thumb.webp differ diff --git a/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5.webp b/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5.webp new file mode 100644 index 00000000..be8eaf0b Binary files /dev/null and b/backend/public/images/products/77/68d45875c3402ffd196e28db-a225d1e5.webp differ diff --git a/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa-medium.webp b/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa-medium.webp new file mode 100644 index 00000000..54df8cef Binary files /dev/null and b/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa-medium.webp differ diff --git a/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa-thumb.webp b/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa-thumb.webp new file mode 100644 index 00000000..cd6b3ff0 Binary files /dev/null and b/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa-thumb.webp differ diff --git a/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa.webp b/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa.webp new file mode 100644 index 00000000..965b2e43 Binary files /dev/null and b/backend/public/images/products/77/68d45875c3402ffd196e28dc-7ca384aa.webp differ diff --git a/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef-medium.webp b/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef-medium.webp new file mode 100644 index 00000000..e21217f2 Binary files /dev/null and b/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef-medium.webp differ diff --git a/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef-thumb.webp b/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef-thumb.webp new file mode 100644 index 00000000..59f070d3 Binary files /dev/null and b/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef-thumb.webp differ diff --git a/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef.webp b/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef.webp new file mode 100644 index 00000000..7cb36d42 Binary files /dev/null and b/backend/public/images/products/77/68d580391dabc63c613fc076-31e481ef.webp differ diff --git a/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6-medium.webp b/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6-medium.webp new file mode 100644 index 00000000..2f3dab99 Binary files /dev/null and b/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6-medium.webp differ diff --git a/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6-thumb.webp b/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6-thumb.webp new file mode 100644 index 00000000..ef30c14e Binary files /dev/null and b/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6-thumb.webp differ diff --git a/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6.webp b/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6.webp new file mode 100644 index 00000000..1f367c91 Binary files /dev/null and b/backend/public/images/products/77/68d58288684f31eef3a22194-1149dcb6.webp differ diff --git a/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6-medium.webp b/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6-medium.webp new file mode 100644 index 00000000..2f3dab99 Binary files /dev/null and b/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6-medium.webp differ diff --git a/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6-thumb.webp b/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6-thumb.webp new file mode 100644 index 00000000..ef30c14e Binary files /dev/null and b/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6-thumb.webp differ diff --git a/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6.webp b/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6.webp new file mode 100644 index 00000000..1f367c91 Binary files /dev/null and b/backend/public/images/products/77/68d58288684f31eef3a22195-1149dcb6.webp differ diff --git a/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a-medium.webp b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a-medium.webp new file mode 100644 index 00000000..5514732b Binary files /dev/null and b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a-medium.webp differ diff --git a/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a-thumb.webp b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a-thumb.webp new file mode 100644 index 00000000..af25bd10 Binary files /dev/null and b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a-thumb.webp differ diff --git a/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a.webp b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a.webp new file mode 100644 index 00000000..07351b07 Binary files /dev/null and b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e261-e4c2433a.webp differ diff --git a/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a-medium.webp b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a-medium.webp new file mode 100644 index 00000000..5514732b Binary files /dev/null and b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a-medium.webp differ diff --git a/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a-thumb.webp b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a-thumb.webp new file mode 100644 index 00000000..af25bd10 Binary files /dev/null and b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a-thumb.webp differ diff --git a/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a.webp b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a.webp new file mode 100644 index 00000000..07351b07 Binary files /dev/null and b/backend/public/images/products/77/68d6bb0b11f36ffd18b0e262-e4c2433a.webp differ diff --git a/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544-medium.webp b/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544-thumb.webp b/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544.webp b/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/68d88110807db8787fffcf09-feef4544.webp differ diff --git a/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba-medium.webp b/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba-medium.webp new file mode 100644 index 00000000..ce890fb5 Binary files /dev/null and b/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba-medium.webp differ diff --git a/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba-thumb.webp b/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba-thumb.webp new file mode 100644 index 00000000..6cd1f0f0 Binary files /dev/null and b/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba-thumb.webp differ diff --git a/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba.webp b/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba.webp new file mode 100644 index 00000000..d551d41b Binary files /dev/null and b/backend/public/images/products/77/68d885e6c41b915a706d5d1c-1fff02ba.webp differ diff --git a/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931-medium.webp b/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931-medium.webp new file mode 100644 index 00000000..7952d2b5 Binary files /dev/null and b/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931-medium.webp differ diff --git a/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931-thumb.webp b/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931-thumb.webp new file mode 100644 index 00000000..c20e38e4 Binary files /dev/null and b/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931-thumb.webp differ diff --git a/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931.webp b/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931.webp new file mode 100644 index 00000000..d25a714c Binary files /dev/null and b/backend/public/images/products/77/68d89bcc1da0f1c9d83b1841-84174931.webp differ diff --git a/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5-medium.webp b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5-medium.webp new file mode 100644 index 00000000..9ebf6ba5 Binary files /dev/null and b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5-medium.webp differ diff --git a/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5-thumb.webp b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5-thumb.webp new file mode 100644 index 00000000..33ed6505 Binary files /dev/null and b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5-thumb.webp differ diff --git a/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5.webp b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5.webp new file mode 100644 index 00000000..a97bc67d Binary files /dev/null and b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9ee-b596c8d5.webp differ diff --git a/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d-medium.webp b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d-medium.webp new file mode 100644 index 00000000..e36965ea Binary files /dev/null and b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d-medium.webp differ diff --git a/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d-thumb.webp b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d-thumb.webp new file mode 100644 index 00000000..ce97af3e Binary files /dev/null and b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d-thumb.webp differ diff --git a/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d.webp b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d.webp new file mode 100644 index 00000000..fd623dd9 Binary files /dev/null and b/backend/public/images/products/77/68d8b6319eb6e9228bc6b9f1-8a6cda7d.webp differ diff --git a/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef-medium.webp b/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef-medium.webp new file mode 100644 index 00000000..e21217f2 Binary files /dev/null and b/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef-medium.webp differ diff --git a/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef-thumb.webp b/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef-thumb.webp new file mode 100644 index 00000000..59f070d3 Binary files /dev/null and b/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef-thumb.webp differ diff --git a/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef.webp b/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef.webp new file mode 100644 index 00000000..7cb36d42 Binary files /dev/null and b/backend/public/images/products/77/68dac304076a0a7a9f20895d-31e481ef.webp differ diff --git a/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa-medium.webp b/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa-thumb.webp b/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa.webp b/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/68daca6cf04f2e774d865ecd-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b-medium.webp b/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b-medium.webp new file mode 100644 index 00000000..50aa7255 Binary files /dev/null and b/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b-medium.webp differ diff --git a/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b-thumb.webp b/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b-thumb.webp new file mode 100644 index 00000000..034e746f Binary files /dev/null and b/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b-thumb.webp differ diff --git a/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b.webp b/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b.webp new file mode 100644 index 00000000..f6bde44b Binary files /dev/null and b/backend/public/images/products/77/68dc362bbfa6967443f8703d-aeaa307b.webp differ diff --git a/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134-medium.webp b/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134-medium.webp new file mode 100644 index 00000000..89eda587 Binary files /dev/null and b/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134-medium.webp differ diff --git a/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134-thumb.webp b/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134-thumb.webp new file mode 100644 index 00000000..73538bc5 Binary files /dev/null and b/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134-thumb.webp differ diff --git a/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134.webp b/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134.webp new file mode 100644 index 00000000..cfd2da43 Binary files /dev/null and b/backend/public/images/products/77/68dc362bbfa6967443f8703e-f0062134.webp differ diff --git a/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544-medium.webp b/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544-thumb.webp b/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544.webp b/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/68dd71c645bb9c8661f85703-feef4544.webp differ diff --git a/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3-medium.webp b/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3-medium.webp new file mode 100644 index 00000000..86663cbe Binary files /dev/null and b/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3-medium.webp differ diff --git a/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3-thumb.webp b/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3-thumb.webp new file mode 100644 index 00000000..48d83275 Binary files /dev/null and b/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3-thumb.webp differ diff --git a/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3.webp b/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3.webp new file mode 100644 index 00000000..0354c30b Binary files /dev/null and b/backend/public/images/products/77/68dd792ef1148a1b1dadf05c-9439e1d3.webp differ diff --git a/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544-medium.webp b/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544-thumb.webp b/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544.webp b/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/68dd80b924fa96ccd69e2e81-feef4544.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759-medium.webp b/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759-medium.webp new file mode 100644 index 00000000..765f55a4 Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759-medium.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759-thumb.webp b/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759-thumb.webp new file mode 100644 index 00000000..7c2fd4f0 Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759-thumb.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759.webp b/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759.webp new file mode 100644 index 00000000..dcf46b8e Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d927-81cd9759.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed-medium.webp b/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed-medium.webp new file mode 100644 index 00000000..3d11107e Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed-medium.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed-thumb.webp b/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed-thumb.webp new file mode 100644 index 00000000..7256ee78 Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed-thumb.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed.webp b/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed.webp new file mode 100644 index 00000000..e20f9c12 Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d928-ffcdefed.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed-medium.webp b/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed-medium.webp new file mode 100644 index 00000000..3d11107e Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed-medium.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed-thumb.webp b/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed-thumb.webp new file mode 100644 index 00000000..7256ee78 Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed-thumb.webp differ diff --git a/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed.webp b/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed.webp new file mode 100644 index 00000000..e20f9c12 Binary files /dev/null and b/backend/public/images/products/77/68dd89283b925a8a6841d92b-ffcdefed.webp differ diff --git a/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476-medium.webp b/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476-medium.webp new file mode 100644 index 00000000..3990c742 Binary files /dev/null and b/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476-medium.webp differ diff --git a/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476-thumb.webp b/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476-thumb.webp new file mode 100644 index 00000000..cdff277d Binary files /dev/null and b/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476-thumb.webp differ diff --git a/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476.webp b/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476.webp new file mode 100644 index 00000000..9839ff68 Binary files /dev/null and b/backend/public/images/products/77/68dd8dd1160d8d9dbbc0cde1-177f2476.webp differ diff --git a/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa-medium.webp b/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa-thumb.webp b/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa.webp b/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/68deade7c79ce1451ea49ba9-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057-medium.webp b/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057-medium.webp new file mode 100644 index 00000000..f09d293e Binary files /dev/null and b/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057-medium.webp differ diff --git a/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057-thumb.webp b/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057-thumb.webp new file mode 100644 index 00000000..d8132b3f Binary files /dev/null and b/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057-thumb.webp differ diff --git a/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057.webp b/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057.webp new file mode 100644 index 00000000..7f950791 Binary files /dev/null and b/backend/public/images/products/77/68decb09b218f834dd8bc1bf-122f8057.webp differ diff --git a/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83-medium.webp b/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83-medium.webp new file mode 100644 index 00000000..3874dc2c Binary files /dev/null and b/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83-medium.webp differ diff --git a/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83-thumb.webp b/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83-thumb.webp new file mode 100644 index 00000000..58edc397 Binary files /dev/null and b/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83-thumb.webp differ diff --git a/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83.webp b/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83.webp new file mode 100644 index 00000000..eb821e8c Binary files /dev/null and b/backend/public/images/products/77/68decf89b2a7e71848dd3262-bbb48d83.webp differ diff --git a/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe-medium.webp b/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe-medium.webp new file mode 100644 index 00000000..32b99386 Binary files /dev/null and b/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe-medium.webp differ diff --git a/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe-thumb.webp b/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe-thumb.webp new file mode 100644 index 00000000..461f7f38 Binary files /dev/null and b/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe-thumb.webp differ diff --git a/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe.webp b/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe.webp new file mode 100644 index 00000000..4cfccafb Binary files /dev/null and b/backend/public/images/products/77/68df3db8314db2ef5aa34872-738ee0fe.webp differ diff --git a/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d-medium.webp b/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d-medium.webp new file mode 100644 index 00000000..a96895c3 Binary files /dev/null and b/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d-medium.webp differ diff --git a/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d-thumb.webp b/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d-thumb.webp new file mode 100644 index 00000000..679c35b3 Binary files /dev/null and b/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d-thumb.webp differ diff --git a/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d.webp b/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d.webp new file mode 100644 index 00000000..1fa585dc Binary files /dev/null and b/backend/public/images/products/77/68dffe2737dcabbe32da57e3-a8b8e38d.webp differ diff --git a/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f-medium.webp b/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f-medium.webp new file mode 100644 index 00000000..41af9648 Binary files /dev/null and b/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f-medium.webp differ diff --git a/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f-thumb.webp b/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f-thumb.webp new file mode 100644 index 00000000..944c265e Binary files /dev/null and b/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f-thumb.webp differ diff --git a/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f.webp b/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f.webp new file mode 100644 index 00000000..a1bca66a Binary files /dev/null and b/backend/public/images/products/77/68dffe2737dcabbe32da57e4-d14d761f.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95-medium.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95-thumb.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53d-2b235e95.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95-medium.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95-thumb.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53e-2b235e95.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95-medium.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95-thumb.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95.webp b/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c53f-2b235e95.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95-medium.webp b/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95-thumb.webp b/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95.webp b/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c540-2b235e95.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95-medium.webp b/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95-thumb.webp b/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95.webp b/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/68e00c250422e3a79e30c541-2b235e95.webp differ diff --git a/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95-medium.webp b/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95-thumb.webp b/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95.webp b/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/68e015eec4f174b4e1af995c-2b235e95.webp differ diff --git a/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129-medium.webp b/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129-medium.webp new file mode 100644 index 00000000..c5114b30 Binary files /dev/null and b/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129-medium.webp differ diff --git a/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129-thumb.webp b/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129-thumb.webp new file mode 100644 index 00000000..0b1f6676 Binary files /dev/null and b/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129-thumb.webp differ diff --git a/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129.webp b/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129.webp new file mode 100644 index 00000000..60b82747 Binary files /dev/null and b/backend/public/images/products/77/68e01f37c41cd34afe8c5e50-ccf70129.webp differ diff --git a/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93-medium.webp b/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93-medium.webp new file mode 100644 index 00000000..5751eb6a Binary files /dev/null and b/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93-medium.webp differ diff --git a/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93-thumb.webp b/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93-thumb.webp new file mode 100644 index 00000000..30d8d84a Binary files /dev/null and b/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93-thumb.webp differ diff --git a/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93.webp b/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93.webp new file mode 100644 index 00000000..1859d577 Binary files /dev/null and b/backend/public/images/products/77/68e02724d70500d19c1dd456-70425f93.webp differ diff --git a/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7-medium.webp b/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7-medium.webp new file mode 100644 index 00000000..ee4ae0f8 Binary files /dev/null and b/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7-medium.webp differ diff --git a/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7-thumb.webp b/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7-thumb.webp new file mode 100644 index 00000000..4f779ac0 Binary files /dev/null and b/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7-thumb.webp differ diff --git a/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7.webp b/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7.webp new file mode 100644 index 00000000..3d042c54 Binary files /dev/null and b/backend/public/images/products/77/68e029a16912aa13d8d66dcb-2256b0e7.webp differ diff --git a/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48-medium.webp b/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48-medium.webp new file mode 100644 index 00000000..fd3fcfdf Binary files /dev/null and b/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48-medium.webp differ diff --git a/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48-thumb.webp b/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48-thumb.webp new file mode 100644 index 00000000..cd7d6ec5 Binary files /dev/null and b/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48-thumb.webp differ diff --git a/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48.webp b/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48.webp new file mode 100644 index 00000000..056c0b72 Binary files /dev/null and b/backend/public/images/products/77/68e479e153bc93f46b7d3f59-4d3c6b48.webp differ diff --git a/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1-medium.webp b/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1-medium.webp new file mode 100644 index 00000000..d3e10a05 Binary files /dev/null and b/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1-medium.webp differ diff --git a/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1-thumb.webp b/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1-thumb.webp new file mode 100644 index 00000000..a8fb57f5 Binary files /dev/null and b/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1-thumb.webp differ diff --git a/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1.webp b/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1.webp new file mode 100644 index 00000000..41d278aa Binary files /dev/null and b/backend/public/images/products/77/68e47cd55c95e24bd8191136-140331d1.webp differ diff --git a/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37-medium.webp b/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37-medium.webp new file mode 100644 index 00000000..e027b31f Binary files /dev/null and b/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37-medium.webp differ diff --git a/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37-thumb.webp b/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37-thumb.webp new file mode 100644 index 00000000..6ffddd27 Binary files /dev/null and b/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37-thumb.webp differ diff --git a/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37.webp b/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37.webp new file mode 100644 index 00000000..f0fafce6 Binary files /dev/null and b/backend/public/images/products/77/68e47ed6e62c198063640763-07b25d37.webp differ diff --git a/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37-medium.webp b/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37-medium.webp new file mode 100644 index 00000000..e027b31f Binary files /dev/null and b/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37-medium.webp differ diff --git a/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37-thumb.webp b/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37-thumb.webp new file mode 100644 index 00000000..6ffddd27 Binary files /dev/null and b/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37-thumb.webp differ diff --git a/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37.webp b/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37.webp new file mode 100644 index 00000000..f0fafce6 Binary files /dev/null and b/backend/public/images/products/77/68e49ea724cef4d257d8f136-07b25d37.webp differ diff --git a/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9-medium.webp b/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9-medium.webp new file mode 100644 index 00000000..42645a08 Binary files /dev/null and b/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9-medium.webp differ diff --git a/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9-thumb.webp b/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9-thumb.webp new file mode 100644 index 00000000..5f16c6af Binary files /dev/null and b/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9-thumb.webp differ diff --git a/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9.webp b/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9.webp new file mode 100644 index 00000000..e4378caf Binary files /dev/null and b/backend/public/images/products/77/68e5a9a30422e3a79efe26f4-e91862f9.webp differ diff --git a/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02-medium.webp b/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02-medium.webp new file mode 100644 index 00000000..10578906 Binary files /dev/null and b/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02-medium.webp differ diff --git a/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02-thumb.webp b/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02-thumb.webp new file mode 100644 index 00000000..86887e96 Binary files /dev/null and b/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02-thumb.webp differ diff --git a/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02.webp b/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02.webp new file mode 100644 index 00000000..3e8c0997 Binary files /dev/null and b/backend/public/images/products/77/68e5a9a30422e3a79efe26f5-c15efe02.webp differ diff --git a/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee-medium.webp b/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee-medium.webp new file mode 100644 index 00000000..11dcef1b Binary files /dev/null and b/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee-medium.webp differ diff --git a/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee-thumb.webp b/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee-thumb.webp new file mode 100644 index 00000000..0957074e Binary files /dev/null and b/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee-thumb.webp differ diff --git a/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee.webp b/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee.webp new file mode 100644 index 00000000..97683aa8 Binary files /dev/null and b/backend/public/images/products/77/68e71948336cf59cde26faf2-c94a93ee.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93-medium.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93-medium.webp new file mode 100644 index 00000000..5751eb6a Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93-medium.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93-thumb.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93-thumb.webp new file mode 100644 index 00000000..30d8d84a Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93-thumb.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93.webp new file mode 100644 index 00000000..1859d577 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8a-70425f93.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed-medium.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed-medium.webp new file mode 100644 index 00000000..c0661e71 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed-medium.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed-thumb.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed-thumb.webp new file mode 100644 index 00000000..22ddff86 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed-thumb.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed.webp new file mode 100644 index 00000000..fcf39072 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8b-89d69fed.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa-medium.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa-thumb.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8c-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa-medium.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa-thumb.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8d-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa-medium.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa-thumb.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa.webp b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/68e72cf75e545a1ea3d53f8e-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9-medium.webp b/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9-medium.webp new file mode 100644 index 00000000..ae86697d Binary files /dev/null and b/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9-medium.webp differ diff --git a/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9-thumb.webp b/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9-thumb.webp new file mode 100644 index 00000000..909407e8 Binary files /dev/null and b/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9-thumb.webp differ diff --git a/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9.webp b/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9.webp new file mode 100644 index 00000000..23289a8e Binary files /dev/null and b/backend/public/images/products/77/68e801c520f6447130f15cbc-4cc40de9.webp differ diff --git a/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9-medium.webp b/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9-medium.webp new file mode 100644 index 00000000..ae86697d Binary files /dev/null and b/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9-medium.webp differ diff --git a/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9-thumb.webp b/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9-thumb.webp new file mode 100644 index 00000000..909407e8 Binary files /dev/null and b/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9-thumb.webp differ diff --git a/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9.webp b/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9.webp new file mode 100644 index 00000000..23289a8e Binary files /dev/null and b/backend/public/images/products/77/68e801c520f6447130f15cbd-4cc40de9.webp differ diff --git a/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882-medium.webp b/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882-medium.webp new file mode 100644 index 00000000..2da2c9fc Binary files /dev/null and b/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882-medium.webp differ diff --git a/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882-thumb.webp b/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882-thumb.webp new file mode 100644 index 00000000..d7e98fbd Binary files /dev/null and b/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882-thumb.webp differ diff --git a/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882.webp b/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882.webp new file mode 100644 index 00000000..311871b9 Binary files /dev/null and b/backend/public/images/products/77/68e923f01dd8e32de9805afa-48a9c882.webp differ diff --git a/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0-medium.webp b/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0-medium.webp new file mode 100644 index 00000000..dcf08653 Binary files /dev/null and b/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0-medium.webp differ diff --git a/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0-thumb.webp b/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0-thumb.webp new file mode 100644 index 00000000..6365fac1 Binary files /dev/null and b/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0-thumb.webp differ diff --git a/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0.webp b/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0.webp new file mode 100644 index 00000000..77135312 Binary files /dev/null and b/backend/public/images/products/77/68e95651ed4b20830991cceb-4f387ed0.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459-medium.webp b/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459-medium.webp new file mode 100644 index 00000000..285f1577 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459-medium.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459-thumb.webp b/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459-thumb.webp new file mode 100644 index 00000000..1a15a422 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459-thumb.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459.webp b/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459.webp new file mode 100644 index 00000000..1fc9488e Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c27-98f20459.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb-medium.webp b/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb-medium.webp new file mode 100644 index 00000000..0cf97f10 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb-medium.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb-thumb.webp b/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb-thumb.webp new file mode 100644 index 00000000..e53b6aa0 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb-thumb.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb.webp b/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb.webp new file mode 100644 index 00000000..695628b2 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c29-7f5476cb.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a-medium.webp b/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a-medium.webp new file mode 100644 index 00000000..733385c9 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a-medium.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a-thumb.webp b/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a-thumb.webp new file mode 100644 index 00000000..55eb89f9 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a-thumb.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a.webp b/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a.webp new file mode 100644 index 00000000..1b37b3db Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c2a-a9b2f51a.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231-medium.webp b/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231-medium.webp new file mode 100644 index 00000000..ec608afd Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231-medium.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231-thumb.webp b/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231-thumb.webp new file mode 100644 index 00000000..683569c2 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231-thumb.webp differ diff --git a/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231.webp b/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231.webp new file mode 100644 index 00000000..901904e8 Binary files /dev/null and b/backend/public/images/products/77/68e958ace72066a6dd385c2b-e6332231.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd-medium.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd-medium.webp new file mode 100644 index 00000000..224fce33 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd-medium.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd-thumb.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd-thumb.webp new file mode 100644 index 00000000..6b7864e5 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd-thumb.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd.webp new file mode 100644 index 00000000..97453100 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566a-033870bd.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590-medium.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590-medium.webp new file mode 100644 index 00000000..9c7db436 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590-medium.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590-thumb.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590-thumb.webp new file mode 100644 index 00000000..57b6870a Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590-thumb.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590.webp new file mode 100644 index 00000000..07a7f61b Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566b-864ce590.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba-medium.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba-medium.webp new file mode 100644 index 00000000..0fba497a Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba-medium.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba-thumb.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba-thumb.webp new file mode 100644 index 00000000..747e5d27 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba-thumb.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba.webp new file mode 100644 index 00000000..eac5b0f7 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566c-914b93ba.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869-medium.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869-medium.webp new file mode 100644 index 00000000..a41ab1e9 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869-medium.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869-thumb.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869-thumb.webp new file mode 100644 index 00000000..83a3440a Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869-thumb.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869.webp new file mode 100644 index 00000000..8b498161 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566d-873e6869.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49-medium.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49-medium.webp new file mode 100644 index 00000000..ccc3600f Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49-medium.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49-thumb.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49-thumb.webp new file mode 100644 index 00000000..167112ae Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49-thumb.webp differ diff --git a/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49.webp b/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49.webp new file mode 100644 index 00000000..584d7b63 Binary files /dev/null and b/backend/public/images/products/77/68ed699b87a217bf3ae4566e-6d58de49.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583-medium.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583-medium.webp new file mode 100644 index 00000000..19e4b537 Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583-medium.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583-thumb.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583-thumb.webp new file mode 100644 index 00000000..d72a46c1 Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583-thumb.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583.webp new file mode 100644 index 00000000..a79c454c Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e2779-b2a51583.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583-medium.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583-medium.webp new file mode 100644 index 00000000..19e4b537 Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583-medium.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583-thumb.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583-thumb.webp new file mode 100644 index 00000000..d72a46c1 Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583-thumb.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583.webp new file mode 100644 index 00000000..a79c454c Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e277a-b2a51583.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583-medium.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583-medium.webp new file mode 100644 index 00000000..19e4b537 Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583-medium.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583-thumb.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583-thumb.webp new file mode 100644 index 00000000..d72a46c1 Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583-thumb.webp differ diff --git a/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583.webp b/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583.webp new file mode 100644 index 00000000..a79c454c Binary files /dev/null and b/backend/public/images/products/77/68eea23ce8682afe5f9e277c-b2a51583.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713-medium.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713-medium.webp new file mode 100644 index 00000000..0ea8ac62 Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713-medium.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713-thumb.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713-thumb.webp new file mode 100644 index 00000000..98e14662 Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713-thumb.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713.webp new file mode 100644 index 00000000..07ee1803 Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe0-81b8d713.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02-medium.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02-medium.webp new file mode 100644 index 00000000..396d0a1e Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02-medium.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02-thumb.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02-thumb.webp new file mode 100644 index 00000000..348c6dfb Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02-thumb.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02.webp new file mode 100644 index 00000000..4b0db624 Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe3-aad17e02.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02-medium.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02-medium.webp new file mode 100644 index 00000000..396d0a1e Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02-medium.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02-thumb.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02-thumb.webp new file mode 100644 index 00000000..348c6dfb Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02-thumb.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02.webp new file mode 100644 index 00000000..4b0db624 Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe5-aad17e02.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02-medium.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02-medium.webp new file mode 100644 index 00000000..396d0a1e Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02-medium.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02-thumb.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02-thumb.webp new file mode 100644 index 00000000..348c6dfb Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02-thumb.webp differ diff --git a/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02.webp b/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02.webp new file mode 100644 index 00000000..4b0db624 Binary files /dev/null and b/backend/public/images/products/77/68efd01ade265ed6b9729fe7-aad17e02.webp differ diff --git a/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1-medium.webp b/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1-medium.webp new file mode 100644 index 00000000..c5963e09 Binary files /dev/null and b/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1-medium.webp differ diff --git a/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1-thumb.webp b/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1-thumb.webp new file mode 100644 index 00000000..7c2b1a47 Binary files /dev/null and b/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1-thumb.webp differ diff --git a/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1.webp b/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1.webp new file mode 100644 index 00000000..4c617855 Binary files /dev/null and b/backend/public/images/products/77/68efe0788f805c1683512d11-6bdd03e1.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6-medium.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6-thumb.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfa-701c49c6.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6-medium.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6-thumb.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfb-701c49c6.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6-medium.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6-thumb.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6.webp b/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/68efe323142b9efc7696bbfc-701c49c6.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270-medium.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270-medium.webp new file mode 100644 index 00000000..aba08f9a Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270-medium.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270-thumb.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270-thumb.webp new file mode 100644 index 00000000..113559a7 Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270-thumb.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270.webp new file mode 100644 index 00000000..4f402fab Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541152-a11ae270.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270-medium.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270-medium.webp new file mode 100644 index 00000000..aba08f9a Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270-medium.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270-thumb.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270-thumb.webp new file mode 100644 index 00000000..113559a7 Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270-thumb.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270.webp new file mode 100644 index 00000000..4f402fab Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541153-a11ae270.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270-medium.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270-medium.webp new file mode 100644 index 00000000..aba08f9a Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270-medium.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270-thumb.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270-thumb.webp new file mode 100644 index 00000000..113559a7 Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270-thumb.webp differ diff --git a/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270.webp b/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270.webp new file mode 100644 index 00000000..4f402fab Binary files /dev/null and b/backend/public/images/products/77/68efeceb7cc4ee57a9541154-a11ae270.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b285-c0343412-medium.webp b/backend/public/images/products/77/68efef8df25774c07747b285-c0343412-medium.webp new file mode 100644 index 00000000..2686cc4b Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b285-c0343412-medium.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b285-c0343412-thumb.webp b/backend/public/images/products/77/68efef8df25774c07747b285-c0343412-thumb.webp new file mode 100644 index 00000000..ba44dd18 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b285-c0343412-thumb.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b285-c0343412.webp b/backend/public/images/products/77/68efef8df25774c07747b285-c0343412.webp new file mode 100644 index 00000000..ec91d6b8 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b285-c0343412.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b286-0470080b-medium.webp b/backend/public/images/products/77/68efef8df25774c07747b286-0470080b-medium.webp new file mode 100644 index 00000000..224ac1c1 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b286-0470080b-medium.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b286-0470080b-thumb.webp b/backend/public/images/products/77/68efef8df25774c07747b286-0470080b-thumb.webp new file mode 100644 index 00000000..5133a847 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b286-0470080b-thumb.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b286-0470080b.webp b/backend/public/images/products/77/68efef8df25774c07747b286-0470080b.webp new file mode 100644 index 00000000..b1261a85 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b286-0470080b.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b289-c0343412-medium.webp b/backend/public/images/products/77/68efef8df25774c07747b289-c0343412-medium.webp new file mode 100644 index 00000000..2686cc4b Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b289-c0343412-medium.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b289-c0343412-thumb.webp b/backend/public/images/products/77/68efef8df25774c07747b289-c0343412-thumb.webp new file mode 100644 index 00000000..ba44dd18 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b289-c0343412-thumb.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b289-c0343412.webp b/backend/public/images/products/77/68efef8df25774c07747b289-c0343412.webp new file mode 100644 index 00000000..ec91d6b8 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b289-c0343412.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412-medium.webp b/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412-medium.webp new file mode 100644 index 00000000..2686cc4b Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412-medium.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412-thumb.webp b/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412-thumb.webp new file mode 100644 index 00000000..ba44dd18 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412-thumb.webp differ diff --git a/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412.webp b/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412.webp new file mode 100644 index 00000000..ec91d6b8 Binary files /dev/null and b/backend/public/images/products/77/68efef8df25774c07747b28a-c0343412.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1-medium.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1-medium.webp new file mode 100644 index 00000000..8a462eb1 Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1-medium.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1-thumb.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1-thumb.webp new file mode 100644 index 00000000..6da4e4ca Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1-thumb.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1.webp new file mode 100644 index 00000000..db6b2231 Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed5-ebb83ad1.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9-medium.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9-medium.webp new file mode 100644 index 00000000..bf3f4fa9 Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9-medium.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9-thumb.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9-thumb.webp new file mode 100644 index 00000000..b1817113 Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9-thumb.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9.webp new file mode 100644 index 00000000..7580e181 Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed6-8b3ba3e9.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7-medium.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7-medium.webp new file mode 100644 index 00000000..78cd4f6d Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7-medium.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7-thumb.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7-thumb.webp new file mode 100644 index 00000000..e79ff2f9 Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7-thumb.webp differ diff --git a/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7.webp b/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7.webp new file mode 100644 index 00000000..397a8f53 Binary files /dev/null and b/backend/public/images/products/77/68f024f9af73d0d547992ed7-5d5a0bc7.webp differ diff --git a/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41-medium.webp b/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41-medium.webp new file mode 100644 index 00000000..040f1983 Binary files /dev/null and b/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41-medium.webp differ diff --git a/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41-thumb.webp b/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41-thumb.webp new file mode 100644 index 00000000..25623a25 Binary files /dev/null and b/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41-thumb.webp differ diff --git a/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41.webp b/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41.webp new file mode 100644 index 00000000..57f973b4 Binary files /dev/null and b/backend/public/images/products/77/68f0455efa64c4d04c141391-c8e92d41.webp differ diff --git a/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938-medium.webp b/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938-medium.webp new file mode 100644 index 00000000..828bba73 Binary files /dev/null and b/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938-medium.webp differ diff --git a/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938-thumb.webp b/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938-thumb.webp new file mode 100644 index 00000000..7347a61e Binary files /dev/null and b/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938-thumb.webp differ diff --git a/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938.webp b/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938.webp new file mode 100644 index 00000000..d77c63b9 Binary files /dev/null and b/backend/public/images/products/77/68f0455efa64c4d04c141393-4b12d938.webp differ diff --git a/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5-medium.webp b/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5-medium.webp new file mode 100644 index 00000000..329e7f86 Binary files /dev/null and b/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5-medium.webp differ diff --git a/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5-thumb.webp b/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5-thumb.webp new file mode 100644 index 00000000..9770573f Binary files /dev/null and b/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5-thumb.webp differ diff --git a/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5.webp b/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5.webp new file mode 100644 index 00000000..32796fca Binary files /dev/null and b/backend/public/images/products/77/68f120d78467d35fa3124ea4-1f29c3a5.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050-medium.webp b/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050-medium.webp new file mode 100644 index 00000000..b2a7e627 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050-medium.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050-thumb.webp b/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050-thumb.webp new file mode 100644 index 00000000..0ca002cc Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050-thumb.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050.webp b/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050.webp new file mode 100644 index 00000000..1b6bab28 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdb-1a7e4050.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050-medium.webp b/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050-medium.webp new file mode 100644 index 00000000..b2a7e627 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050-medium.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050-thumb.webp b/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050-thumb.webp new file mode 100644 index 00000000..0ca002cc Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050-thumb.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050.webp b/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050.webp new file mode 100644 index 00000000..1b6bab28 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdc-1a7e4050.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51-medium.webp b/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51-medium.webp new file mode 100644 index 00000000..ba696316 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51-medium.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51-thumb.webp b/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51-thumb.webp new file mode 100644 index 00000000..ced556b6 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51-thumb.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51.webp b/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51.webp new file mode 100644 index 00000000..d8aa4675 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bdd-aee7ad51.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c-medium.webp b/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c-medium.webp new file mode 100644 index 00000000..cc6ba337 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c-medium.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c-thumb.webp b/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c-thumb.webp new file mode 100644 index 00000000..d6c7c1cf Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c-thumb.webp differ diff --git a/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c.webp b/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c.webp new file mode 100644 index 00000000..3ab334e7 Binary files /dev/null and b/backend/public/images/products/77/68f272bd56c880a100019bde-6cb0a12c.webp differ diff --git a/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1-medium.webp b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1-medium.webp new file mode 100644 index 00000000..b6078bc2 Binary files /dev/null and b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1-medium.webp differ diff --git a/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1-thumb.webp b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1-thumb.webp new file mode 100644 index 00000000..b4676170 Binary files /dev/null and b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1-thumb.webp differ diff --git a/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1.webp b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1.webp new file mode 100644 index 00000000..98e17a7e Binary files /dev/null and b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ea-f5461de1.webp differ diff --git a/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988-medium.webp b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988-medium.webp new file mode 100644 index 00000000..dd406460 Binary files /dev/null and b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988-medium.webp differ diff --git a/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988-thumb.webp b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988-thumb.webp new file mode 100644 index 00000000..bafa4504 Binary files /dev/null and b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988-thumb.webp differ diff --git a/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988.webp b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988.webp new file mode 100644 index 00000000..223d97d1 Binary files /dev/null and b/backend/public/images/products/77/68f27ce7909df2d7e7f1e4ec-92488988.webp differ diff --git a/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85-medium.webp b/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85-medium.webp new file mode 100644 index 00000000..191c807b Binary files /dev/null and b/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85-medium.webp differ diff --git a/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85-thumb.webp b/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85-thumb.webp new file mode 100644 index 00000000..44cd09bf Binary files /dev/null and b/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85-thumb.webp differ diff --git a/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85.webp b/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85.webp new file mode 100644 index 00000000..eae68730 Binary files /dev/null and b/backend/public/images/products/77/68f296abe5ac6b7ad77b5109-1ff6bd85.webp differ diff --git a/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36-medium.webp b/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36-medium.webp new file mode 100644 index 00000000..8d57a6d2 Binary files /dev/null and b/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36-medium.webp differ diff --git a/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36-thumb.webp b/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36-thumb.webp new file mode 100644 index 00000000..07d96f42 Binary files /dev/null and b/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36-thumb.webp differ diff --git a/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36.webp b/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36.webp new file mode 100644 index 00000000..c8410194 Binary files /dev/null and b/backend/public/images/products/77/68f2b148cf9cbebe954fbfec-df6bcb36.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e-medium.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e-medium.webp new file mode 100644 index 00000000..888c6308 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e-medium.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e-thumb.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e-thumb.webp new file mode 100644 index 00000000..8b2f85a0 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e-thumb.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e.webp new file mode 100644 index 00000000..129c27e8 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d28-927e243e.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55-medium.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55-medium.webp new file mode 100644 index 00000000..bb4dd2bb Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55-medium.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55-thumb.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55-thumb.webp new file mode 100644 index 00000000..18dc7cdf Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55-thumb.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55.webp new file mode 100644 index 00000000..7a6d4c90 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d29-b2f87e55.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e-medium.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e-medium.webp new file mode 100644 index 00000000..888c6308 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e-medium.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e-thumb.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e-thumb.webp new file mode 100644 index 00000000..8b2f85a0 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e-thumb.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e.webp new file mode 100644 index 00000000..129c27e8 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2a-927e243e.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e-medium.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e-medium.webp new file mode 100644 index 00000000..888c6308 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e-medium.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e-thumb.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e-thumb.webp new file mode 100644 index 00000000..8b2f85a0 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e-thumb.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e.webp new file mode 100644 index 00000000..129c27e8 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2b-927e243e.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e-medium.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e-medium.webp new file mode 100644 index 00000000..888c6308 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e-medium.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e-thumb.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e-thumb.webp new file mode 100644 index 00000000..8b2f85a0 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e-thumb.webp differ diff --git a/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e.webp b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e.webp new file mode 100644 index 00000000..129c27e8 Binary files /dev/null and b/backend/public/images/products/77/68f6b7afd9778f91d6f22d2c-927e243e.webp differ diff --git a/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51-medium.webp b/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51-medium.webp new file mode 100644 index 00000000..ba696316 Binary files /dev/null and b/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51-medium.webp differ diff --git a/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51-thumb.webp b/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51-thumb.webp new file mode 100644 index 00000000..ced556b6 Binary files /dev/null and b/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51-thumb.webp differ diff --git a/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51.webp b/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51.webp new file mode 100644 index 00000000..d8aa4675 Binary files /dev/null and b/backend/public/images/products/77/68f6ffaa6b1adfbca373c282-aee7ad51.webp differ diff --git a/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598-medium.webp b/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598-medium.webp new file mode 100644 index 00000000..11c7435e Binary files /dev/null and b/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598-medium.webp differ diff --git a/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598-thumb.webp b/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598-thumb.webp new file mode 100644 index 00000000..6cd34ae1 Binary files /dev/null and b/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598-thumb.webp differ diff --git a/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598.webp b/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598.webp new file mode 100644 index 00000000..4698218f Binary files /dev/null and b/backend/public/images/products/77/68f850d6d9049778136e8ed3-12852598.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388-medium.webp new file mode 100644 index 00000000..7f073f67 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388-thumb.webp new file mode 100644 index 00000000..6d947fd0 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388.webp new file mode 100644 index 00000000..32ad7e0d Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12b-65221388.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b-medium.webp new file mode 100644 index 00000000..9d7ddf0a Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b-thumb.webp new file mode 100644 index 00000000..84f9a4e3 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b.webp new file mode 100644 index 00000000..ae331245 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12c-94c7318b.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803-medium.webp new file mode 100644 index 00000000..3f747164 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803-thumb.webp new file mode 100644 index 00000000..9e61833d Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803.webp new file mode 100644 index 00000000..882fdddd Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12d-9414c803.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2-medium.webp new file mode 100644 index 00000000..f4e0b284 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2-thumb.webp new file mode 100644 index 00000000..0d9eab1d Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2.webp new file mode 100644 index 00000000..74298f0e Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12e-639263b2.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f-medium.webp new file mode 100644 index 00000000..976b8508 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f-thumb.webp new file mode 100644 index 00000000..6669e916 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f.webp new file mode 100644 index 00000000..a133ac92 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf12f-ad43416f.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179-medium.webp new file mode 100644 index 00000000..7fa02224 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179-thumb.webp new file mode 100644 index 00000000..f8e7624f Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179.webp new file mode 100644 index 00000000..3f07ef21 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf130-0d3f8179.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396-medium.webp new file mode 100644 index 00000000..ec121398 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396-thumb.webp new file mode 100644 index 00000000..e92ab704 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396.webp new file mode 100644 index 00000000..5d946090 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf131-ca2b3396.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384-medium.webp new file mode 100644 index 00000000..e602f249 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384-thumb.webp new file mode 100644 index 00000000..a7959ac2 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384.webp new file mode 100644 index 00000000..36f6f91c Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf132-ffc06384.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be-medium.webp new file mode 100644 index 00000000..89f65b53 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be-thumb.webp new file mode 100644 index 00000000..1b8586a7 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be.webp new file mode 100644 index 00000000..b1135b38 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf133-e94215be.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e-medium.webp new file mode 100644 index 00000000..89b070ee Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e-thumb.webp new file mode 100644 index 00000000..21913fd7 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e.webp new file mode 100644 index 00000000..ee94eab3 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf134-87b6ed7e.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9-medium.webp new file mode 100644 index 00000000..87f876e6 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9-thumb.webp new file mode 100644 index 00000000..70ef0dd9 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9.webp new file mode 100644 index 00000000..faf4f9ef Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf135-01d5f9e9.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93-medium.webp new file mode 100644 index 00000000..1e80b4eb Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93-thumb.webp new file mode 100644 index 00000000..f5e20d43 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93.webp new file mode 100644 index 00000000..f6b76a35 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf136-00a2ea93.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8-medium.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8-medium.webp new file mode 100644 index 00000000..59d87b7f Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8-medium.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8-thumb.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8-thumb.webp new file mode 100644 index 00000000..0c79cd1b Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8-thumb.webp differ diff --git a/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8.webp b/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8.webp new file mode 100644 index 00000000..7c08cb91 Binary files /dev/null and b/backend/public/images/products/77/68f8f46390e082b60a7bf137-0fd9d8f8.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c-medium.webp new file mode 100644 index 00000000..e41f2a49 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c-thumb.webp new file mode 100644 index 00000000..518e84c2 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c.webp new file mode 100644 index 00000000..f3e2b7ec Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9840f-537ebe3c.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98410-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98412-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98413-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98414-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98415-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98416-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98417-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98418-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c-medium.webp new file mode 100644 index 00000000..555782fe Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c-thumb.webp new file mode 100644 index 00000000..2ef110ee Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c.webp b/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c.webp new file mode 100644 index 00000000..7455b401 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf98419-26fd710c.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841b-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529-medium.webp new file mode 100644 index 00000000..ec45de37 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529-thumb.webp new file mode 100644 index 00000000..cbca57da Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529.webp new file mode 100644 index 00000000..3d8c632c Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841c-2a320529.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c-medium.webp new file mode 100644 index 00000000..555782fe Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c-thumb.webp new file mode 100644 index 00000000..2ef110ee Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c.webp new file mode 100644 index 00000000..7455b401 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841d-26fd710c.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283-medium.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283-medium.webp new file mode 100644 index 00000000..efda3d0b Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283-medium.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283-thumb.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283-thumb.webp new file mode 100644 index 00000000..1d619634 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283-thumb.webp differ diff --git a/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283.webp b/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283.webp new file mode 100644 index 00000000..0749f8c9 Binary files /dev/null and b/backend/public/images/products/77/68f92152d981dcc8dcf9841e-76902283.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0-medium.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0-thumb.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb580-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0-medium.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0-thumb.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb581-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0-medium.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0-medium.webp new file mode 100644 index 00000000..90c1fc86 Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0-medium.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0-thumb.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0-thumb.webp new file mode 100644 index 00000000..37cf1c7d Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0-thumb.webp differ diff --git a/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0.webp b/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0.webp new file mode 100644 index 00000000..c8c876b2 Binary files /dev/null and b/backend/public/images/products/77/68f928e825fec6f7ad9fb582-1ba2bef0.webp differ diff --git a/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2-medium.webp b/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2-medium.webp new file mode 100644 index 00000000..2c6b4e22 Binary files /dev/null and b/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2-medium.webp differ diff --git a/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2-thumb.webp b/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2-thumb.webp new file mode 100644 index 00000000..864b6d18 Binary files /dev/null and b/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2-thumb.webp differ diff --git a/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2.webp b/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2.webp new file mode 100644 index 00000000..9f3da02e Binary files /dev/null and b/backend/public/images/products/77/68f934921b1704651c7ed948-a7e73dc2.webp differ diff --git a/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192-medium.webp b/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192-medium.webp new file mode 100644 index 00000000..6cf93712 Binary files /dev/null and b/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192-medium.webp differ diff --git a/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192-thumb.webp b/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192-thumb.webp new file mode 100644 index 00000000..4fc8bd01 Binary files /dev/null and b/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192-thumb.webp differ diff --git a/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192.webp b/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192.webp new file mode 100644 index 00000000..de41698e Binary files /dev/null and b/backend/public/images/products/77/68f93d90d5a10c6c1fde323e-a11cd192.webp differ diff --git a/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2-medium.webp b/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2-medium.webp new file mode 100644 index 00000000..68da9cf8 Binary files /dev/null and b/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2-medium.webp differ diff --git a/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2-thumb.webp b/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2-thumb.webp new file mode 100644 index 00000000..9a566403 Binary files /dev/null and b/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2-thumb.webp differ diff --git a/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2.webp b/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2.webp new file mode 100644 index 00000000..4a82bc3a Binary files /dev/null and b/backend/public/images/products/77/68f93d90d5a10c6c1fde323f-da2ff0d2.webp differ diff --git a/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e-medium.webp b/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e-medium.webp new file mode 100644 index 00000000..09dc7c18 Binary files /dev/null and b/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e-medium.webp differ diff --git a/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e-thumb.webp b/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e-thumb.webp new file mode 100644 index 00000000..62e9fb19 Binary files /dev/null and b/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e-thumb.webp differ diff --git a/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e.webp b/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e.webp new file mode 100644 index 00000000..99cbbe40 Binary files /dev/null and b/backend/public/images/products/77/68f940038d7edecdb889d28c-d941ed3e.webp differ diff --git a/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453-medium.webp b/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453-medium.webp new file mode 100644 index 00000000..8193bc15 Binary files /dev/null and b/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453-medium.webp differ diff --git a/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453-thumb.webp b/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453-thumb.webp new file mode 100644 index 00000000..9c2c42d4 Binary files /dev/null and b/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453-thumb.webp differ diff --git a/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453.webp b/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453.webp new file mode 100644 index 00000000..1efbed57 Binary files /dev/null and b/backend/public/images/products/77/68f9473512f4c3124354409d-4bd8b453.webp differ diff --git a/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7-medium.webp b/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7-medium.webp new file mode 100644 index 00000000..522c3d13 Binary files /dev/null and b/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7-medium.webp differ diff --git a/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7-thumb.webp b/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7-thumb.webp new file mode 100644 index 00000000..3a3038f2 Binary files /dev/null and b/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7-thumb.webp differ diff --git a/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7.webp b/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7.webp new file mode 100644 index 00000000..ccafbc72 Binary files /dev/null and b/backend/public/images/products/77/68f9473512f4c3124354409e-80f800c7.webp differ diff --git a/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674-medium.webp b/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674-medium.webp new file mode 100644 index 00000000..8f37c86e Binary files /dev/null and b/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674-medium.webp differ diff --git a/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674-thumb.webp b/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674-thumb.webp new file mode 100644 index 00000000..75467d50 Binary files /dev/null and b/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674-thumb.webp differ diff --git a/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674.webp b/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674.webp new file mode 100644 index 00000000..12573f29 Binary files /dev/null and b/backend/public/images/products/77/68f9a126531ce51dadd75d75-c394b674.webp differ diff --git a/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad-medium.webp b/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad-medium.webp new file mode 100644 index 00000000..1d1b74fb Binary files /dev/null and b/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad-medium.webp differ diff --git a/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad-thumb.webp b/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad-thumb.webp new file mode 100644 index 00000000..ff4fd21e Binary files /dev/null and b/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad-thumb.webp differ diff --git a/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad.webp b/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad.webp new file mode 100644 index 00000000..edd3fe81 Binary files /dev/null and b/backend/public/images/products/77/68fbba20ec9c8033b2cc705d-bfc3fbad.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd-medium.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd-medium.webp new file mode 100644 index 00000000..e3a75b99 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd-medium.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd-thumb.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd-thumb.webp new file mode 100644 index 00000000..819f7fc5 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd-thumb.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd.webp new file mode 100644 index 00000000..f08ae6f9 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bb-7a66effd.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd-medium.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd-medium.webp new file mode 100644 index 00000000..e3a75b99 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd-medium.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd-thumb.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd-thumb.webp new file mode 100644 index 00000000..819f7fc5 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd-thumb.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd.webp new file mode 100644 index 00000000..f08ae6f9 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bc-7a66effd.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd-medium.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd-medium.webp new file mode 100644 index 00000000..e3a75b99 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd-medium.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd-thumb.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd-thumb.webp new file mode 100644 index 00000000..819f7fc5 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd-thumb.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd.webp new file mode 100644 index 00000000..f08ae6f9 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6bd-7a66effd.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd-medium.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd-medium.webp new file mode 100644 index 00000000..e3a75b99 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd-medium.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd-thumb.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd-thumb.webp new file mode 100644 index 00000000..819f7fc5 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd-thumb.webp differ diff --git a/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd.webp b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd.webp new file mode 100644 index 00000000..f08ae6f9 Binary files /dev/null and b/backend/public/images/products/77/68fbd4a3a0f0db72cb86c6be-7a66effd.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583-medium.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583-medium.webp new file mode 100644 index 00000000..19e4b537 Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583-medium.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583-thumb.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583-thumb.webp new file mode 100644 index 00000000..d72a46c1 Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583-thumb.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583.webp new file mode 100644 index 00000000..a79c454c Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e642-b2a51583.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91-medium.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91-medium.webp new file mode 100644 index 00000000..270575fb Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91-medium.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91-thumb.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91-thumb.webp new file mode 100644 index 00000000..7cccceb1 Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91-thumb.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91.webp new file mode 100644 index 00000000..6a67eb15 Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e643-2ed6fe91.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91-medium.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91-medium.webp new file mode 100644 index 00000000..270575fb Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91-medium.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91-thumb.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91-thumb.webp new file mode 100644 index 00000000..7cccceb1 Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91-thumb.webp differ diff --git a/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91.webp b/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91.webp new file mode 100644 index 00000000..6a67eb15 Binary files /dev/null and b/backend/public/images/products/77/68fbe8fe7771d03fdf61e644-2ed6fe91.webp differ diff --git a/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51-medium.webp b/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51-medium.webp new file mode 100644 index 00000000..3e17895b Binary files /dev/null and b/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51-medium.webp differ diff --git a/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51-thumb.webp b/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51-thumb.webp new file mode 100644 index 00000000..90a2420e Binary files /dev/null and b/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51-thumb.webp differ diff --git a/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51.webp b/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51.webp new file mode 100644 index 00000000..2b8aa480 Binary files /dev/null and b/backend/public/images/products/77/68fbede16e8185c64dc9a834-4ad42f51.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902-medium.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902-medium.webp new file mode 100644 index 00000000..903381ce Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902-medium.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902-thumb.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902-thumb.webp new file mode 100644 index 00000000..383eb0f8 Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902-thumb.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902.webp new file mode 100644 index 00000000..1bb922f6 Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081b8-c6835902.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a-medium.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a-medium.webp new file mode 100644 index 00000000..b2d3401a Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a-medium.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a-thumb.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a-thumb.webp new file mode 100644 index 00000000..a7cb0606 Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a-thumb.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a.webp new file mode 100644 index 00000000..6563a0b5 Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081b9-3df36b7a.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b-medium.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b-medium.webp new file mode 100644 index 00000000..4d5ac77f Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b-medium.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b-thumb.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b-thumb.webp new file mode 100644 index 00000000..529f97ad Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b-thumb.webp differ diff --git a/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b.webp b/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b.webp new file mode 100644 index 00000000..138944ee Binary files /dev/null and b/backend/public/images/products/77/68fc1c901f43e2fc31c081ba-388d841b.webp differ diff --git a/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2-medium.webp b/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2-medium.webp new file mode 100644 index 00000000..36ed4818 Binary files /dev/null and b/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2-medium.webp differ diff --git a/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2-thumb.webp b/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2-thumb.webp new file mode 100644 index 00000000..7614314a Binary files /dev/null and b/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2-thumb.webp differ diff --git a/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2.webp b/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2.webp new file mode 100644 index 00000000..7e7e46b4 Binary files /dev/null and b/backend/public/images/products/77/68fd2e609fb48e68b9d9b084-ab375ef2.webp differ diff --git a/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2-medium.webp b/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2-medium.webp new file mode 100644 index 00000000..36ed4818 Binary files /dev/null and b/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2-medium.webp differ diff --git a/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2-thumb.webp b/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2-thumb.webp new file mode 100644 index 00000000..7614314a Binary files /dev/null and b/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2-thumb.webp differ diff --git a/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2.webp b/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2.webp new file mode 100644 index 00000000..7e7e46b4 Binary files /dev/null and b/backend/public/images/products/77/68fd2e609fb48e68b9d9b086-ab375ef2.webp differ diff --git a/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603-medium.webp b/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603-medium.webp new file mode 100644 index 00000000..2caa5713 Binary files /dev/null and b/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603-medium.webp differ diff --git a/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603-thumb.webp b/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603-thumb.webp new file mode 100644 index 00000000..d9716fe8 Binary files /dev/null and b/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603-thumb.webp differ diff --git a/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603.webp b/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603.webp new file mode 100644 index 00000000..62857920 Binary files /dev/null and b/backend/public/images/products/77/68ffaba748756e9a95816fd5-3e81c603.webp differ diff --git a/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6-medium.webp b/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6-medium.webp new file mode 100644 index 00000000..2ed54809 Binary files /dev/null and b/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6-medium.webp differ diff --git a/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6-thumb.webp b/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6-thumb.webp new file mode 100644 index 00000000..f5205226 Binary files /dev/null and b/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6-thumb.webp differ diff --git a/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6.webp b/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6.webp new file mode 100644 index 00000000..6db2232b Binary files /dev/null and b/backend/public/images/products/77/68ffc145cecec0826bdea63c-701c49c6.webp differ diff --git a/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583-medium.webp b/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583-medium.webp new file mode 100644 index 00000000..19e4b537 Binary files /dev/null and b/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583-medium.webp differ diff --git a/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583-thumb.webp b/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583-thumb.webp new file mode 100644 index 00000000..d72a46c1 Binary files /dev/null and b/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583-thumb.webp differ diff --git a/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583.webp b/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583.webp new file mode 100644 index 00000000..a79c454c Binary files /dev/null and b/backend/public/images/products/77/68ffc3df5e60bc75d609bc7d-b2a51583.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea-medium.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea-medium.webp new file mode 100644 index 00000000..08ca2111 Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea-medium.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea-thumb.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea-thumb.webp new file mode 100644 index 00000000..8addf91d Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea-thumb.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea.webp new file mode 100644 index 00000000..7fa1815a Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e7-3295b9ea.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403-medium.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403-medium.webp new file mode 100644 index 00000000..7b5acf14 Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403-medium.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403-thumb.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403-thumb.webp new file mode 100644 index 00000000..3d54d88d Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403-thumb.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403.webp new file mode 100644 index 00000000..6f48d135 Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e8-78312403.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a-medium.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a-medium.webp new file mode 100644 index 00000000..69dd93da Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a-medium.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a-thumb.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a-thumb.webp new file mode 100644 index 00000000..53080a73 Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a-thumb.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a.webp new file mode 100644 index 00000000..d8a98a37 Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0e9-775fac2a.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a-medium.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a-medium.webp new file mode 100644 index 00000000..69dd93da Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a-medium.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a-thumb.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a-thumb.webp new file mode 100644 index 00000000..53080a73 Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a-thumb.webp differ diff --git a/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a.webp b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a.webp new file mode 100644 index 00000000..d8a98a37 Binary files /dev/null and b/backend/public/images/products/77/68ffc6471f43e2fc31e6a0ea-775fac2a.webp differ diff --git a/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b-medium.webp b/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b-medium.webp new file mode 100644 index 00000000..2f64bb2c Binary files /dev/null and b/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b-medium.webp differ diff --git a/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b-thumb.webp b/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b-thumb.webp new file mode 100644 index 00000000..224ca4a7 Binary files /dev/null and b/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b-thumb.webp differ diff --git a/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b.webp b/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b.webp new file mode 100644 index 00000000..929c34f0 Binary files /dev/null and b/backend/public/images/products/77/68ffcb6ebde78832d3ec1af4-5116933b.webp differ diff --git a/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d-medium.webp b/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d-medium.webp new file mode 100644 index 00000000..3fae3e89 Binary files /dev/null and b/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d-medium.webp differ diff --git a/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d-thumb.webp b/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d-thumb.webp new file mode 100644 index 00000000..29cbbb47 Binary files /dev/null and b/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d-thumb.webp differ diff --git a/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d.webp b/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d.webp new file mode 100644 index 00000000..8c1c86dc Binary files /dev/null and b/backend/public/images/products/77/68ffd0493ebfdd11bfaec972-5cf9831d.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed-medium.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed-medium.webp new file mode 100644 index 00000000..3d11107e Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed-medium.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed-thumb.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed-thumb.webp new file mode 100644 index 00000000..7256ee78 Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed-thumb.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed.webp new file mode 100644 index 00000000..e20f9c12 Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18056-ffcdefed.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224-medium.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224-medium.webp new file mode 100644 index 00000000..e951d79a Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224-medium.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224-thumb.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224-thumb.webp new file mode 100644 index 00000000..b20daee8 Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224-thumb.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224.webp new file mode 100644 index 00000000..1fff9da4 Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18057-e01b2224.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa-medium.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa-medium.webp new file mode 100644 index 00000000..54df8cef Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa-medium.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa-thumb.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa-thumb.webp new file mode 100644 index 00000000..cd6b3ff0 Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa-thumb.webp differ diff --git a/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa.webp b/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa.webp new file mode 100644 index 00000000..965b2e43 Binary files /dev/null and b/backend/public/images/products/77/68ffd7a2501d448daeb18058-7ca384aa.webp differ diff --git a/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544-medium.webp b/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544-medium.webp new file mode 100644 index 00000000..bfa537a8 Binary files /dev/null and b/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544-medium.webp differ diff --git a/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544-thumb.webp b/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544-thumb.webp new file mode 100644 index 00000000..89762bde Binary files /dev/null and b/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544-thumb.webp differ diff --git a/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544.webp b/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544.webp new file mode 100644 index 00000000..6295eb7d Binary files /dev/null and b/backend/public/images/products/77/69002e66ea73392ec5e8d9dc-feef4544.webp differ diff --git a/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42-medium.webp b/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42-medium.webp new file mode 100644 index 00000000..31ee9c5f Binary files /dev/null and b/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42-medium.webp differ diff --git a/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42-thumb.webp b/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42-thumb.webp new file mode 100644 index 00000000..904d9380 Binary files /dev/null and b/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42-thumb.webp differ diff --git a/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42.webp b/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42.webp new file mode 100644 index 00000000..e3c09edb Binary files /dev/null and b/backend/public/images/products/77/6902400800fcf4ac9069d706-035b3a42.webp differ diff --git a/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9-medium.webp b/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9-medium.webp new file mode 100644 index 00000000..556aef07 Binary files /dev/null and b/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9-medium.webp differ diff --git a/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9-thumb.webp b/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9-thumb.webp new file mode 100644 index 00000000..f37e65a7 Binary files /dev/null and b/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9-thumb.webp differ diff --git a/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9.webp b/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9.webp new file mode 100644 index 00000000..5e356db9 Binary files /dev/null and b/backend/public/images/products/77/69024ce16d9754112ddd8e06-a2811aa9.webp differ diff --git a/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9-medium.webp b/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9-medium.webp new file mode 100644 index 00000000..556aef07 Binary files /dev/null and b/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9-medium.webp differ diff --git a/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9-thumb.webp b/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9-thumb.webp new file mode 100644 index 00000000..f37e65a7 Binary files /dev/null and b/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9-thumb.webp differ diff --git a/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9.webp b/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9.webp new file mode 100644 index 00000000..5e356db9 Binary files /dev/null and b/backend/public/images/products/77/69024ce16d9754112ddd8e07-a2811aa9.webp differ diff --git a/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2-medium.webp b/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2-medium.webp new file mode 100644 index 00000000..25e28a25 Binary files /dev/null and b/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2-medium.webp differ diff --git a/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2-thumb.webp b/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2-thumb.webp new file mode 100644 index 00000000..136d67cf Binary files /dev/null and b/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2-thumb.webp differ diff --git a/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2.webp b/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2.webp new file mode 100644 index 00000000..eea406ed Binary files /dev/null and b/backend/public/images/products/77/690251cff8fc5df839c28c7d-a1df1ab2.webp differ diff --git a/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5-medium.webp b/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5-thumb.webp b/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5.webp b/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/690254356779578e4811a625-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878-medium.webp b/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878-medium.webp new file mode 100644 index 00000000..d0bb6dcf Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878-medium.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878-thumb.webp b/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878-thumb.webp new file mode 100644 index 00000000..2c2aa150 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878-thumb.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878.webp b/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878.webp new file mode 100644 index 00000000..e0a15c21 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4ad-63640878.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878-medium.webp b/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878-medium.webp new file mode 100644 index 00000000..d0bb6dcf Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878-medium.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878-thumb.webp b/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878-thumb.webp new file mode 100644 index 00000000..2c2aa150 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878-thumb.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878.webp b/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878.webp new file mode 100644 index 00000000..e0a15c21 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4ae-63640878.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4af-63640878-medium.webp b/backend/public/images/products/77/6902719431ae14768c35c4af-63640878-medium.webp new file mode 100644 index 00000000..d0bb6dcf Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4af-63640878-medium.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4af-63640878-thumb.webp b/backend/public/images/products/77/6902719431ae14768c35c4af-63640878-thumb.webp new file mode 100644 index 00000000..2c2aa150 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4af-63640878-thumb.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4af-63640878.webp b/backend/public/images/products/77/6902719431ae14768c35c4af-63640878.webp new file mode 100644 index 00000000..e0a15c21 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4af-63640878.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878-medium.webp b/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878-medium.webp new file mode 100644 index 00000000..d0bb6dcf Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878-medium.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878-thumb.webp b/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878-thumb.webp new file mode 100644 index 00000000..2c2aa150 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878-thumb.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878.webp b/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878.webp new file mode 100644 index 00000000..e0a15c21 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b0-63640878.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878-medium.webp b/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878-medium.webp new file mode 100644 index 00000000..d0bb6dcf Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878-medium.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878-thumb.webp b/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878-thumb.webp new file mode 100644 index 00000000..2c2aa150 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878-thumb.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878.webp b/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878.webp new file mode 100644 index 00000000..e0a15c21 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b1-63640878.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324-medium.webp b/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324-medium.webp new file mode 100644 index 00000000..22c2e26d Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324-medium.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324-thumb.webp b/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324-thumb.webp new file mode 100644 index 00000000..8d8f8210 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324-thumb.webp differ diff --git a/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324.webp b/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324.webp new file mode 100644 index 00000000..07f9c5f8 Binary files /dev/null and b/backend/public/images/products/77/6902719431ae14768c35c4b4-38e45324.webp differ diff --git a/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea-medium.webp b/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea-medium.webp new file mode 100644 index 00000000..bc033310 Binary files /dev/null and b/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea-medium.webp differ diff --git a/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea-thumb.webp b/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea-thumb.webp new file mode 100644 index 00000000..4ebcd630 Binary files /dev/null and b/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea-thumb.webp differ diff --git a/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea.webp b/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea.webp new file mode 100644 index 00000000..c8672bc4 Binary files /dev/null and b/backend/public/images/products/77/69028483578706fbf9953a63-e324ddea.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b-medium.webp b/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b-medium.webp new file mode 100644 index 00000000..60fd15aa Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b-medium.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b-thumb.webp b/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b-thumb.webp new file mode 100644 index 00000000..dd010512 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b-thumb.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b.webp b/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b.webp new file mode 100644 index 00000000..3bebc4ae Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c612-02c4272b.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b-medium.webp b/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b-medium.webp new file mode 100644 index 00000000..60fd15aa Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b-medium.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b-thumb.webp b/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b-thumb.webp new file mode 100644 index 00000000..dd010512 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b-thumb.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b.webp b/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b.webp new file mode 100644 index 00000000..3bebc4ae Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c613-02c4272b.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b-medium.webp b/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b-medium.webp new file mode 100644 index 00000000..60fd15aa Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b-medium.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b-thumb.webp b/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b-thumb.webp new file mode 100644 index 00000000..dd010512 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b-thumb.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b.webp b/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b.webp new file mode 100644 index 00000000..3bebc4ae Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c614-02c4272b.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e-medium.webp b/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e-medium.webp new file mode 100644 index 00000000..977fb6b1 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e-medium.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e-thumb.webp b/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e-thumb.webp new file mode 100644 index 00000000..be205ad4 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e-thumb.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e.webp b/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e.webp new file mode 100644 index 00000000..9d2d8441 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c615-ede49e9e.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e-medium.webp b/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e-medium.webp new file mode 100644 index 00000000..977fb6b1 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e-medium.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e-thumb.webp b/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e-thumb.webp new file mode 100644 index 00000000..be205ad4 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e-thumb.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e.webp b/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e.webp new file mode 100644 index 00000000..9d2d8441 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c616-ede49e9e.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e-medium.webp b/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e-medium.webp new file mode 100644 index 00000000..977fb6b1 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e-medium.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e-thumb.webp b/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e-thumb.webp new file mode 100644 index 00000000..be205ad4 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e-thumb.webp differ diff --git a/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e.webp b/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e.webp new file mode 100644 index 00000000..9d2d8441 Binary files /dev/null and b/backend/public/images/products/77/69028a97b881e72d76f6c617-ede49e9e.webp differ diff --git a/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb-medium.webp b/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb-medium.webp new file mode 100644 index 00000000..91c9251c Binary files /dev/null and b/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb-medium.webp differ diff --git a/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb-thumb.webp b/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb-thumb.webp new file mode 100644 index 00000000..10f9209e Binary files /dev/null and b/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb-thumb.webp differ diff --git a/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb.webp b/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb.webp new file mode 100644 index 00000000..06bbdf9c Binary files /dev/null and b/backend/public/images/products/77/6902d5c279d187a75921527b-a482e2cb.webp differ diff --git a/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a-medium.webp b/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a-medium.webp new file mode 100644 index 00000000..5b6b190e Binary files /dev/null and b/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a-medium.webp differ diff --git a/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a-thumb.webp b/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a-thumb.webp new file mode 100644 index 00000000..610545d1 Binary files /dev/null and b/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a-thumb.webp differ diff --git a/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a.webp b/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a.webp new file mode 100644 index 00000000..d2988978 Binary files /dev/null and b/backend/public/images/products/77/6902eff6a6d5431a429df363-230f7f1a.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286-medium.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286-medium.webp new file mode 100644 index 00000000..ac22dbc2 Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286-medium.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286-thumb.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286-thumb.webp new file mode 100644 index 00000000..e2e6ce54 Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286-thumb.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286.webp new file mode 100644 index 00000000..50ef943e Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda0-e68d4286.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88-medium.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88-medium.webp new file mode 100644 index 00000000..9352e233 Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88-medium.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88-thumb.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88-thumb.webp new file mode 100644 index 00000000..a3e60b9f Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88-thumb.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88.webp new file mode 100644 index 00000000..03cd4691 Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda1-23f6fa88.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44-medium.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44-medium.webp new file mode 100644 index 00000000..b897e51e Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44-medium.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44-thumb.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44-thumb.webp new file mode 100644 index 00000000..e965154f Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44-thumb.webp differ diff --git a/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44.webp b/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44.webp new file mode 100644 index 00000000..cbdfee51 Binary files /dev/null and b/backend/public/images/products/77/69039b304cbe31e45ef2bda2-268a6e44.webp differ diff --git a/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118-medium.webp b/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118-medium.webp new file mode 100644 index 00000000..623e84c3 Binary files /dev/null and b/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118-medium.webp differ diff --git a/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118-thumb.webp b/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118-thumb.webp new file mode 100644 index 00000000..c6aace4b Binary files /dev/null and b/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118-thumb.webp differ diff --git a/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118.webp b/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118.webp new file mode 100644 index 00000000..6e8d6778 Binary files /dev/null and b/backend/public/images/products/77/6904fadfce8898eff5c08c62-3380a118.webp differ diff --git a/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2-medium.webp b/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2-medium.webp new file mode 100644 index 00000000..65f6a50b Binary files /dev/null and b/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2-medium.webp differ diff --git a/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2-thumb.webp b/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2-thumb.webp new file mode 100644 index 00000000..ec9e45e5 Binary files /dev/null and b/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2-thumb.webp differ diff --git a/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2.webp b/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2.webp new file mode 100644 index 00000000..c0f3b8df Binary files /dev/null and b/backend/public/images/products/77/6905194816e3fa0961728032-0cdac3e2.webp differ diff --git a/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8-medium.webp b/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8-medium.webp new file mode 100644 index 00000000..1d6223f9 Binary files /dev/null and b/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8-medium.webp differ diff --git a/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8-thumb.webp b/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8-thumb.webp new file mode 100644 index 00000000..58f0e6b3 Binary files /dev/null and b/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8-thumb.webp differ diff --git a/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8.webp b/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8.webp new file mode 100644 index 00000000..5a62d34b Binary files /dev/null and b/backend/public/images/products/77/6908e2e6e8833fbe31022845-037bc6f8.webp differ diff --git a/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c-medium.webp b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c-medium.webp new file mode 100644 index 00000000..cc6ba337 Binary files /dev/null and b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c-medium.webp differ diff --git a/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c-thumb.webp b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c-thumb.webp new file mode 100644 index 00000000..d6c7c1cf Binary files /dev/null and b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c-thumb.webp differ diff --git a/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c.webp b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c.webp new file mode 100644 index 00000000..3ab334e7 Binary files /dev/null and b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad04-6cb0a12c.webp differ diff --git a/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050-medium.webp b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050-medium.webp new file mode 100644 index 00000000..b2a7e627 Binary files /dev/null and b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050-medium.webp differ diff --git a/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050-thumb.webp b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050-thumb.webp new file mode 100644 index 00000000..0ca002cc Binary files /dev/null and b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050-thumb.webp differ diff --git a/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050.webp b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050.webp new file mode 100644 index 00000000..1b6bab28 Binary files /dev/null and b/backend/public/images/products/77/6908e8145f1a3df2f1c0ad05-1a7e4050.webp differ diff --git a/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36-medium.webp b/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36-medium.webp new file mode 100644 index 00000000..8d57a6d2 Binary files /dev/null and b/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36-medium.webp differ diff --git a/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36-thumb.webp b/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36-thumb.webp new file mode 100644 index 00000000..07d96f42 Binary files /dev/null and b/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36-thumb.webp differ diff --git a/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36.webp b/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36.webp new file mode 100644 index 00000000..c8410194 Binary files /dev/null and b/backend/public/images/products/77/6908f24320df1d25b12fe5ae-df6bcb36.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8-medium.webp b/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8-medium.webp new file mode 100644 index 00000000..1e590f68 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8-medium.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8-thumb.webp b/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8-thumb.webp new file mode 100644 index 00000000..a12b4e56 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8-thumb.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8.webp b/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8.webp new file mode 100644 index 00000000..5c913b00 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d744-422e1fc8.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8-medium.webp b/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8-medium.webp new file mode 100644 index 00000000..1e590f68 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8-medium.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8-thumb.webp b/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8-thumb.webp new file mode 100644 index 00000000..a12b4e56 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8-thumb.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8.webp b/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8.webp new file mode 100644 index 00000000..5c913b00 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d745-422e1fc8.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8-medium.webp b/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8-medium.webp new file mode 100644 index 00000000..1e590f68 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8-medium.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8-thumb.webp b/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8-thumb.webp new file mode 100644 index 00000000..a12b4e56 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8-thumb.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8.webp b/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8.webp new file mode 100644 index 00000000..5c913b00 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d746-422e1fc8.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8-medium.webp b/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8-medium.webp new file mode 100644 index 00000000..1e590f68 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8-medium.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8-thumb.webp b/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8-thumb.webp new file mode 100644 index 00000000..a12b4e56 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8-thumb.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8.webp b/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8.webp new file mode 100644 index 00000000..5c913b00 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d747-422e1fc8.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8-medium.webp b/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8-medium.webp new file mode 100644 index 00000000..1e590f68 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8-medium.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8-thumb.webp b/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8-thumb.webp new file mode 100644 index 00000000..a12b4e56 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8-thumb.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8.webp b/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8.webp new file mode 100644 index 00000000..5c913b00 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d748-422e1fc8.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8-medium.webp b/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8-medium.webp new file mode 100644 index 00000000..1e590f68 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8-medium.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8-thumb.webp b/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8-thumb.webp new file mode 100644 index 00000000..a12b4e56 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8-thumb.webp differ diff --git a/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8.webp b/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8.webp new file mode 100644 index 00000000..5c913b00 Binary files /dev/null and b/backend/public/images/products/77/6908fa5628a295bf2525d749-422e1fc8.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69-medium.webp b/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69-medium.webp new file mode 100644 index 00000000..97c269b0 Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69-medium.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69-thumb.webp b/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69-thumb.webp new file mode 100644 index 00000000..cdde6f79 Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69-thumb.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69.webp b/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69.webp new file mode 100644 index 00000000..c8ac6b5f Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df145-06d2bd69.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be-medium.webp b/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be-medium.webp new file mode 100644 index 00000000..8efa5651 Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be-medium.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be-thumb.webp b/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be-thumb.webp new file mode 100644 index 00000000..1bd6ddc5 Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be-thumb.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be.webp b/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be.webp new file mode 100644 index 00000000..85f07348 Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df147-08edf8be.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6-medium.webp b/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6-medium.webp new file mode 100644 index 00000000..c626f2f2 Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6-medium.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6-thumb.webp b/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6-thumb.webp new file mode 100644 index 00000000..0f23e6b8 Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6-thumb.webp differ diff --git a/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6.webp b/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6.webp new file mode 100644 index 00000000..bfec525c Binary files /dev/null and b/backend/public/images/products/77/690906ae47a0e7c4048df148-0c7790c6.webp differ diff --git a/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01-medium.webp b/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01-medium.webp new file mode 100644 index 00000000..1fd61393 Binary files /dev/null and b/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01-medium.webp differ diff --git a/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01-thumb.webp b/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01-thumb.webp new file mode 100644 index 00000000..52767b53 Binary files /dev/null and b/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01-thumb.webp differ diff --git a/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01.webp b/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01.webp new file mode 100644 index 00000000..fdb55ac5 Binary files /dev/null and b/backend/public/images/products/77/6909133b0b0a9f17ac78e3c5-98e4ec01.webp differ diff --git a/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023-medium.webp b/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023-medium.webp new file mode 100644 index 00000000..064e1dbd Binary files /dev/null and b/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023-medium.webp differ diff --git a/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023-thumb.webp b/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023-thumb.webp new file mode 100644 index 00000000..a6c35bcc Binary files /dev/null and b/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023-thumb.webp differ diff --git a/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023.webp b/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023.webp new file mode 100644 index 00000000..40e479ea Binary files /dev/null and b/backend/public/images/products/77/690918551332ab1b67b0f2fc-79f0f023.webp differ diff --git a/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb-medium.webp b/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb-medium.webp new file mode 100644 index 00000000..f0747eb8 Binary files /dev/null and b/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb-medium.webp differ diff --git a/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb-thumb.webp b/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb-thumb.webp new file mode 100644 index 00000000..6453fab7 Binary files /dev/null and b/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb-thumb.webp differ diff --git a/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb.webp b/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb.webp new file mode 100644 index 00000000..ddee3519 Binary files /dev/null and b/backend/public/images/products/77/690918551332ab1b67b0f2fd-c8481cfb.webp differ diff --git a/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8-medium.webp b/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8-medium.webp new file mode 100644 index 00000000..415271ad Binary files /dev/null and b/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8-medium.webp differ diff --git a/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8-thumb.webp b/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8-thumb.webp new file mode 100644 index 00000000..487ba211 Binary files /dev/null and b/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8-thumb.webp differ diff --git a/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8.webp b/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8.webp new file mode 100644 index 00000000..07156349 Binary files /dev/null and b/backend/public/images/products/77/690a7961d640b14764cfc193-d3a566d8.webp differ diff --git a/backend/public/images/products/77/690a9437609023005c196801-c158d427-medium.webp b/backend/public/images/products/77/690a9437609023005c196801-c158d427-medium.webp new file mode 100644 index 00000000..e755ed41 Binary files /dev/null and b/backend/public/images/products/77/690a9437609023005c196801-c158d427-medium.webp differ diff --git a/backend/public/images/products/77/690a9437609023005c196801-c158d427-thumb.webp b/backend/public/images/products/77/690a9437609023005c196801-c158d427-thumb.webp new file mode 100644 index 00000000..3d76a0ed Binary files /dev/null and b/backend/public/images/products/77/690a9437609023005c196801-c158d427-thumb.webp differ diff --git a/backend/public/images/products/77/690a9437609023005c196801-c158d427.webp b/backend/public/images/products/77/690a9437609023005c196801-c158d427.webp new file mode 100644 index 00000000..42beed13 Binary files /dev/null and b/backend/public/images/products/77/690a9437609023005c196801-c158d427.webp differ diff --git a/backend/public/images/products/77/690a9437609023005c196802-c158d427-medium.webp b/backend/public/images/products/77/690a9437609023005c196802-c158d427-medium.webp new file mode 100644 index 00000000..e755ed41 Binary files /dev/null and b/backend/public/images/products/77/690a9437609023005c196802-c158d427-medium.webp differ diff --git a/backend/public/images/products/77/690a9437609023005c196802-c158d427-thumb.webp b/backend/public/images/products/77/690a9437609023005c196802-c158d427-thumb.webp new file mode 100644 index 00000000..3d76a0ed Binary files /dev/null and b/backend/public/images/products/77/690a9437609023005c196802-c158d427-thumb.webp differ diff --git a/backend/public/images/products/77/690a9437609023005c196802-c158d427.webp b/backend/public/images/products/77/690a9437609023005c196802-c158d427.webp new file mode 100644 index 00000000..42beed13 Binary files /dev/null and b/backend/public/images/products/77/690a9437609023005c196802-c158d427.webp differ diff --git a/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3-medium.webp b/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3-medium.webp new file mode 100644 index 00000000..82fdcc9e Binary files /dev/null and b/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3-medium.webp differ diff --git a/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3-thumb.webp b/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3-thumb.webp new file mode 100644 index 00000000..4e042c90 Binary files /dev/null and b/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3-thumb.webp differ diff --git a/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3.webp b/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3.webp new file mode 100644 index 00000000..1e93fa9a Binary files /dev/null and b/backend/public/images/products/77/690aa0255d9c3c32bc5868fb-05a935e3.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6-medium.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6-medium.webp new file mode 100644 index 00000000..cdd98c49 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6-medium.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6-thumb.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6-thumb.webp new file mode 100644 index 00000000..8b8e4f12 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6-thumb.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6.webp new file mode 100644 index 00000000..04984636 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41a9-707f02a6.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6-medium.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6-medium.webp new file mode 100644 index 00000000..cdd98c49 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6-medium.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6-thumb.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6-thumb.webp new file mode 100644 index 00000000..8b8e4f12 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6-thumb.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6.webp new file mode 100644 index 00000000..04984636 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41aa-707f02a6.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5-medium.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5-thumb.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ab-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5-medium.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5-thumb.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ac-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6-medium.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6-medium.webp new file mode 100644 index 00000000..cdd98c49 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6-medium.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6-thumb.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6-thumb.webp new file mode 100644 index 00000000..8b8e4f12 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6-thumb.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6.webp new file mode 100644 index 00000000..04984636 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41ae-707f02a6.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412-medium.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412-medium.webp new file mode 100644 index 00000000..2686cc4b Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412-medium.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412-thumb.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412-thumb.webp new file mode 100644 index 00000000..ba44dd18 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412-thumb.webp differ diff --git a/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412.webp b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412.webp new file mode 100644 index 00000000..ec91d6b8 Binary files /dev/null and b/backend/public/images/products/77/690b7f1dd2bb1d5686bf41af-c0343412.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0-medium.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0-medium.webp new file mode 100644 index 00000000..eced865c Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0-medium.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0-thumb.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0-thumb.webp new file mode 100644 index 00000000..779618fb Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0-thumb.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0.webp new file mode 100644 index 00000000..eb11fbcd Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d4-93d960e0.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204-medium.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204-medium.webp new file mode 100644 index 00000000..98c15005 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204-medium.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204-thumb.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204-thumb.webp new file mode 100644 index 00000000..5e8b8ff3 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204-thumb.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204.webp new file mode 100644 index 00000000..82228543 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d5-444fb204.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204-medium.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204-medium.webp new file mode 100644 index 00000000..98c15005 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204-medium.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204-thumb.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204-thumb.webp new file mode 100644 index 00000000..5e8b8ff3 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204-thumb.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204.webp new file mode 100644 index 00000000..82228543 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2d9-444fb204.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204-medium.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204-medium.webp new file mode 100644 index 00000000..98c15005 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204-medium.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204-thumb.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204-thumb.webp new file mode 100644 index 00000000..5e8b8ff3 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204-thumb.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204.webp new file mode 100644 index 00000000..82228543 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2da-444fb204.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3-medium.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3-medium.webp new file mode 100644 index 00000000..e4d595df Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3-medium.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3-thumb.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3-thumb.webp new file mode 100644 index 00000000..58cad3db Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3-thumb.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3.webp new file mode 100644 index 00000000..87d604d3 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2db-494211a3.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1-medium.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1-medium.webp new file mode 100644 index 00000000..1efec9f1 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1-medium.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1-thumb.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1-thumb.webp new file mode 100644 index 00000000..fb6d08c7 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1-thumb.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1.webp new file mode 100644 index 00000000..26eff412 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dc-b696dff1.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1-medium.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1-medium.webp new file mode 100644 index 00000000..1efec9f1 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1-medium.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1-thumb.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1-thumb.webp new file mode 100644 index 00000000..fb6d08c7 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1-thumb.webp differ diff --git a/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1.webp b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1.webp new file mode 100644 index 00000000..26eff412 Binary files /dev/null and b/backend/public/images/products/77/690bb1adf58b11ea17c1e2dd-b696dff1.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c-medium.webp b/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c-medium.webp new file mode 100644 index 00000000..d44ebd3f Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c-medium.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c-thumb.webp b/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c-thumb.webp new file mode 100644 index 00000000..169a9912 Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c-thumb.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c.webp b/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c.webp new file mode 100644 index 00000000..49288bae Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c5d-57fd950c.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5-medium.webp b/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5-medium.webp new file mode 100644 index 00000000..9cfe13cc Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5-medium.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5-thumb.webp b/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5-thumb.webp new file mode 100644 index 00000000..e57e9bbe Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5-thumb.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5.webp b/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5.webp new file mode 100644 index 00000000..c58e39cd Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c5f-25b359b5.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb-medium.webp b/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb-medium.webp new file mode 100644 index 00000000..0356c18f Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb-medium.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb-thumb.webp b/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb-thumb.webp new file mode 100644 index 00000000..636056a2 Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb-thumb.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb.webp b/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb.webp new file mode 100644 index 00000000..983f12c0 Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c60-06c74ceb.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3-medium.webp b/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3-medium.webp new file mode 100644 index 00000000..cc92a6ef Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3-medium.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3-thumb.webp b/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3-thumb.webp new file mode 100644 index 00000000..e3c236d6 Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3-thumb.webp differ diff --git a/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3.webp b/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3.webp new file mode 100644 index 00000000..1c3a59a8 Binary files /dev/null and b/backend/public/images/products/77/690cf161eada9b0f56447c62-f24222c3.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59-medium.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59-medium.webp new file mode 100644 index 00000000..d8c38485 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59-medium.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59-thumb.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59-thumb.webp new file mode 100644 index 00000000..863d2e69 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59-thumb.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59.webp new file mode 100644 index 00000000..873f716b Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5173-da16cf59.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a-medium.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a-medium.webp new file mode 100644 index 00000000..bed3c400 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a-medium.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a-thumb.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a-thumb.webp new file mode 100644 index 00000000..9a86b885 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a-thumb.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a.webp new file mode 100644 index 00000000..b9f90cf1 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5174-9ef8617a.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f-medium.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f-medium.webp new file mode 100644 index 00000000..d975c268 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f-medium.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f-thumb.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f-thumb.webp new file mode 100644 index 00000000..d1687f9d Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f-thumb.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f.webp new file mode 100644 index 00000000..325920b1 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5175-f9d1f60f.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86-medium.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86-medium.webp new file mode 100644 index 00000000..45ccd627 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86-medium.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86-thumb.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86-thumb.webp new file mode 100644 index 00000000..3d2ad84e Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86-thumb.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86.webp new file mode 100644 index 00000000..e8e16cd9 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5176-f71bfe86.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59-medium.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59-medium.webp new file mode 100644 index 00000000..d8c38485 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59-medium.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59-thumb.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59-thumb.webp new file mode 100644 index 00000000..863d2e69 Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59-thumb.webp differ diff --git a/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59.webp b/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59.webp new file mode 100644 index 00000000..873f716b Binary files /dev/null and b/backend/public/images/products/77/690cf659c4d1238e3a5c5177-da16cf59.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796-medium.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796-medium.webp new file mode 100644 index 00000000..d7072955 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796-medium.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796-thumb.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796-thumb.webp new file mode 100644 index 00000000..1f81e7b1 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796-thumb.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796.webp new file mode 100644 index 00000000..fd1da801 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e93-10a8a796.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9-medium.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9-medium.webp new file mode 100644 index 00000000..9f1e7cf5 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9-medium.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9-thumb.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9-thumb.webp new file mode 100644 index 00000000..bf3d447b Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9-thumb.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9.webp new file mode 100644 index 00000000..08257db9 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e94-e0347ad9.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd-medium.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd-medium.webp new file mode 100644 index 00000000..6a73cd10 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd-medium.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd-thumb.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd-thumb.webp new file mode 100644 index 00000000..7d94a31b Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd-thumb.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd.webp new file mode 100644 index 00000000..9cd6d423 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e95-7d8356cd.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796-medium.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796-medium.webp new file mode 100644 index 00000000..d7072955 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796-medium.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796-thumb.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796-thumb.webp new file mode 100644 index 00000000..1f81e7b1 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796-thumb.webp differ diff --git a/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796.webp b/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796.webp new file mode 100644 index 00000000..fd1da801 Binary files /dev/null and b/backend/public/images/products/77/690d0a7074660b69a21f1e96-10a8a796.webp differ diff --git a/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b-medium.webp b/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b-medium.webp new file mode 100644 index 00000000..1f4bdf5a Binary files /dev/null and b/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b-medium.webp differ diff --git a/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b-thumb.webp b/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b-thumb.webp new file mode 100644 index 00000000..55a3f6a3 Binary files /dev/null and b/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b-thumb.webp differ diff --git a/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b.webp b/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b.webp new file mode 100644 index 00000000..34f19f11 Binary files /dev/null and b/backend/public/images/products/77/690d0e3d87ccc32314adf8da-8a96059b.webp differ diff --git a/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef-medium.webp b/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef-medium.webp new file mode 100644 index 00000000..e21217f2 Binary files /dev/null and b/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef-medium.webp differ diff --git a/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef-thumb.webp b/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef-thumb.webp new file mode 100644 index 00000000..59f070d3 Binary files /dev/null and b/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef-thumb.webp differ diff --git a/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef.webp b/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef.webp new file mode 100644 index 00000000..7cb36d42 Binary files /dev/null and b/backend/public/images/products/77/690d136e2c0055b390e69ac4-31e481ef.webp differ diff --git a/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36-medium.webp b/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36-medium.webp new file mode 100644 index 00000000..8d57a6d2 Binary files /dev/null and b/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36-medium.webp differ diff --git a/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36-thumb.webp b/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36-thumb.webp new file mode 100644 index 00000000..07d96f42 Binary files /dev/null and b/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36-thumb.webp differ diff --git a/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36.webp b/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36.webp new file mode 100644 index 00000000..c8410194 Binary files /dev/null and b/backend/public/images/products/77/690e28c43dabbc0984f60518-df6bcb36.webp differ diff --git a/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97-medium.webp b/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97-medium.webp new file mode 100644 index 00000000..e9ac1e3a Binary files /dev/null and b/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97-medium.webp differ diff --git a/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97-thumb.webp b/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97-thumb.webp new file mode 100644 index 00000000..beb168cd Binary files /dev/null and b/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97-thumb.webp differ diff --git a/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97.webp b/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97.webp new file mode 100644 index 00000000..9bbda67f Binary files /dev/null and b/backend/public/images/products/77/690e28c43dabbc0984f60519-b5551d97.webp differ diff --git a/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5-medium.webp b/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5-medium.webp new file mode 100644 index 00000000..329e7f86 Binary files /dev/null and b/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5-medium.webp differ diff --git a/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5-thumb.webp b/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5-thumb.webp new file mode 100644 index 00000000..9770573f Binary files /dev/null and b/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5-thumb.webp differ diff --git a/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5.webp b/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5.webp new file mode 100644 index 00000000..32796fca Binary files /dev/null and b/backend/public/images/products/77/690e504b0d4f5381a23dfda1-1f29c3a5.webp differ diff --git a/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a-medium.webp b/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a-medium.webp new file mode 100644 index 00000000..69dd93da Binary files /dev/null and b/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a-medium.webp differ diff --git a/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a-thumb.webp b/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a-thumb.webp new file mode 100644 index 00000000..53080a73 Binary files /dev/null and b/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a-thumb.webp differ diff --git a/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a.webp b/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a.webp new file mode 100644 index 00000000..d8a98a37 Binary files /dev/null and b/backend/public/images/products/77/6910da8210b680381e605d19-775fac2a.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b-medium.webp b/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b-medium.webp new file mode 100644 index 00000000..3ef9216e Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b-medium.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b-thumb.webp b/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b-thumb.webp new file mode 100644 index 00000000..5ea78555 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b-thumb.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b.webp b/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b.webp new file mode 100644 index 00000000..3791e99e Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde23-917d869b.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2-medium.webp b/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2-medium.webp new file mode 100644 index 00000000..8db1374a Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2-medium.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2-thumb.webp b/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2-thumb.webp new file mode 100644 index 00000000..4a25d144 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2-thumb.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2.webp b/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2.webp new file mode 100644 index 00000000..141d532f Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde24-6e54d7c2.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df-medium.webp b/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df-medium.webp new file mode 100644 index 00000000..3de12931 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df-medium.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df-thumb.webp b/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df-thumb.webp new file mode 100644 index 00000000..3e14d372 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df-thumb.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df.webp b/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df.webp new file mode 100644 index 00000000..ad53a0f9 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde25-8a5fb6df.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa-medium.webp b/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa-thumb.webp b/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa.webp b/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde26-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa-medium.webp b/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa-medium.webp new file mode 100644 index 00000000..3f72d087 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa-medium.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa-thumb.webp b/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa-thumb.webp new file mode 100644 index 00000000..f80896a9 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa-thumb.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa.webp b/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa.webp new file mode 100644 index 00000000..b5a00747 Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde27-3b3e60fa.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a-medium.webp b/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a-medium.webp new file mode 100644 index 00000000..2456e79e Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a-medium.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a-thumb.webp b/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a-thumb.webp new file mode 100644 index 00000000..1c9097eb Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a-thumb.webp differ diff --git a/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a.webp b/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a.webp new file mode 100644 index 00000000..e8a71fdf Binary files /dev/null and b/backend/public/images/products/77/69126a25063dd450fa6cde28-cd022f2a.webp differ diff --git a/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71-medium.webp b/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71-medium.webp new file mode 100644 index 00000000..503fd56c Binary files /dev/null and b/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71-medium.webp differ diff --git a/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71-thumb.webp b/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71-thumb.webp new file mode 100644 index 00000000..db8e5d62 Binary files /dev/null and b/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71-thumb.webp differ diff --git a/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71.webp b/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71.webp new file mode 100644 index 00000000..139abdad Binary files /dev/null and b/backend/public/images/products/77/6912e7c3039435da6fc317e6-6957fc71.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95-medium.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95-thumb.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffc-2b235e95.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95-medium.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95-thumb.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffd-2b235e95.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95-medium.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95-thumb.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95.webp b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/69136c3bd02bf4ad2ef25ffe-2b235e95.webp differ diff --git a/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef-medium.webp b/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef-medium.webp new file mode 100644 index 00000000..e21217f2 Binary files /dev/null and b/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef-medium.webp differ diff --git a/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef-thumb.webp b/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef-thumb.webp new file mode 100644 index 00000000..59f070d3 Binary files /dev/null and b/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef-thumb.webp differ diff --git a/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef.webp b/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef.webp new file mode 100644 index 00000000..7cb36d42 Binary files /dev/null and b/backend/public/images/products/77/6913ac528a7e9c4c13127cf7-31e481ef.webp differ diff --git a/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef-medium.webp b/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef-medium.webp new file mode 100644 index 00000000..e21217f2 Binary files /dev/null and b/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef-medium.webp differ diff --git a/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef-thumb.webp b/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef-thumb.webp new file mode 100644 index 00000000..59f070d3 Binary files /dev/null and b/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef-thumb.webp differ diff --git a/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef.webp b/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef.webp new file mode 100644 index 00000000..7cb36d42 Binary files /dev/null and b/backend/public/images/products/77/6913ac528a7e9c4c13127cf9-31e481ef.webp differ diff --git a/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3-medium.webp b/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3-medium.webp new file mode 100644 index 00000000..18f60636 Binary files /dev/null and b/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3-medium.webp differ diff --git a/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3-thumb.webp b/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3-thumb.webp new file mode 100644 index 00000000..0f6d2c95 Binary files /dev/null and b/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3-thumb.webp differ diff --git a/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3.webp b/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3.webp new file mode 100644 index 00000000..ffb552b7 Binary files /dev/null and b/backend/public/images/products/77/691634fa4da43f08082a6350-524d7eb3.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36-medium.webp b/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36-medium.webp new file mode 100644 index 00000000..8d57a6d2 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36-medium.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36-thumb.webp b/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36-thumb.webp new file mode 100644 index 00000000..07d96f42 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36-thumb.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36.webp b/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36.webp new file mode 100644 index 00000000..c8410194 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a2-df6bcb36.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36-medium.webp b/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36-medium.webp new file mode 100644 index 00000000..8d57a6d2 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36-medium.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36-thumb.webp b/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36-thumb.webp new file mode 100644 index 00000000..07d96f42 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36-thumb.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36.webp b/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36.webp new file mode 100644 index 00000000..c8410194 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a3-df6bcb36.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36-medium.webp b/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36-medium.webp new file mode 100644 index 00000000..8d57a6d2 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36-medium.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36-thumb.webp b/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36-thumb.webp new file mode 100644 index 00000000..07d96f42 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36-thumb.webp differ diff --git a/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36.webp b/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36.webp new file mode 100644 index 00000000..c8410194 Binary files /dev/null and b/backend/public/images/products/77/69167ef37497c280ad1030a4-df6bcb36.webp differ diff --git a/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5-medium.webp b/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5-thumb.webp b/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5.webp b/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/69176f5320370dd77482548e-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5-medium.webp b/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5-thumb.webp b/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5.webp b/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/69176f5320370dd77482548f-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0-medium.webp b/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0-medium.webp new file mode 100644 index 00000000..b40025f7 Binary files /dev/null and b/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0-medium.webp differ diff --git a/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0-thumb.webp b/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0-thumb.webp new file mode 100644 index 00000000..31abde42 Binary files /dev/null and b/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0-thumb.webp differ diff --git a/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0.webp b/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0.webp new file mode 100644 index 00000000..39b84774 Binary files /dev/null and b/backend/public/images/products/77/69177b82a3b3eb3a6e070beb-1e5b94c0.webp differ diff --git a/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1-medium.webp b/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1-medium.webp new file mode 100644 index 00000000..2ff869c9 Binary files /dev/null and b/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1-medium.webp differ diff --git a/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1-thumb.webp b/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1-thumb.webp new file mode 100644 index 00000000..9aed36f2 Binary files /dev/null and b/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1-thumb.webp differ diff --git a/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1.webp b/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1.webp new file mode 100644 index 00000000..ae1b9a62 Binary files /dev/null and b/backend/public/images/products/77/691784f24171280274418b50-96b0cbc1.webp differ diff --git a/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2-medium.webp b/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2-medium.webp new file mode 100644 index 00000000..9ef5d08c Binary files /dev/null and b/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2-medium.webp differ diff --git a/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2-thumb.webp b/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2-thumb.webp new file mode 100644 index 00000000..2b404654 Binary files /dev/null and b/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2-thumb.webp differ diff --git a/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2.webp b/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2.webp new file mode 100644 index 00000000..023c0498 Binary files /dev/null and b/backend/public/images/products/77/6917baa4e40c67fbf1d2ccc8-2b6b58c2.webp differ diff --git a/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7-medium.webp b/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7-medium.webp new file mode 100644 index 00000000..4dbce2b5 Binary files /dev/null and b/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7-medium.webp differ diff --git a/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7-thumb.webp b/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7-thumb.webp new file mode 100644 index 00000000..be90c2e9 Binary files /dev/null and b/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7-thumb.webp differ diff --git a/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7.webp b/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7.webp new file mode 100644 index 00000000..f9df424a Binary files /dev/null and b/backend/public/images/products/77/6919f96e09759e0305b63137-211184a7.webp differ diff --git a/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1-medium.webp b/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1-medium.webp new file mode 100644 index 00000000..b1f8db82 Binary files /dev/null and b/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1-medium.webp differ diff --git a/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1-thumb.webp b/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1-thumb.webp new file mode 100644 index 00000000..71618b98 Binary files /dev/null and b/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1-thumb.webp differ diff --git a/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1.webp b/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1.webp new file mode 100644 index 00000000..708c7712 Binary files /dev/null and b/backend/public/images/products/77/6919f96e09759e0305b63138-2ad466a1.webp differ diff --git a/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c-medium.webp b/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c-medium.webp new file mode 100644 index 00000000..883c90e5 Binary files /dev/null and b/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c-medium.webp differ diff --git a/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c-thumb.webp b/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c-thumb.webp new file mode 100644 index 00000000..7fc9fbee Binary files /dev/null and b/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c-thumb.webp differ diff --git a/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c.webp b/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c.webp new file mode 100644 index 00000000..d979417b Binary files /dev/null and b/backend/public/images/products/77/691b55b731d644ca86f39b38-465a641c.webp differ diff --git a/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e-medium.webp b/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e-medium.webp new file mode 100644 index 00000000..c01de3c4 Binary files /dev/null and b/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e-medium.webp differ diff --git a/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e-thumb.webp b/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e-thumb.webp new file mode 100644 index 00000000..3ff506c4 Binary files /dev/null and b/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e-thumb.webp differ diff --git a/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e.webp b/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e.webp new file mode 100644 index 00000000..9e39e24c Binary files /dev/null and b/backend/public/images/products/77/691b6ef3a973468199b4b0ca-5175b53e.webp differ diff --git a/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070-medium.webp b/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070-medium.webp new file mode 100644 index 00000000..7c8abc0d Binary files /dev/null and b/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070-medium.webp differ diff --git a/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070-thumb.webp b/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070-thumb.webp new file mode 100644 index 00000000..0c9cdc3e Binary files /dev/null and b/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070-thumb.webp differ diff --git a/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070.webp b/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070.webp new file mode 100644 index 00000000..02c533b0 Binary files /dev/null and b/backend/public/images/products/77/691b7da9ff8afbe9afc096ba-3af49070.webp differ diff --git a/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634-medium.webp b/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634-medium.webp new file mode 100644 index 00000000..11de9d0f Binary files /dev/null and b/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634-medium.webp differ diff --git a/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634-thumb.webp b/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634-thumb.webp new file mode 100644 index 00000000..f11d6cc3 Binary files /dev/null and b/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634-thumb.webp differ diff --git a/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634.webp b/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634.webp new file mode 100644 index 00000000..85b417bd Binary files /dev/null and b/backend/public/images/products/77/691ca0d4264ce11a82f1f6e9-27aaf634.webp differ diff --git a/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31-medium.webp b/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31-medium.webp new file mode 100644 index 00000000..4bef903b Binary files /dev/null and b/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31-medium.webp differ diff --git a/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31-thumb.webp b/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31-thumb.webp new file mode 100644 index 00000000..34f3f73d Binary files /dev/null and b/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31-thumb.webp differ diff --git a/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31.webp b/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31.webp new file mode 100644 index 00000000..22f09d64 Binary files /dev/null and b/backend/public/images/products/77/691cd6950af1dbad6d2d2082-1a373b31.webp differ diff --git a/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8-medium.webp b/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8-medium.webp new file mode 100644 index 00000000..415271ad Binary files /dev/null and b/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8-medium.webp differ diff --git a/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8-thumb.webp b/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8-thumb.webp new file mode 100644 index 00000000..487ba211 Binary files /dev/null and b/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8-thumb.webp differ diff --git a/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8.webp b/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8.webp new file mode 100644 index 00000000..07156349 Binary files /dev/null and b/backend/public/images/products/77/691de62a8ca71660d8b96161-d3a566d8.webp differ diff --git a/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a-medium.webp b/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a-medium.webp new file mode 100644 index 00000000..47d38fde Binary files /dev/null and b/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a-medium.webp differ diff --git a/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a-thumb.webp b/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a-thumb.webp new file mode 100644 index 00000000..434402ad Binary files /dev/null and b/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a-thumb.webp differ diff --git a/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a.webp b/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a.webp new file mode 100644 index 00000000..dc3f1b80 Binary files /dev/null and b/backend/public/images/products/77/691df50e44502618dc2aafe6-54cea90a.webp differ diff --git a/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95-medium.webp b/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95-thumb.webp b/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95.webp b/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/691dfe39c7e10e6ccf6cfcf0-2b235e95.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa-medium.webp b/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa-medium.webp new file mode 100644 index 00000000..cc5bd5ed Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa-medium.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa-thumb.webp b/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa-thumb.webp new file mode 100644 index 00000000..4523fb7a Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa-thumb.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa.webp b/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa.webp new file mode 100644 index 00000000..e6a41843 Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793726-5df80eaa.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4-medium.webp b/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4-medium.webp new file mode 100644 index 00000000..d2ab50eb Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4-medium.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4-thumb.webp b/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4-thumb.webp new file mode 100644 index 00000000..d7deb514 Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4-thumb.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4.webp b/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4.webp new file mode 100644 index 00000000..b5f62f3a Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793727-f765dce4.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39-medium.webp b/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39-medium.webp new file mode 100644 index 00000000..940e166c Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39-medium.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39-thumb.webp b/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39-thumb.webp new file mode 100644 index 00000000..c016a4eb Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39-thumb.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39.webp b/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39.webp new file mode 100644 index 00000000..b91768f0 Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793728-2ac5ad39.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b-medium.webp b/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b-medium.webp new file mode 100644 index 00000000..e8b53793 Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b-medium.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b-thumb.webp b/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b-thumb.webp new file mode 100644 index 00000000..5137858b Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b-thumb.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b.webp b/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b.webp new file mode 100644 index 00000000..94662487 Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c793729-f19e010b.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81-medium.webp b/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81-medium.webp new file mode 100644 index 00000000..dd966282 Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81-medium.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81-thumb.webp b/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81-thumb.webp new file mode 100644 index 00000000..a28d698b Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81-thumb.webp differ diff --git a/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81.webp b/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81.webp new file mode 100644 index 00000000..f9a86349 Binary files /dev/null and b/backend/public/images/products/77/691e1225df3b65941c79372a-93018c81.webp differ diff --git a/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69-medium.webp b/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69-medium.webp new file mode 100644 index 00000000..5cb20b5d Binary files /dev/null and b/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69-medium.webp differ diff --git a/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69-thumb.webp b/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69-thumb.webp new file mode 100644 index 00000000..988cf0d7 Binary files /dev/null and b/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69-thumb.webp differ diff --git a/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69.webp b/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69.webp new file mode 100644 index 00000000..50597363 Binary files /dev/null and b/backend/public/images/products/77/6920802ce5bb28f480c332cc-f95a2c69.webp differ diff --git a/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c-medium.webp b/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c-medium.webp new file mode 100644 index 00000000..dacfc6be Binary files /dev/null and b/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c-medium.webp differ diff --git a/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c-thumb.webp b/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c-thumb.webp new file mode 100644 index 00000000..2a43b7b8 Binary files /dev/null and b/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c-thumb.webp differ diff --git a/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c.webp b/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c.webp new file mode 100644 index 00000000..9c287012 Binary files /dev/null and b/backend/public/images/products/77/6920a47b4bc1f878a547604b-d818303c.webp differ diff --git a/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39-medium.webp b/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39-medium.webp new file mode 100644 index 00000000..2204ead9 Binary files /dev/null and b/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39-medium.webp differ diff --git a/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39-thumb.webp b/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39-thumb.webp new file mode 100644 index 00000000..88dafa86 Binary files /dev/null and b/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39-thumb.webp differ diff --git a/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39.webp b/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39.webp new file mode 100644 index 00000000..b6b301ee Binary files /dev/null and b/backend/public/images/products/77/6920c179ce974fb6a36ff500-dc952a39.webp differ diff --git a/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be-medium.webp b/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be-medium.webp new file mode 100644 index 00000000..1e4998d4 Binary files /dev/null and b/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be-medium.webp differ diff --git a/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be-thumb.webp b/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be-thumb.webp new file mode 100644 index 00000000..5fd3fd5d Binary files /dev/null and b/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be-thumb.webp differ diff --git a/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be.webp b/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be.webp new file mode 100644 index 00000000..260b1e29 Binary files /dev/null and b/backend/public/images/products/77/6924a2a7f2e40f2d974803a0-86d4d4be.webp differ diff --git a/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479-medium.webp b/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479-medium.webp new file mode 100644 index 00000000..b3a1097a Binary files /dev/null and b/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479-medium.webp differ diff --git a/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479-thumb.webp b/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479-thumb.webp new file mode 100644 index 00000000..3548a85c Binary files /dev/null and b/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479-thumb.webp differ diff --git a/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479.webp b/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479.webp new file mode 100644 index 00000000..5f1ea933 Binary files /dev/null and b/backend/public/images/products/77/6924b3777f29e2003387e36b-bf3b8479.webp differ diff --git a/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d-medium.webp b/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d-medium.webp new file mode 100644 index 00000000..1dde980d Binary files /dev/null and b/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d-medium.webp differ diff --git a/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d-thumb.webp b/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d-thumb.webp new file mode 100644 index 00000000..3eb00397 Binary files /dev/null and b/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d-thumb.webp differ diff --git a/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d.webp b/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d.webp new file mode 100644 index 00000000..e27ed519 Binary files /dev/null and b/backend/public/images/products/77/6924bfeb335ba2154b522e02-73472e7d.webp differ diff --git a/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43-medium.webp b/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43-medium.webp new file mode 100644 index 00000000..1e24b217 Binary files /dev/null and b/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43-medium.webp differ diff --git a/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43-thumb.webp b/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43-thumb.webp new file mode 100644 index 00000000..46542a6f Binary files /dev/null and b/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43-thumb.webp differ diff --git a/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43.webp b/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43.webp new file mode 100644 index 00000000..b28f7fd8 Binary files /dev/null and b/backend/public/images/products/77/6927300e650f8e5ae6930ab2-d65b6f43.webp differ diff --git a/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d-medium.webp b/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d-medium.webp new file mode 100644 index 00000000..e36965ea Binary files /dev/null and b/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d-medium.webp differ diff --git a/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d-thumb.webp b/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d-thumb.webp new file mode 100644 index 00000000..ce97af3e Binary files /dev/null and b/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d-thumb.webp differ diff --git a/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d.webp b/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d.webp new file mode 100644 index 00000000..fd623dd9 Binary files /dev/null and b/backend/public/images/products/77/69274100632a018ccc7d19d4-8a6cda7d.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147-medium.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147-medium.webp new file mode 100644 index 00000000..459cd0e1 Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147-medium.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147-thumb.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147-thumb.webp new file mode 100644 index 00000000..afbc5195 Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147-thumb.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147.webp new file mode 100644 index 00000000..f99ee91f Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21d-a4e9d147.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b-medium.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b-medium.webp new file mode 100644 index 00000000..71e57afa Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b-medium.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b-thumb.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b-thumb.webp new file mode 100644 index 00000000..8c18d254 Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b-thumb.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b.webp new file mode 100644 index 00000000..dc21830e Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21e-6e34112b.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb-medium.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb-medium.webp new file mode 100644 index 00000000..ec69e92a Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb-medium.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb-thumb.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb-thumb.webp new file mode 100644 index 00000000..1759924b Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb-thumb.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb.webp new file mode 100644 index 00000000..ef90f8ca Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf21f-e6c59bbb.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003-medium.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003-medium.webp new file mode 100644 index 00000000..6e53d6b4 Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003-medium.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003-thumb.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003-thumb.webp new file mode 100644 index 00000000..46b60110 Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003-thumb.webp differ diff --git a/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003.webp b/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003.webp new file mode 100644 index 00000000..14c93d65 Binary files /dev/null and b/backend/public/images/products/77/692743c7faf3ea97f4ebf221-3d39a003.webp differ diff --git a/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1-medium.webp b/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1-medium.webp new file mode 100644 index 00000000..93f67418 Binary files /dev/null and b/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1-medium.webp differ diff --git a/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1-thumb.webp b/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1-thumb.webp new file mode 100644 index 00000000..ec5c51ac Binary files /dev/null and b/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1-thumb.webp differ diff --git a/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1.webp b/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1.webp new file mode 100644 index 00000000..bf0df228 Binary files /dev/null and b/backend/public/images/products/77/69274665ebc89e7cfc44572a-c787cfa1.webp differ diff --git a/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72-medium.webp b/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72-medium.webp new file mode 100644 index 00000000..ca5d1828 Binary files /dev/null and b/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72-medium.webp differ diff --git a/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72-thumb.webp b/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72-thumb.webp new file mode 100644 index 00000000..cdf51755 Binary files /dev/null and b/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72-thumb.webp differ diff --git a/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72.webp b/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72.webp new file mode 100644 index 00000000..701dd484 Binary files /dev/null and b/backend/public/images/products/77/69274c0365bf6ce19ae3d782-129e5f72.webp differ diff --git a/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f-medium.webp b/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f-medium.webp new file mode 100644 index 00000000..ead3263c Binary files /dev/null and b/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f-medium.webp differ diff --git a/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f-thumb.webp b/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f-thumb.webp new file mode 100644 index 00000000..527bfd08 Binary files /dev/null and b/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f-thumb.webp differ diff --git a/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f.webp b/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f.webp new file mode 100644 index 00000000..0ebd7b61 Binary files /dev/null and b/backend/public/images/products/77/69275a67f721a7d4a2398eb7-8451631f.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d-medium.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d-medium.webp new file mode 100644 index 00000000..d9f92220 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d-medium.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d-thumb.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d-thumb.webp new file mode 100644 index 00000000..69b22bfd Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d-thumb.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d.webp new file mode 100644 index 00000000..4708c088 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01d-abca866d.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4-medium.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4-thumb.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01e-752aa3a4.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4-medium.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4-medium.webp new file mode 100644 index 00000000..080093ac Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4-medium.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4-thumb.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4-thumb.webp new file mode 100644 index 00000000..ad986e80 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4-thumb.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4.webp new file mode 100644 index 00000000..a7c956c5 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd01f-752aa3a4.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb-medium.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb-medium.webp new file mode 100644 index 00000000..7f691028 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb-medium.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb-thumb.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb-thumb.webp new file mode 100644 index 00000000..4bf659bd Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb-thumb.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb.webp new file mode 100644 index 00000000..61b3bd47 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd020-d0edc2bb.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb-medium.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb-medium.webp new file mode 100644 index 00000000..80f32209 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb-medium.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb-thumb.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb-thumb.webp new file mode 100644 index 00000000..133677b3 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb-thumb.webp differ diff --git a/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb.webp b/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb.webp new file mode 100644 index 00000000..e9311f11 Binary files /dev/null and b/backend/public/images/products/77/69275cd37e87d99ddd3fd021-b6f9d0bb.webp differ diff --git a/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f-medium.webp b/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f-medium.webp new file mode 100644 index 00000000..cd857036 Binary files /dev/null and b/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f-medium.webp differ diff --git a/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f-thumb.webp b/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f-thumb.webp new file mode 100644 index 00000000..3b6d8df1 Binary files /dev/null and b/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f-thumb.webp differ diff --git a/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f.webp b/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f.webp new file mode 100644 index 00000000..7d6b214a Binary files /dev/null and b/backend/public/images/products/77/692769330cf315702c4b6d3f-6a1bbb6f.webp differ diff --git a/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e-medium.webp b/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e-medium.webp new file mode 100644 index 00000000..908603ab Binary files /dev/null and b/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e-medium.webp differ diff --git a/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e-thumb.webp b/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e-thumb.webp new file mode 100644 index 00000000..5c569e77 Binary files /dev/null and b/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e-thumb.webp differ diff --git a/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e.webp b/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e.webp new file mode 100644 index 00000000..7511b0a7 Binary files /dev/null and b/backend/public/images/products/77/692dda535b0159dfa07ec0d8-eb9df59e.webp differ diff --git a/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd-medium.webp b/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd-medium.webp new file mode 100644 index 00000000..c1854c83 Binary files /dev/null and b/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd-medium.webp differ diff --git a/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd-thumb.webp b/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd-thumb.webp new file mode 100644 index 00000000..fc4b74ef Binary files /dev/null and b/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd-thumb.webp differ diff --git a/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd.webp b/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd.webp new file mode 100644 index 00000000..42d21812 Binary files /dev/null and b/backend/public/images/products/77/692dda535b0159dfa07ec0d9-09c0d2bd.webp differ diff --git a/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d-medium.webp b/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d-medium.webp new file mode 100644 index 00000000..3fae3e89 Binary files /dev/null and b/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d-medium.webp differ diff --git a/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d-thumb.webp b/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d-thumb.webp new file mode 100644 index 00000000..29cbbb47 Binary files /dev/null and b/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d-thumb.webp differ diff --git a/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d.webp b/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d.webp new file mode 100644 index 00000000..8c1c86dc Binary files /dev/null and b/backend/public/images/products/77/6930628e15fef60c9e5602b5-5cf9831d.webp differ diff --git a/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3-medium.webp b/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3-medium.webp new file mode 100644 index 00000000..aebcad9b Binary files /dev/null and b/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3-medium.webp differ diff --git a/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3-thumb.webp b/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3-thumb.webp new file mode 100644 index 00000000..62b38890 Binary files /dev/null and b/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3-thumb.webp differ diff --git a/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3.webp b/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3.webp new file mode 100644 index 00000000..ad43199a Binary files /dev/null and b/backend/public/images/products/77/69306757959ae1db7198c900-8475e1f3.webp differ diff --git a/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1-medium.webp b/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1-medium.webp new file mode 100644 index 00000000..93f67418 Binary files /dev/null and b/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1-medium.webp differ diff --git a/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1-thumb.webp b/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1-thumb.webp new file mode 100644 index 00000000..ec5c51ac Binary files /dev/null and b/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1-thumb.webp differ diff --git a/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1.webp b/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1.webp new file mode 100644 index 00000000..bf0df228 Binary files /dev/null and b/backend/public/images/products/77/69307c3130f88498c2166023-c787cfa1.webp differ diff --git a/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f-medium.webp b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f-medium.webp new file mode 100644 index 00000000..57890ea2 Binary files /dev/null and b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f-medium.webp differ diff --git a/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f-thumb.webp b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f-thumb.webp new file mode 100644 index 00000000..cc0b350f Binary files /dev/null and b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f-thumb.webp differ diff --git a/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f.webp b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f.webp new file mode 100644 index 00000000..f8a84d5d Binary files /dev/null and b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7b-33c8466f.webp differ diff --git a/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e-medium.webp b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e-medium.webp new file mode 100644 index 00000000..502a712b Binary files /dev/null and b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e-medium.webp differ diff --git a/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e-thumb.webp b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e-thumb.webp new file mode 100644 index 00000000..a03faf95 Binary files /dev/null and b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e-thumb.webp differ diff --git a/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e.webp b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e.webp new file mode 100644 index 00000000..2f5a2685 Binary files /dev/null and b/backend/public/images/products/77/69307e8fecc2bbe8a5d74d7c-24efa60e.webp differ diff --git a/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12-medium.webp b/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12-medium.webp new file mode 100644 index 00000000..22b2d297 Binary files /dev/null and b/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12-medium.webp differ diff --git a/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12-thumb.webp b/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12-thumb.webp new file mode 100644 index 00000000..05ecafc2 Binary files /dev/null and b/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12-thumb.webp differ diff --git a/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12.webp b/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12.webp new file mode 100644 index 00000000..f1f4a35b Binary files /dev/null and b/backend/public/images/products/77/6930859e99019a575e7498d3-8515bc12.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6-medium.webp b/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6-medium.webp new file mode 100644 index 00000000..c626f2f2 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6-medium.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6-thumb.webp b/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6-thumb.webp new file mode 100644 index 00000000..0f23e6b8 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6-thumb.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6.webp b/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6.webp new file mode 100644 index 00000000..bfec525c Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f83-0c7790c6.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387-medium.webp b/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387-medium.webp new file mode 100644 index 00000000..4b961805 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387-medium.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387-thumb.webp b/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387-thumb.webp new file mode 100644 index 00000000..444e8000 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387-thumb.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387.webp b/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387.webp new file mode 100644 index 00000000..dc84e5d1 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f84-a325c387.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387-medium.webp b/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387-medium.webp new file mode 100644 index 00000000..4b961805 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387-medium.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387-thumb.webp b/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387-thumb.webp new file mode 100644 index 00000000..444e8000 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387-thumb.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387.webp b/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387.webp new file mode 100644 index 00000000..dc84e5d1 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f85-a325c387.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387-medium.webp b/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387-medium.webp new file mode 100644 index 00000000..4b961805 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387-medium.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387-thumb.webp b/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387-thumb.webp new file mode 100644 index 00000000..444e8000 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387-thumb.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387.webp b/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387.webp new file mode 100644 index 00000000..dc84e5d1 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f86-a325c387.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387-medium.webp b/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387-medium.webp new file mode 100644 index 00000000..4b961805 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387-medium.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387-thumb.webp b/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387-thumb.webp new file mode 100644 index 00000000..444e8000 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387-thumb.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387.webp b/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387.webp new file mode 100644 index 00000000..dc84e5d1 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f87-a325c387.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387-medium.webp b/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387-medium.webp new file mode 100644 index 00000000..4b961805 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387-medium.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387-thumb.webp b/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387-thumb.webp new file mode 100644 index 00000000..444e8000 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387-thumb.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387.webp b/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387.webp new file mode 100644 index 00000000..dc84e5d1 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f88-a325c387.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387-medium.webp b/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387-medium.webp new file mode 100644 index 00000000..4b961805 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387-medium.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387-thumb.webp b/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387-thumb.webp new file mode 100644 index 00000000..444e8000 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387-thumb.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387.webp b/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387.webp new file mode 100644 index 00000000..dc84e5d1 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f89-a325c387.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387-medium.webp b/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387-medium.webp new file mode 100644 index 00000000..4b961805 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387-medium.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387-thumb.webp b/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387-thumb.webp new file mode 100644 index 00000000..444e8000 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387-thumb.webp differ diff --git a/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387.webp b/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387.webp new file mode 100644 index 00000000..dc84e5d1 Binary files /dev/null and b/backend/public/images/products/77/6930882e1e23d60290d52f8a-a325c387.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0-medium.webp new file mode 100644 index 00000000..bee4830a Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0-thumb.webp new file mode 100644 index 00000000..4b76717d Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0.webp b/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0.webp new file mode 100644 index 00000000..240daa18 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb6e-6a33b1f0.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95-medium.webp new file mode 100644 index 00000000..56dd431a Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95-thumb.webp new file mode 100644 index 00000000..005db19e Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95.webp b/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95.webp new file mode 100644 index 00000000..a57b00fd Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb6f-2b235e95.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5.webp b/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb70-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5.webp b/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb71-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b-medium.webp new file mode 100644 index 00000000..ac786946 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b-thumb.webp new file mode 100644 index 00000000..654ddad1 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b.webp b/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b.webp new file mode 100644 index 00000000..6d3937fd Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb72-d47f6f6b.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5.webp b/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb73-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b-medium.webp new file mode 100644 index 00000000..ac786946 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b-thumb.webp new file mode 100644 index 00000000..654ddad1 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b.webp b/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b.webp new file mode 100644 index 00000000..6d3937fd Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb74-d47f6f6b.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5.webp b/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb75-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5.webp b/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb76-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5.webp b/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb77-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5.webp b/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb78-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5-medium.webp b/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5-medium.webp new file mode 100644 index 00000000..ab279153 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5-medium.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5-thumb.webp b/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5-thumb.webp new file mode 100644 index 00000000..9622cb58 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5-thumb.webp differ diff --git a/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5.webp b/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5.webp new file mode 100644 index 00000000..f07b8713 Binary files /dev/null and b/backend/public/images/products/77/6930918d77920b93481afb79-9ddc3ed5.webp differ diff --git a/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b-medium.webp b/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b-medium.webp new file mode 100644 index 00000000..617c38e6 Binary files /dev/null and b/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b-medium.webp differ diff --git a/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b-thumb.webp b/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b-thumb.webp new file mode 100644 index 00000000..82440aa7 Binary files /dev/null and b/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b-thumb.webp differ diff --git a/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b.webp b/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b.webp new file mode 100644 index 00000000..f08c978b Binary files /dev/null and b/backend/public/images/products/77/6930963f38e7aa55fc28c5f8-aa658c8b.webp differ diff --git a/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9-medium.webp b/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9-medium.webp new file mode 100644 index 00000000..a186c6c9 Binary files /dev/null and b/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9-medium.webp differ diff --git a/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9-thumb.webp b/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9-thumb.webp new file mode 100644 index 00000000..165a8681 Binary files /dev/null and b/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9-thumb.webp differ diff --git a/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9.webp b/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9.webp new file mode 100644 index 00000000..cf82a746 Binary files /dev/null and b/backend/public/images/products/77/69309fd73bd234b6a2ba0d42-c7433bb9.webp differ diff --git a/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef-medium.webp b/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef-medium.webp new file mode 100644 index 00000000..6044a7a0 Binary files /dev/null and b/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef-medium.webp differ diff --git a/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef-thumb.webp b/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef-thumb.webp new file mode 100644 index 00000000..f60f29ec Binary files /dev/null and b/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef-thumb.webp differ diff --git a/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef.webp b/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef.webp new file mode 100644 index 00000000..df54e8a6 Binary files /dev/null and b/backend/public/images/products/77/69309fd73bd234b6a2ba0d43-531e61ef.webp differ diff --git a/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4-medium.webp b/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4-medium.webp new file mode 100644 index 00000000..b34f5dc7 Binary files /dev/null and b/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4-medium.webp differ diff --git a/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4-thumb.webp b/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4-thumb.webp new file mode 100644 index 00000000..10230ee8 Binary files /dev/null and b/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4-thumb.webp differ diff --git a/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4.webp b/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4.webp new file mode 100644 index 00000000..89c8c218 Binary files /dev/null and b/backend/public/images/products/77/6930aa1cfe657846c2470a47-8a9123d4.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0-medium.webp new file mode 100644 index 00000000..ab3f4194 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0-thumb.webp new file mode 100644 index 00000000..5a889ebc Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0.webp b/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0.webp new file mode 100644 index 00000000..2ed16863 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff62980444e-d3aa75a0.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f-medium.webp new file mode 100644 index 00000000..57890ea2 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f-thumb.webp new file mode 100644 index 00000000..cc0b350f Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f.webp b/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f.webp new file mode 100644 index 00000000..f8a84d5d Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff62980444f-33c8466f.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f-medium.webp new file mode 100644 index 00000000..57890ea2 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f-thumb.webp new file mode 100644 index 00000000..cc0b350f Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f.webp b/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f.webp new file mode 100644 index 00000000..f8a84d5d Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804450-33c8466f.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0-medium.webp new file mode 100644 index 00000000..ab3f4194 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0-thumb.webp new file mode 100644 index 00000000..5a889ebc Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0.webp b/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0.webp new file mode 100644 index 00000000..2ed16863 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804451-d3aa75a0.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f-medium.webp new file mode 100644 index 00000000..57890ea2 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f-thumb.webp new file mode 100644 index 00000000..cc0b350f Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f.webp b/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f.webp new file mode 100644 index 00000000..f8a84d5d Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804452-33c8466f.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f-medium.webp new file mode 100644 index 00000000..57890ea2 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f-thumb.webp new file mode 100644 index 00000000..cc0b350f Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f.webp b/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f.webp new file mode 100644 index 00000000..f8a84d5d Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804453-33c8466f.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f-medium.webp new file mode 100644 index 00000000..57890ea2 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f-thumb.webp new file mode 100644 index 00000000..cc0b350f Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f.webp b/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f.webp new file mode 100644 index 00000000..f8a84d5d Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804454-33c8466f.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8-medium.webp new file mode 100644 index 00000000..1e590f68 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8-thumb.webp new file mode 100644 index 00000000..a12b4e56 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8.webp b/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8.webp new file mode 100644 index 00000000..5c913b00 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804455-422e1fc8.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0-medium.webp new file mode 100644 index 00000000..ab3f4194 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0-thumb.webp new file mode 100644 index 00000000..5a889ebc Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0.webp b/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0.webp new file mode 100644 index 00000000..2ed16863 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804456-d3aa75a0.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b-medium.webp new file mode 100644 index 00000000..8d849fc5 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b-thumb.webp new file mode 100644 index 00000000..bb7e1358 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b.webp b/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b.webp new file mode 100644 index 00000000..4ee09cd7 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804457-4065566b.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0-medium.webp b/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0-medium.webp new file mode 100644 index 00000000..ab3f4194 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0-medium.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0-thumb.webp b/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0-thumb.webp new file mode 100644 index 00000000..5a889ebc Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0-thumb.webp differ diff --git a/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0.webp b/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0.webp new file mode 100644 index 00000000..2ed16863 Binary files /dev/null and b/backend/public/images/products/77/6930ac9f9b946ff629804458-d3aa75a0.webp differ diff --git a/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370-medium.webp b/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370-medium.webp new file mode 100644 index 00000000..a290a49e Binary files /dev/null and b/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370-medium.webp differ diff --git a/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370-thumb.webp b/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370-thumb.webp new file mode 100644 index 00000000..a47ea862 Binary files /dev/null and b/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370-thumb.webp differ diff --git a/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370.webp b/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370.webp new file mode 100644 index 00000000..c006c532 Binary files /dev/null and b/backend/public/images/products/77/6930dbe1ffe827dcfaf911b8-b34f3370.webp differ diff --git a/backend/src/dutchie-az/routes/index.ts b/backend/src/dutchie-az/routes/index.ts index 942559b9..a16d0680 100644 --- a/backend/src/dutchie-az/routes/index.ts +++ b/backend/src/dutchie-az/routes/index.ts @@ -1521,6 +1521,7 @@ router.get('/monitor/active-jobs', async (_req: Request, res: Response) => { `); // Get running crawl jobs (individual store crawls with worker info) + // Note: Use COALESCE for optional columns that may not exist in older schemas const { rows: runningCrawlJobs } = await query(` SELECT cj.id, @@ -1541,7 +1542,6 @@ router.get('/monitor/active-jobs', async (_req: Request, res: Response) => { cj.total_pages, cj.last_heartbeat_at, cj.retry_count, - cj.metadata, EXTRACT(EPOCH FROM (NOW() - cj.started_at)) as duration_seconds FROM dispensary_crawl_jobs cj LEFT JOIN dispensaries d ON cj.dispensary_id = d.id diff --git a/backend/src/index.ts b/backend/src/index.ts index 140021d6..f63d1d24 100755 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -58,6 +58,8 @@ import scheduleRoutes from './routes/schedule'; import crawlerSandboxRoutes from './routes/crawler-sandbox'; import versionRoutes from './routes/version'; import publicApiRoutes from './routes/public-api'; +import usersRoutes from './routes/users'; +import staleProcessesRoutes from './routes/stale-processes'; import { dutchieAZRouter, startScheduler as startDutchieAZScheduler, initializeDefaultSchedules } from './dutchie-az'; import { trackApiUsage, checkRateLimit } from './middleware/apiTokenTracker'; import { startCrawlScheduler } from './services/crawl-scheduler'; @@ -89,6 +91,8 @@ app.use('/api/parallel-scrape', parallelScrapeRoutes); app.use('/api/schedule', scheduleRoutes); app.use('/api/crawler-sandbox', crawlerSandboxRoutes); app.use('/api/version', versionRoutes); +app.use('/api/users', usersRoutes); +app.use('/api/stale-processes', staleProcessesRoutes); // Vendor-agnostic AZ data pipeline routes (new public surface) app.use('/api/az', dutchieAZRouter); // Legacy alias (kept temporarily for backward compatibility) diff --git a/backend/src/routes/public-api.ts b/backend/src/routes/public-api.ts index 979d43fa..6bb01efa 100644 --- a/backend/src/routes/public-api.ts +++ b/backend/src/routes/public-api.ts @@ -209,11 +209,25 @@ async function validatePublicApiKey( req.apiPermission = permission; next(); - } catch (error) { + } catch (error: any) { console.error('Public API validation error:', error); - return res.status(500).json({ - error: 'Internal server error during API validation' - }); + + // Provide more detailed error info for debugging + const errorDetails: any = { + error: 'Internal server error during API validation', + message: 'An unexpected error occurred while validating your API key. Please try again or contact support.', + }; + + // Add error type hint for debugging (without exposing sensitive details) + if (error.code === 'ECONNREFUSED') { + errorDetails.hint = 'Database connection failed'; + } else if (error.code === '42P01') { + errorDetails.hint = 'Database table not found - permissions table may not be initialized'; + } else if (error.message?.includes('timeout')) { + errorDetails.hint = 'Database query timeout'; + } + + return res.status(500).json(errorDetails); } } diff --git a/backend/src/routes/stale-processes.ts b/backend/src/routes/stale-processes.ts new file mode 100644 index 00000000..f9e8eb44 --- /dev/null +++ b/backend/src/routes/stale-processes.ts @@ -0,0 +1,217 @@ +import { Router } from 'express'; +import { authMiddleware } from '../auth/middleware'; +import { exec } from 'child_process'; +import { promisify } from 'util'; + +const execAsync = promisify(exec); +const router = Router(); +router.use(authMiddleware); + +// Process patterns to monitor (matches stale-process-monitor.sh) +const STALE_PATTERNS = [ + 'kubectl port-forward', + 'npm run dev', + 'npx tsx', + 'node dist/index.js', + 'docker push', + 'kubectl exec' +]; + +interface ProcessInfo { + pid: number; + user: string; + cpu: string; + mem: string; + elapsed: string; + command: string; + pattern: string; +} + +// Get list of stale processes +router.get('/status', async (req, res) => { + try { + const processes: ProcessInfo[] = []; + + for (const pattern of STALE_PATTERNS) { + try { + // Use ps aux to find matching processes + const { stdout } = await execAsync( + `ps aux | grep -E "${pattern}" | grep -v grep | grep -v "stale-process" || true` + ); + + const lines = stdout.trim().split('\n').filter(line => line.trim()); + + for (const line of lines) { + const parts = line.split(/\s+/); + if (parts.length >= 11) { + const pid = parseInt(parts[1]); + + // Get elapsed time for this process + let elapsed = 'unknown'; + try { + const { stdout: etimeOut } = await execAsync(`ps -o etime= -p ${pid} 2>/dev/null || echo "unknown"`); + elapsed = etimeOut.trim() || 'unknown'; + } catch {} + + processes.push({ + pid, + user: parts[0], + cpu: parts[2], + mem: parts[3], + elapsed, + command: parts.slice(10).join(' ').substring(0, 100), + pattern + }); + } + } + } catch { + // Pattern not found, continue + } + } + + // Group by pattern for summary + const summary: Record = {}; + for (const p of processes) { + summary[p.pattern] = (summary[p.pattern] || 0) + 1; + } + + res.json({ + total: processes.length, + processes, + summary, + patterns: STALE_PATTERNS + }); + } catch (error: any) { + console.error('Error fetching stale processes:', error); + res.status(500).json({ error: 'Failed to fetch stale processes' }); + } +}); + +// Kill a specific process by PID +router.post('/kill/:pid', async (req, res) => { + try { + const pid = parseInt(req.params.pid); + + if (isNaN(pid) || pid <= 0) { + return res.status(400).json({ error: 'Invalid PID' }); + } + + // Safety check: don't kill init or system processes + if (pid === 1) { + return res.status(400).json({ error: 'Cannot kill init process' }); + } + + await execAsync(`kill -9 ${pid}`); + res.json({ success: true, message: `Process ${pid} killed` }); + } catch (error: any) { + // Process might already be dead + if (error.message.includes('No such process')) { + res.json({ success: true, message: `Process ${req.params.pid} already terminated` }); + } else { + res.status(500).json({ error: `Failed to kill process: ${error.message}` }); + } + } +}); + +// Kill all processes matching a pattern +router.post('/kill-pattern', async (req, res) => { + try { + const { pattern } = req.body; + + if (!pattern || typeof pattern !== 'string') { + return res.status(400).json({ error: 'Pattern is required' }); + } + + // Validate pattern is in allowed list + if (!STALE_PATTERNS.includes(pattern)) { + return res.status(400).json({ error: 'Pattern not in allowed list' }); + } + + // Get PIDs first + const { stdout } = await execAsync( + `ps aux | grep -E "${pattern}" | grep -v grep | grep -v "stale-process" | awk '{print $2}' || true` + ); + + const pids = stdout.trim().split('\n').filter(p => p.trim()).map(p => parseInt(p)); + const killed: number[] = []; + const failed: number[] = []; + + for (const pid of pids) { + if (!isNaN(pid) && pid > 1) { + try { + await execAsync(`kill -9 ${pid}`); + killed.push(pid); + } catch { + failed.push(pid); + } + } + } + + res.json({ + success: true, + pattern, + killed, + failed, + message: `Killed ${killed.length} processes` + }); + } catch (error: any) { + res.status(500).json({ error: `Failed to kill processes: ${error.message}` }); + } +}); + +// Clean all stale processes +router.post('/clean-all', async (req, res) => { + try { + const { dryRun = false } = req.body; + const results: Record = {}; + let totalKilled = 0; + + for (const pattern of STALE_PATTERNS) { + try { + const { stdout } = await execAsync( + `ps aux | grep -E "${pattern}" | grep -v grep | grep -v "stale-process" | awk '{print $2}' || true` + ); + + const pids = stdout.trim().split('\n').filter(p => p.trim()).map(p => parseInt(p)); + const killed: number[] = []; + const failed: number[] = []; + + for (const pid of pids) { + if (!isNaN(pid) && pid > 1) { + if (dryRun) { + killed.push(pid); + } else { + try { + await execAsync(`kill -9 ${pid}`); + killed.push(pid); + } catch { + failed.push(pid); + } + } + } + } + + if (killed.length > 0 || failed.length > 0) { + results[pattern] = { killed, failed }; + totalKilled += killed.length; + } + } catch { + // Pattern not found + } + } + + res.json({ + success: true, + dryRun, + totalKilled, + results, + message: dryRun + ? `Would kill ${totalKilled} processes` + : `Killed ${totalKilled} processes` + }); + } catch (error: any) { + res.status(500).json({ error: `Failed to clean processes: ${error.message}` }); + } +}); + +export default router; diff --git a/backend/src/routes/users.ts b/backend/src/routes/users.ts new file mode 100644 index 00000000..a1b22958 --- /dev/null +++ b/backend/src/routes/users.ts @@ -0,0 +1,183 @@ +import { Router } from 'express'; +import bcrypt from 'bcrypt'; +import { pool } from '../db/migrate'; +import { authMiddleware, requireRole, AuthRequest } from '../auth/middleware'; + +const router = Router(); + +// All routes require authentication and admin/superadmin role +router.use(authMiddleware); +router.use(requireRole('admin', 'superadmin')); + +// Get all users +router.get('/', async (req: AuthRequest, res) => { + try { + const result = await pool.query(` + SELECT id, email, role, created_at, updated_at + FROM users + ORDER BY created_at DESC + `); + res.json({ users: result.rows }); + } catch (error) { + console.error('Error fetching users:', error); + res.status(500).json({ error: 'Failed to fetch users' }); + } +}); + +// Get single user +router.get('/:id', async (req: AuthRequest, res) => { + try { + const { id } = req.params; + const result = await pool.query(` + SELECT id, email, role, created_at, updated_at + FROM users + WHERE id = $1 + `, [id]); + + if (result.rows.length === 0) { + return res.status(404).json({ error: 'User not found' }); + } + + res.json({ user: result.rows[0] }); + } catch (error) { + console.error('Error fetching user:', error); + res.status(500).json({ error: 'Failed to fetch user' }); + } +}); + +// Create user +router.post('/', async (req: AuthRequest, res) => { + try { + const { email, password, role } = req.body; + + if (!email || !password) { + return res.status(400).json({ error: 'Email and password are required' }); + } + + // Check for valid role + const validRoles = ['admin', 'analyst', 'viewer']; + if (role && !validRoles.includes(role)) { + return res.status(400).json({ error: 'Invalid role. Must be: admin, analyst, or viewer' }); + } + + // Check if email already exists + const existing = await pool.query('SELECT id FROM users WHERE email = $1', [email]); + if (existing.rows.length > 0) { + return res.status(400).json({ error: 'Email already exists' }); + } + + // Hash password + const passwordHash = await bcrypt.hash(password, 10); + + const result = await pool.query(` + INSERT INTO users (email, password_hash, role) + VALUES ($1, $2, $3) + RETURNING id, email, role, created_at, updated_at + `, [email, passwordHash, role || 'viewer']); + + res.status(201).json({ user: result.rows[0] }); + } catch (error) { + console.error('Error creating user:', error); + res.status(500).json({ error: 'Failed to create user' }); + } +}); + +// Update user +router.put('/:id', async (req: AuthRequest, res) => { + try { + const { id } = req.params; + const { email, password, role } = req.body; + + // Check if user exists + const existing = await pool.query('SELECT id FROM users WHERE id = $1', [id]); + if (existing.rows.length === 0) { + return res.status(404).json({ error: 'User not found' }); + } + + // Check for valid role + const validRoles = ['admin', 'analyst', 'viewer', 'superadmin']; + if (role && !validRoles.includes(role)) { + return res.status(400).json({ error: 'Invalid role' }); + } + + // Prevent non-superadmin from modifying superadmin users + const targetUser = await pool.query('SELECT role FROM users WHERE id = $1', [id]); + if (targetUser.rows[0].role === 'superadmin' && req.user?.role !== 'superadmin') { + return res.status(403).json({ error: 'Cannot modify superadmin users' }); + } + + // Build update query dynamically + const updates: string[] = []; + const values: any[] = []; + let paramIndex = 1; + + if (email) { + // Check if email already taken by another user + const emailCheck = await pool.query('SELECT id FROM users WHERE email = $1 AND id != $2', [email, id]); + if (emailCheck.rows.length > 0) { + return res.status(400).json({ error: 'Email already in use' }); + } + updates.push(`email = $${paramIndex++}`); + values.push(email); + } + + if (password) { + const passwordHash = await bcrypt.hash(password, 10); + updates.push(`password_hash = $${paramIndex++}`); + values.push(passwordHash); + } + + if (role) { + updates.push(`role = $${paramIndex++}`); + values.push(role); + } + + if (updates.length === 0) { + return res.status(400).json({ error: 'No fields to update' }); + } + + updates.push(`updated_at = NOW()`); + values.push(id); + + const result = await pool.query(` + UPDATE users + SET ${updates.join(', ')} + WHERE id = $${paramIndex} + RETURNING id, email, role, created_at, updated_at + `, values); + + res.json({ user: result.rows[0] }); + } catch (error) { + console.error('Error updating user:', error); + res.status(500).json({ error: 'Failed to update user' }); + } +}); + +// Delete user +router.delete('/:id', async (req: AuthRequest, res) => { + try { + const { id } = req.params; + + // Prevent deleting yourself + if (req.user?.id === parseInt(id)) { + return res.status(400).json({ error: 'Cannot delete your own account' }); + } + + // Prevent non-superadmin from deleting superadmin users + const targetUser = await pool.query('SELECT role FROM users WHERE id = $1', [id]); + if (targetUser.rows.length === 0) { + return res.status(404).json({ error: 'User not found' }); + } + if (targetUser.rows[0].role === 'superadmin' && req.user?.role !== 'superadmin') { + return res.status(403).json({ error: 'Cannot delete superadmin users' }); + } + + await pool.query('DELETE FROM users WHERE id = $1', [id]); + res.json({ success: true }); + } catch (error) { + console.error('Error deleting user:', error); + res.status(500).json({ error: 'Failed to delete user' }); + } +}); + +export default router; diff --git a/backend/src/scripts/bootstrap-stores-for-dispensaries.ts b/backend/src/scripts/bootstrap-stores-for-dispensaries.ts new file mode 100644 index 00000000..2f2fb61d --- /dev/null +++ b/backend/src/scripts/bootstrap-stores-for-dispensaries.ts @@ -0,0 +1,72 @@ +import { Pool } from 'pg'; + +const pool = new Pool({ connectionString: process.env.DATABASE_URL }); + +/** + * Creates `stores` table records for all dispensaries that: + * 1. Have menu_type = 'dutchie' AND platform_dispensary_id (ready for GraphQL crawl) + * 2. Don't already have a linked stores record + * + * The stores table is required by the scraper engine (scrapeStore function) + */ +async function bootstrapStores() { + console.log('=== Bootstrapping stores for Dutchie dispensaries ===\n'); + + // Find all dutchie dispensaries without linked stores + const result = await pool.query(` + SELECT d.id, d.name, d.slug, d.menu_type, d.platform_dispensary_id, d.menu_url + FROM dispensaries d + LEFT JOIN stores s ON s.dispensary_id = d.id + WHERE d.menu_type = 'dutchie' + AND d.platform_dispensary_id IS NOT NULL + AND s.id IS NULL + ORDER BY d.id + `); + + console.log(`Found ${result.rows.length} dispensaries needing store records\n`); + + let created = 0; + let errors = 0; + + for (const d of result.rows) { + try { + // Insert store record linking to dispensary + // Note: stores table only has basic fields: name, slug, dispensary_id, dutchie_url + // The platform_dispensary_id for GraphQL crawling lives in the dispensaries table + const insertResult = await pool.query(` + INSERT INTO stores ( + name, + slug, + dispensary_id, + active, + scrape_enabled, + created_at, + updated_at + ) VALUES ($1, $2, $3, true, true, NOW(), NOW()) + RETURNING id + `, [ + d.name, + d.slug || d.name.toLowerCase().replace(/[^a-z0-9]+/g, '-'), + d.id + ]); + + console.log(`[CREATED] Store ${insertResult.rows[0].id} for dispensary ${d.id}: ${d.name}`); + created++; + } catch (e: any) { + console.error(`[ERROR] Dispensary ${d.id} (${d.name}): ${e.message}`); + errors++; + } + } + + console.log('\n=== Bootstrap Summary ==='); + console.log(`Created: ${created}`); + console.log(`Errors: ${errors}`); + console.log(`Total needing stores: ${result.rows.length}`); + + await pool.end(); +} + +bootstrapStores().catch(e => { + console.error('Fatal error:', e.message); + process.exit(1); +}); diff --git a/backend/src/scripts/check-store-linking.ts b/backend/src/scripts/check-store-linking.ts new file mode 100644 index 00000000..97e30680 --- /dev/null +++ b/backend/src/scripts/check-store-linking.ts @@ -0,0 +1,35 @@ +import { Pool } from 'pg'; + +const pool = new Pool({ connectionString: process.env.DATABASE_URL }); + +async function check() { + // Check which dispensaries have linked stores + const result = await pool.query(` + SELECT d.id as disp_id, d.name, d.menu_type, d.platform_dispensary_id, + s.id as store_id, s.name as store_name + FROM dispensaries d + LEFT JOIN stores s ON s.dispensary_id = d.id + WHERE d.menu_type = 'dutchie' AND d.platform_dispensary_id IS NOT NULL + LIMIT 15 + `); + + console.log('Dispensaries with linked stores:'); + result.rows.forEach(r => { + console.log(` [${r.disp_id}] ${r.name} -> store ${r.store_id || 'NONE'} (${r.store_name || 'NOT LINKED'})`); + }); + + // Count how many have linked stores + const countResult = await pool.query(` + SELECT + COUNT(*) FILTER (WHERE s.id IS NOT NULL) as with_store, + COUNT(*) FILTER (WHERE s.id IS NULL) as without_store + FROM dispensaries d + LEFT JOIN stores s ON s.dispensary_id = d.id + WHERE d.menu_type = 'dutchie' AND d.platform_dispensary_id IS NOT NULL + `); + + console.log('\nSummary:', countResult.rows[0]); + + await pool.end(); +} +check(); diff --git a/backend/src/scripts/detect-all.ts b/backend/src/scripts/detect-all.ts new file mode 100644 index 00000000..82a82130 --- /dev/null +++ b/backend/src/scripts/detect-all.ts @@ -0,0 +1,130 @@ +import { Pool } from 'pg'; +const pool = new Pool({ connectionString: process.env.DATABASE_URL }); + +// Simple fetch with timeout +async function fetchWithTimeout(url: string, timeout = 10000): Promise { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeout); + + try { + const resp = await fetch(url, { + signal: controller.signal, + headers: { + 'User-Agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + }, + redirect: 'follow', + }); + clearTimeout(id); + return await resp.text(); + } catch (e) { + clearTimeout(id); + throw e; + } +} + +// Check for dutchie patterns in HTML +function detectDutchie(html: string): { provider: string; platformId?: string; menuUrl?: string } { + // Check for reactEnv.dispensaryId (Curaleaf/Sol pattern) + const reactEnvMatch = html.match(/"dispensaryId"\s*:\s*"([a-fA-F0-9]{24})"/i); + if (reactEnvMatch) { + return { provider: 'dutchie', platformId: reactEnvMatch[1] }; + } + + // Check for Dutchie embedded-menu script (Trulieve pattern) + // Look for: embedded-menu/5eaf48fc972e6200b1303b97.js + const embedMatch = html.match(/embedded-menu\/([a-f0-9]{24})(?:\.js)?/i); + if (embedMatch) { + return { provider: 'dutchie', platformId: embedMatch[1] }; + } + + // Check for dutchie.com links + const dutchieLink = html.match(/https?:\/\/(?:www\.)?dutchie\.com\/(?:dispensary|embedded-menu|stores)\/([a-zA-Z0-9-]+)/i); + if (dutchieLink) { + return { provider: 'dutchie', menuUrl: dutchieLink[0] }; + } + + // Check for jane + if (html.includes('iheartjane.com') || html.includes('jane.co')) { + const janeMatch = html.match(/https?:\/\/(?:www\.)?(?:iheartjane\.com|jane\.co)\/[^"\s]+/i); + return { provider: 'jane', menuUrl: janeMatch?.[0] }; + } + + // Check for treez + if (html.includes('.treez.io')) { + const treezMatch = html.match(/https?:\/\/[a-zA-Z0-9-]+\.treez\.io[^"\s]*/i); + return { provider: 'treez', menuUrl: treezMatch?.[0] }; + } + + // Check for leafly + if (html.includes('leafly.com/dispensary')) { + return { provider: 'leafly' }; + } + + return { provider: 'unknown' }; +} + +async function main() { + const { rows: stores } = await pool.query(` + SELECT id, name, website + FROM dispensaries + WHERE platform_dispensary_id IS NULL + AND website IS NOT NULL + AND website NOT LIKE '%example%' + ORDER BY id + LIMIT 150 + `); + + console.log('Checking ' + stores.length + ' stores...\n'); + + let dutchieCount = 0; + let otherCount = 0; + let errorCount = 0; + + for (const store of stores) { + try { + const html = await fetchWithTimeout(store.website); + const result = detectDutchie(html); + + if (result.provider === 'dutchie') { + if (result.platformId) { + await pool.query( + 'UPDATE dispensaries SET menu_type = $1, platform_dispensary_id = $2, updated_at = NOW() WHERE id = $3', + ['dutchie', result.platformId, store.id] + ); + console.log('[' + store.id + '] ' + store.name + ' => DUTCHIE (ID: ' + result.platformId + ')'); + dutchieCount++; + } else if (result.menuUrl) { + await pool.query( + 'UPDATE dispensaries SET menu_type = $1, menu_url = $2, updated_at = NOW() WHERE id = $3', + ['dutchie', result.menuUrl, store.id] + ); + console.log('[' + store.id + '] ' + store.name + ' => DUTCHIE (URL: ' + result.menuUrl.slice(0, 60) + ')'); + dutchieCount++; + } + } else if (result.provider !== 'unknown') { + await pool.query( + 'UPDATE dispensaries SET menu_type = $1, menu_url = COALESCE($2, menu_url), updated_at = NOW() WHERE id = $3', + [result.provider, result.menuUrl, store.id] + ); + console.log('[' + store.id + '] ' + store.name + ' => ' + result.provider.toUpperCase()); + otherCount++; + } else { + console.log('[' + store.id + '] ' + store.name + ' => no menu found'); + } + } catch (err: any) { + const errMsg = err.name === 'AbortError' ? 'timeout' : err.message?.slice(0, 40) || 'error'; + console.log('[' + store.id + '] ' + store.name + ' => ERROR: ' + errMsg); + errorCount++; + } + } + + console.log('\n=== Summary ==='); + console.log('Dutchie detected: ' + dutchieCount); + console.log('Other providers: ' + otherCount); + console.log('Errors: ' + errorCount); + + await pool.end(); +} + +main().catch(console.error); diff --git a/backend/src/scripts/export-dispensaries.ts b/backend/src/scripts/export-dispensaries.ts new file mode 100644 index 00000000..8499bb38 --- /dev/null +++ b/backend/src/scripts/export-dispensaries.ts @@ -0,0 +1,19 @@ +import { Pool } from 'pg'; +const pool = new Pool({ connectionString: process.env.DATABASE_URL }); + +async function exportDispensaries() { + const { rows } = await pool.query(` + SELECT id, name, dba_name, company_name, slug, + address, city, state, zip, latitude, longitude, + website, menu_type, menu_url, platform_dispensary_id, + created_at, updated_at + FROM dispensaries + WHERE menu_type IS NOT NULL + ORDER BY id + `); + + console.log(JSON.stringify(rows, null, 2)); + await pool.end(); +} + +exportDispensaries(); diff --git a/backend/src/scripts/extract-platform-ids.ts b/backend/src/scripts/extract-platform-ids.ts new file mode 100644 index 00000000..dcea2ce3 --- /dev/null +++ b/backend/src/scripts/extract-platform-ids.ts @@ -0,0 +1,278 @@ +import { chromium } from 'playwright'; +import { Pool } from 'pg'; + +const pool = new Pool({ + connectionString: process.env.DATABASE_URL +}); + +interface Dispensary { + id: number; + name: string; + website: string; +} + +async function extractPlatformId(browser: any, dispensary: Dispensary): Promise { + let capturedId: string | null = null; + const context = await browser.newContext(); + const page = await context.newPage(); + + // Intercept network requests to find retailer IDs + page.on('request', (request: any) => { + const url = request.url(); + if (url.includes('dutchie') || url.includes('plus.dutchie') || url.includes('api.dutchie')) { + // Check URL for retailer ID + const urlMatch = url.match(/[\/=]([a-f0-9]{24})(?:[\/\?&]|$)/i); + if (urlMatch && !capturedId) { + capturedId = urlMatch[1]; + console.log(` Captured from URL: ${capturedId}`); + } + + const postData = request.postData(); + if (postData) { + // Look for retailerId in GraphQL variables + const match = postData.match(/["']?retailerId["']?\s*:\s*["']([a-f0-9]{24})["']/i); + if (match && !capturedId) { + capturedId = match[1]; + console.log(` Captured retailerId: ${capturedId}`); + } + // Also look for dispensaryId + const dispMatch = postData.match(/["']?dispensaryId["']?\s*:\s*["']([a-f0-9]{24})["']/i); + if (dispMatch && !capturedId) { + capturedId = dispMatch[1]; + console.log(` Captured dispensaryId: ${capturedId}`); + } + } + } + }); + + try { + console.log(`\nLoading ${dispensary.name}: ${dispensary.website}`); + await page.goto(dispensary.website, { waitUntil: 'domcontentloaded', timeout: 30000 }); + + // Wait for initial load + await page.waitForTimeout(2000); + + // Check page content for retailerId + const content = await page.content(); + + // Try various patterns in page content + const patterns = [ + /["']retailerId["']\s*:\s*["']([a-f0-9]{24})["']/i, + /dispensaryId["']\s*:\s*["']([a-f0-9]{24})["']/i, + /retailer["']?\s*:\s*["']([a-f0-9]{24})["']/i, + /dutchie\.com\/embedded-menu\/([a-f0-9]{24})/i, + /dutchie\.com\/dispensary\/([a-f0-9]{24})/i, + /plus\.dutchie\.com\/plus\/([a-f0-9]{24})/i, + /retailerId=([a-f0-9]{24})/i, + ]; + + for (const pattern of patterns) { + const match = content.match(pattern); + if (match && !capturedId) { + capturedId = match[1]; + console.log(` Found in content: ${capturedId}`); + break; + } + } + + // Check __NEXT_DATA__ if present + if (!capturedId) { + const nextData = await page.evaluate(() => { + const el = document.getElementById('__NEXT_DATA__'); + return el?.textContent || null; + }); + + if (nextData) { + for (const pattern of patterns) { + const match = nextData.match(pattern); + if (match) { + capturedId = match[1]; + console.log(` Found in __NEXT_DATA__: ${capturedId}`); + break; + } + } + } + } + + // Look for iframes that might contain dutchie embed + if (!capturedId) { + const iframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + + for (const src of iframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + console.log(` Found in iframe: ${capturedId}`); + break; + } + } + } + } + + // If still not found, try clicking on "Shop" or "Menu" links + if (!capturedId) { + const menuSelectors = [ + 'a:has-text("Shop")', + 'a:has-text("Menu")', + 'a:has-text("Order")', + 'a[href*="menu"]', + 'a[href*="shop"]', + 'a[href*="order"]', + 'button:has-text("Shop")', + 'button:has-text("Menu")', + ]; + + for (const selector of menuSelectors) { + try { + const element = page.locator(selector).first(); + const isVisible = await element.isVisible({ timeout: 500 }); + if (isVisible) { + const href = await element.getAttribute('href'); + // If it's an internal link, click it + if (href && !href.startsWith('http')) { + console.log(` Clicking ${selector}...`); + await element.click(); + await page.waitForTimeout(3000); + + // Check new page content + const newContent = await page.content(); + for (const pattern of patterns) { + const match = newContent.match(pattern); + if (match && !capturedId) { + capturedId = match[1]; + console.log(` Found after navigation: ${capturedId}`); + break; + } + } + + // Check iframes on new page + if (!capturedId) { + const newIframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of newIframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + console.log(` Found in iframe after nav: ${capturedId}`); + break; + } + } + } + } + + if (capturedId) break; + } + } + } catch (e) { + // Continue to next selector + } + } + } + + // If still not found, wait longer for async dutchie widget to load + if (!capturedId) { + console.log(` Waiting for async content...`); + await page.waitForTimeout(5000); + + // Check for dutchie script tags + const scripts = await page.evaluate(() => { + return Array.from(document.querySelectorAll('script')).map(s => s.src || s.innerHTML?.substring(0, 500)); + }); + + for (const script of scripts) { + if (script && script.includes('dutchie')) { + for (const pattern of patterns) { + const match = script.match(pattern); + if (match && !capturedId) { + capturedId = match[1]; + console.log(` Found in script: ${capturedId}`); + break; + } + } + if (capturedId) break; + } + } + + // Final check of iframes after wait + if (!capturedId) { + const finalIframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of finalIframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + console.log(` Found in iframe (delayed): ${capturedId}`); + break; + } + } + } + } + } + + } catch (e: any) { + console.log(` Error: ${e.message.substring(0, 80)}`); + } finally { + await context.close(); + } + + return capturedId; +} + +async function main() { + // Get dispensaries missing platform IDs + const result = await pool.query(` + SELECT id, name, website + FROM dispensaries + WHERE state = 'AZ' + AND menu_type = 'dutchie' + AND (platform_dispensary_id IS NULL OR platform_dispensary_id = '') + AND website IS NOT NULL AND website != '' + ORDER BY name + `); + + console.log(`Found ${result.rows.length} dispensaries to process\n`); + + const browser = await chromium.launch({ headless: true }); + + const results: { id: number; name: string; platformId: string | null }[] = []; + + for (const dispensary of result.rows) { + const platformId = await extractPlatformId(browser, dispensary); + results.push({ id: dispensary.id, name: dispensary.name, platformId }); + + if (platformId) { + // Update database + await pool.query( + 'UPDATE dispensaries SET platform_dispensary_id = $1 WHERE id = $2', + [platformId, dispensary.id] + ); + console.log(` Updated database with ${platformId}`); + } + } + + await browser.close(); + + console.log('\n=== SUMMARY ==='); + const found = results.filter(r => r.platformId); + const notFound = results.filter(r => !r.platformId); + + console.log(`\nFound (${found.length}):`); + found.forEach(r => console.log(` ${r.id}: ${r.name} -> ${r.platformId}`)); + + console.log(`\nNot Found (${notFound.length}):`); + notFound.forEach(r => console.log(` ${r.id}: ${r.name}`)); + + await pool.end(); +} + +main().catch(e => { + console.error('Error:', e); + process.exit(1); +}); diff --git a/backend/src/scripts/import-dispensaries.ts b/backend/src/scripts/import-dispensaries.ts new file mode 100644 index 00000000..49f0916c --- /dev/null +++ b/backend/src/scripts/import-dispensaries.ts @@ -0,0 +1,83 @@ +import { Pool } from 'pg'; +import * as fs from 'fs'; + +const pool = new Pool({ connectionString: process.env.DATABASE_URL }); + +async function importDispensaries(filePath: string) { + const data = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + + console.log(`Importing ${data.length} dispensaries...`); + + let inserted = 0; + let updated = 0; + let errors = 0; + + for (const d of data) { + try { + // Check if dispensary exists by name and city + const { rows: existing } = await pool.query( + `SELECT id FROM dispensaries WHERE name = $1 AND city = $2`, + [d.name, d.city] + ); + + if (existing.length > 0) { + // Update existing + await pool.query(` + UPDATE dispensaries SET + dba_name = COALESCE($1, dba_name), + company_name = COALESCE($2, company_name), + slug = COALESCE($3, slug), + address = COALESCE($4, address), + state = COALESCE($5, state), + zip = COALESCE($6, zip), + latitude = COALESCE($7, latitude), + longitude = COALESCE($8, longitude), + website = COALESCE($9, website), + menu_type = COALESCE($10, menu_type), + menu_url = COALESCE($11, menu_url), + platform_dispensary_id = COALESCE($12, platform_dispensary_id), + updated_at = NOW() + WHERE id = $13 + `, [ + d.dba_name, d.company_name, d.slug, + d.address, d.state, d.zip, + d.latitude, d.longitude, d.website, + d.menu_type, d.menu_url, d.platform_dispensary_id, + existing[0].id + ]); + console.log(`Updated: [${existing[0].id}] ${d.name} (${d.city})`); + updated++; + } else { + // Insert new + const { rows: newRow } = await pool.query(` + INSERT INTO dispensaries ( + name, dba_name, company_name, slug, + address, city, state, zip, latitude, longitude, + website, menu_type, menu_url, platform_dispensary_id, + created_at, updated_at + ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, NOW(), NOW()) + RETURNING id + `, [ + d.name, d.dba_name, d.company_name, d.slug, + d.address, d.city, d.state, d.zip, d.latitude, d.longitude, + d.website, d.menu_type, d.menu_url, d.platform_dispensary_id + ]); + console.log(`Inserted: [${newRow[0].id}] ${d.name} (${d.city})`); + inserted++; + } + } catch (err: any) { + console.error(`Error for ${d.name}: ${err.message}`); + errors++; + } + } + + console.log(`\n=== Import Summary ===`); + console.log(`Inserted: ${inserted}`); + console.log(`Updated: ${updated}`); + console.log(`Errors: ${errors}`); + + await pool.end(); +} + +const filePath = process.argv[2] || '/tmp/dispensaries-export.json'; +importDispensaries(filePath).catch(console.error); diff --git a/backend/src/scripts/jars-az-extractor.ts b/backend/src/scripts/jars-az-extractor.ts new file mode 100644 index 00000000..c2b2f133 --- /dev/null +++ b/backend/src/scripts/jars-az-extractor.ts @@ -0,0 +1,133 @@ +import { chromium } from 'playwright'; + +async function extractJarsAzStoreIds() { + const browser = await chromium.launch({ headless: true }); + const page = await browser.newPage(); + + const results: { name: string; retailerId: string; url: string }[] = []; + const capturedIds: string[] = []; + const allRequests: string[] = []; + + // Intercept network requests to find Dutchie Plus API calls + page.on('request', (request) => { + const url = request.url(); + allRequests.push(url.substring(0, 100)); + + if (url.includes('dutchie') || url.includes('graphql')) { + const postData = request.postData(); + console.log('Dutchie request to:', url.substring(0, 80)); + if (postData) { + // Look for retailerId in GraphQL variables + const match = postData.match(/"retailerId"\s*:\s*"([a-f0-9-]{36})"/i); + if (match) { + const id = match[1]; + if (capturedIds.indexOf(id) === -1) { + capturedIds.push(id); + console.log('Captured retailerId from request:', id); + } + } + } + } + }); + + try { + // Just load one page first and thoroughly debug it + console.log('Loading Mesa store with full network debugging...'); + await page.goto('https://jarscannabis.com/shop/mesa-az/', { + waitUntil: 'networkidle', + timeout: 60000 + }); + + console.log('\nWaiting 5 seconds for dynamic content...'); + await page.waitForTimeout(5000); + + // Get page title and content + const title = await page.title(); + console.log('Page title:', title); + + const content = await page.content(); + console.log('Page content length:', content.length); + + // Save screenshot + await page.screenshot({ path: '/tmp/jars-mesa-debug.png', fullPage: true }); + console.log('Screenshot saved to /tmp/jars-mesa-debug.png'); + + // Look for all UUIDs in content + const uuidPattern = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi; + const uuids = content.match(uuidPattern); + if (uuids) { + const uniqueUuids = [...new Set(uuids)]; + console.log('\n=== All UUIDs found on page ==='); + uniqueUuids.forEach(u => console.log(u)); + } + + // Look for all iframes + const iframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => ({ + src: f.src, + id: f.id, + name: f.name, + className: f.className + })); + }); + console.log('\n=== Iframes ==='); + console.log(JSON.stringify(iframes, null, 2)); + + // Look for any elements with dutchie + const dutchieElements = await page.evaluate(() => { + const elements = document.body.innerHTML.match(/dutchie[^<>]*\"/gi) || []; + return elements.slice(0, 20); + }); + console.log('\n=== Dutchie mentions ==='); + dutchieElements.forEach(e => console.log(e)); + + // Look for script src containing dutchie + const scripts = await page.evaluate(() => { + return Array.from(document.querySelectorAll('script[src]')) + .map(s => s.getAttribute('src')) + .filter(src => src && (src.includes('dutchie') || src.includes('embed'))); + }); + console.log('\n=== Relevant scripts ==='); + scripts.forEach(s => console.log(s)); + + // Look for __NEXT_DATA__ + const nextData = await page.evaluate(() => { + const el = document.getElementById('__NEXT_DATA__'); + return el ? el.textContent : null; + }); + if (nextData) { + console.log('\n=== __NEXT_DATA__ found ==='); + const data = JSON.parse(nextData); + // Look for retailer in various places + const propsStr = JSON.stringify(data, null, 2); + // Find all UUID patterns in the props + const propsUuids = propsStr.match(/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi); + if (propsUuids) { + console.log('UUIDs in __NEXT_DATA__:', [...new Set(propsUuids)]); + } + } else { + console.log('\nNo __NEXT_DATA__ found'); + } + + // Look for specific Dutchie embed patterns + const embedPatterns = content.match(/https:\/\/[^"'\s]*dutchie[^"'\s]*/gi); + if (embedPatterns) { + console.log('\n=== Dutchie embed URLs ==='); + [...new Set(embedPatterns)].forEach(u => console.log(u)); + } + + console.log('\n=== Network requests summary ==='); + console.log('Total requests:', allRequests.length); + const dutchieRequests = allRequests.filter(r => r.includes('dutchie')); + console.log('Dutchie requests:', dutchieRequests.length); + dutchieRequests.forEach(r => console.log(r)); + + console.log('\n=== CAPTURED IDS ==='); + console.log(capturedIds); + + } finally { + await browser.close(); + } +} + +extractJarsAzStoreIds().catch(e => console.error('Error:', e.message)); diff --git a/backend/src/scripts/jars-az-finder.ts b/backend/src/scripts/jars-az-finder.ts new file mode 100644 index 00000000..cd306839 --- /dev/null +++ b/backend/src/scripts/jars-az-finder.ts @@ -0,0 +1,197 @@ +import { chromium } from 'playwright'; + +async function findJarsAzStores() { + const browser = await chromium.launch({ headless: true }); + const page = await browser.newPage(); + + const capturedRetailerIds: { url: string; retailerId: string }[] = []; + const allApiCalls: string[] = []; + + // Intercept ALL requests to find retailer IDs + page.on('request', (request) => { + const url = request.url(); + + // Log Buddy API calls + if (url.includes('buddyapi') || url.includes('dutchie') || url.includes('graphql')) { + allApiCalls.push(url); + const postData = request.postData(); + if (postData) { + // Look for retailerId in various formats + const match = postData.match(/retailerId['":\s]+([a-f0-9-]{36})/i); + if (match) { + capturedRetailerIds.push({ url, retailerId: match[1] }); + } + } + // Also check URL params + const urlMatch = url.match(/retailerId=([a-f0-9-]{36})/i); + if (urlMatch) { + capturedRetailerIds.push({ url, retailerId: urlMatch[1] }); + } + } + }); + + try { + // First, let's try to find the actual Arizona menu URLs + console.log('Loading JARS find-a-dispensary page...'); + await page.goto('https://jarscannabis.com/find-a-dispensary', { + waitUntil: 'networkidle', + timeout: 30000 + }); + await page.waitForTimeout(3000); + + // Take screenshot + await page.screenshot({ path: '/tmp/jars-find-dispensary.png', fullPage: true }); + console.log('Screenshot saved to /tmp/jars-find-dispensary.png'); + + // Try to find state selector and click Arizona + console.log('\nLooking for state selector...'); + + // Try various ways to select Arizona + const stateSelectors = [ + 'select[name*="state"]', + '[class*="state"] select', + 'select option[value="AZ"]', + 'button:has-text("Arizona")', + 'a:has-text("Arizona")', + '[data-state="AZ"]', + 'div:has-text("Arizona")', + ]; + + for (const selector of stateSelectors) { + try { + const element = page.locator(selector).first(); + const isVisible = await element.isVisible({ timeout: 1000 }); + if (isVisible) { + console.log(`Found element with selector: ${selector}`); + await element.click(); + await page.waitForTimeout(2000); + } + } catch (e) { + // Continue to next selector + } + } + + // Get all links on the page + const links = await page.evaluate(() => { + return Array.from(document.querySelectorAll('a')).map(a => ({ + href: a.href, + text: a.textContent?.trim() + })).filter(l => l.href.includes('/shop') || l.href.includes('menu') || l.href.includes('arizona') || l.href.includes('-az')); + }); + + console.log('\n=== Shop/Menu Links Found ==='); + links.forEach(l => console.log(`${l.text}: ${l.href}`)); + + // Look for __NEXT_DATA__ which might have location data + const nextData = await page.evaluate(() => { + const el = document.getElementById('__NEXT_DATA__'); + return el?.textContent || null; + }); + + if (nextData) { + console.log('\n=== Analyzing __NEXT_DATA__ ==='); + const data = JSON.parse(nextData); + const dataStr = JSON.stringify(data); + + // Look for Arizona references + if (dataStr.includes('Arizona') || dataStr.includes('AZ')) { + console.log('Found Arizona references in __NEXT_DATA__'); + + // Extract all objects that might be Arizona stores + const findArizonaStores = (obj: any, path: string = ''): any[] => { + const results: any[] = []; + if (!obj || typeof obj !== 'object') return results; + + if (Array.isArray(obj)) { + obj.forEach((item, i) => { + results.push(...findArizonaStores(item, `${path}[${i}]`)); + }); + } else { + // Check if this object looks like an AZ store + if (obj.state === 'AZ' || obj.state === 'Arizona' || + obj.stateCode === 'AZ' || obj.region === 'Arizona' || + (obj.city && ['Mesa', 'Phoenix', 'Peoria', 'Payson', 'Globe', 'Safford', 'Somerton', 'Prescott Valley'].includes(obj.city))) { + results.push({ path, data: obj }); + } + + for (const key of Object.keys(obj)) { + results.push(...findArizonaStores(obj[key], `${path}.${key}`)); + } + } + return results; + }; + + const azStores = findArizonaStores(data); + console.log(`Found ${azStores.length} Arizona store objects`); + azStores.forEach(s => { + console.log('\n---'); + console.log('Path:', s.path); + console.log(JSON.stringify(s.data, null, 2)); + }); + } + + // Also look for retailer IDs + const retailerMatches = dataStr.match(/"retailerId"\s*:\s*"([a-f0-9-]{36})"/gi); + if (retailerMatches) { + console.log('\n=== RetailerIds in __NEXT_DATA__ ==='); + const uniqueIds = [...new Set(retailerMatches.map(m => { + const match = m.match(/([a-f0-9-]{36})/i); + return match ? match[1] : null; + }).filter(Boolean))]; + uniqueIds.forEach(id => console.log(id)); + } + } + + // Try loading a known store URL pattern + const testUrls = [ + 'https://jarscannabis.com/arizona/', + 'https://jarscannabis.com/az/', + 'https://jarscannabis.com/stores/arizona/', + 'https://jarscannabis.com/locations/arizona/', + 'https://jarscannabis.com/shop/arizona/', + 'https://az.jarscannabis.com/', + ]; + + console.log('\n=== Testing Arizona URLs ==='); + for (const testUrl of testUrls) { + try { + const response = await page.goto(testUrl, { waitUntil: 'domcontentloaded', timeout: 10000 }); + const status = response?.status(); + console.log(`${testUrl}: ${status}`); + if (status === 200) { + const title = await page.title(); + console.log(` Title: ${title}`); + + // If we found a working page, extract store links + const storeLinks = await page.evaluate(() => { + return Array.from(document.querySelectorAll('a')).map(a => ({ + href: a.href, + text: a.textContent?.trim() + })).filter(l => l.href.includes('shop') || l.href.includes('menu')); + }); + + if (storeLinks.length > 0) { + console.log(' Store links:'); + storeLinks.forEach(l => console.log(` ${l.text}: ${l.href}`)); + } + } + } catch (e) { + console.log(`${testUrl}: Error - ${(e as Error).message.substring(0, 50)}`); + } + } + + console.log('\n=== Captured Retailer IDs from API calls ==='); + const uniqueRetailerIds = [...new Map(capturedRetailerIds.map(r => [r.retailerId, r])).values()]; + uniqueRetailerIds.forEach(r => { + console.log(`${r.retailerId} (from: ${r.url.substring(0, 60)}...)`); + }); + + console.log('\n=== All API calls ==='); + allApiCalls.forEach(url => console.log(url.substring(0, 100))); + + } finally { + await browser.close(); + } +} + +findJarsAzStores().catch(e => console.error('Error:', e.message)); diff --git a/backend/src/scripts/platform-id-extractor.ts b/backend/src/scripts/platform-id-extractor.ts new file mode 100644 index 00000000..0aec1bac --- /dev/null +++ b/backend/src/scripts/platform-id-extractor.ts @@ -0,0 +1,350 @@ +/** + * Platform ID Extractor - Standalone script for extracting Dutchie platform IDs + * + * This script visits dispensary websites to capture their Dutchie retailerId + * by intercepting network requests to the Dutchie GraphQL API. + * + * It does NOT use the main orchestrator - it's a standalone browser-based tool. + */ + +import { chromium, Browser, BrowserContext, Page } from 'playwright'; +import { Pool } from 'pg'; + +const pool = new Pool({ + connectionString: process.env.DATABASE_URL +}); + +interface Dispensary { + id: number; + name: string; + website: string; +} + +interface ExtractionResult { + id: number; + name: string; + website: string; + platformId: string | null; + source: string | null; + error: string | null; +} + +async function extractPlatformId(browser: Browser, dispensary: Dispensary): Promise { + let capturedId: string | null = null; + let captureSource: string | null = null; + let errorMsg: string | null = null; + + const context = await browser.newContext({ + userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' + }); + const page = await context.newPage(); + + // Patterns to match retailer IDs in various formats + const idPatterns = [ + /["']retailerId["']\s*:\s*["']([a-f0-9]{24})["']/i, + /["']dispensaryId["']\s*:\s*["']([a-f0-9]{24})["']/i, + /retailer["']?\s*:\s*["']([a-f0-9]{24})["']/i, + /dutchie\.com\/embedded-menu\/([a-f0-9]{24})/i, + /dutchie\.com\/dispensary\/([a-f0-9]{24})/i, + /plus\.dutchie\.com\/plus\/([a-f0-9]{24})/i, + /retailerId=([a-f0-9]{24})/i, + /\/([a-f0-9]{24})(?:\/|\?|$)/i, // Generic ID in URL path + ]; + + // Intercept network requests + page.on('request', (request) => { + if (capturedId) return; + + const url = request.url(); + if (url.includes('dutchie') || url.includes('api.dutchie')) { + // Check URL for retailer ID + for (const pattern of idPatterns) { + const match = url.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'request_url'; + break; + } + } + + // Check POST data + const postData = request.postData(); + if (postData && !capturedId) { + for (const pattern of idPatterns) { + const match = postData.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'request_body'; + break; + } + } + } + } + }); + + try { + console.log(`\n[${dispensary.id}] ${dispensary.name}: ${dispensary.website}`); + + // Load main page + await page.goto(dispensary.website, { + waitUntil: 'domcontentloaded', + timeout: 25000 + }); + await page.waitForTimeout(2000); + + // Check page content + if (!capturedId) { + const content = await page.content(); + for (const pattern of idPatterns) { + const match = content.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'page_content'; + break; + } + } + } + + // Check __NEXT_DATA__ + if (!capturedId) { + const nextData = await page.evaluate(() => { + const el = document.getElementById('__NEXT_DATA__'); + return el?.textContent || null; + }); + if (nextData) { + for (const pattern of idPatterns) { + const match = nextData.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = '__NEXT_DATA__'; + break; + } + } + } + } + + // Check iframes + if (!capturedId) { + const iframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of iframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + captureSource = 'iframe_src'; + break; + } + } + } + } + + // Check scripts + if (!capturedId) { + const scripts = await page.evaluate(() => { + return Array.from(document.querySelectorAll('script')) + .map(s => s.src || s.innerHTML?.substring(0, 1000)) + .filter(Boolean); + }); + for (const script of scripts) { + if (script && (script.includes('dutchie') || script.includes('retailerId'))) { + for (const pattern of idPatterns) { + const match = script.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'script'; + break; + } + } + if (capturedId) break; + } + } + } + + // Try navigating to menu/shop page + if (!capturedId) { + const menuLink = await page.evaluate(() => { + const links = Array.from(document.querySelectorAll('a')); + for (const link of links) { + const href = link.href?.toLowerCase() || ''; + const text = link.textContent?.toLowerCase() || ''; + if (href.includes('menu') || href.includes('shop') || href.includes('order') || + text.includes('menu') || text.includes('shop') || text.includes('order')) { + return link.href; + } + } + return null; + }); + + if (menuLink && !menuLink.startsWith('javascript:')) { + try { + console.log(` -> Following menu link: ${menuLink.substring(0, 60)}...`); + await page.goto(menuLink, { waitUntil: 'domcontentloaded', timeout: 20000 }); + await page.waitForTimeout(3000); + + // Recheck all sources on new page + const newContent = await page.content(); + for (const pattern of idPatterns) { + const match = newContent.match(pattern); + if (match && match[1] && match[1].length === 24) { + capturedId = match[1]; + captureSource = 'menu_page_content'; + break; + } + } + + // Check iframes on new page + if (!capturedId) { + const newIframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of newIframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + captureSource = 'menu_page_iframe'; + break; + } + } + } + } + } catch (navError: any) { + // Menu navigation failed, continue + } + } + } + + // Final wait for async content + if (!capturedId) { + await page.waitForTimeout(3000); + + // Final iframe check + const finalIframes = await page.evaluate(() => { + return Array.from(document.querySelectorAll('iframe')).map(f => f.src); + }); + for (const src of finalIframes) { + if (src.includes('dutchie')) { + const match = src.match(/([a-f0-9]{24})/i); + if (match) { + capturedId = match[1]; + captureSource = 'delayed_iframe'; + break; + } + } + } + } + + if (capturedId) { + console.log(` ✓ Found: ${capturedId} (${captureSource})`); + } else { + console.log(` ✗ Not found`); + } + + } catch (e: any) { + errorMsg = e.message.substring(0, 100); + console.log(` ✗ Error: ${errorMsg}`); + } finally { + await context.close(); + } + + return { + id: dispensary.id, + name: dispensary.name, + website: dispensary.website, + platformId: capturedId, + source: captureSource, + error: errorMsg + }; +} + +async function main() { + // Get specific dispensary ID from command line, or process all missing + const targetId = process.argv[2] ? parseInt(process.argv[2], 10) : null; + + let query: string; + let params: any[] = []; + + if (targetId) { + query = ` + SELECT id, name, website + FROM dispensaries + WHERE id = $1 + AND website IS NOT NULL AND website != '' + `; + params = [targetId]; + } else { + query = ` + SELECT id, name, website + FROM dispensaries + WHERE state = 'AZ' + AND menu_type = 'dutchie' + AND (platform_dispensary_id IS NULL OR platform_dispensary_id = '') + AND website IS NOT NULL AND website != '' + ORDER BY name + `; + } + + const result = await pool.query(query, params); + + if (result.rows.length === 0) { + console.log('No dispensaries to process'); + await pool.end(); + return; + } + + console.log(`\n=== Platform ID Extractor ===`); + console.log(`Processing ${result.rows.length} dispensaries...\n`); + + const browser = await chromium.launch({ + headless: true, + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + + const results: ExtractionResult[] = []; + + for (const dispensary of result.rows) { + const extractionResult = await extractPlatformId(browser, dispensary); + results.push(extractionResult); + + // Update database immediately if found + if (extractionResult.platformId) { + await pool.query( + 'UPDATE dispensaries SET platform_dispensary_id = $1 WHERE id = $2', + [extractionResult.platformId, extractionResult.id] + ); + } + } + + await browser.close(); + + // Summary + console.log('\n' + '='.repeat(60)); + console.log('SUMMARY'); + console.log('='.repeat(60)); + + const found = results.filter(r => r.platformId); + const notFound = results.filter(r => !r.platformId); + + console.log(`\nFound: ${found.length}/${results.length}`); + if (found.length > 0) { + console.log('\nSuccessful extractions:'); + found.forEach(r => console.log(` [${r.id}] ${r.name} -> ${r.platformId} (${r.source})`)); + } + + if (notFound.length > 0) { + console.log(`\nNot found: ${notFound.length}`); + notFound.forEach(r => { + const reason = r.error || 'No Dutchie ID detected'; + console.log(` [${r.id}] ${r.name}: ${reason}`); + }); + } + + await pool.end(); +} + +main().catch(e => { + console.error('Fatal error:', e); + process.exit(1); +}); diff --git a/backend/src/scripts/test-jane-scraper.ts b/backend/src/scripts/test-jane-scraper.ts new file mode 100644 index 00000000..56b39969 --- /dev/null +++ b/backend/src/scripts/test-jane-scraper.ts @@ -0,0 +1,301 @@ +/** + * Test script for iHeartJane menu scraping via Playwright + * Intercepts API/Algolia calls made by the browser + */ + +import { chromium } from 'playwright'; + +interface JaneProduct { + id: number; + name: string; + brand?: string; + category?: string; + kind?: string; + kind_subtype?: string; + price?: number; + prices?: Record; + thc_potency?: number; + cbd_potency?: number; + image_url?: string; + description?: string; + store_id?: number; +} + +async function scrapeJaneMenu(urlOrStoreId: string) { + // Handle either a full URL or just a store ID + const menuUrl = urlOrStoreId.startsWith('http') + ? urlOrStoreId + : `https://www.iheartjane.com/embed/stores/${urlOrStoreId}/menu`; + + console.log(`Starting Playwright scrape for iHeartJane: ${menuUrl}`); + + const browser = await chromium.launch({ + headless: true, + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-blink-features=AutomationControlled' + ] + }); + + const context = await browser.newContext({ + userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + viewport: { width: 1920, height: 1080 }, + locale: 'en-US', + timezoneId: 'America/Chicago' + }); + + // Add stealth scripts to avoid detection + await context.addInitScript(() => { + Object.defineProperty(navigator, 'webdriver', { get: () => false }); + (window as any).chrome = { runtime: {} }; + }); + + const page = await context.newPage(); + + const products: JaneProduct[] = []; + const apiResponses: any[] = []; + const capturedCredentials: any = {}; + + // Intercept ALL network requests to capture API/Algolia data and credentials + page.on('request', (request) => { + const url = request.url(); + const headers = request.headers(); + + // Capture Algolia credentials from request headers + if (url.includes('algolia')) { + const appId = headers['x-algolia-application-id']; + const apiKey = headers['x-algolia-api-key']; + if (appId && apiKey) { + capturedCredentials.algolia = { appId, apiKey }; + console.log(`Captured Algolia credentials: App=${appId}, Key=${apiKey.substring(0, 10)}...`); + } + } + }); + + page.on('response', async (response) => { + const url = response.url(); + + // Capture Algolia search results + if (url.includes('algolia.net') || url.includes('algolianet.com')) { + try { + const data = await response.json(); + if (data.results && data.results[0] && data.results[0].hits) { + console.log(`Captured ${data.results[0].hits.length} products from Algolia`); + apiResponses.push({ type: 'algolia', data: data.results[0] }); + } + } catch (e) { + // Not JSON or error parsing + } + } + + // Capture Jane API responses + if (url.includes('api.iheartjane.com') && url.includes('products')) { + try { + const data = await response.json(); + console.log(`Captured Jane API response: ${url}`); + apiResponses.push({ type: 'jane-api', url, data }); + } catch (e) { + // Not JSON or error parsing + } + } + }); + + try { + console.log(`Navigating to: ${menuUrl}`); + + await page.goto(menuUrl, { + waitUntil: 'domcontentloaded', + timeout: 60000 + }); + + // Wait for page to settle + await page.waitForTimeout(2000); + + // Handle age gate - use Playwright locator with force click + console.log('Looking for age gate...'); + try { + let clicked = false; + + // Method 1: Use Playwright locator with exact text match + try { + const yesButton = page.locator('button:has-text("Yes")').first(); + await yesButton.waitFor({ state: 'visible', timeout: 5000 }); + await yesButton.click({ force: true }); + clicked = true; + console.log('Clicked age gate via Playwright locator'); + await page.waitForTimeout(5000); + } catch (e) { + console.log('Playwright locator failed:', (e as Error).message); + } + + // Method 2: Try clicking by visible bounding box + if (!clicked) { + try { + const box = await page.locator('button:has-text("Yes")').first().boundingBox(); + if (box) { + await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2); + clicked = true; + console.log(`Clicked age gate at coordinates: ${box.x + box.width / 2}, ${box.y + box.height / 2}`); + await page.waitForTimeout(5000); + } + } catch (e) { + console.log('Bounding box click failed'); + } + } + + // Method 3: Try JavaScript click + if (!clicked) { + const jsClickResult = await page.evaluate(() => { + const buttons = Array.from(document.querySelectorAll('button')); + for (const btn of buttons) { + if (btn.textContent?.includes('Yes')) { + btn.click(); + return { success: true, buttonText: btn.textContent }; + } + } + return { success: false }; + }); + if (jsClickResult.success) { + clicked = true; + console.log(`Clicked via JS: ${jsClickResult.buttonText}`); + await page.waitForTimeout(5000); + } + } + + // Method 4: Click element containing "Yes" with dispatchEvent + if (!clicked) { + const dispatchResult = await page.evaluate(() => { + const buttons = Array.from(document.querySelectorAll('button')); + for (const btn of buttons) { + if (btn.textContent?.includes('Yes')) { + btn.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true })); + return true; + } + } + return false; + }); + if (dispatchResult) { + clicked = true; + console.log('Clicked via dispatchEvent'); + await page.waitForTimeout(5000); + } + } + + // Log button info for debugging + const buttonInfo = await page.evaluate(() => { + const buttons = Array.from(document.querySelectorAll('button')); + return buttons.map(b => ({ + text: b.textContent?.trim(), + visible: b.offsetParent !== null, + rect: b.getBoundingClientRect() + })); + }); + console.log('Buttons found:', JSON.stringify(buttonInfo, null, 2)); + + } catch (e) { + console.log('Age gate handling error:', e); + } + + // Wait for content to load after age gate + await page.waitForTimeout(3000); + + // Try to scroll to trigger more product loads + console.log('Scrolling to load more products...'); + for (let i = 0; i < 3; i++) { + await page.evaluate(() => window.scrollBy(0, 1000)); + await page.waitForTimeout(1000); + } + + // Extract products from the page DOM as backup + const domProducts = await page.evaluate(() => { + const items: any[] = []; + // Try various selectors that Jane might use + const productCards = document.querySelectorAll('[data-testid*="product"], [class*="ProductCard"], [class*="product-card"], .product-tile'); + + productCards.forEach((card) => { + const name = card.querySelector('[class*="name"], [class*="title"], h3, h4')?.textContent?.trim(); + const brand = card.querySelector('[class*="brand"]')?.textContent?.trim(); + const price = card.querySelector('[class*="price"]')?.textContent?.trim(); + const image = card.querySelector('img')?.getAttribute('src'); + + if (name) { + items.push({ name, brand, price, image, source: 'dom' }); + } + }); + + return items; + }); + + console.log(`Extracted ${domProducts.length} products from DOM`); + + // Check for __NEXT_DATA__ or similar embedded data + const embeddedData = await page.evaluate(() => { + // Check for Next.js data + const nextData = document.getElementById('__NEXT_DATA__'); + if (nextData) { + return { type: 'next', data: JSON.parse(nextData.textContent || '{}') }; + } + + // Check for any window-level product data + const win = window as any; + if (win.__INITIAL_STATE__) return { type: 'initial_state', data: win.__INITIAL_STATE__ }; + if (win.__PRELOADED_STATE__) return { type: 'preloaded', data: win.__PRELOADED_STATE__ }; + if (win.products) return { type: 'products', data: win.products }; + + return null; + }); + + if (embeddedData) { + console.log(`Found embedded data: ${embeddedData.type}`); + apiResponses.push(embeddedData); + } + + // Take a screenshot for debugging + const screenshotPath = `/tmp/jane-scrape-${Date.now()}.png`; + await page.screenshot({ path: screenshotPath, fullPage: true }); + console.log(`Screenshot saved to ${screenshotPath}`); + + // Process captured API responses + console.log('\n=== API Responses Summary ==='); + for (const resp of apiResponses) { + console.log(`Type: ${resp.type}`); + if (resp.type === 'algolia' && resp.data.hits) { + console.log(` Hits: ${resp.data.hits.length}`); + console.log(` Total: ${resp.data.nbHits}`); + if (resp.data.hits[0]) { + console.log(` Sample product:`, JSON.stringify(resp.data.hits[0], null, 2).substring(0, 1000)); + } + } + } + + console.log('\n=== DOM Products Sample ==='); + console.log(JSON.stringify(domProducts.slice(0, 3), null, 2)); + + console.log('\n=== Captured Credentials ==='); + console.log(JSON.stringify(capturedCredentials, null, 2)); + + return { + apiResponses, + domProducts, + embeddedData, + capturedCredentials + }; + + } finally { + await browser.close(); + } +} + +// Main execution +const urlOrStoreId = process.argv[2] || 'https://iheartjane.com/aly2djS2yXoTGnR0/DBeqE6HSSwijog9l'; // Default to The Flower Shop Az +scrapeJaneMenu(urlOrStoreId) + .then((result) => { + console.log('\n=== Scrape Complete ==='); + console.log(`Total API responses captured: ${result.apiResponses.length}`); + console.log(`Total DOM products: ${result.domProducts.length}`); + }) + .catch((err) => { + console.error('Scrape failed:', err); + process.exit(1); + }); diff --git a/backend/src/services/category-crawler-jobs.ts b/backend/src/services/category-crawler-jobs.ts index 5935dc6d..534d485d 100644 --- a/backend/src/services/category-crawler-jobs.ts +++ b/backend/src/services/category-crawler-jobs.ts @@ -20,7 +20,9 @@ import { detectCategoryProviderChange, moveCategoryToSandbox, } from './intelligence-detector'; -import { scrapeStore } from '../scraper-v2'; +// Note: scrapeStore from scraper-v2 is NOT used for Dutchie - we use GraphQL API directly +import { crawlDispensaryProducts, CrawlResult } from '../dutchie-az/services/product-crawler'; +import { Dispensary } from '../dutchie-az/types'; import puppeteer, { Browser, Page } from 'puppeteer'; import { promises as fs } from 'fs'; import path from 'path'; @@ -36,6 +38,8 @@ interface DispensaryWithCategories { name: string; website: string | null; menu_url: string | null; + menu_type: string | null; + platform_dispensary_id: string | null; // Product category product_provider: MenuProvider | null; product_confidence: number; @@ -82,7 +86,7 @@ interface SandboxQualityMetrics { async function getDispensaryWithCategories(dispensaryId: number): Promise { const result = await pool.query( - `SELECT id, name, website, menu_url, + `SELECT id, name, website, menu_url, menu_type, platform_dispensary_id, product_provider, product_confidence, product_crawler_mode, last_product_scan_at, specials_provider, specials_confidence, specials_crawler_mode, last_specials_scan_at, brand_provider, brand_confidence, brand_crawler_mode, last_brand_scan_at, @@ -228,7 +232,11 @@ async function getCrawlerTemplate( /** * CrawlProductsJob - Production product crawling - * Only runs for Dutchie dispensaries in production mode + * Uses Dutchie GraphQL API directly (NOT browser-based scraping) + * + * IMPORTANT: This function calls crawlDispensaryProducts() from dutchie-az + * which uses the GraphQL API. The GraphQL response includes categories directly, + * so no browser-based category discovery is needed. */ export async function runCrawlProductsJob(dispensaryId: number): Promise { const category: IntelligenceCategory = 'product'; @@ -239,26 +247,24 @@ export async function runCrawlProductsJob(dispensaryId: number): Promise { const result = await pool.query( - `SELECT id, name, city, website, menu_url, + `SELECT id, name, city, website, menu_url, menu_type, platform_dispensary_id, product_provider, product_confidence, product_crawler_mode, last_product_scan_at FROM dispensaries WHERE id = $1`, @@ -277,6 +286,12 @@ async function getDispensaryInfo(dispensaryId: number): Promise { + // If menu_type is already 'dutchie' and we have platform_dispensary_id, skip detection entirely + // This avoids wasteful detection timeouts for known Dutchie stores + if (dispensary.menu_type === 'dutchie' && dispensary.platform_dispensary_id) { + return false; + } + // No provider = definitely needs detection if (!dispensary.product_provider) return true; diff --git a/frontend/dist/assets/index-B8stM7ei.js b/frontend/dist/assets/index-B8stM7ei.js deleted file mode 100644 index d8e8a0c6..00000000 --- a/frontend/dist/assets/index-B8stM7ei.js +++ /dev/null @@ -1,411 +0,0 @@ -var Pk=Object.defineProperty;var _k=(e,t,r)=>t in e?Pk(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var ho=(e,t,r)=>_k(e,typeof t!="symbol"?t+"":t,r);function Ck(e,t){for(var r=0;rn[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function r(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=r(i);fetch(i.href,s)}})();function Tr(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Sv={exports:{}},kc={},Nv={exports:{}},ie={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ks=Symbol.for("react.element"),Ak=Symbol.for("react.portal"),Ok=Symbol.for("react.fragment"),Ek=Symbol.for("react.strict_mode"),Dk=Symbol.for("react.profiler"),Tk=Symbol.for("react.provider"),Mk=Symbol.for("react.context"),Ik=Symbol.for("react.forward_ref"),$k=Symbol.for("react.suspense"),Lk=Symbol.for("react.memo"),zk=Symbol.for("react.lazy"),dg=Symbol.iterator;function Rk(e){return e===null||typeof e!="object"?null:(e=dg&&e[dg]||e["@@iterator"],typeof e=="function"?e:null)}var kv={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Pv=Object.assign,_v={};function ba(e,t,r){this.props=e,this.context=t,this.refs=_v,this.updater=r||kv}ba.prototype.isReactComponent={};ba.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};ba.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Cv(){}Cv.prototype=ba.prototype;function Pp(e,t,r){this.props=e,this.context=t,this.refs=_v,this.updater=r||kv}var _p=Pp.prototype=new Cv;_p.constructor=Pp;Pv(_p,ba.prototype);_p.isPureReactComponent=!0;var fg=Array.isArray,Av=Object.prototype.hasOwnProperty,Cp={current:null},Ov={key:!0,ref:!0,__self:!0,__source:!0};function Ev(e,t,r){var n,i={},s=null,o=null;if(t!=null)for(n in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(s=""+t.key),t)Av.call(t,n)&&!Ov.hasOwnProperty(n)&&(i[n]=t[n]);var l=arguments.length-2;if(l===1)i.children=r;else if(1>>1,H=O[F];if(0>>1;Fi(we,L))Ai(J,we)?(O[F]=J,O[A]=L,F=A):(O[F]=we,O[re]=L,F=re);else if(Ai(J,L))O[F]=J,O[A]=L,F=A;else break e}}return k}function i(O,k){var L=O.sortIndex-k.sortIndex;return L!==0?L:O.id-k.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();e.unstable_now=function(){return o.now()-l}}var c=[],d=[],u=1,f=null,p=3,m=!1,x=!1,g=!1,b=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,j=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function y(O){for(var k=r(d);k!==null;){if(k.callback===null)n(d);else if(k.startTime<=O)n(d),k.sortIndex=k.expirationTime,t(c,k);else break;k=r(d)}}function w(O){if(g=!1,y(O),!x)if(r(c)!==null)x=!0,E(S);else{var k=r(d);k!==null&&D(w,k.startTime-O)}}function S(O,k){x=!1,g&&(g=!1,v(_),_=-1),m=!0;var L=p;try{for(y(k),f=r(c);f!==null&&(!(f.expirationTime>k)||O&&!M());){var F=f.callback;if(typeof F=="function"){f.callback=null,p=f.priorityLevel;var H=F(f.expirationTime<=k);k=e.unstable_now(),typeof H=="function"?f.callback=H:f===r(c)&&n(c),y(k)}else n(c);f=r(c)}if(f!==null)var te=!0;else{var re=r(d);re!==null&&D(w,re.startTime-k),te=!1}return te}finally{f=null,p=L,m=!1}}var N=!1,P=null,_=-1,T=5,$=-1;function M(){return!(e.unstable_now()-$O||125F?(O.sortIndex=L,t(d,O),r(c)===null&&O===r(d)&&(g?(v(_),_=-1):g=!0,D(w,L-F))):(O.sortIndex=H,t(c,O),x||m||(x=!0,E(S))),O},e.unstable_shouldYield=M,e.unstable_wrapCallback=function(O){var k=p;return function(){var L=p;p=k;try{return O.apply(this,arguments)}finally{p=L}}}})(Lv);$v.exports=Lv;var Zk=$v.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Xk=h,Ft=Zk;function W(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Ed=Object.prototype.hasOwnProperty,Jk=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,hg={},mg={};function Qk(e){return Ed.call(mg,e)?!0:Ed.call(hg,e)?!1:Jk.test(e)?mg[e]=!0:(hg[e]=!0,!1)}function eP(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function tP(e,t,r,n){if(t===null||typeof t>"u"||eP(e,t,r,n))return!0;if(n)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function yt(e,t,r,n,i,s,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=i,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=s,this.removeEmptyString=o}var tt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){tt[e]=new yt(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];tt[t]=new yt(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){tt[e]=new yt(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){tt[e]=new yt(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){tt[e]=new yt(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){tt[e]=new yt(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){tt[e]=new yt(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){tt[e]=new yt(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){tt[e]=new yt(e,5,!1,e.toLowerCase(),null,!1,!1)});var Op=/[\-:]([a-z])/g;function Ep(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Op,Ep);tt[t]=new yt(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Op,Ep);tt[t]=new yt(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Op,Ep);tt[t]=new yt(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){tt[e]=new yt(e,1,!1,e.toLowerCase(),null,!1,!1)});tt.xlinkHref=new yt("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){tt[e]=new yt(e,1,!1,e.toLowerCase(),null,!0,!0)});function Dp(e,t,r,n){var i=tt.hasOwnProperty(t)?tt[t]:null;(i!==null?i.type!==0:n||!(2l||i[o]!==s[l]){var c=` -`+i[o].replace(" at new "," at ");return e.displayName&&c.includes("")&&(c=c.replace("",e.displayName)),c}while(1<=o&&0<=l);break}}}finally{Lu=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Za(e):""}function rP(e){switch(e.tag){case 5:return Za(e.type);case 16:return Za("Lazy");case 13:return Za("Suspense");case 19:return Za("SuspenseList");case 0:case 2:case 15:return e=zu(e.type,!1),e;case 11:return e=zu(e.type.render,!1),e;case 1:return e=zu(e.type,!0),e;default:return""}}function Id(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Li:return"Fragment";case $i:return"Portal";case Dd:return"Profiler";case Tp:return"StrictMode";case Td:return"Suspense";case Md:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Bv:return(e.displayName||"Context")+".Consumer";case Rv:return(e._context.displayName||"Context")+".Provider";case Mp:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Ip:return t=e.displayName||null,t!==null?t:Id(e.type)||"Memo";case mn:t=e._payload,e=e._init;try{return Id(e(t))}catch{}}return null}function nP(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Id(t);case 8:return t===Tp?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function In(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Wv(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function iP(e){var t=Wv(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var i=r.get,s=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(o){n=""+o,s.call(this,o)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(o){n=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function xo(e){e._valueTracker||(e._valueTracker=iP(e))}function Uv(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=Wv(e)?e.checked?"true":"false":e.value),e=n,e!==r?(t.setValue(e),!0):!1}function ul(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function $d(e,t){var r=t.checked;return ke({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function xg(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;r=In(t.value!=null?t.value:r),e._wrapperState={initialChecked:n,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function qv(e,t){t=t.checked,t!=null&&Dp(e,"checked",t,!1)}function Ld(e,t){qv(e,t);var r=In(t.value),n=t.type;if(r!=null)n==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?zd(e,t.type,r):t.hasOwnProperty("defaultValue")&&zd(e,t.type,In(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function yg(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function zd(e,t,r){(t!=="number"||ul(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Xa=Array.isArray;function Xi(e,t,r,n){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=yo.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function ms(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var rs={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},aP=["Webkit","ms","Moz","O"];Object.keys(rs).forEach(function(e){aP.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),rs[t]=rs[e]})});function Yv(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||rs.hasOwnProperty(e)&&rs[e]?(""+t).trim():t+"px"}function Gv(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=r.indexOf("--")===0,i=Yv(r,t[r],n);r==="float"&&(r="cssFloat"),n?e.setProperty(r,i):e[r]=i}}var sP=ke({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Fd(e,t){if(t){if(sP[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(W(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(W(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(W(61))}if(t.style!=null&&typeof t.style!="object")throw Error(W(62))}}function Wd(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ud=null;function $p(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var qd=null,Ji=null,Qi=null;function jg(e){if(e=Gs(e)){if(typeof qd!="function")throw Error(W(280));var t=e.stateNode;t&&(t=Oc(t),qd(e.stateNode,e.type,t))}}function Zv(e){Ji?Qi?Qi.push(e):Qi=[e]:Ji=e}function Xv(){if(Ji){var e=Ji,t=Qi;if(Qi=Ji=null,jg(e),t)for(e=0;e>>=0,e===0?32:31-(xP(e)/yP|0)|0}var vo=64,bo=4194304;function Ja(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function hl(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,i=e.suspendedLanes,s=e.pingedLanes,o=r&268435455;if(o!==0){var l=o&~i;l!==0?n=Ja(l):(s&=o,s!==0&&(n=Ja(s)))}else o=r&~i,o!==0?n=Ja(o):s!==0&&(n=Ja(s));if(n===0)return 0;if(t!==0&&t!==n&&!(t&i)&&(i=n&-n,s=t&-t,i>=s||i===16&&(s&4194240)!==0))return t;if(n&4&&(n|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0r;r++)t.push(e);return t}function Vs(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-hr(t),e[t]=r}function wP(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0=is),Og=" ",Eg=!1;function xb(e,t){switch(e){case"keyup":return ZP.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function yb(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var zi=!1;function JP(e,t){switch(e){case"compositionend":return yb(t);case"keypress":return t.which!==32?null:(Eg=!0,Og);case"textInput":return e=t.data,e===Og&&Eg?null:e;default:return null}}function QP(e,t){if(zi)return e==="compositionend"||!qp&&xb(e,t)?(e=mb(),Xo=Fp=wn=null,zi=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Ig(r)}}function wb(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?wb(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Sb(){for(var e=window,t=ul();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=ul(e.document)}return t}function Hp(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function l_(e){var t=Sb(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&wb(r.ownerDocument.documentElement,r)){if(n!==null&&Hp(r)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=r.textContent.length,s=Math.min(n.start,i);n=n.end===void 0?s:Math.min(n.end,i),!e.extend&&s>n&&(i=n,n=s,s=i),i=$g(r,s);var o=$g(r,n);i&&o&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),s>n?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,Ri=null,Zd=null,ss=null,Xd=!1;function Lg(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;Xd||Ri==null||Ri!==ul(n)||(n=Ri,"selectionStart"in n&&Hp(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),ss&&js(ss,n)||(ss=n,n=xl(Zd,"onSelect"),0Wi||(e.current=nf[Wi],nf[Wi]=null,Wi--)}function me(e,t){Wi++,nf[Wi]=e.current,e.current=t}var $n={},ct=Fn($n),kt=Fn(!1),pi=$n;function oa(e,t){var r=e.type.contextTypes;if(!r)return $n;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var i={},s;for(s in r)i[s]=t[s];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Pt(e){return e=e.childContextTypes,e!=null}function vl(){ye(kt),ye(ct)}function qg(e,t,r){if(ct.current!==$n)throw Error(W(168));me(ct,t),me(kt,r)}function Db(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return r;n=n.getChildContext();for(var i in n)if(!(i in t))throw Error(W(108,nP(e)||"Unknown",i));return ke({},r,n)}function bl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||$n,pi=ct.current,me(ct,e),me(kt,kt.current),!0}function Hg(e,t,r){var n=e.stateNode;if(!n)throw Error(W(169));r?(e=Db(e,t,pi),n.__reactInternalMemoizedMergedChildContext=e,ye(kt),ye(ct),me(ct,e)):ye(kt),me(kt,r)}var Lr=null,Ec=!1,Ju=!1;function Tb(e){Lr===null?Lr=[e]:Lr.push(e)}function b_(e){Ec=!0,Tb(e)}function Wn(){if(!Ju&&Lr!==null){Ju=!0;var e=0,t=le;try{var r=Lr;for(le=1;e>=o,i-=o,Br=1<<32-hr(t)+i|r<_?(T=P,P=null):T=P.sibling;var $=p(v,P,y[_],w);if($===null){P===null&&(P=T);break}e&&P&&$.alternate===null&&t(v,P),j=s($,j,_),N===null?S=$:N.sibling=$,N=$,P=T}if(_===y.length)return r(v,P),be&&Gn(v,_),S;if(P===null){for(;__?(T=P,P=null):T=P.sibling;var M=p(v,P,$.value,w);if(M===null){P===null&&(P=T);break}e&&P&&M.alternate===null&&t(v,P),j=s(M,j,_),N===null?S=M:N.sibling=M,N=M,P=T}if($.done)return r(v,P),be&&Gn(v,_),S;if(P===null){for(;!$.done;_++,$=y.next())$=f(v,$.value,w),$!==null&&(j=s($,j,_),N===null?S=$:N.sibling=$,N=$);return be&&Gn(v,_),S}for(P=n(v,P);!$.done;_++,$=y.next())$=m(P,v,_,$.value,w),$!==null&&(e&&$.alternate!==null&&P.delete($.key===null?_:$.key),j=s($,j,_),N===null?S=$:N.sibling=$,N=$);return e&&P.forEach(function(C){return t(v,C)}),be&&Gn(v,_),S}function b(v,j,y,w){if(typeof y=="object"&&y!==null&&y.type===Li&&y.key===null&&(y=y.props.children),typeof y=="object"&&y!==null){switch(y.$$typeof){case go:e:{for(var S=y.key,N=j;N!==null;){if(N.key===S){if(S=y.type,S===Li){if(N.tag===7){r(v,N.sibling),j=i(N,y.props.children),j.return=v,v=j;break e}}else if(N.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===mn&&Yg(S)===N.type){r(v,N.sibling),j=i(N,y.props),j.ref=Ba(v,N,y),j.return=v,v=j;break e}r(v,N);break}else t(v,N);N=N.sibling}y.type===Li?(j=oi(y.props.children,v.mode,w,y.key),j.return=v,v=j):(w=al(y.type,y.key,y.props,null,v.mode,w),w.ref=Ba(v,j,y),w.return=v,v=w)}return o(v);case $i:e:{for(N=y.key;j!==null;){if(j.key===N)if(j.tag===4&&j.stateNode.containerInfo===y.containerInfo&&j.stateNode.implementation===y.implementation){r(v,j.sibling),j=i(j,y.children||[]),j.return=v,v=j;break e}else{r(v,j);break}else t(v,j);j=j.sibling}j=sd(y,v.mode,w),j.return=v,v=j}return o(v);case mn:return N=y._init,b(v,j,N(y._payload),w)}if(Xa(y))return x(v,j,y,w);if(Ia(y))return g(v,j,y,w);_o(v,y)}return typeof y=="string"&&y!==""||typeof y=="number"?(y=""+y,j!==null&&j.tag===6?(r(v,j.sibling),j=i(j,y),j.return=v,v=j):(r(v,j),j=ad(y,v.mode,w),j.return=v,v=j),o(v)):r(v,j)}return b}var ca=Lb(!0),zb=Lb(!1),Sl=Fn(null),Nl=null,Hi=null,Gp=null;function Zp(){Gp=Hi=Nl=null}function Xp(e){var t=Sl.current;ye(Sl),e._currentValue=t}function of(e,t,r){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,n!==null&&(n.childLanes|=t)):n!==null&&(n.childLanes&t)!==t&&(n.childLanes|=t),e===r)break;e=e.return}}function ta(e,t){Nl=e,Gp=Hi=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(St=!0),e.firstContext=null)}function tr(e){var t=e._currentValue;if(Gp!==e)if(e={context:e,memoizedValue:t,next:null},Hi===null){if(Nl===null)throw Error(W(308));Hi=e,Nl.dependencies={lanes:0,firstContext:e}}else Hi=Hi.next=e;return t}var ti=null;function Jp(e){ti===null?ti=[e]:ti.push(e)}function Rb(e,t,r,n){var i=t.interleaved;return i===null?(r.next=r,Jp(t)):(r.next=i.next,i.next=r),t.interleaved=r,Zr(e,n)}function Zr(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t),r=e,e=e.return;e!==null;)e.childLanes|=t,r=e.alternate,r!==null&&(r.childLanes|=t),r=e,e=e.return;return r.tag===3?r.stateNode:null}var gn=!1;function Qp(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Bb(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function qr(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function An(e,t,r){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,ae&2){var i=n.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),n.pending=t,Zr(e,r)}return i=n.interleaved,i===null?(t.next=t,Jp(n)):(t.next=i.next,i.next=t),n.interleaved=t,Zr(e,r)}function Qo(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!==0)){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,zp(e,r)}}function Gg(e,t){var r=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,r===n)){var i=null,s=null;if(r=r.firstBaseUpdate,r!==null){do{var o={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};s===null?i=s=o:s=s.next=o,r=r.next}while(r!==null);s===null?i=s=t:s=s.next=t}else i=s=t;r={baseState:n.baseState,firstBaseUpdate:i,lastBaseUpdate:s,shared:n.shared,effects:n.effects},e.updateQueue=r;return}e=r.lastBaseUpdate,e===null?r.firstBaseUpdate=t:e.next=t,r.lastBaseUpdate=t}function kl(e,t,r,n){var i=e.updateQueue;gn=!1;var s=i.firstBaseUpdate,o=i.lastBaseUpdate,l=i.shared.pending;if(l!==null){i.shared.pending=null;var c=l,d=c.next;c.next=null,o===null?s=d:o.next=d,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,l=u.lastBaseUpdate,l!==o&&(l===null?u.firstBaseUpdate=d:l.next=d,u.lastBaseUpdate=c))}if(s!==null){var f=i.baseState;o=0,u=d=c=null,l=s;do{var p=l.lane,m=l.eventTime;if((n&p)===p){u!==null&&(u=u.next={eventTime:m,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var x=e,g=l;switch(p=t,m=r,g.tag){case 1:if(x=g.payload,typeof x=="function"){f=x.call(m,f,p);break e}f=x;break e;case 3:x.flags=x.flags&-65537|128;case 0:if(x=g.payload,p=typeof x=="function"?x.call(m,f,p):x,p==null)break e;f=ke({},f,p);break e;case 2:gn=!0}}l.callback!==null&&l.lane!==0&&(e.flags|=64,p=i.effects,p===null?i.effects=[l]:p.push(l))}else m={eventTime:m,lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},u===null?(d=u=m,c=f):u=u.next=m,o|=p;if(l=l.next,l===null){if(l=i.shared.pending,l===null)break;p=l,l=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(!0);if(u===null&&(c=f),i.baseState=c,i.firstBaseUpdate=d,i.lastBaseUpdate=u,t=i.shared.interleaved,t!==null){i=t;do o|=i.lane,i=i.next;while(i!==t)}else s===null&&(i.shared.lanes=0);gi|=o,e.lanes=o,e.memoizedState=f}}function Zg(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;tr?r:4,e(!0);var n=ed.transition;ed.transition={};try{e(!1),t()}finally{le=r,ed.transition=n}}function n1(){return rr().memoizedState}function N_(e,t,r){var n=En(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},i1(e))a1(t,r);else if(r=Rb(e,t,r,n),r!==null){var i=gt();mr(r,e,n,i),s1(r,t,n)}}function k_(e,t,r){var n=En(e),i={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(i1(e))a1(t,i);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var o=t.lastRenderedState,l=s(o,r);if(i.hasEagerState=!0,i.eagerState=l,gr(l,o)){var c=t.interleaved;c===null?(i.next=i,Jp(t)):(i.next=c.next,c.next=i),t.interleaved=i;return}}catch{}finally{}r=Rb(e,t,i,n),r!==null&&(i=gt(),mr(r,e,n,i),s1(r,t,n))}}function i1(e){var t=e.alternate;return e===Ne||t!==null&&t===Ne}function a1(e,t){os=_l=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function s1(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,zp(e,r)}}var Cl={readContext:tr,useCallback:nt,useContext:nt,useEffect:nt,useImperativeHandle:nt,useInsertionEffect:nt,useLayoutEffect:nt,useMemo:nt,useReducer:nt,useRef:nt,useState:nt,useDebugValue:nt,useDeferredValue:nt,useTransition:nt,useMutableSource:nt,useSyncExternalStore:nt,useId:nt,unstable_isNewReconciler:!1},P_={readContext:tr,useCallback:function(e,t){return jr().memoizedState=[e,t===void 0?null:t],e},useContext:tr,useEffect:Jg,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,tl(4194308,4,Jb.bind(null,t,e),r)},useLayoutEffect:function(e,t){return tl(4194308,4,e,t)},useInsertionEffect:function(e,t){return tl(4,2,e,t)},useMemo:function(e,t){var r=jr();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var n=jr();return t=r!==void 0?r(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=N_.bind(null,Ne,e),[n.memoizedState,e]},useRef:function(e){var t=jr();return e={current:e},t.memoizedState=e},useState:Xg,useDebugValue:oh,useDeferredValue:function(e){return jr().memoizedState=e},useTransition:function(){var e=Xg(!1),t=e[0];return e=S_.bind(null,e[1]),jr().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var n=Ne,i=jr();if(be){if(r===void 0)throw Error(W(407));r=r()}else{if(r=t(),Ke===null)throw Error(W(349));mi&30||qb(n,t,r)}i.memoizedState=r;var s={value:r,getSnapshot:t};return i.queue=s,Jg(Kb.bind(null,n,s,e),[e]),n.flags|=2048,As(9,Hb.bind(null,n,s,r,t),void 0,null),r},useId:function(){var e=jr(),t=Ke.identifierPrefix;if(be){var r=Fr,n=Br;r=(n&~(1<<32-hr(n)-1)).toString(32)+r,t=":"+t+"R"+r,r=_s++,0<\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=o.createElement(r,{is:n.is}):(e=o.createElement(r),r==="select"&&(o=e,n.multiple?o.multiple=!0:n.size&&(o.size=n.size))):e=o.createElementNS(e,r),e[Sr]=t,e[Ns]=n,g1(e,t,!1,!1),t.stateNode=e;e:{switch(o=Wd(r,n),r){case"dialog":ge("cancel",e),ge("close",e),i=n;break;case"iframe":case"object":case"embed":ge("load",e),i=n;break;case"video":case"audio":for(i=0;ifa&&(t.flags|=128,n=!0,Fa(s,!1),t.lanes=4194304)}else{if(!n)if(e=Pl(o),e!==null){if(t.flags|=128,n=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),Fa(s,!0),s.tail===null&&s.tailMode==="hidden"&&!o.alternate&&!be)return it(t),null}else 2*Ae()-s.renderingStartTime>fa&&r!==1073741824&&(t.flags|=128,n=!0,Fa(s,!1),t.lanes=4194304);s.isBackwards?(o.sibling=t.child,t.child=o):(r=s.last,r!==null?r.sibling=o:t.child=o,s.last=o)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=Ae(),t.sibling=null,r=Se.current,me(Se,n?r&1|2:r&1),t):(it(t),null);case 22:case 23:return ph(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?It&1073741824&&(it(t),t.subtreeFlags&6&&(t.flags|=8192)):it(t),null;case 24:return null;case 25:return null}throw Error(W(156,t.tag))}function M_(e,t){switch(Vp(t),t.tag){case 1:return Pt(t.type)&&vl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ua(),ye(kt),ye(ct),rh(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return th(t),null;case 13:if(ye(Se),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(W(340));la()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ye(Se),null;case 4:return ua(),null;case 10:return Xp(t.type._context),null;case 22:case 23:return ph(),null;case 24:return null;default:return null}}var Ao=!1,st=!1,I_=typeof WeakSet=="function"?WeakSet:Set,K=null;function Ki(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(n){Pe(e,t,n)}else r.current=null}function gf(e,t,r){try{r()}catch(n){Pe(e,t,n)}}var cx=!1;function $_(e,t){if(Jd=ml,e=Sb(),Hp(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var n=r.getSelection&&r.getSelection();if(n&&n.rangeCount!==0){r=n.anchorNode;var i=n.anchorOffset,s=n.focusNode;n=n.focusOffset;try{r.nodeType,s.nodeType}catch{r=null;break e}var o=0,l=-1,c=-1,d=0,u=0,f=e,p=null;t:for(;;){for(var m;f!==r||i!==0&&f.nodeType!==3||(l=o+i),f!==s||n!==0&&f.nodeType!==3||(c=o+n),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break t;if(p===r&&++d===i&&(l=o),p===s&&++u===n&&(c=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}r=l===-1||c===-1?null:{start:l,end:c}}else r=null}r=r||{start:0,end:0}}else r=null;for(Qd={focusedElem:e,selectionRange:r},ml=!1,K=t;K!==null;)if(t=K,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,K=e;else for(;K!==null;){t=K;try{var x=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(x!==null){var g=x.memoizedProps,b=x.memoizedState,v=t.stateNode,j=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:cr(t.type,g),b);v.__reactInternalSnapshotBeforeUpdate=j}break;case 3:var y=t.stateNode.containerInfo;y.nodeType===1?y.textContent="":y.nodeType===9&&y.documentElement&&y.removeChild(y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(W(163))}}catch(w){Pe(t,t.return,w)}if(e=t.sibling,e!==null){e.return=t.return,K=e;break}K=t.return}return x=cx,cx=!1,x}function ls(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var s=i.destroy;i.destroy=void 0,s!==void 0&&gf(t,r,s)}i=i.next}while(i!==n)}}function Mc(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var n=r.create;r.destroy=n()}r=r.next}while(r!==t)}}function xf(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function v1(e){var t=e.alternate;t!==null&&(e.alternate=null,v1(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Sr],delete t[Ns],delete t[rf],delete t[y_],delete t[v_])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function b1(e){return e.tag===5||e.tag===3||e.tag===4}function ux(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||b1(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function yf(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=yl));else if(n!==4&&(e=e.child,e!==null))for(yf(e,t,r),e=e.sibling;e!==null;)yf(e,t,r),e=e.sibling}function vf(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(vf(e,t,r),e=e.sibling;e!==null;)vf(e,t,r),e=e.sibling}var Xe=null,ur=!1;function hn(e,t,r){for(r=r.child;r!==null;)j1(e,t,r),r=r.sibling}function j1(e,t,r){if(kr&&typeof kr.onCommitFiberUnmount=="function")try{kr.onCommitFiberUnmount(Pc,r)}catch{}switch(r.tag){case 5:st||Ki(r,t);case 6:var n=Xe,i=ur;Xe=null,hn(e,t,r),Xe=n,ur=i,Xe!==null&&(ur?(e=Xe,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Xe.removeChild(r.stateNode));break;case 18:Xe!==null&&(ur?(e=Xe,r=r.stateNode,e.nodeType===8?Xu(e.parentNode,r):e.nodeType===1&&Xu(e,r),vs(e)):Xu(Xe,r.stateNode));break;case 4:n=Xe,i=ur,Xe=r.stateNode.containerInfo,ur=!0,hn(e,t,r),Xe=n,ur=i;break;case 0:case 11:case 14:case 15:if(!st&&(n=r.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){i=n=n.next;do{var s=i,o=s.destroy;s=s.tag,o!==void 0&&(s&2||s&4)&&gf(r,t,o),i=i.next}while(i!==n)}hn(e,t,r);break;case 1:if(!st&&(Ki(r,t),n=r.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=r.memoizedProps,n.state=r.memoizedState,n.componentWillUnmount()}catch(l){Pe(r,t,l)}hn(e,t,r);break;case 21:hn(e,t,r);break;case 22:r.mode&1?(st=(n=st)||r.memoizedState!==null,hn(e,t,r),st=n):hn(e,t,r);break;default:hn(e,t,r)}}function dx(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new I_),t.forEach(function(n){var i=H_.bind(null,e,n);r.has(n)||(r.add(n),n.then(i,i))})}}function lr(e,t){var r=t.deletions;if(r!==null)for(var n=0;ni&&(i=o),n&=~s}if(n=i,n=Ae()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*z_(n/1960))-n,10e?16:e,Sn===null)var n=!1;else{if(e=Sn,Sn=null,El=0,ae&6)throw Error(W(331));var i=ae;for(ae|=4,K=e.current;K!==null;){var s=K,o=s.child;if(K.flags&16){var l=s.deletions;if(l!==null){for(var c=0;cAe()-dh?si(e,0):uh|=r),_t(e,t)}function A1(e,t){t===0&&(e.mode&1?(t=bo,bo<<=1,!(bo&130023424)&&(bo=4194304)):t=1);var r=gt();e=Zr(e,t),e!==null&&(Vs(e,t,r),_t(e,r))}function q_(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),A1(e,r)}function H_(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,i=e.memoizedState;i!==null&&(r=i.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(W(314))}n!==null&&n.delete(t),A1(e,r)}var O1;O1=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||kt.current)St=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return St=!1,D_(e,t,r);St=!!(e.flags&131072)}else St=!1,be&&t.flags&1048576&&Mb(t,wl,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;rl(e,t),e=t.pendingProps;var i=oa(t,ct.current);ta(t,r),i=ih(null,t,n,e,i,r);var s=ah();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Pt(n)?(s=!0,bl(t)):s=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,Qp(t),i.updater=Tc,t.stateNode=i,i._reactInternals=t,cf(t,n,e,r),t=ff(null,t,n,!0,s,r)):(t.tag=0,be&&s&&Kp(t),ht(null,t,i,r),t=t.child),t;case 16:n=t.elementType;e:{switch(rl(e,t),e=t.pendingProps,i=n._init,n=i(n._payload),t.type=n,i=t.tag=V_(n),e=cr(n,e),i){case 0:t=df(null,t,n,e,r);break e;case 1:t=sx(null,t,n,e,r);break e;case 11:t=ix(null,t,n,e,r);break e;case 14:t=ax(null,t,n,cr(n.type,e),r);break e}throw Error(W(306,n,""))}return t;case 0:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:cr(n,i),df(e,t,n,i,r);case 1:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:cr(n,i),sx(e,t,n,i,r);case 3:e:{if(p1(t),e===null)throw Error(W(387));n=t.pendingProps,s=t.memoizedState,i=s.element,Bb(e,t),kl(t,n,null,r);var o=t.memoizedState;if(n=o.element,s.isDehydrated)if(s={element:n,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){i=da(Error(W(423)),t),t=ox(e,t,n,r,i);break e}else if(n!==i){i=da(Error(W(424)),t),t=ox(e,t,n,r,i);break e}else for(zt=Cn(t.stateNode.containerInfo.firstChild),Rt=t,be=!0,dr=null,r=zb(t,null,n,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(la(),n===i){t=Xr(e,t,r);break e}ht(e,t,n,r)}t=t.child}return t;case 5:return Fb(t),e===null&&sf(t),n=t.type,i=t.pendingProps,s=e!==null?e.memoizedProps:null,o=i.children,ef(n,i)?o=null:s!==null&&ef(n,s)&&(t.flags|=32),f1(e,t),ht(e,t,o,r),t.child;case 6:return e===null&&sf(t),null;case 13:return h1(e,t,r);case 4:return eh(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=ca(t,null,n,r):ht(e,t,n,r),t.child;case 11:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:cr(n,i),ix(e,t,n,i,r);case 7:return ht(e,t,t.pendingProps,r),t.child;case 8:return ht(e,t,t.pendingProps.children,r),t.child;case 12:return ht(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(n=t.type._context,i=t.pendingProps,s=t.memoizedProps,o=i.value,me(Sl,n._currentValue),n._currentValue=o,s!==null)if(gr(s.value,o)){if(s.children===i.children&&!kt.current){t=Xr(e,t,r);break e}}else for(s=t.child,s!==null&&(s.return=t);s!==null;){var l=s.dependencies;if(l!==null){o=s.child;for(var c=l.firstContext;c!==null;){if(c.context===n){if(s.tag===1){c=qr(-1,r&-r),c.tag=2;var d=s.updateQueue;if(d!==null){d=d.shared;var u=d.pending;u===null?c.next=c:(c.next=u.next,u.next=c),d.pending=c}}s.lanes|=r,c=s.alternate,c!==null&&(c.lanes|=r),of(s.return,r,t),l.lanes|=r;break}c=c.next}}else if(s.tag===10)o=s.type===t.type?null:s.child;else if(s.tag===18){if(o=s.return,o===null)throw Error(W(341));o.lanes|=r,l=o.alternate,l!==null&&(l.lanes|=r),of(o,r,t),o=s.sibling}else o=s.child;if(o!==null)o.return=s;else for(o=s;o!==null;){if(o===t){o=null;break}if(s=o.sibling,s!==null){s.return=o.return,o=s;break}o=o.return}s=o}ht(e,t,i.children,r),t=t.child}return t;case 9:return i=t.type,n=t.pendingProps.children,ta(t,r),i=tr(i),n=n(i),t.flags|=1,ht(e,t,n,r),t.child;case 14:return n=t.type,i=cr(n,t.pendingProps),i=cr(n.type,i),ax(e,t,n,i,r);case 15:return u1(e,t,t.type,t.pendingProps,r);case 17:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:cr(n,i),rl(e,t),t.tag=1,Pt(n)?(e=!0,bl(t)):e=!1,ta(t,r),o1(t,n,i),cf(t,n,i,r),ff(null,t,n,!0,e,r);case 19:return m1(e,t,r);case 22:return d1(e,t,r)}throw Error(W(156,t.tag))};function E1(e,t){return ib(e,t)}function K_(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Zt(e,t,r,n){return new K_(e,t,r,n)}function mh(e){return e=e.prototype,!(!e||!e.isReactComponent)}function V_(e){if(typeof e=="function")return mh(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Mp)return 11;if(e===Ip)return 14}return 2}function Dn(e,t){var r=e.alternate;return r===null?(r=Zt(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function al(e,t,r,n,i,s){var o=2;if(n=e,typeof e=="function")mh(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Li:return oi(r.children,i,s,t);case Tp:o=8,i|=8;break;case Dd:return e=Zt(12,r,t,i|2),e.elementType=Dd,e.lanes=s,e;case Td:return e=Zt(13,r,t,i),e.elementType=Td,e.lanes=s,e;case Md:return e=Zt(19,r,t,i),e.elementType=Md,e.lanes=s,e;case Fv:return $c(r,i,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Rv:o=10;break e;case Bv:o=9;break e;case Mp:o=11;break e;case Ip:o=14;break e;case mn:o=16,n=null;break e}throw Error(W(130,e==null?e:typeof e,""))}return t=Zt(o,r,t,i),t.elementType=e,t.type=n,t.lanes=s,t}function oi(e,t,r,n){return e=Zt(7,e,n,t),e.lanes=r,e}function $c(e,t,r,n){return e=Zt(22,e,n,t),e.elementType=Fv,e.lanes=r,e.stateNode={isHidden:!1},e}function ad(e,t,r){return e=Zt(6,e,null,t),e.lanes=r,e}function sd(e,t,r){return t=Zt(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Y_(e,t,r,n,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Bu(0),this.expirationTimes=Bu(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Bu(0),this.identifierPrefix=n,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function gh(e,t,r,n,i,s,o,l,c){return e=new Y_(e,t,r,l,c),t===1?(t=1,s===!0&&(t|=8)):t=0,s=Zt(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:n,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},Qp(s),e}function G_(e,t,r){var n=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(I1)}catch(e){console.error(e)}}I1(),Iv.exports=Ut;var bh=Iv.exports,vx=bh;Od.createRoot=vx.createRoot,Od.hydrateRoot=vx.hydrateRoot;/** - * @remix-run/router v1.23.1 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Es(){return Es=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function jh(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function tC(){return Math.random().toString(36).substr(2,8)}function jx(e,t){return{usr:e.state,key:e.key,idx:t}}function Nf(e,t,r,n){return r===void 0&&(r=null),Es({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Sa(t):t,{state:r,key:t&&t.key||n||tC()})}function Ml(e){let{pathname:t="/",search:r="",hash:n=""}=e;return r&&r!=="?"&&(t+=r.charAt(0)==="?"?r:"?"+r),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function Sa(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function rC(e,t,r,n){n===void 0&&(n={});let{window:i=document.defaultView,v5Compat:s=!1}=n,o=i.history,l=Nn.Pop,c=null,d=u();d==null&&(d=0,o.replaceState(Es({},o.state,{idx:d}),""));function u(){return(o.state||{idx:null}).idx}function f(){l=Nn.Pop;let b=u(),v=b==null?null:b-d;d=b,c&&c({action:l,location:g.location,delta:v})}function p(b,v){l=Nn.Push;let j=Nf(g.location,b,v);d=u()+1;let y=jx(j,d),w=g.createHref(j);try{o.pushState(y,"",w)}catch(S){if(S instanceof DOMException&&S.name==="DataCloneError")throw S;i.location.assign(w)}s&&c&&c({action:l,location:g.location,delta:1})}function m(b,v){l=Nn.Replace;let j=Nf(g.location,b,v);d=u();let y=jx(j,d),w=g.createHref(j);o.replaceState(y,"",w),s&&c&&c({action:l,location:g.location,delta:0})}function x(b){let v=i.location.origin!=="null"?i.location.origin:i.location.href,j=typeof b=="string"?b:Ml(b);return j=j.replace(/ $/,"%20"),Oe(v,"No window.location.(origin|href) available to create URL for href: "+j),new URL(j,v)}let g={get action(){return l},get location(){return e(i,o)},listen(b){if(c)throw new Error("A history only accepts one active listener");return i.addEventListener(bx,f),c=b,()=>{i.removeEventListener(bx,f),c=null}},createHref(b){return t(i,b)},createURL:x,encodeLocation(b){let v=x(b);return{pathname:v.pathname,search:v.search,hash:v.hash}},push:p,replace:m,go(b){return o.go(b)}};return g}var wx;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(wx||(wx={}));function nC(e,t,r){return r===void 0&&(r="/"),iC(e,t,r)}function iC(e,t,r,n){let i=typeof t=="string"?Sa(t):t,s=wh(i.pathname||"/",r);if(s==null)return null;let o=$1(e);aC(o);let l=null;for(let c=0;l==null&&c{let c={relativePath:l===void 0?s.path||"":l,caseSensitive:s.caseSensitive===!0,childrenIndex:o,route:s};c.relativePath.startsWith("/")&&(Oe(c.relativePath.startsWith(n),'Absolute route path "'+c.relativePath+'" nested under path '+('"'+n+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),c.relativePath=c.relativePath.slice(n.length));let d=Tn([n,c.relativePath]),u=r.concat(c);s.children&&s.children.length>0&&(Oe(s.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+d+'".')),$1(s.children,t,u,d)),!(s.path==null&&!s.index)&&t.push({path:d,score:fC(d,s.index),routesMeta:u})};return e.forEach((s,o)=>{var l;if(s.path===""||!((l=s.path)!=null&&l.includes("?")))i(s,o);else for(let c of L1(s.path))i(s,o,c)}),t}function L1(e){let t=e.split("/");if(t.length===0)return[];let[r,...n]=t,i=r.endsWith("?"),s=r.replace(/\?$/,"");if(n.length===0)return i?[s,""]:[s];let o=L1(n.join("/")),l=[];return l.push(...o.map(c=>c===""?s:[s,c].join("/"))),i&&l.push(...o),l.map(c=>e.startsWith("/")&&c===""?"/":c)}function aC(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:pC(t.routesMeta.map(n=>n.childrenIndex),r.routesMeta.map(n=>n.childrenIndex)))}const sC=/^:[\w-]+$/,oC=3,lC=2,cC=1,uC=10,dC=-2,Sx=e=>e==="*";function fC(e,t){let r=e.split("/"),n=r.length;return r.some(Sx)&&(n+=dC),t&&(n+=lC),r.filter(i=>!Sx(i)).reduce((i,s)=>i+(sC.test(s)?oC:s===""?cC:uC),n)}function pC(e,t){return e.length===t.length&&e.slice(0,-1).every((n,i)=>n===t[i])?e[e.length-1]-t[t.length-1]:0}function hC(e,t,r){let{routesMeta:n}=e,i={},s="/",o=[];for(let l=0;l{let{paramName:p,isOptional:m}=u;if(p==="*"){let g=l[f]||"";o=s.slice(0,s.length-g.length).replace(/(.)\/+$/,"$1")}const x=l[f];return m&&!x?d[p]=void 0:d[p]=(x||"").replace(/%2F/g,"/"),d},{}),pathname:s,pathnameBase:o,pattern:e}}function gC(e,t,r){t===void 0&&(t=!1),r===void 0&&(r=!0),jh(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let n=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(o,l,c)=>(n.push({paramName:l,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(n.push({paramName:"*"}),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),n]}function xC(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return jh(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function wh(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,n=e.charAt(r);return n&&n!=="/"?null:e.slice(r)||"/"}const yC=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,vC=e=>yC.test(e);function bC(e,t){t===void 0&&(t="/");let{pathname:r,search:n="",hash:i=""}=typeof e=="string"?Sa(e):e,s;if(r)if(vC(r))s=r;else{if(r.includes("//")){let o=r;r=r.replace(/\/\/+/g,"/"),jh(!1,"Pathnames cannot have embedded double slashes - normalizing "+(o+" -> "+r))}r.startsWith("/")?s=Nx(r.substring(1),"/"):s=Nx(r,t)}else s=t;return{pathname:s,search:SC(n),hash:NC(i)}}function Nx(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?r.length>1&&r.pop():i!=="."&&r.push(i)}),r.length>1?r.join("/"):"/"}function od(e,t,r,n){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(n)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function jC(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function Sh(e,t){let r=jC(e);return t?r.map((n,i)=>i===r.length-1?n.pathname:n.pathnameBase):r.map(n=>n.pathnameBase)}function Nh(e,t,r,n){n===void 0&&(n=!1);let i;typeof e=="string"?i=Sa(e):(i=Es({},e),Oe(!i.pathname||!i.pathname.includes("?"),od("?","pathname","search",i)),Oe(!i.pathname||!i.pathname.includes("#"),od("#","pathname","hash",i)),Oe(!i.search||!i.search.includes("#"),od("#","search","hash",i)));let s=e===""||i.pathname==="",o=s?"/":i.pathname,l;if(o==null)l=r;else{let f=t.length-1;if(!n&&o.startsWith("..")){let p=o.split("/");for(;p[0]==="..";)p.shift(),f-=1;i.pathname=p.join("/")}l=f>=0?t[f]:"/"}let c=bC(i,l),d=o&&o!=="/"&&o.endsWith("/"),u=(s||o===".")&&r.endsWith("/");return!c.pathname.endsWith("/")&&(d||u)&&(c.pathname+="/"),c}const Tn=e=>e.join("/").replace(/\/\/+/g,"/"),wC=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),SC=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,NC=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function kC(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const z1=["post","put","patch","delete"];new Set(z1);const PC=["get",...z1];new Set(PC);/** - * React Router v6.30.2 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Ds(){return Ds=Object.assign?Object.assign.bind():function(e){for(var t=1;t{l.current=!0}),h.useCallback(function(d,u){if(u===void 0&&(u={}),!l.current)return;if(typeof d=="number"){n.go(d);return}let f=Nh(d,JSON.parse(o),s,u.relative==="path");e==null&&t!=="/"&&(f.pathname=f.pathname==="/"?t:Tn([t,f.pathname])),(u.replace?n.replace:n.push)(f,u.state,u)},[t,n,o,s,e])}function ka(){let{matches:e}=h.useContext(on),t=e[e.length-1];return t?t.params:{}}function F1(e,t){let{relative:r}=t===void 0?{}:t,{future:n}=h.useContext(Un),{matches:i}=h.useContext(on),{pathname:s}=_i(),o=JSON.stringify(Sh(i,n.v7_relativeSplatPath));return h.useMemo(()=>Nh(e,JSON.parse(o),s,r==="path"),[e,o,s,r])}function OC(e,t){return EC(e,t)}function EC(e,t,r,n){Na()||Oe(!1);let{navigator:i}=h.useContext(Un),{matches:s}=h.useContext(on),o=s[s.length-1],l=o?o.params:{};o&&o.pathname;let c=o?o.pathnameBase:"/";o&&o.route;let d=_i(),u;if(t){var f;let b=typeof t=="string"?Sa(t):t;c==="/"||(f=b.pathname)!=null&&f.startsWith(c)||Oe(!1),u=b}else u=d;let p=u.pathname||"/",m=p;if(c!=="/"){let b=c.replace(/^\//,"").split("/");m="/"+p.replace(/^\//,"").split("/").slice(b.length).join("/")}let x=nC(e,{pathname:m}),g=$C(x&&x.map(b=>Object.assign({},b,{params:Object.assign({},l,b.params),pathname:Tn([c,i.encodeLocation?i.encodeLocation(b.pathname).pathname:b.pathname]),pathnameBase:b.pathnameBase==="/"?c:Tn([c,i.encodeLocation?i.encodeLocation(b.pathnameBase).pathname:b.pathnameBase])})),s,r,n);return t&&g?h.createElement(Fc.Provider,{value:{location:Ds({pathname:"/",search:"",hash:"",state:null,key:"default"},u),navigationType:Nn.Pop}},g):g}function DC(){let e=BC(),t=kC(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,i={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return h.createElement(h.Fragment,null,h.createElement("h2",null,"Unexpected Application Error!"),h.createElement("h3",{style:{fontStyle:"italic"}},t),r?h.createElement("pre",{style:i},r):null,null)}const TC=h.createElement(DC,null);class MC extends h.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error!==void 0?h.createElement(on.Provider,{value:this.props.routeContext},h.createElement(R1.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function IC(e){let{routeContext:t,match:r,children:n}=e,i=h.useContext(kh);return i&&i.static&&i.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=r.route.id),h.createElement(on.Provider,{value:t},n)}function $C(e,t,r,n){var i;if(t===void 0&&(t=[]),r===void 0&&(r=null),n===void 0&&(n=null),e==null){var s;if(!r)return null;if(r.errors)e=r.matches;else if((s=n)!=null&&s.v7_partialHydration&&t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let o=e,l=(i=r)==null?void 0:i.errors;if(l!=null){let u=o.findIndex(f=>f.route.id&&(l==null?void 0:l[f.route.id])!==void 0);u>=0||Oe(!1),o=o.slice(0,Math.min(o.length,u+1))}let c=!1,d=-1;if(r&&n&&n.v7_partialHydration)for(let u=0;u=0?o=o.slice(0,d+1):o=[o[0]];break}}}return o.reduceRight((u,f,p)=>{let m,x=!1,g=null,b=null;r&&(m=l&&f.route.id?l[f.route.id]:void 0,g=f.route.errorElement||TC,c&&(d<0&&p===0?(WC("route-fallback"),x=!0,b=null):d===p&&(x=!0,b=f.route.hydrateFallbackElement||null)));let v=t.concat(o.slice(0,p+1)),j=()=>{let y;return m?y=g:x?y=b:f.route.Component?y=h.createElement(f.route.Component,null):f.route.element?y=f.route.element:y=u,h.createElement(IC,{match:f,routeContext:{outlet:u,matches:v,isDataRoute:r!=null},children:y})};return r&&(f.route.ErrorBoundary||f.route.errorElement||p===0)?h.createElement(MC,{location:r.location,revalidation:r.revalidation,component:g,error:m,children:j(),routeContext:{outlet:null,matches:v,isDataRoute:!0}}):j()},null)}var W1=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(W1||{}),U1=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(U1||{});function LC(e){let t=h.useContext(kh);return t||Oe(!1),t}function zC(e){let t=h.useContext(_C);return t||Oe(!1),t}function RC(e){let t=h.useContext(on);return t||Oe(!1),t}function q1(e){let t=RC(),r=t.matches[t.matches.length-1];return r.route.id||Oe(!1),r.route.id}function BC(){var e;let t=h.useContext(R1),r=zC(),n=q1();return t!==void 0?t:(e=r.errors)==null?void 0:e[n]}function FC(){let{router:e}=LC(W1.UseNavigateStable),t=q1(U1.UseNavigateStable),r=h.useRef(!1);return B1(()=>{r.current=!0}),h.useCallback(function(i,s){s===void 0&&(s={}),r.current&&(typeof i=="number"?e.navigate(i):e.navigate(i,Ds({fromRouteId:t},s)))},[e,t])}const kx={};function WC(e,t,r){kx[e]||(kx[e]=!0)}function UC(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function H1(e){let{to:t,replace:r,state:n,relative:i}=e;Na()||Oe(!1);let{future:s,static:o}=h.useContext(Un),{matches:l}=h.useContext(on),{pathname:c}=_i(),d=dt(),u=Nh(t,Sh(l,s.v7_relativeSplatPath),c,i==="path"),f=JSON.stringify(u);return h.useEffect(()=>d(JSON.parse(f),{replace:r,state:n,relative:i}),[d,f,i,r,n]),null}function de(e){Oe(!1)}function qC(e){let{basename:t="/",children:r=null,location:n,navigationType:i=Nn.Pop,navigator:s,static:o=!1,future:l}=e;Na()&&Oe(!1);let c=t.replace(/^\/*/,"/"),d=h.useMemo(()=>({basename:c,navigator:s,static:o,future:Ds({v7_relativeSplatPath:!1},l)}),[c,l,s,o]);typeof n=="string"&&(n=Sa(n));let{pathname:u="/",search:f="",hash:p="",state:m=null,key:x="default"}=n,g=h.useMemo(()=>{let b=wh(u,c);return b==null?null:{location:{pathname:b,search:f,hash:p,state:m,key:x},navigationType:i}},[c,u,f,p,m,x,i]);return g==null?null:h.createElement(Un.Provider,{value:d},h.createElement(Fc.Provider,{children:r,value:g}))}function HC(e){let{children:t,location:r}=e;return OC(kf(t),r)}new Promise(()=>{});function kf(e,t){t===void 0&&(t=[]);let r=[];return h.Children.forEach(e,(n,i)=>{if(!h.isValidElement(n))return;let s=[...t,i];if(n.type===h.Fragment){r.push.apply(r,kf(n.props.children,s));return}n.type!==de&&Oe(!1),!n.props.index||!n.props.children||Oe(!1);let o={id:n.props.id||s.join("-"),caseSensitive:n.props.caseSensitive,element:n.props.element,Component:n.props.Component,index:n.props.index,path:n.props.path,loader:n.props.loader,action:n.props.action,errorElement:n.props.errorElement,ErrorBoundary:n.props.ErrorBoundary,hasErrorBoundary:n.props.ErrorBoundary!=null||n.props.errorElement!=null,shouldRevalidate:n.props.shouldRevalidate,handle:n.props.handle,lazy:n.props.lazy};n.props.children&&(o.children=kf(n.props.children,s)),r.push(o)}),r}/** - * React Router DOM v6.30.2 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Pf(){return Pf=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(r[i]=e[i]);return r}function VC(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function YC(e,t){return e.button===0&&(!t||t==="_self")&&!VC(e)}function _f(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,r)=>{let n=e[r];return t.concat(Array.isArray(n)?n.map(i=>[r,i]):[[r,n]])},[]))}function GC(e,t){let r=_f(e);return t&&t.forEach((n,i)=>{r.has(i)||t.getAll(i).forEach(s=>{r.append(i,s)})}),r}const ZC=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],XC="6";try{window.__reactRouterVersion=XC}catch{}const JC="startTransition",Px=Tv[JC];function QC(e){let{basename:t,children:r,future:n,window:i}=e,s=h.useRef();s.current==null&&(s.current=eC({window:i,v5Compat:!0}));let o=s.current,[l,c]=h.useState({action:o.action,location:o.location}),{v7_startTransition:d}=n||{},u=h.useCallback(f=>{d&&Px?Px(()=>c(f)):c(f)},[c,d]);return h.useLayoutEffect(()=>o.listen(u),[o,u]),h.useEffect(()=>UC(n),[n]),h.createElement(qC,{basename:t,children:r,location:l.location,navigationType:l.action,navigator:o,future:n})}const eA=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",tA=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,K1=h.forwardRef(function(t,r){let{onClick:n,relative:i,reloadDocument:s,replace:o,state:l,target:c,to:d,preventScrollReset:u,viewTransition:f}=t,p=KC(t,ZC),{basename:m}=h.useContext(Un),x,g=!1;if(typeof d=="string"&&tA.test(d)&&(x=d,eA))try{let y=new URL(window.location.href),w=d.startsWith("//")?new URL(y.protocol+d):new URL(d),S=wh(w.pathname,m);w.origin===y.origin&&S!=null?d=S+w.search+w.hash:g=!0}catch{}let b=CC(d,{relative:i}),v=rA(d,{replace:o,state:l,target:c,preventScrollReset:u,relative:i,viewTransition:f});function j(y){n&&n(y),y.defaultPrevented||v(y)}return h.createElement("a",Pf({},p,{href:x||b,onClick:g||s?n:j,ref:r,target:c}))});var _x;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(_x||(_x={}));var Cx;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Cx||(Cx={}));function rA(e,t){let{target:r,replace:n,state:i,preventScrollReset:s,relative:o,viewTransition:l}=t===void 0?{}:t,c=dt(),d=_i(),u=F1(e,{relative:o});return h.useCallback(f=>{if(YC(f,r)){f.preventDefault();let p=n!==void 0?n:Ml(d)===Ml(u);c(e,{replace:p,state:i,preventScrollReset:s,relative:o,viewTransition:l})}},[d,c,u,n,i,r,e,s,o,l])}function nA(e){let t=h.useRef(_f(e)),r=h.useRef(!1),n=_i(),i=h.useMemo(()=>GC(n.search,r.current?null:t.current),[n.search]),s=dt(),o=h.useCallback((l,c)=>{const d=_f(typeof l=="function"?l(i):l);r.current=!0,s("?"+d,c)},[s,i]);return[i,o]}const iA={},Ax=e=>{let t;const r=new Set,n=(u,f)=>{const p=typeof u=="function"?u(t):u;if(!Object.is(p,t)){const m=t;t=f??(typeof p!="object"||p===null)?p:Object.assign({},t,p),r.forEach(x=>x(t,m))}},i=()=>t,c={setState:n,getState:i,getInitialState:()=>d,subscribe:u=>(r.add(u),()=>r.delete(u)),destroy:()=>{(iA?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),r.clear()}},d=t=e(n,i,c);return c},aA=e=>e?Ax(e):Ax;var V1={exports:{}},Y1={},G1={exports:{}},Z1={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var pa=h;function sA(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var oA=typeof Object.is=="function"?Object.is:sA,lA=pa.useState,cA=pa.useEffect,uA=pa.useLayoutEffect,dA=pa.useDebugValue;function fA(e,t){var r=t(),n=lA({inst:{value:r,getSnapshot:t}}),i=n[0].inst,s=n[1];return uA(function(){i.value=r,i.getSnapshot=t,ld(i)&&s({inst:i})},[e,r,t]),cA(function(){return ld(i)&&s({inst:i}),e(function(){ld(i)&&s({inst:i})})},[e]),dA(r),r}function ld(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!oA(e,r)}catch{return!0}}function pA(e,t){return t()}var hA=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?pA:fA;Z1.useSyncExternalStore=pa.useSyncExternalStore!==void 0?pa.useSyncExternalStore:hA;G1.exports=Z1;var mA=G1.exports;/** - * @license React - * use-sync-external-store-shim/with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Wc=h,gA=mA;function xA(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var yA=typeof Object.is=="function"?Object.is:xA,vA=gA.useSyncExternalStore,bA=Wc.useRef,jA=Wc.useEffect,wA=Wc.useMemo,SA=Wc.useDebugValue;Y1.useSyncExternalStoreWithSelector=function(e,t,r,n,i){var s=bA(null);if(s.current===null){var o={hasValue:!1,value:null};s.current=o}else o=s.current;s=wA(function(){function c(m){if(!d){if(d=!0,u=m,m=n(m),i!==void 0&&o.hasValue){var x=o.value;if(i(x,m))return f=x}return f=m}if(x=f,yA(u,m))return x;var g=n(m);return i!==void 0&&i(x,g)?(u=m,x):(u=m,f=g)}var d=!1,u,f,p=r===void 0?null:r;return[function(){return c(t())},p===null?void 0:function(){return c(p())}]},[t,r,n,i]);var l=vA(e,s[0],s[1]);return jA(function(){o.hasValue=!0,o.value=l},[l]),SA(l),l};V1.exports=Y1;var X1=V1.exports;const NA=Tr(X1),J1={},{useDebugValue:kA}=ps,{useSyncExternalStoreWithSelector:PA}=NA;let Ox=!1;const _A=e=>e;function CA(e,t=_A,r){(J1?"production":void 0)!=="production"&&r&&!Ox&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),Ox=!0);const n=PA(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,r);return kA(n),n}const Ex=e=>{(J1?"production":void 0)!=="production"&&typeof e!="function"&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");const t=typeof e=="function"?aA(e):e,r=(n,i)=>CA(t,n,i);return Object.assign(r,t),r},AA=e=>e?Ex(e):Ex,OA="http://localhost:3010";class EA{constructor(t){ho(this,"baseUrl");this.baseUrl=t}getHeaders(){const t=localStorage.getItem("token");return{"Content-Type":"application/json",...t?{Authorization:`Bearer ${t}`}:{}}}async request(t,r){const n=`${this.baseUrl}${t}`,i=await fetch(n,{...r,headers:{...this.getHeaders(),...r==null?void 0:r.headers}});if(!i.ok){const s=await i.json().catch(()=>({error:"Request failed"}));throw new Error(s.error||`HTTP ${i.status}`)}return i.json()}async login(t,r){return this.request("/api/auth/login",{method:"POST",body:JSON.stringify({email:t,password:r})})}async getMe(){return this.request("/api/auth/me")}async getDashboardStats(){return this.request("/api/dashboard/stats")}async getDashboardActivity(){return this.request("/api/dashboard/activity")}async getStores(){return this.request("/api/stores")}async getStore(t){return this.request(`/api/stores/${t}`)}async createStore(t){return this.request("/api/stores",{method:"POST",body:JSON.stringify(t)})}async updateStore(t,r){return this.request(`/api/stores/${t}`,{method:"PUT",body:JSON.stringify(r)})}async getDispensaries(){return this.request("/api/dispensaries")}async getDispensary(t){return this.request(`/api/dispensaries/${t}`)}async updateDispensary(t,r){return this.request(`/api/dispensaries/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteStore(t){return this.request(`/api/stores/${t}`,{method:"DELETE"})}async scrapeStore(t,r,n){return this.request(`/api/stores/${t}/scrape`,{method:"POST",body:JSON.stringify({parallel:r,userAgent:n})})}async downloadStoreImages(t){return this.request(`/api/stores/${t}/download-images`,{method:"POST"})}async discoverStoreCategories(t){return this.request(`/api/stores/${t}/discover-categories`,{method:"POST"})}async debugScrapeStore(t){return this.request(`/api/stores/${t}/debug-scrape`,{method:"POST"})}async getStoreBrands(t){return this.request(`/api/stores/${t}/brands`)}async getStoreSpecials(t,r){const n=r?`?date=${r}`:"";return this.request(`/api/stores/${t}/specials${n}`)}async getCategories(t){const r=t?`?store_id=${t}`:"";return this.request(`/api/categories${r}`)}async getCategoryTree(t){return this.request(`/api/categories/tree?store_id=${t}`)}async getProducts(t){const r=new URLSearchParams(t).toString();return this.request(`/api/products${r?`?${r}`:""}`)}async getProduct(t){return this.request(`/api/products/${t}`)}async getCampaigns(){return this.request("/api/campaigns")}async getCampaign(t){return this.request(`/api/campaigns/${t}`)}async createCampaign(t){return this.request("/api/campaigns",{method:"POST",body:JSON.stringify(t)})}async updateCampaign(t,r){return this.request(`/api/campaigns/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteCampaign(t){return this.request(`/api/campaigns/${t}`,{method:"DELETE"})}async addProductToCampaign(t,r,n){return this.request(`/api/campaigns/${t}/products`,{method:"POST",body:JSON.stringify({product_id:r,display_order:n})})}async removeProductFromCampaign(t,r){return this.request(`/api/campaigns/${t}/products/${r}`,{method:"DELETE"})}async getAnalyticsOverview(t){return this.request(`/api/analytics/overview${t?`?days=${t}`:""}`)}async getProductAnalytics(t,r){return this.request(`/api/analytics/products/${t}${r?`?days=${r}`:""}`)}async getCampaignAnalytics(t,r){return this.request(`/api/analytics/campaigns/${t}${r?`?days=${r}`:""}`)}async getSettings(){return this.request("/api/settings")}async updateSetting(t,r){return this.request(`/api/settings/${t}`,{method:"PUT",body:JSON.stringify({value:r})})}async updateSettings(t){return this.request("/api/settings",{method:"PUT",body:JSON.stringify({settings:t})})}async getProxies(){return this.request("/api/proxies")}async getProxy(t){return this.request(`/api/proxies/${t}`)}async addProxy(t){return this.request("/api/proxies",{method:"POST",body:JSON.stringify(t)})}async addProxiesBulk(t){return this.request("/api/proxies/bulk",{method:"POST",body:JSON.stringify({proxies:t})})}async testProxy(t){return this.request(`/api/proxies/${t}/test`,{method:"POST"})}async testAllProxies(){return this.request("/api/proxies/test-all",{method:"POST"})}async getProxyTestJob(t){return this.request(`/api/proxies/test-job/${t}`)}async getActiveProxyTestJob(){return this.request("/api/proxies/test-job")}async cancelProxyTestJob(t){return this.request(`/api/proxies/test-job/${t}/cancel`,{method:"POST"})}async updateProxy(t,r){return this.request(`/api/proxies/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteProxy(t){return this.request(`/api/proxies/${t}`,{method:"DELETE"})}async updateProxyLocations(){return this.request("/api/proxies/update-locations",{method:"POST"})}async getLogs(t,r,n){const i=new URLSearchParams;return t&&i.append("limit",t.toString()),r&&i.append("level",r),n&&i.append("category",n),this.request(`/api/logs?${i.toString()}`)}async clearLogs(){return this.request("/api/logs",{method:"DELETE"})}async getActiveScrapers(){return this.request("/api/scraper-monitor/active")}async getScraperHistory(t){const r=t?`?store_id=${t}`:"";return this.request(`/api/scraper-monitor/history${r}`)}async getJobStats(t){const r=t?`?dispensary_id=${t}`:"";return this.request(`/api/scraper-monitor/jobs/stats${r}`)}async getActiveJobs(t){const r=t?`?dispensary_id=${t}`:"";return this.request(`/api/scraper-monitor/jobs/active${r}`)}async getRecentJobs(t){const r=new URLSearchParams;t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.dispensaryId&&r.append("dispensary_id",t.dispensaryId.toString()),t!=null&&t.status&&r.append("status",t.status);const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/scraper-monitor/jobs/recent${n}`)}async getWorkerStats(t){const r=t?`?dispensary_id=${t}`:"";return this.request(`/api/scraper-monitor/jobs/workers${r}`)}async getAZMonitorActiveJobs(){return this.request("/api/az/monitor/active-jobs")}async getAZMonitorRecentJobs(t){const r=t?`?limit=${t}`:"";return this.request(`/api/az/monitor/recent-jobs${r}`)}async getAZMonitorErrors(t){const r=new URLSearchParams;t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.hours&&r.append("hours",t.hours.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/monitor/errors${n}`)}async getAZMonitorSummary(){return this.request("/api/az/monitor/summary")}async getChanges(t){const r=t?`?status=${t}`:"";return this.request(`/api/changes${r}`)}async getChangeStats(){return this.request("/api/changes/stats")}async approveChange(t){return this.request(`/api/changes/${t}/approve`,{method:"POST"})}async rejectChange(t,r){return this.request(`/api/changes/${t}/reject`,{method:"POST",body:JSON.stringify({reason:r})})}async getDispensaryProducts(t,r){const n=r?`?category=${r}`:"";return this.request(`/api/dispensaries/${t}/products${n}`)}async getDispensaryBrands(t){return this.request(`/api/dispensaries/${t}/brands`)}async getDispensarySpecials(t){return this.request(`/api/dispensaries/${t}/specials`)}async getApiPermissions(){return this.request("/api/api-permissions")}async getApiPermissionDispensaries(){return this.request("/api/api-permissions/dispensaries")}async createApiPermission(t){return this.request("/api/api-permissions",{method:"POST",body:JSON.stringify(t)})}async updateApiPermission(t,r){return this.request(`/api/api-permissions/${t}`,{method:"PUT",body:JSON.stringify(r)})}async toggleApiPermission(t){return this.request(`/api/api-permissions/${t}/toggle`,{method:"PATCH"})}async deleteApiPermission(t){return this.request(`/api/api-permissions/${t}`,{method:"DELETE"})}async getGlobalSchedule(){return this.request("/api/schedule/global")}async updateGlobalSchedule(t,r){return this.request(`/api/schedule/global/${t}`,{method:"PUT",body:JSON.stringify(r)})}async getStoreSchedules(){return this.request("/api/schedule/stores")}async getStoreSchedule(t){return this.request(`/api/schedule/stores/${t}`)}async updateStoreSchedule(t,r){return this.request(`/api/schedule/stores/${t}`,{method:"PUT",body:JSON.stringify(r)})}async getDispensarySchedules(t){const r=new URLSearchParams;t!=null&&t.state&&r.append("state",t.state),t!=null&&t.search&&r.append("search",t.search);const n=r.toString();return this.request(`/api/schedule/dispensaries${n?`?${n}`:""}`)}async getDispensarySchedule(t){return this.request(`/api/schedule/dispensaries/${t}`)}async updateDispensarySchedule(t,r){return this.request(`/api/schedule/dispensaries/${t}`,{method:"PUT",body:JSON.stringify(r)})}async getDispensaryCrawlJobs(t){const r=t?`?limit=${t}`:"";return this.request(`/api/schedule/dispensary-jobs${r}`)}async triggerDispensaryCrawl(t){return this.request(`/api/schedule/trigger/dispensary/${t}`,{method:"POST"})}async resolvePlatformId(t){return this.request(`/api/schedule/dispensaries/${t}/resolve-platform-id`,{method:"POST"})}async detectMenuType(t){return this.request(`/api/schedule/dispensaries/${t}/detect-menu-type`,{method:"POST"})}async refreshDetection(t){return this.request(`/api/schedule/dispensaries/${t}/refresh-detection`,{method:"POST"})}async toggleDispensarySchedule(t,r){return this.request(`/api/schedule/dispensaries/${t}/toggle-active`,{method:"PUT",body:JSON.stringify({is_active:r})})}async deleteDispensarySchedule(t){return this.request(`/api/schedule/dispensaries/${t}/schedule`,{method:"DELETE"})}async getCrawlJobs(t){const r=t?`?limit=${t}`:"";return this.request(`/api/schedule/jobs${r}`)}async getStoreCrawlJobs(t,r){const n=r?`?limit=${r}`:"";return this.request(`/api/schedule/jobs/store/${t}${n}`)}async cancelCrawlJob(t){return this.request(`/api/schedule/jobs/${t}/cancel`,{method:"POST"})}async triggerStoreCrawl(t){return this.request(`/api/schedule/trigger/store/${t}`,{method:"POST"})}async triggerAllCrawls(){return this.request("/api/schedule/trigger/all",{method:"POST"})}async restartScheduler(){return this.request("/api/schedule/restart",{method:"POST"})}async getVersion(){return this.request("/api/version")}async getDutchieAZDashboard(){return this.request("/api/az/dashboard")}async getDutchieAZSchedules(){return this.request("/api/az/admin/schedules")}async getDutchieAZSchedule(t){return this.request(`/api/az/admin/schedules/${t}`)}async createDutchieAZSchedule(t){return this.request("/api/az/admin/schedules",{method:"POST",body:JSON.stringify(t)})}async updateDutchieAZSchedule(t,r){return this.request(`/api/az/admin/schedules/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteDutchieAZSchedule(t){return this.request(`/api/az/admin/schedules/${t}`,{method:"DELETE"})}async triggerDutchieAZSchedule(t){return this.request(`/api/az/admin/schedules/${t}/trigger`,{method:"POST"})}async initDutchieAZSchedules(){return this.request("/api/az/admin/schedules/init",{method:"POST"})}async getDutchieAZScheduleLogs(t,r,n){const i=new URLSearchParams;r&&i.append("limit",r.toString()),n&&i.append("offset",n.toString());const s=i.toString()?`?${i.toString()}`:"";return this.request(`/api/az/admin/schedules/${t}/logs${s}`)}async getDutchieAZRunLogs(t){const r=new URLSearchParams;t!=null&&t.scheduleId&&r.append("scheduleId",t.scheduleId.toString()),t!=null&&t.jobName&&r.append("jobName",t.jobName),t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.offset&&r.append("offset",t.offset.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/admin/run-logs${n}`)}async getDutchieAZSchedulerStatus(){return this.request("/api/az/admin/scheduler/status")}async startDutchieAZScheduler(){return this.request("/api/az/admin/scheduler/start",{method:"POST"})}async stopDutchieAZScheduler(){return this.request("/api/az/admin/scheduler/stop",{method:"POST"})}async triggerDutchieAZImmediateCrawl(){return this.request("/api/az/admin/scheduler/trigger",{method:"POST"})}async getDutchieAZStores(t){const r=new URLSearchParams;t!=null&&t.city&&r.append("city",t.city),(t==null?void 0:t.hasPlatformId)!==void 0&&r.append("hasPlatformId",String(t.hasPlatformId)),t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.offset&&r.append("offset",t.offset.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/stores${n}`)}async getDutchieAZStore(t){return this.request(`/api/az/stores/${t}`)}async getDutchieAZStoreSummary(t){return this.request(`/api/az/stores/${t}/summary`)}async getDutchieAZStoreProducts(t,r){const n=new URLSearchParams;r!=null&&r.stockStatus&&n.append("stockStatus",r.stockStatus),r!=null&&r.type&&n.append("type",r.type),r!=null&&r.subcategory&&n.append("subcategory",r.subcategory),r!=null&&r.brandName&&n.append("brandName",r.brandName),r!=null&&r.search&&n.append("search",r.search),r!=null&&r.limit&&n.append("limit",r.limit.toString()),r!=null&&r.offset&&n.append("offset",r.offset.toString());const i=n.toString()?`?${n.toString()}`:"";return this.request(`/api/az/stores/${t}/products${i}`)}async getDutchieAZStoreBrands(t){return this.request(`/api/az/stores/${t}/brands`)}async getDutchieAZStoreCategories(t){return this.request(`/api/az/stores/${t}/categories`)}async getDutchieAZBrands(t){const r=new URLSearchParams;t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.offset&&r.append("offset",t.offset.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/brands${n}`)}async getDutchieAZCategories(){return this.request("/api/az/categories")}async getDutchieAZDebugSummary(){return this.request("/api/az/debug/summary")}async getDutchieAZDebugStore(t){return this.request(`/api/az/debug/store/${t}`)}async triggerDutchieAZCrawl(t,r){return this.request(`/api/az/admin/crawl/${t}`,{method:"POST",body:JSON.stringify(r||{})})}async getDetectionStats(){return this.request("/api/az/admin/detection/stats")}async getDispensariesNeedingDetection(t){const r=new URLSearchParams;t!=null&&t.state&&r.append("state",t.state),t!=null&&t.limit&&r.append("limit",t.limit.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/admin/detection/pending${n}`)}async detectDispensary(t){return this.request(`/api/az/admin/detection/detect/${t}`,{method:"POST"})}async detectAllDispensaries(t){return this.request("/api/az/admin/detection/detect-all",{method:"POST",body:JSON.stringify(t||{})})}async triggerMenuDetectionJob(){return this.request("/api/az/admin/detection/trigger",{method:"POST"})}}const B=new EA(OA),Ph=AA(e=>({user:null,token:localStorage.getItem("token"),isAuthenticated:!!localStorage.getItem("token"),login:async(t,r)=>{const n=await B.login(t,r);localStorage.setItem("token",n.token),e({user:n.user,token:n.token,isAuthenticated:!0})},logout:()=>{localStorage.removeItem("token"),e({user:null,token:null,isAuthenticated:!1})},checkAuth:async()=>{try{const t=await B.getMe();e({user:t.user,isAuthenticated:!0})}catch{localStorage.removeItem("token"),e({user:null,token:null,isAuthenticated:!1})}}}));function DA(){const[e,t]=h.useState("admin@example.com"),[r,n]=h.useState("password"),[i,s]=h.useState(""),[o,l]=h.useState(!1),c=dt(),d=Ph(f=>f.login),u=async f=>{f.preventDefault(),s(""),l(!0);try{await d(e,r),c("/")}catch(p){s(p.message||"Login failed")}finally{l(!1)}};return a.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"100vh",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)"},children:a.jsxs("div",{style:{background:"white",padding:"40px",borderRadius:"12px",boxShadow:"0 10px 40px rgba(0,0,0,0.2)",width:"100%",maxWidth:"400px"},children:[a.jsx("h1",{style:{marginBottom:"10px",fontSize:"28px"},children:"Dutchie Menus"}),a.jsx("p",{style:{color:"#666",marginBottom:"30px"},children:"Admin Dashboard"}),i&&a.jsx("div",{style:{background:"#fee",color:"#c33",padding:"12px",borderRadius:"6px",marginBottom:"20px",fontSize:"14px"},children:i}),a.jsxs("form",{onSubmit:u,children:[a.jsxs("div",{style:{marginBottom:"20px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"500"},children:"Email"}),a.jsx("input",{type:"email",value:e,onChange:f=>t(f.target.value),required:!0,style:{width:"100%",padding:"12px",border:"1px solid #ddd",borderRadius:"6px",fontSize:"14px"}})]}),a.jsxs("div",{style:{marginBottom:"25px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"500"},children:"Password"}),a.jsx("input",{type:"password",value:r,onChange:f=>n(f.target.value),required:!0,style:{width:"100%",padding:"12px",border:"1px solid #ddd",borderRadius:"6px",fontSize:"14px"}})]}),a.jsx("button",{type:"submit",disabled:o,style:{width:"100%",padding:"14px",background:o?"#999":"#667eea",color:"white",border:"none",borderRadius:"6px",cursor:o?"not-allowed":"pointer",fontSize:"16px",fontWeight:"500",transition:"background 0.2s"},children:o?"Logging in...":"Login"})]})]})})}/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const TA=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),MA=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,r,n)=>n?n.toUpperCase():r.toLowerCase()),Dx=e=>{const t=MA(e);return t.charAt(0).toUpperCase()+t.slice(1)},Q1=(...e)=>e.filter((t,r,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===r).join(" ").trim(),IA=e=>{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0};/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var $A={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const LA=h.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:n,className:i="",children:s,iconNode:o,...l},c)=>h.createElement("svg",{ref:c,...$A,width:t,height:t,stroke:e,strokeWidth:n?Number(r)*24/Number(t):r,className:Q1("lucide",i),...!s&&!IA(l)&&{"aria-hidden":"true"},...l},[...o.map(([d,u])=>h.createElement(d,u)),...Array.isArray(s)?s:[s]]));/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ee=(e,t)=>{const r=h.forwardRef(({className:n,...i},s)=>h.createElement(LA,{ref:s,iconNode:t,className:Q1(`lucide-${TA(Dx(e))}`,`lucide-${e}`,n),...i}));return r.displayName=Dx(e),r};/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const zA=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],na=ee("activity",zA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const RA=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],_h=ee("arrow-left",RA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const BA=[["path",{d:"M10 12h4",key:"a56b0p"}],["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M14 21v-3a2 2 0 0 0-4 0v3",key:"1rgiei"}],["path",{d:"M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2",key:"secmi2"}],["path",{d:"M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16",key:"16ra0t"}]],Ln=ee("building-2",BA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const FA=[["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M12 6h.01",key:"1vi96p"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M16 14h.01",key:"1gbofw"}],["path",{d:"M16 6h.01",key:"1x0f13"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M8 6h.01",key:"1dz90k"}],["path",{d:"M9 22v-3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v3",key:"cabbwy"}],["rect",{x:"4",y:"2",width:"16",height:"20",rx:"2",key:"1uxh74"}]],WA=ee("building",FA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const UA=[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]],Ch=ee("calendar",UA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qA=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]],HA=ee("chart-column",qA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const KA=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],ej=ee("chevron-down",KA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const VA=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],Cf=ee("chevron-right",VA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const YA=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],Uc=ee("circle-alert",YA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const GA=[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]],_r=ee("circle-check-big",GA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ZA=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],Hr=ee("circle-x",ZA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const XA=[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],xr=ee("clock",XA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const JA=[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]],QA=ee("dollar-sign",JA);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const eO=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],Jr=ee("external-link",eO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const tO=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],rO=ee("eye",tO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const nO=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]],iO=ee("file-text",nO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const aO=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]],sO=ee("folder-open",aO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const oO=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],lO=ee("image",oO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const cO=[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]],uO=ee("key",cO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const dO=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],Tx=ee("layers",dO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const fO=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],pO=ee("layout-dashboard",fO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const hO=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],mO=ee("log-out",hO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const gO=[["path",{d:"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7",key:"132q7q"}],["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",key:"izxlao"}]],tj=ee("mail",gO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xO=[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]],yi=ee("map-pin",xO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const yO=[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]],Ct=ee("package",yO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const vO=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],bO=ee("pencil",vO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const jO=[["path",{d:"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384",key:"9njp5v"}]],Ah=ee("phone",jO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const wO=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],Af=ee("plus",wO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const SO=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Xt=ee("refresh-cw",SO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const NO=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],kO=ee("save",NO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const PO=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],_O=ee("search",PO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const CO=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],AO=ee("settings",CO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const OO=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],sl=ee("shield",OO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const EO=[["path",{d:"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5",key:"slp6dd"}],["path",{d:"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244",key:"o0xfot"}],["path",{d:"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05",key:"wn3emo"}]],Il=ee("store",EO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const DO=[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]],Cr=ee("tag",DO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const TO=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]],rj=ee("target",TO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const MO=[["circle",{cx:"9",cy:"12",r:"3",key:"u3jwor"}],["rect",{width:"20",height:"14",x:"2",y:"5",rx:"7",key:"g7kal2"}]],Mx=ee("toggle-left",MO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const IO=[["circle",{cx:"15",cy:"12",r:"3",key:"1afu0r"}],["rect",{width:"20",height:"14",x:"2",y:"5",rx:"7",key:"g7kal2"}]],Ix=ee("toggle-right",IO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $O=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],LO=ee("trash-2",$O);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const zO=[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]],RO=ee("trending-down",zO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const BO=[["path",{d:"M16 7h6v6",key:"box55l"}],["path",{d:"m22 7-8.5 8.5-5-5L2 17",key:"1t1m79"}]],zn=ee("trending-up",BO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const FO=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],nj=ee("triangle-alert",FO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const WO=[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]],UO=ee("upload",WO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qO=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]],HO=ee("wrench",qO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const KO=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],ij=ee("x",KO);/** - * @license lucide-react v0.553.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const VO=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],$x=ee("zap",VO);function Ge({to:e,icon:t,label:r,isActive:n}){return a.jsxs("a",{href:e,className:`flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${n?"bg-blue-50 text-blue-600":"text-gray-700 hover:bg-gray-50"}`,children:[a.jsx("span",{className:"flex-shrink-0",children:t}),a.jsx("span",{children:r})]})}function Do({title:e,children:t}){return a.jsxs("div",{className:"space-y-1",children:[a.jsx("div",{className:"px-3 mb-2",children:a.jsx("h3",{className:"text-xs font-semibold text-gray-400 uppercase tracking-wider",children:e})}),t]})}function X({children:e}){const t=dt(),r=_i(),{user:n,logout:i}=Ph(),[s,o]=h.useState(null);h.useEffect(()=>{(async()=>{try{const u=await B.getVersion();o(u)}catch(u){console.error("Failed to fetch version info:",u)}})()},[]);const l=()=>{i(),t("/login")},c=(d,u=!0)=>u?r.pathname===d:r.pathname.startsWith(d);return a.jsxs("div",{className:"flex min-h-screen bg-gray-50",children:[a.jsxs("div",{className:"w-64 bg-white border-r border-gray-200 flex flex-col",style:{position:"sticky",top:0,height:"100vh",overflowY:"auto"},children:[a.jsxs("div",{className:"px-6 py-5 border-b border-gray-200",children:[a.jsx("h1",{className:"text-lg font-semibold text-gray-900",children:"Dutchie Analytics"}),a.jsx("p",{className:"text-xs text-gray-500 mt-0.5",children:n==null?void 0:n.email})]}),a.jsxs("nav",{className:"flex-1 px-3 py-4 space-y-6",children:[a.jsxs(Do,{title:"Main",children:[a.jsx(Ge,{to:"/",icon:a.jsx(pO,{className:"w-4 h-4"}),label:"Dashboard",isActive:c("/",!0)}),a.jsx(Ge,{to:"/dispensaries",icon:a.jsx(Ln,{className:"w-4 h-4"}),label:"Dispensaries",isActive:c("/dispensaries")}),a.jsx(Ge,{to:"/categories",icon:a.jsx(sO,{className:"w-4 h-4"}),label:"Categories",isActive:c("/categories")}),a.jsx(Ge,{to:"/products",icon:a.jsx(Ct,{className:"w-4 h-4"}),label:"Products",isActive:c("/products")}),a.jsx(Ge,{to:"/campaigns",icon:a.jsx(rj,{className:"w-4 h-4"}),label:"Campaigns",isActive:c("/campaigns")}),a.jsx(Ge,{to:"/analytics",icon:a.jsx(zn,{className:"w-4 h-4"}),label:"Analytics",isActive:c("/analytics")})]}),a.jsxs(Do,{title:"AZ Data",children:[a.jsx(Ge,{to:"/wholesale-analytics",icon:a.jsx(zn,{className:"w-4 h-4"}),label:"Wholesale Analytics",isActive:c("/wholesale-analytics")}),a.jsx(Ge,{to:"/az",icon:a.jsx(Il,{className:"w-4 h-4"}),label:"AZ Stores",isActive:c("/az",!1)}),a.jsx(Ge,{to:"/az-schedule",icon:a.jsx(Ch,{className:"w-4 h-4"}),label:"AZ Schedule",isActive:c("/az-schedule")})]}),a.jsxs(Do,{title:"Scraper",children:[a.jsx(Ge,{to:"/scraper-tools",icon:a.jsx(HO,{className:"w-4 h-4"}),label:"Tools",isActive:c("/scraper-tools")}),a.jsx(Ge,{to:"/scraper-schedule",icon:a.jsx(xr,{className:"w-4 h-4"}),label:"Schedule",isActive:c("/scraper-schedule")}),a.jsx(Ge,{to:"/scraper-monitor",icon:a.jsx(na,{className:"w-4 h-4"}),label:"Monitor",isActive:c("/scraper-monitor")})]}),a.jsxs(Do,{title:"System",children:[a.jsx(Ge,{to:"/changes",icon:a.jsx(_r,{className:"w-4 h-4"}),label:"Change Approval",isActive:c("/changes")}),a.jsx(Ge,{to:"/api-permissions",icon:a.jsx(uO,{className:"w-4 h-4"}),label:"API Permissions",isActive:c("/api-permissions")}),a.jsx(Ge,{to:"/proxies",icon:a.jsx(sl,{className:"w-4 h-4"}),label:"Proxies",isActive:c("/proxies")}),a.jsx(Ge,{to:"/logs",icon:a.jsx(iO,{className:"w-4 h-4"}),label:"Logs",isActive:c("/logs")}),a.jsx(Ge,{to:"/settings",icon:a.jsx(AO,{className:"w-4 h-4"}),label:"Settings",isActive:c("/settings")})]})]}),a.jsx("div",{className:"px-3 py-4 border-t border-gray-200",children:a.jsxs("button",{onClick:l,className:"w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium text-red-600 hover:bg-red-50 transition-colors",children:[a.jsx(mO,{className:"w-4 h-4"}),a.jsx("span",{children:"Logout"})]})}),s&&a.jsxs("div",{className:"px-3 py-2 border-t border-gray-200 bg-gray-50",children:[a.jsxs("p",{className:"text-xs text-gray-500 text-center",children:[s.build_version," (",s.git_sha.slice(0,7),")"]}),a.jsx("p",{className:"text-xs text-gray-400 text-center mt-0.5",children:s.image_tag})]})]}),a.jsx("div",{className:"flex-1 overflow-y-auto",children:a.jsx("div",{className:"max-w-7xl mx-auto px-8 py-8",children:e})})]})}function aj(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t{var[n]=r;return sj(n)||oj(n)});return Object.fromEntries(t)}function qc(e){if(e==null)return null;if(h.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return nr(t)}return typeof e=="object"&&!Array.isArray(e)?nr(e):null}function ut(e){var t=Object.entries(e).filter(r=>{var[n]=r;return sj(n)||oj(n)||Oh(n)});return Object.fromEntries(t)}function ZO(e){return e==null?null:h.isValidElement(e)?ut(e.props):typeof e=="object"&&!Array.isArray(e)?ut(e):null}var XO=["children","width","height","viewBox","className","style","title","desc"];function Of(){return Of=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{children:r,width:n,height:i,viewBox:s,className:o,style:l,title:c,desc:d}=e,u=JO(e,XO),f=s||{width:n,height:i,x:0,y:0},p=ce("recharts-surface",o);return h.createElement("svg",Of({},ut(u),{className:p,width:n,height:i,style:l,viewBox:"".concat(f.x," ").concat(f.y," ").concat(f.width," ").concat(f.height),ref:t}),h.createElement("title",null,c),h.createElement("desc",null,d),r)}),e6=["children","className"];function Ef(){return Ef=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{children:r,className:n}=e,i=t6(e,e6),s=ce("recharts-layer",n);return h.createElement("g",Ef({className:s},ut(i),{ref:t}),r)}),n6=h.createContext(null);function he(e){return function(){return e}}const cj=Math.cos,$l=Math.sin,vr=Math.sqrt,Ll=Math.PI,Hc=2*Ll,Df=Math.PI,Tf=2*Df,Xn=1e-6,i6=Tf-Xn;function uj(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return uj;const r=10**t;return function(n){this._+=n[0];for(let i=1,s=n.length;iXn)if(!(Math.abs(f*c-d*u)>Xn)||!s)this._append`L${this._x1=t},${this._y1=r}`;else{let m=n-o,x=i-l,g=c*c+d*d,b=m*m+x*x,v=Math.sqrt(g),j=Math.sqrt(p),y=s*Math.tan((Df-Math.acos((g+p-b)/(2*v*j)))/2),w=y/j,S=y/v;Math.abs(w-1)>Xn&&this._append`L${t+w*u},${r+w*f}`,this._append`A${s},${s},0,0,${+(f*m>u*x)},${this._x1=t+S*c},${this._y1=r+S*d}`}}arc(t,r,n,i,s,o){if(t=+t,r=+r,n=+n,o=!!o,n<0)throw new Error(`negative radius: ${n}`);let l=n*Math.cos(i),c=n*Math.sin(i),d=t+l,u=r+c,f=1^o,p=o?i-s:s-i;this._x1===null?this._append`M${d},${u}`:(Math.abs(this._x1-d)>Xn||Math.abs(this._y1-u)>Xn)&&this._append`L${d},${u}`,n&&(p<0&&(p=p%Tf+Tf),p>i6?this._append`A${n},${n},0,1,${f},${t-l},${r-c}A${n},${n},0,1,${f},${this._x1=d},${this._y1=u}`:p>Xn&&this._append`A${n},${n},0,${+(p>=Df)},${f},${this._x1=t+n*Math.cos(s)},${this._y1=r+n*Math.sin(s)}`)}rect(t,r,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function Eh(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new s6(t)}function Dh(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function dj(e){this._context=e}dj.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function Kc(e){return new dj(e)}function fj(e){return e[0]}function pj(e){return e[1]}function hj(e,t){var r=he(!0),n=null,i=Kc,s=null,o=Eh(l);e=typeof e=="function"?e:e===void 0?fj:he(e),t=typeof t=="function"?t:t===void 0?pj:he(t);function l(c){var d,u=(c=Dh(c)).length,f,p=!1,m;for(n==null&&(s=i(m=o())),d=0;d<=u;++d)!(d=m;--x)l.point(y[x],w[x]);l.lineEnd(),l.areaEnd()}v&&(y[p]=+e(b,p,f),w[p]=+t(b,p,f),l.point(n?+n(b,p,f):y[p],r?+r(b,p,f):w[p]))}if(j)return l=null,j+""||null}function u(){return hj().defined(i).curve(o).context(s)}return d.x=function(f){return arguments.length?(e=typeof f=="function"?f:he(+f),n=null,d):e},d.x0=function(f){return arguments.length?(e=typeof f=="function"?f:he(+f),d):e},d.x1=function(f){return arguments.length?(n=f==null?null:typeof f=="function"?f:he(+f),d):n},d.y=function(f){return arguments.length?(t=typeof f=="function"?f:he(+f),r=null,d):t},d.y0=function(f){return arguments.length?(t=typeof f=="function"?f:he(+f),d):t},d.y1=function(f){return arguments.length?(r=f==null?null:typeof f=="function"?f:he(+f),d):r},d.lineX0=d.lineY0=function(){return u().x(e).y(t)},d.lineY1=function(){return u().x(e).y(r)},d.lineX1=function(){return u().x(n).y(t)},d.defined=function(f){return arguments.length?(i=typeof f=="function"?f:he(!!f),d):i},d.curve=function(f){return arguments.length?(o=f,s!=null&&(l=o(s)),d):o},d.context=function(f){return arguments.length?(f==null?s=l=null:l=o(s=f),d):s},d}class mj{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function o6(e){return new mj(e,!0)}function l6(e){return new mj(e,!1)}const Th={draw(e,t){const r=vr(t/Ll);e.moveTo(r,0),e.arc(0,0,r,0,Hc)}},c6={draw(e,t){const r=vr(t/5)/2;e.moveTo(-3*r,-r),e.lineTo(-r,-r),e.lineTo(-r,-3*r),e.lineTo(r,-3*r),e.lineTo(r,-r),e.lineTo(3*r,-r),e.lineTo(3*r,r),e.lineTo(r,r),e.lineTo(r,3*r),e.lineTo(-r,3*r),e.lineTo(-r,r),e.lineTo(-3*r,r),e.closePath()}},gj=vr(1/3),u6=gj*2,d6={draw(e,t){const r=vr(t/u6),n=r*gj;e.moveTo(0,-r),e.lineTo(n,0),e.lineTo(0,r),e.lineTo(-n,0),e.closePath()}},f6={draw(e,t){const r=vr(t),n=-r/2;e.rect(n,n,r,r)}},p6=.8908130915292852,xj=$l(Ll/10)/$l(7*Ll/10),h6=$l(Hc/10)*xj,m6=-cj(Hc/10)*xj,g6={draw(e,t){const r=vr(t*p6),n=h6*r,i=m6*r;e.moveTo(0,-r),e.lineTo(n,i);for(let s=1;s<5;++s){const o=Hc*s/5,l=cj(o),c=$l(o);e.lineTo(c*r,-l*r),e.lineTo(l*n-c*i,c*n+l*i)}e.closePath()}},cd=vr(3),x6={draw(e,t){const r=-vr(t/(cd*3));e.moveTo(0,r*2),e.lineTo(-cd*r,-r),e.lineTo(cd*r,-r),e.closePath()}},Ht=-.5,Kt=vr(3)/2,Mf=1/vr(12),y6=(Mf/2+1)*3,v6={draw(e,t){const r=vr(t/y6),n=r/2,i=r*Mf,s=n,o=r*Mf+r,l=-s,c=o;e.moveTo(n,i),e.lineTo(s,o),e.lineTo(l,c),e.lineTo(Ht*n-Kt*i,Kt*n+Ht*i),e.lineTo(Ht*s-Kt*o,Kt*s+Ht*o),e.lineTo(Ht*l-Kt*c,Kt*l+Ht*c),e.lineTo(Ht*n+Kt*i,Ht*i-Kt*n),e.lineTo(Ht*s+Kt*o,Ht*o-Kt*s),e.lineTo(Ht*l+Kt*c,Ht*c-Kt*l),e.closePath()}};function b6(e,t){let r=null,n=Eh(i);e=typeof e=="function"?e:he(e||Th),t=typeof t=="function"?t:he(t===void 0?64:+t);function i(){let s;if(r||(r=s=n()),e.apply(this,arguments).draw(r,+t.apply(this,arguments)),s)return r=null,s+""||null}return i.type=function(s){return arguments.length?(e=typeof s=="function"?s:he(s),i):e},i.size=function(s){return arguments.length?(t=typeof s=="function"?s:he(+s),i):t},i.context=function(s){return arguments.length?(r=s??null,i):r},i}function zl(){}function Rl(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function yj(e){this._context=e}yj.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Rl(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Rl(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function j6(e){return new yj(e)}function vj(e){this._context=e}vj.prototype={areaStart:zl,areaEnd:zl,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:Rl(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function w6(e){return new vj(e)}function bj(e){this._context=e}bj.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Rl(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function S6(e){return new bj(e)}function jj(e){this._context=e}jj.prototype={areaStart:zl,areaEnd:zl,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function N6(e){return new jj(e)}function Lx(e){return e<0?-1:1}function zx(e,t,r){var n=e._x1-e._x0,i=t-e._x1,s=(e._y1-e._y0)/(n||i<0&&-0),o=(r-e._y1)/(i||n<0&&-0),l=(s*i+o*n)/(n+i);return(Lx(s)+Lx(o))*Math.min(Math.abs(s),Math.abs(o),.5*Math.abs(l))||0}function Rx(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function ud(e,t,r){var n=e._x0,i=e._y0,s=e._x1,o=e._y1,l=(s-n)/3;e._context.bezierCurveTo(n+l,i+l*t,s-l,o-l*r,s,o)}function Bl(e){this._context=e}Bl.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:ud(this,this._t0,Rx(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,ud(this,Rx(this,r=zx(this,e,t)),r);break;default:ud(this,this._t0,r=zx(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function wj(e){this._context=new Sj(e)}(wj.prototype=Object.create(Bl.prototype)).point=function(e,t){Bl.prototype.point.call(this,t,e)};function Sj(e){this._context=e}Sj.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,i,s){this._context.bezierCurveTo(t,e,n,r,s,i)}};function k6(e){return new Bl(e)}function P6(e){return new wj(e)}function Nj(e){this._context=e}Nj.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Bx(e),i=Bx(t),s=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/s[t];for(s[r-1]=(e[r]+i[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function C6(e){return new Vc(e,.5)}function A6(e){return new Vc(e,0)}function O6(e){return new Vc(e,1)}function ha(e,t){if((o=e.length)>1)for(var r=1,n,i,s=e[t[0]],o,l=s.length;r=0;)r[t]=t;return r}function E6(e,t){return e[t]}function D6(e){const t=[];return t.key=e,t}function T6(){var e=he([]),t=If,r=ha,n=E6;function i(s){var o=Array.from(e.apply(this,arguments),D6),l,c=o.length,d=-1,u;for(const f of s)for(l=0,++d;l0){for(var r,n,i=0,s=e[0].length,o;i0){for(var r=0,n=e[t[0]],i,s=n.length;r0)||!((s=(i=e[t[0]]).length)>0))){for(var r=0,n=1,i,s,o;ne===0?0:e>0?1:-1,yr=e=>typeof e=="number"&&e!=+e,Qr=e=>typeof e=="string"&&e.indexOf("%")===e.length-1,Y=e=>(typeof e=="number"||e instanceof Number)&&!yr(e),Or=e=>Y(e)||typeof e=="string",z6=0,Ts=e=>{var t=++z6;return"".concat(e||"").concat(t)},Rn=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!Y(t)&&typeof t!="string")return n;var s;if(Qr(t)){if(r==null)return n;var o=t.indexOf("%");s=r*parseFloat(t.slice(0,o))/100}else s=+t;return yr(s)&&(s=n),i&&r!=null&&s>r&&(s=r),s},_j=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):Xc(n,t))===r)}var Re=e=>e===null||typeof e>"u",Xs=e=>Re(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function R6(e){return e!=null}function Pa(){}var B6=["type","size","sizeType"];function $f(){return $f=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t="symbol".concat(Xs(e));return Aj[t]||Th},Y6=(e,t,r)=>{if(t==="area")return e;switch(r){case"cross":return 5*e*e/9;case"diamond":return .5*e*e/Math.sqrt(3);case"square":return e*e;case"star":{var n=18*K6;return 1.25*e*e*(Math.tan(n)-Math.tan(n*2)*Math.tan(n)**2)}case"triangle":return Math.sqrt(3)*e*e/4;case"wye":return(21-10*Math.sqrt(3))*e*e/8;default:return Math.PI*e*e/4}},G6=(e,t)=>{Aj["symbol".concat(Xs(e))]=t},Oj=e=>{var{type:t="circle",size:r=64,sizeType:n="area"}=e,i=q6(e,B6),s=Wx(Wx({},i),{},{type:t,size:r,sizeType:n}),o="circle";typeof t=="string"&&(o=t);var l=()=>{var p=V6(o),m=b6().type(p).size(Y6(r,n,o)),x=m();if(x!==null)return x},{className:c,cx:d,cy:u}=s,f=ut(s);return Y(d)&&Y(u)&&Y(r)?h.createElement("path",$f({},f,{className:ce("recharts-symbols",c),transform:"translate(".concat(d,", ").concat(u,")"),d:l()})):null};Oj.registerSymbol=G6;var Ej=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Ih=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(h.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(i=>{Oh(i)&&(n[i]=s=>r[i](r,s))}),n},Z6=(e,t,r)=>n=>(e(t,r,n),null),X6=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(i=>{var s=e[i];Oh(i)&&typeof s=="function"&&(n||(n={}),n[i]=Z6(s,t,r))}),n};function Ux(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function J6(e){for(var t=1;t(o[l]===void 0&&n[l]!==void 0&&(o[l]=n[l]),o),r);return s}var Dj={},Tj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r,n){const i=new Map;for(let s=0;s=0}e.isLength=t})(Ij);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Ij;function r(n){return n!=null&&typeof n!="function"&&t.isLength(n.length)}e.isArrayLike=r})(Jc);var $j={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return typeof r=="object"&&r!==null}e.isObjectLike=t})($j);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Jc,r=$j;function n(i){return r.isObjectLike(i)&&t.isArrayLike(i)}e.isArrayLikeObject=n})(Mj);var Lj={},zj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Yc;function r(n){return function(i){return t.get(i,n)}}e.property=r})(zj);var Rj={},Lh={},Bj={},zh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r!==null&&(typeof r=="object"||typeof r=="function")}e.isObject=t})(zh);var Rh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r==null||typeof r!="object"&&typeof r!="function"}e.isPrimitive=t})(Rh);var Bh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r,n){return r===n||Number.isNaN(r)&&Number.isNaN(n)}e.eq=t})(Bh);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=zh,r=Rh,n=Bh;function i(u,f,p){return typeof p!="function"?i(u,f,()=>{}):s(u,f,function m(x,g,b,v,j,y){const w=p(x,g,b,v,j,y);return w!==void 0?!!w:s(x,g,m,y)},new Map)}function s(u,f,p,m){if(f===u)return!0;switch(typeof f){case"object":return o(u,f,p,m);case"function":return Object.keys(f).length>0?s(u,{...f},p,m):n.eq(u,f);default:return t.isObject(u)?typeof f=="string"?f==="":!0:n.eq(u,f)}}function o(u,f,p,m){if(f==null)return!0;if(Array.isArray(f))return c(u,f,p,m);if(f instanceof Map)return l(u,f,p,m);if(f instanceof Set)return d(u,f,p,m);const x=Object.keys(f);if(u==null)return x.length===0;if(x.length===0)return!0;if(m!=null&&m.has(f))return m.get(f)===u;m==null||m.set(f,u);try{for(let g=0;g{})}e.isMatch=r})(Lh);var Fj={},Fh={},Wj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return Object.getOwnPropertySymbols(r).filter(n=>Object.prototype.propertyIsEnumerable.call(r,n))}e.getSymbols=t})(Wj);var Wh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r==null?r===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(r)}e.getTag=t})(Wh);var Uh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t="[object RegExp]",r="[object String]",n="[object Number]",i="[object Boolean]",s="[object Arguments]",o="[object Symbol]",l="[object Date]",c="[object Map]",d="[object Set]",u="[object Array]",f="[object Function]",p="[object ArrayBuffer]",m="[object Object]",x="[object Error]",g="[object DataView]",b="[object Uint8Array]",v="[object Uint8ClampedArray]",j="[object Uint16Array]",y="[object Uint32Array]",w="[object BigUint64Array]",S="[object Int8Array]",N="[object Int16Array]",P="[object Int32Array]",_="[object BigInt64Array]",T="[object Float32Array]",$="[object Float64Array]";e.argumentsTag=s,e.arrayBufferTag=p,e.arrayTag=u,e.bigInt64ArrayTag=_,e.bigUint64ArrayTag=w,e.booleanTag=i,e.dataViewTag=g,e.dateTag=l,e.errorTag=x,e.float32ArrayTag=T,e.float64ArrayTag=$,e.functionTag=f,e.int16ArrayTag=N,e.int32ArrayTag=P,e.int8ArrayTag=S,e.mapTag=c,e.numberTag=n,e.objectTag=m,e.regexpTag=t,e.setTag=d,e.stringTag=r,e.symbolTag=o,e.uint16ArrayTag=j,e.uint32ArrayTag=y,e.uint8ArrayTag=b,e.uint8ClampedArrayTag=v})(Uh);var Uj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return ArrayBuffer.isView(r)&&!(r instanceof DataView)}e.isTypedArray=t})(Uj);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Wj,r=Wh,n=Uh,i=Rh,s=Uj;function o(u,f){return l(u,void 0,u,new Map,f)}function l(u,f,p,m=new Map,x=void 0){const g=x==null?void 0:x(u,f,p,m);if(g!==void 0)return g;if(i.isPrimitive(u))return u;if(m.has(u))return m.get(u);if(Array.isArray(u)){const b=new Array(u.length);m.set(u,b);for(let v=0;vt.isMatch(s,i)}e.matches=n})(Rj);var qj={},Hj={},Kj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Fh,r=Uh;function n(i,s){return t.cloneDeepWith(i,(o,l,c,d)=>{const u=s==null?void 0:s(o,l,c,d);if(u!==void 0)return u;if(typeof i=="object")switch(Object.prototype.toString.call(i)){case r.numberTag:case r.stringTag:case r.booleanTag:{const f=new i.constructor(i==null?void 0:i.valueOf());return t.copyProperties(f,i),f}case r.argumentsTag:{const f={};return t.copyProperties(f,i),f.length=i.length,f[Symbol.iterator]=i[Symbol.iterator],f}default:return}})}e.cloneDeepWith=n})(Kj);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Kj;function r(n){return t.cloneDeepWith(n)}e.cloneDeep=r})(Hj);var Vj={},qh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=/^(?:0|[1-9]\d*)$/;function r(n,i=Number.MAX_SAFE_INTEGER){switch(typeof n){case"number":return Number.isInteger(n)&&n>=0&&ne,Ve=()=>{var e=h.useContext(Hh);return e?e.store.dispatch:i4},ol=()=>{},a4=()=>ol,s4=(e,t)=>e===t;function G(e){var t=h.useContext(Hh);return X1.useSyncExternalStoreWithSelector(t?t.subscription.addNestedSub:a4,t?t.store.getState:ol,t?t.store.getState:ol,t?e:ol,s4)}function o4(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function l4(e,t=`expected an object, instead received ${typeof e}`){if(typeof e!="object")throw new TypeError(t)}function c4(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(r=>typeof r=="function")){const r=e.map(n=>typeof n=="function"?`function ${n.name||"unnamed"}()`:typeof n).join(", ");throw new TypeError(`${t}[${r}]`)}}var Hx=e=>Array.isArray(e)?e:[e];function u4(e){const t=Array.isArray(e[0])?e[0]:e;return c4(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function d4(e,t){const r=[],{length:n}=e;for(let i=0;i{r=Mo(),o.resetResultsCount()},o.resultsCount=()=>s,o.resetResultsCount=()=>{s=0},o}function m4(e,...t){const r=typeof e=="function"?{memoize:e,memoizeOptions:t}:e,n=(...i)=>{let s=0,o=0,l,c={},d=i.pop();typeof d=="object"&&(c=d,d=i.pop()),o4(d,`createSelector expects an output function after the inputs, but received: [${typeof d}]`);const u={...r,...c},{memoize:f,memoizeOptions:p=[],argsMemoize:m=Gj,argsMemoizeOptions:x=[]}=u,g=Hx(p),b=Hx(x),v=u4(i),j=f(function(){return s++,d.apply(null,arguments)},...g),y=m(function(){o++;const S=d4(v,arguments);return l=j.apply(null,S),l},...b);return Object.assign(y,{resultFunc:d,memoizedResultFunc:j,dependencies:v,dependencyRecomputations:()=>o,resetDependencyRecomputations:()=>{o=0},lastResult:()=>l,recomputations:()=>s,resetRecomputations:()=>{s=0},memoize:f,argsMemoize:m})};return Object.assign(n,{withTypes:()=>n}),n}var I=m4(Gj),g4=Object.assign((e,t=I)=>{l4(e,`createStructuredSelector expects first argument to be an object where each property is a selector, instead received a ${typeof e}`);const r=Object.keys(e),n=r.map(s=>e[s]);return t(n,(...s)=>s.reduce((o,l,c)=>(o[r[c]]=l,o),{}))},{withTypes:()=>g4}),Zj={},Xj={},Jj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(n){return typeof n=="symbol"?1:n===null?2:n===void 0?3:n!==n?4:0}const r=(n,i,s)=>{if(n!==i){const o=t(n),l=t(i);if(o===l&&o===0){if(ni)return s==="desc"?-1:1}return s==="desc"?l-o:o-l}return 0};e.compareValues=r})(Jj);var Qj={},Kh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return typeof r=="symbol"||r instanceof Symbol}e.isSymbol=t})(Kh);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Kh,r=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,n=/^\w*$/;function i(s,o){return Array.isArray(s)?!1:typeof s=="number"||typeof s=="boolean"||s==null||t.isSymbol(s)?!0:typeof s=="string"&&(n.test(s)||!r.test(s))||o!=null&&Object.hasOwn(o,s)}e.isKey=i})(Qj);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Jj,r=Qj,n=Zc;function i(s,o,l,c){if(s==null)return[];l=c?void 0:l,Array.isArray(s)||(s=Object.values(s)),Array.isArray(o)||(o=o==null?[null]:[o]),o.length===0&&(o=[null]),Array.isArray(l)||(l=l==null?[]:[l]),l=l.map(m=>String(m));const d=(m,x)=>{let g=m;for(let b=0;bx==null||m==null?x:typeof m=="object"&&"key"in m?Object.hasOwn(x,m.key)?x[m.key]:d(x,m.path):typeof m=="function"?m(x):Array.isArray(m)?d(x,m):typeof x=="object"?x[m]:x,f=o.map(m=>(Array.isArray(m)&&m.length===1&&(m=m[0]),m==null||typeof m=="function"||Array.isArray(m)||r.isKey(m)?m:{key:m,path:n.toPath(m)}));return s.map(m=>({original:m,criteria:f.map(x=>u(x,m))})).slice().sort((m,x)=>{for(let g=0;gm.original)}e.orderBy=i})(Xj);var ew={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r,n=1){const i=[],s=Math.floor(n),o=(l,c)=>{for(let d=0;d1&&n.isIterateeCall(s,o[0],o[1])?o=[]:l>2&&n.isIterateeCall(o[0],o[1],o[2])&&(o=[o[0]]),t.orderBy(s,r.flatten(o),["asc"])}e.sortBy=i})(Zj);var x4=Zj.sortBy;const Qc=Tr(x4);var tw=e=>e.legend.settings,y4=e=>e.legend.size,v4=e=>e.legend.payload;I([v4,tw],(e,t)=>{var{itemSorter:r}=t,n=e.flat(1);return r?Qc(n,r):n});var Io=1;function b4(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],[t,r]=h.useState({height:0,left:0,top:0,width:0}),n=h.useCallback(i=>{if(i!=null){var s=i.getBoundingClientRect(),o={height:s.height,left:s.left,top:s.top,width:s.width};(Math.abs(o.height-t.height)>Io||Math.abs(o.left-t.left)>Io||Math.abs(o.top-t.top)>Io||Math.abs(o.width-t.width)>Io)&&r({height:o.height,left:o.left,top:o.top,width:o.width})}},[t.width,t.height,t.top,t.left,...e]);return[t,n]}function Ze(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var j4=typeof Symbol=="function"&&Symbol.observable||"@@observable",Vx=j4,dd=()=>Math.random().toString(36).substring(7).split("").join("."),w4={INIT:`@@redux/INIT${dd()}`,REPLACE:`@@redux/REPLACE${dd()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${dd()}`},Fl=w4;function Yh(e){if(typeof e!="object"||e===null)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function rw(e,t,r){if(typeof e!="function")throw new Error(Ze(2));if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(Ze(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Ze(1));return r(rw)(e,t)}let n=e,i=t,s=new Map,o=s,l=0,c=!1;function d(){o===s&&(o=new Map,s.forEach((b,v)=>{o.set(v,b)}))}function u(){if(c)throw new Error(Ze(3));return i}function f(b){if(typeof b!="function")throw new Error(Ze(4));if(c)throw new Error(Ze(5));let v=!0;d();const j=l++;return o.set(j,b),function(){if(v){if(c)throw new Error(Ze(6));v=!1,d(),o.delete(j),s=null}}}function p(b){if(!Yh(b))throw new Error(Ze(7));if(typeof b.type>"u")throw new Error(Ze(8));if(typeof b.type!="string")throw new Error(Ze(17));if(c)throw new Error(Ze(9));try{c=!0,i=n(i,b)}finally{c=!1}return(s=o).forEach(j=>{j()}),b}function m(b){if(typeof b!="function")throw new Error(Ze(10));n=b,p({type:Fl.REPLACE})}function x(){const b=f;return{subscribe(v){if(typeof v!="object"||v===null)throw new Error(Ze(11));function j(){const w=v;w.next&&w.next(u())}return j(),{unsubscribe:b(j)}},[Vx](){return this}}}return p({type:Fl.INIT}),{dispatch:p,subscribe:f,getState:u,replaceReducer:m,[Vx]:x}}function S4(e){Object.keys(e).forEach(t=>{const r=e[t];if(typeof r(void 0,{type:Fl.INIT})>"u")throw new Error(Ze(12));if(typeof r(void 0,{type:Fl.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Ze(13))})}function nw(e){const t=Object.keys(e),r={};for(let s=0;s"u")throw l&&l.type,new Error(Ze(14));d[f]=x,c=c||x!==m}return c=c||n.length!==Object.keys(o).length,c?d:o}}function Wl(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,r)=>(...n)=>t(r(...n)))}function N4(...e){return t=>(r,n)=>{const i=t(r,n);let s=()=>{throw new Error(Ze(15))};const o={getState:i.getState,dispatch:(c,...d)=>s(c,...d)},l=e.map(c=>c(o));return s=Wl(...l)(i.dispatch),{...i,dispatch:s}}}function iw(e){return Yh(e)&&"type"in e&&typeof e.type=="string"}var aw=Symbol.for("immer-nothing"),Yx=Symbol.for("immer-draftable"),Wt=Symbol.for("immer-state");function fr(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Ms=Object.getPrototypeOf;function vi(e){return!!e&&!!e[Wt]}function en(e){var t;return e?sw(e)||Array.isArray(e)||!!e[Yx]||!!((t=e.constructor)!=null&&t[Yx])||Js(e)||tu(e):!1}var k4=Object.prototype.constructor.toString(),Gx=new WeakMap;function sw(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);if(t===null||t===Object.prototype)return!0;const r=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(r===Object)return!0;if(typeof r!="function")return!1;let n=Gx.get(r);return n===void 0&&(n=Function.toString.call(r),Gx.set(r,n)),n===k4}function Ul(e,t,r=!0){eu(e)===0?(r?Reflect.ownKeys(e):Object.keys(e)).forEach(i=>{t(i,e[i],e)}):e.forEach((n,i)=>t(i,n,e))}function eu(e){const t=e[Wt];return t?t.type_:Array.isArray(e)?1:Js(e)?2:tu(e)?3:0}function Lf(e,t){return eu(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function ow(e,t,r){const n=eu(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function P4(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function Js(e){return e instanceof Map}function tu(e){return e instanceof Set}function Jn(e){return e.copy_||e.base_}function zf(e,t){if(Js(e))return new Map(e);if(tu(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const r=sw(e);if(t===!0||t==="class_only"&&!r){const n=Object.getOwnPropertyDescriptors(e);delete n[Wt];let i=Reflect.ownKeys(n);for(let s=0;s1&&Object.defineProperties(e,{set:$o,add:$o,clear:$o,delete:$o}),Object.freeze(e),t&&Object.values(e).forEach(r=>Gh(r,!0))),e}function _4(){fr(2)}var $o={value:_4};function ru(e){return e===null||typeof e!="object"?!0:Object.isFrozen(e)}var C4={};function bi(e){const t=C4[e];return t||fr(0,e),t}var Is;function lw(){return Is}function A4(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Zx(e,t){t&&(bi("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Rf(e){Bf(e),e.drafts_.forEach(O4),e.drafts_=null}function Bf(e){e===Is&&(Is=e.parent_)}function Xx(e){return Is=A4(Is,e)}function O4(e){const t=e[Wt];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function Jx(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];return e!==void 0&&e!==r?(r[Wt].modified_&&(Rf(t),fr(4)),en(e)&&(e=ql(t,e),t.parent_||Hl(t,e)),t.patches_&&bi("Patches").generateReplacementPatches_(r[Wt].base_,e,t.patches_,t.inversePatches_)):e=ql(t,r,[]),Rf(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==aw?e:void 0}function ql(e,t,r){if(ru(t))return t;const n=e.immer_.shouldUseStrictIteration(),i=t[Wt];if(!i)return Ul(t,(s,o)=>Qx(e,i,t,s,o,r),n),t;if(i.scope_!==e)return t;if(!i.modified_)return Hl(e,i.base_,!0),i.base_;if(!i.finalized_){i.finalized_=!0,i.scope_.unfinalizedDrafts_--;const s=i.copy_;let o=s,l=!1;i.type_===3&&(o=new Set(s),s.clear(),l=!0),Ul(o,(c,d)=>Qx(e,i,s,c,d,r,l),n),Hl(e,s,!1),r&&e.patches_&&bi("Patches").generatePatches_(i,r,e.patches_,e.inversePatches_)}return i.copy_}function Qx(e,t,r,n,i,s,o){if(i==null||typeof i!="object"&&!o)return;const l=ru(i);if(!(l&&!o)){if(vi(i)){const c=s&&t&&t.type_!==3&&!Lf(t.assigned_,n)?s.concat(n):void 0,d=ql(e,i,c);if(ow(r,n,d),vi(d))e.canAutoFreeze_=!1;else return}else o&&r.add(i);if(en(i)&&!l){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1||t&&t.base_&&t.base_[n]===i&&l)return;ql(e,i),(!t||!t.scope_.parent_)&&typeof n!="symbol"&&(Js(r)?r.has(n):Object.prototype.propertyIsEnumerable.call(r,n))&&Hl(e,i)}}}function Hl(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Gh(t,r)}function E4(e,t){const r=Array.isArray(e),n={type_:r?1:0,scope_:t?t.scope_:lw(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let i=n,s=Zh;r&&(i=[n],s=$s);const{revoke:o,proxy:l}=Proxy.revocable(i,s);return n.draft_=l,n.revoke_=o,l}var Zh={get(e,t){if(t===Wt)return e;const r=Jn(e);if(!Lf(r,t))return D4(e,r,t);const n=r[t];return e.finalized_||!en(n)?n:n===fd(e.base_,t)?(pd(e),e.copy_[t]=Wf(n,e)):n},has(e,t){return t in Jn(e)},ownKeys(e){return Reflect.ownKeys(Jn(e))},set(e,t,r){const n=cw(Jn(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const i=fd(Jn(e),t),s=i==null?void 0:i[Wt];if(s&&s.base_===r)return e.copy_[t]=r,e.assigned_[t]=!1,!0;if(P4(r,i)&&(r!==void 0||Lf(e.base_,t)))return!0;pd(e),Ff(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_[t]=!0),!0},deleteProperty(e,t){return fd(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,pd(e),Ff(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=Jn(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:n.enumerable,value:r[t]}},defineProperty(){fr(11)},getPrototypeOf(e){return Ms(e.base_)},setPrototypeOf(){fr(12)}},$s={};Ul(Zh,(e,t)=>{$s[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});$s.deleteProperty=function(e,t){return $s.set.call(this,e,t,void 0)};$s.set=function(e,t,r){return Zh.set.call(this,e[0],t,r,e[0])};function fd(e,t){const r=e[Wt];return(r?Jn(r):e)[t]}function D4(e,t,r){var i;const n=cw(t,r);return n?"value"in n?n.value:(i=n.get)==null?void 0:i.call(e.draft_):void 0}function cw(e,t){if(!(t in e))return;let r=Ms(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Ms(r)}}function Ff(e){e.modified_||(e.modified_=!0,e.parent_&&Ff(e.parent_))}function pd(e){e.copy_||(e.copy_=zf(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var T4=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(t,r,n)=>{if(typeof t=="function"&&typeof r!="function"){const s=r;r=t;const o=this;return function(c=s,...d){return o.produce(c,u=>r.call(this,u,...d))}}typeof r!="function"&&fr(6),n!==void 0&&typeof n!="function"&&fr(7);let i;if(en(t)){const s=Xx(this),o=Wf(t,void 0);let l=!0;try{i=r(o),l=!1}finally{l?Rf(s):Bf(s)}return Zx(s,n),Jx(i,s)}else if(!t||typeof t!="object"){if(i=r(t),i===void 0&&(i=t),i===aw&&(i=void 0),this.autoFreeze_&&Gh(i,!0),n){const s=[],o=[];bi("Patches").generateReplacementPatches_(t,i,s,o),n(s,o)}return i}else fr(1,t)},this.produceWithPatches=(t,r)=>{if(typeof t=="function")return(o,...l)=>this.produceWithPatches(o,c=>t(c,...l));let n,i;return[this.produce(t,r,(o,l)=>{n=o,i=l}),n,i]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),typeof(e==null?void 0:e.useStrictIteration)=="boolean"&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){en(e)||fr(8),vi(e)&&(e=Kr(e));const t=Xx(this),r=Wf(e,void 0);return r[Wt].isManual_=!0,Bf(t),r}finishDraft(e,t){const r=e&&e[Wt];(!r||!r.isManual_)&&fr(9);const{scope_:n}=r;return Zx(n,t),Jx(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){const i=t[r];if(i.path.length===0&&i.op==="replace"){e=i.value;break}}r>-1&&(t=t.slice(r+1));const n=bi("Patches").applyPatches_;return vi(e)?n(e,t):this.produce(e,i=>n(i,t))}};function Wf(e,t){const r=Js(e)?bi("MapSet").proxyMap_(e,t):tu(e)?bi("MapSet").proxySet_(e,t):E4(e,t);return(t?t.scope_:lw()).drafts_.push(r),r}function Kr(e){return vi(e)||fr(10,e),uw(e)}function uw(e){if(!en(e)||ru(e))return e;const t=e[Wt];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=zf(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=zf(e,!0);return Ul(r,(i,s)=>{ow(r,i,uw(s))},n),t&&(t.finalized_=!1),r}var Uf=new T4,dw=Uf.produce,M4=Uf.setUseStrictIteration.bind(Uf);function fw(e){return({dispatch:r,getState:n})=>i=>s=>typeof s=="function"?s(r,n,e):i(s)}var I4=fw(),$4=fw,L4=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?Wl:Wl.apply(null,arguments)};function ar(e,t){function r(...n){if(t){let i=t(...n);if(!i)throw new Error(Bt(0));return{type:e,payload:i.payload,..."meta"in i&&{meta:i.meta},..."error"in i&&{error:i.error}}}return{type:e,payload:n[0]}}return r.toString=()=>`${e}`,r.type=e,r.match=n=>iw(n)&&n.type===e,r}var pw=class es extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,es.prototype)}static get[Symbol.species](){return es}concat(...t){return super.concat.apply(this,t)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new es(...t[0].concat(this)):new es(...t.concat(this))}};function e0(e){return en(e)?dw(e,()=>{}):e}function Lo(e,t,r){return e.has(t)?e.get(t):e.set(t,r(t)).get(t)}function z4(e){return typeof e=="boolean"}var R4=()=>function(t){const{thunk:r=!0,immutableCheck:n=!0,serializableCheck:i=!0,actionCreatorCheck:s=!0}=t??{};let o=new pw;return r&&(z4(r)?o.push(I4):o.push($4(r.extraArgument))),o},hw="RTK_autoBatch",Le=()=>e=>({payload:e,meta:{[hw]:!0}}),t0=e=>t=>{setTimeout(t,e)},mw=(e={type:"raf"})=>t=>(...r)=>{const n=t(...r);let i=!0,s=!1,o=!1;const l=new Set,c=e.type==="tick"?queueMicrotask:e.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?window.requestAnimationFrame:t0(10):e.type==="callback"?e.queueNotification:t0(e.timeout),d=()=>{o=!1,s&&(s=!1,l.forEach(u=>u()))};return Object.assign({},n,{subscribe(u){const f=()=>i&&u(),p=n.subscribe(f);return l.add(u),()=>{p(),l.delete(u)}},dispatch(u){var f;try{return i=!((f=u==null?void 0:u.meta)!=null&&f[hw]),s=!i,s&&(o||(o=!0,c(d))),n.dispatch(u)}finally{i=!0}}})},B4=e=>function(r){const{autoBatch:n=!0}=r??{};let i=new pw(e);return n&&i.push(mw(typeof n=="object"?n:void 0)),i};function F4(e){const t=R4(),{reducer:r=void 0,middleware:n,devTools:i=!0,preloadedState:s=void 0,enhancers:o=void 0}=e||{};let l;if(typeof r=="function")l=r;else if(Yh(r))l=nw(r);else throw new Error(Bt(1));let c;typeof n=="function"?c=n(t):c=t();let d=Wl;i&&(d=L4({trace:!1,...typeof i=="object"&&i}));const u=N4(...c),f=B4(u);let p=typeof o=="function"?o(f):f();const m=d(...p);return rw(l,s,m)}function gw(e){const t={},r=[];let n;const i={addCase(s,o){const l=typeof s=="string"?s:s.type;if(!l)throw new Error(Bt(28));if(l in t)throw new Error(Bt(29));return t[l]=o,i},addAsyncThunk(s,o){return o.pending&&(t[s.pending.type]=o.pending),o.rejected&&(t[s.rejected.type]=o.rejected),o.fulfilled&&(t[s.fulfilled.type]=o.fulfilled),o.settled&&r.push({matcher:s.settled,reducer:o.settled}),i},addMatcher(s,o){return r.push({matcher:s,reducer:o}),i},addDefaultCase(s){return n=s,i}};return e(i),[t,r,n]}M4(!1);function W4(e){return typeof e=="function"}function U4(e,t){let[r,n,i]=gw(t),s;if(W4(e))s=()=>e0(e());else{const l=e0(e);s=()=>l}function o(l=s(),c){let d=[r[c.type],...n.filter(({matcher:u})=>u(c)).map(({reducer:u})=>u)];return d.filter(u=>!!u).length===0&&(d=[i]),d.reduce((u,f)=>{if(f)if(vi(u)){const m=f(u,c);return m===void 0?u:m}else{if(en(u))return dw(u,p=>f(p,c));{const p=f(u,c);if(p===void 0){if(u===null)return u;throw Error("A case reducer on a non-draftable value must not return undefined")}return p}}return u},l)}return o.getInitialState=s,o}var q4="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",H4=(e=21)=>{let t="",r=e;for(;r--;)t+=q4[Math.random()*64|0];return t},K4=Symbol.for("rtk-slice-createasyncthunk");function V4(e,t){return`${e}/${t}`}function Y4({creators:e}={}){var r;const t=(r=e==null?void 0:e.asyncThunk)==null?void 0:r[K4];return function(i){const{name:s,reducerPath:o=s}=i;if(!s)throw new Error(Bt(11));const l=(typeof i.reducers=="function"?i.reducers(Z4()):i.reducers)||{},c=Object.keys(l),d={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},u={addCase(w,S){const N=typeof w=="string"?w:w.type;if(!N)throw new Error(Bt(12));if(N in d.sliceCaseReducersByType)throw new Error(Bt(13));return d.sliceCaseReducersByType[N]=S,u},addMatcher(w,S){return d.sliceMatchers.push({matcher:w,reducer:S}),u},exposeAction(w,S){return d.actionCreators[w]=S,u},exposeCaseReducer(w,S){return d.sliceCaseReducersByName[w]=S,u}};c.forEach(w=>{const S=l[w],N={reducerName:w,type:V4(s,w),createNotation:typeof i.reducers=="function"};J4(S)?eE(N,S,u,t):X4(N,S,u)});function f(){const[w={},S=[],N=void 0]=typeof i.extraReducers=="function"?gw(i.extraReducers):[i.extraReducers],P={...w,...d.sliceCaseReducersByType};return U4(i.initialState,_=>{for(let T in P)_.addCase(T,P[T]);for(let T of d.sliceMatchers)_.addMatcher(T.matcher,T.reducer);for(let T of S)_.addMatcher(T.matcher,T.reducer);N&&_.addDefaultCase(N)})}const p=w=>w,m=new Map,x=new WeakMap;let g;function b(w,S){return g||(g=f()),g(w,S)}function v(){return g||(g=f()),g.getInitialState()}function j(w,S=!1){function N(_){let T=_[w];return typeof T>"u"&&S&&(T=Lo(x,N,v)),T}function P(_=p){const T=Lo(m,S,()=>new WeakMap);return Lo(T,_,()=>{const $={};for(const[M,C]of Object.entries(i.selectors??{}))$[M]=G4(C,_,()=>Lo(x,_,v),S);return $})}return{reducerPath:w,getSelectors:P,get selectors(){return P(N)},selectSlice:N}}const y={name:s,reducer:b,actions:d.actionCreators,caseReducers:d.sliceCaseReducersByName,getInitialState:v,...j(o),injectInto(w,{reducerPath:S,...N}={}){const P=S??o;return w.inject({reducerPath:P,reducer:b},N),{...y,...j(P,!0)}}};return y}}function G4(e,t,r,n){function i(s,...o){let l=t(s);return typeof l>"u"&&n&&(l=r()),e(l,...o)}return i.unwrapped=e,i}var At=Y4();function Z4(){function e(t,r){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...r}}return e.withTypes=()=>e,{reducer(t){return Object.assign({[t.name](...r){return t(...r)}}[t.name],{_reducerDefinitionType:"reducer"})},preparedReducer(t,r){return{_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:r}},asyncThunk:e}}function X4({type:e,reducerName:t,createNotation:r},n,i){let s,o;if("reducer"in n){if(r&&!Q4(n))throw new Error(Bt(17));s=n.reducer,o=n.prepare}else s=n;i.addCase(e,s).exposeCaseReducer(t,s).exposeAction(t,o?ar(e,o):ar(e))}function J4(e){return e._reducerDefinitionType==="asyncThunk"}function Q4(e){return e._reducerDefinitionType==="reducerWithPrepare"}function eE({type:e,reducerName:t},r,n,i){if(!i)throw new Error(Bt(18));const{payloadCreator:s,fulfilled:o,pending:l,rejected:c,settled:d,options:u}=r,f=i(e,s,u);n.exposeAction(t,f),o&&n.addCase(f.fulfilled,o),l&&n.addCase(f.pending,l),c&&n.addCase(f.rejected,c),d&&n.addMatcher(f.settled,d),n.exposeCaseReducer(t,{fulfilled:o||zo,pending:l||zo,rejected:c||zo,settled:d||zo})}function zo(){}var tE="task",xw="listener",yw="completed",Xh="cancelled",rE=`task-${Xh}`,nE=`task-${yw}`,qf=`${xw}-${Xh}`,iE=`${xw}-${yw}`,nu=class{constructor(e){ho(this,"name","TaskAbortError");ho(this,"message");this.code=e,this.message=`${tE} ${Xh} (reason: ${e})`}},Jh=(e,t)=>{if(typeof e!="function")throw new TypeError(Bt(32))},Kl=()=>{},vw=(e,t=Kl)=>(e.catch(t),e),bw=(e,t)=>(e.addEventListener("abort",t,{once:!0}),()=>e.removeEventListener("abort",t)),li=(e,t)=>{const r=e.signal;r.aborted||("reason"in r||Object.defineProperty(r,"reason",{enumerable:!0,value:t,configurable:!0,writable:!0}),e.abort(t))},ci=e=>{if(e.aborted){const{reason:t}=e;throw new nu(t)}};function jw(e,t){let r=Kl;return new Promise((n,i)=>{const s=()=>i(new nu(e.reason));if(e.aborted){s();return}r=bw(e,s),t.finally(()=>r()).then(n,i)}).finally(()=>{r=Kl})}var aE=async(e,t)=>{try{return await Promise.resolve(),{status:"ok",value:await e()}}catch(r){return{status:r instanceof nu?"cancelled":"rejected",error:r}}finally{t==null||t()}},Vl=e=>t=>vw(jw(e,t).then(r=>(ci(e),r))),ww=e=>{const t=Vl(e);return r=>t(new Promise(n=>setTimeout(n,r)))},{assign:ia}=Object,r0={},iu="listenerMiddleware",sE=(e,t)=>{const r=n=>bw(e,()=>li(n,e.reason));return(n,i)=>{Jh(n);const s=new AbortController;r(s);const o=aE(async()=>{ci(e),ci(s.signal);const l=await n({pause:Vl(s.signal),delay:ww(s.signal),signal:s.signal});return ci(s.signal),l},()=>li(s,nE));return i!=null&&i.autoJoin&&t.push(o.catch(Kl)),{result:Vl(e)(o),cancel(){li(s,rE)}}}},oE=(e,t)=>{const r=async(n,i)=>{ci(t);let s=()=>{};const l=[new Promise((c,d)=>{let u=e({predicate:n,effect:(f,p)=>{p.unsubscribe(),c([f,p.getState(),p.getOriginalState()])}});s=()=>{u(),d()}})];i!=null&&l.push(new Promise(c=>setTimeout(c,i,null)));try{const c=await jw(t,Promise.race(l));return ci(t),c}finally{s()}};return(n,i)=>vw(r(n,i))},Sw=e=>{let{type:t,actionCreator:r,matcher:n,predicate:i,effect:s}=e;if(t)i=ar(t).match;else if(r)t=r.type,i=r.match;else if(n)i=n;else if(!i)throw new Error(Bt(21));return Jh(s),{predicate:i,type:t,effect:s}},Nw=ia(e=>{const{type:t,predicate:r,effect:n}=Sw(e);return{id:H4(),effect:n,type:t,predicate:r,pending:new Set,unsubscribe:()=>{throw new Error(Bt(22))}}},{withTypes:()=>Nw}),n0=(e,t)=>{const{type:r,effect:n,predicate:i}=Sw(t);return Array.from(e.values()).find(s=>(typeof r=="string"?s.type===r:s.predicate===i)&&s.effect===n)},Hf=e=>{e.pending.forEach(t=>{li(t,qf)})},lE=(e,t)=>()=>{for(const r of t.keys())Hf(r);e.clear()},i0=(e,t,r)=>{try{e(t,r)}catch(n){setTimeout(()=>{throw n},0)}},kw=ia(ar(`${iu}/add`),{withTypes:()=>kw}),cE=ar(`${iu}/removeAll`),Pw=ia(ar(`${iu}/remove`),{withTypes:()=>Pw}),uE=(...e)=>{console.error(`${iu}/error`,...e)},Qs=(e={})=>{const t=new Map,r=new Map,n=m=>{const x=r.get(m)??0;r.set(m,x+1)},i=m=>{const x=r.get(m)??1;x===1?r.delete(m):r.set(m,x-1)},{extra:s,onError:o=uE}=e;Jh(o);const l=m=>(m.unsubscribe=()=>t.delete(m.id),t.set(m.id,m),x=>{m.unsubscribe(),x!=null&&x.cancelActive&&Hf(m)}),c=m=>{const x=n0(t,m)??Nw(m);return l(x)};ia(c,{withTypes:()=>c});const d=m=>{const x=n0(t,m);return x&&(x.unsubscribe(),m.cancelActive&&Hf(x)),!!x};ia(d,{withTypes:()=>d});const u=async(m,x,g,b)=>{const v=new AbortController,j=oE(c,v.signal),y=[];try{m.pending.add(v),n(m),await Promise.resolve(m.effect(x,ia({},g,{getOriginalState:b,condition:(w,S)=>j(w,S).then(Boolean),take:j,delay:ww(v.signal),pause:Vl(v.signal),extra:s,signal:v.signal,fork:sE(v.signal,y),unsubscribe:m.unsubscribe,subscribe:()=>{t.set(m.id,m)},cancelActiveListeners:()=>{m.pending.forEach((w,S,N)=>{w!==v&&(li(w,qf),N.delete(w))})},cancel:()=>{li(v,qf),m.pending.delete(v)},throwIfCancelled:()=>{ci(v.signal)}})))}catch(w){w instanceof nu||i0(o,w,{raisedBy:"effect"})}finally{await Promise.all(y),li(v,iE),i(m),m.pending.delete(v)}},f=lE(t,r);return{middleware:m=>x=>g=>{if(!iw(g))return x(g);if(kw.match(g))return c(g.payload);if(cE.match(g)){f();return}if(Pw.match(g))return d(g.payload);let b=m.getState();const v=()=>{if(b===r0)throw new Error(Bt(23));return b};let j;try{if(j=x(g),t.size>0){const y=m.getState(),w=Array.from(t.values());for(const S of w){let N=!1;try{N=S.predicate(g,y,b)}catch(P){N=!1,i0(o,P,{raisedBy:"predicate"})}N&&u(S,g,m,v)}}}finally{b=r0}return j},startListening:c,stopListening:d,clearListeners:f}};function Bt(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var dE={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},_w=At({name:"chartLayout",initialState:dE,reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){var r,n,i,s;e.margin.top=(r=t.payload.top)!==null&&r!==void 0?r:0,e.margin.right=(n=t.payload.right)!==null&&n!==void 0?n:0,e.margin.bottom=(i=t.payload.bottom)!==null&&i!==void 0?i:0,e.margin.left=(s=t.payload.left)!==null&&s!==void 0?s:0},setScale(e,t){e.scale=t.payload}}}),{setMargin:fE,setLayout:pE,setChartSize:hE,setScale:mE}=_w.actions,gE=_w.reducer;function Cw(e,t,r){return Array.isArray(e)&&e&&t+r!==0?e.slice(t,r+1):e}function a0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Yi(e){for(var t=1;t{if(t&&r){var{width:n,height:i}=r,{align:s,verticalAlign:o,layout:l}=t;if((l==="vertical"||l==="horizontal"&&o==="middle")&&s!=="center"&&Y(e[s]))return Yi(Yi({},e),{},{[s]:e[s]+(n||0)});if((l==="horizontal"||l==="vertical"&&s==="center")&&o!=="middle"&&Y(e[o]))return Yi(Yi({},e),{},{[o]:e[o]+(i||0)})}return e},Mr=(e,t)=>e==="horizontal"&&t==="xAxis"||e==="vertical"&&t==="yAxis"||e==="centric"&&t==="angleAxis"||e==="radial"&&t==="radiusAxis",Aw=(e,t,r,n)=>{if(n)return e.map(l=>l.coordinate);var i,s,o=e.map(l=>(l.coordinate===t&&(i=!0),l.coordinate===r&&(s=!0),l.coordinate));return i||o.push(t),s||o.push(r),o},Ow=(e,t,r)=>{if(!e)return null;var{duplicateDomain:n,type:i,range:s,scale:o,realScaleType:l,isCategorical:c,categoricalDomain:d,tickCount:u,ticks:f,niceTicks:p,axisType:m}=e;if(!o)return null;var x=l==="scaleBand"&&o.bandwidth?o.bandwidth()/2:2,g=i==="category"&&o.bandwidth?o.bandwidth()/x:0;if(g=m==="angleAxis"&&s&&s.length>=2?Jt(s[0]-s[1])*2*g:g,f||p){var b=(f||p||[]).map((v,j)=>{var y=n?n.indexOf(v):v;return{coordinate:o(y)+g,value:v,offset:g,index:j}});return b.filter(v=>!yr(v.coordinate))}return c&&d?d.map((v,j)=>({coordinate:o(v)+g,value:v,index:j,offset:g})):o.ticks&&u!=null?o.ticks(u).map((v,j)=>({coordinate:o(v)+g,value:v,offset:g,index:j})):o.domain().map((v,j)=>({coordinate:o(v)+g,value:n?n[v]:v,index:j,offset:g}))},s0=1e-4,jE=e=>{var t=e.domain();if(!(!t||t.length<=2)){var r=t.length,n=e.range(),i=Math.min(n[0],n[1])-s0,s=Math.max(n[0],n[1])+s0,o=e(t[0]),l=e(t[r-1]);(os||ls)&&e.domain([t[0],t[r-1]])}},wE=e=>{var t=e.length;if(!(t<=0))for(var r=0,n=e[0].length;r=0?(e[o][r][0]=i,e[o][r][1]=i+l,i=e[o][r][1]):(e[o][r][0]=s,e[o][r][1]=s+l,s=e[o][r][1])}},SE=e=>{var t=e.length;if(!(t<=0))for(var r=0,n=e[0].length;r=0?(e[s][r][0]=i,e[s][r][1]=i+o,i=e[s][r][1]):(e[s][r][0]=0,e[s][r][1]=0)}},NE={sign:wE,expand:M6,none:ha,silhouette:I6,wiggle:$6,positive:SE},kE=(e,t,r)=>{var n=NE[r],i=T6().keys(t).value((s,o)=>Number(et(s,o,0))).order(If).offset(n);return i(e)};function PE(e){return e==null?void 0:String(e)}function Yl(e){var{axis:t,ticks:r,bandSize:n,entry:i,index:s,dataKey:o}=e;if(t.type==="category"){if(!t.allowDuplicatedCategory&&t.dataKey&&!Re(i[t.dataKey])){var l=Cj(r,"value",i[t.dataKey]);if(l)return l.coordinate+n/2}return r[s]?r[s].coordinate+n/2:null}var c=et(i,Re(o)?t.dataKey:o);return Re(c)?null:t.scale(c)}var _E=e=>{var t=e.flat(2).filter(Y);return[Math.min(...t),Math.max(...t)]},CE=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],AE=(e,t,r)=>{if(e!=null)return CE(Object.keys(e).reduce((n,i)=>{var s=e[i],{stackedData:o}=s,l=o.reduce((c,d)=>{var u=Cw(d,t,r),f=_E(u);return[Math.min(c[0],f[0]),Math.max(c[1],f[1])]},[1/0,-1/0]);return[Math.min(l[0],n[0]),Math.max(l[1],n[1])]},[1/0,-1/0]))},o0=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,l0=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,ma=(e,t,r)=>{if(e&&e.scale&&e.scale.bandwidth){var n=e.scale.bandwidth();if(!r||n>0)return n}if(e&&t&&t.length>=2){for(var i=Qc(t,u=>u.coordinate),s=1/0,o=1,l=i.length;o{if(t==="horizontal")return e.chartX;if(t==="vertical")return e.chartY},EE=(e,t)=>t==="centric"?e.angle:e.radius,ln=e=>e.layout.width,cn=e=>e.layout.height,DE=e=>e.layout.scale,Ew=e=>e.layout.margin,su=I(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),ou=I(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),TE="data-recharts-item-index",ME="data-recharts-item-data-key",eo=60;function u0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ro(e){for(var t=1;te.brush.height;function RE(e){var t=ou(e);return t.reduce((r,n)=>{if(n.orientation==="left"&&!n.mirror&&!n.hide){var i=typeof n.width=="number"?n.width:eo;return r+i}return r},0)}function BE(e){var t=ou(e);return t.reduce((r,n)=>{if(n.orientation==="right"&&!n.mirror&&!n.hide){var i=typeof n.width=="number"?n.width:eo;return r+i}return r},0)}function FE(e){var t=su(e);return t.reduce((r,n)=>n.orientation==="top"&&!n.mirror&&!n.hide?r+n.height:r,0)}function WE(e){var t=su(e);return t.reduce((r,n)=>n.orientation==="bottom"&&!n.mirror&&!n.hide?r+n.height:r,0)}var rt=I([ln,cn,Ew,zE,RE,BE,FE,WE,tw,y4],(e,t,r,n,i,s,o,l,c,d)=>{var u={left:(r.left||0)+i,right:(r.right||0)+s},f={top:(r.top||0)+o,bottom:(r.bottom||0)+l},p=Ro(Ro({},f),u),m=p.bottom;p.bottom+=n,p=bE(p,c,d);var x=e-p.left-p.right,g=t-p.top-p.bottom;return Ro(Ro({brushBottom:m},p),{},{width:Math.max(x,0),height:Math.max(g,0)})}),UE=I(rt,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),Dw=I(ln,cn,(e,t)=>({x:0,y:0,width:e,height:t})),qE=h.createContext(null),pt=()=>h.useContext(qE)!=null,lu=e=>e.brush,cu=I([lu,rt,Ew],(e,t,r)=>({height:e.height,x:Y(e.x)?e.x:t.left,y:Y(e.y)?e.y:t.top+t.height+t.brushBottom-((r==null?void 0:r.bottom)||0),width:Y(e.width)?e.width:t.width})),Tw={},Mw={},Iw={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r,n,{signal:i,edges:s}={}){let o,l=null;const c=s!=null&&s.includes("leading"),d=s==null||s.includes("trailing"),u=()=>{l!==null&&(r.apply(o,l),o=void 0,l=null)},f=()=>{d&&u(),g()};let p=null;const m=()=>{p!=null&&clearTimeout(p),p=setTimeout(()=>{p=null,f()},n)},x=()=>{p!==null&&(clearTimeout(p),p=null)},g=()=>{x(),o=void 0,l=null},b=()=>{u()},v=function(...j){if(i!=null&&i.aborted)return;o=this,l=j;const y=p==null;m(),c&&y&&u()};return v.schedule=m,v.cancel=g,v.flush=b,i==null||i.addEventListener("abort",g,{once:!0}),v}e.debounce=t})(Iw);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Iw;function r(n,i=0,s={}){typeof s!="object"&&(s={});const{leading:o=!1,trailing:l=!0,maxWait:c}=s,d=Array(2);o&&(d[0]="leading"),l&&(d[1]="trailing");let u,f=null;const p=t.debounce(function(...g){u=n.apply(this,g),f=null},i,{edges:d}),m=function(...g){return c!=null&&(f===null&&(f=Date.now()),Date.now()-f>=c)?(u=n.apply(this,g),f=Date.now(),p.cancel(),p.schedule(),u):(p.apply(this,g),u)},x=()=>(p.flush(),u);return m.cancel=p.cancel,m.flush=x,m}e.debounce=r})(Mw);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Mw;function r(n,i=0,s={}){const{leading:o=!0,trailing:l=!0}=s;return t.debounce(n,i,{leading:o,maxWait:i,trailing:l})}e.throttle=r})(Tw);var HE=Tw.throttle;const KE=Tr(HE);var Gl=function(t,r){for(var n=arguments.length,i=new Array(n>2?n-2:0),s=2;s{var{width:n="100%",height:i="100%",aspect:s,maxHeight:o}=r,l=Qr(n)?e:Number(n),c=Qr(i)?t:Number(i);return s&&s>0&&(l?c=l/s:c&&(l=c*s),o&&c!=null&&c>o&&(c=o)),{calculatedWidth:l,calculatedHeight:c}},VE={width:0,height:0,overflow:"visible"},YE={width:0,overflowX:"visible"},GE={height:0,overflowY:"visible"},ZE={},XE=e=>{var{width:t,height:r}=e,n=Qr(t),i=Qr(r);return n&&i?VE:n?YE:i?GE:ZE};function JE(e){var{width:t,height:r,aspect:n}=e,i=t,s=r;return i===void 0&&s===void 0?(i="100%",s="100%"):i===void 0?i=n&&n>0?void 0:"100%":s===void 0&&(s=n&&n>0?void 0:"100%"),{width:i,height:s}}function _e(e){return Number.isFinite(e)}function Er(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function Kf(){return Kf=Object.assign?Object.assign.bind():function(e){for(var t=1;t({width:r,height:n}),[r,n]);return r3(i)?h.createElement(Lw.Provider,{value:i},t):null}var Qh=()=>h.useContext(Lw),n3=h.forwardRef((e,t)=>{var{aspect:r,initialDimension:n={width:-1,height:-1},width:i,height:s,minWidth:o=0,minHeight:l,maxHeight:c,children:d,debounce:u=0,id:f,className:p,onResize:m,style:x={}}=e,g=h.useRef(null),b=h.useRef();b.current=m,h.useImperativeHandle(t,()=>g.current);var[v,j]=h.useState({containerWidth:n.width,containerHeight:n.height}),y=h.useCallback((_,T)=>{j($=>{var M=Math.round(_),C=Math.round(T);return $.containerWidth===M&&$.containerHeight===C?$:{containerWidth:M,containerHeight:C}})},[]);h.useEffect(()=>{if(g.current==null||typeof ResizeObserver>"u")return Pa;var _=C=>{var R,{width:q,height:Z}=C[0].contentRect;y(q,Z),(R=b.current)===null||R===void 0||R.call(b,q,Z)};u>0&&(_=KE(_,u,{trailing:!0,leading:!1}));var T=new ResizeObserver(_),{width:$,height:M}=g.current.getBoundingClientRect();return y($,M),T.observe(g.current),()=>{T.disconnect()}},[y,u]);var{containerWidth:w,containerHeight:S}=v;Gl(!r||r>0,"The aspect(%s) must be greater than zero.",r);var{calculatedWidth:N,calculatedHeight:P}=$w(w,S,{width:i,height:s,aspect:r,maxHeight:c});return Gl(N!=null&&N>0||P!=null&&P>0,`The width(%s) and height(%s) of chart should be greater than 0, - please check the style of container, or the props width(%s) and height(%s), - or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the - height and width.`,N,P,i,s,o,l,r),h.createElement("div",{id:f?"".concat(f):void 0,className:ce("recharts-responsive-container",p),style:f0(f0({},x),{},{width:i,height:s,minWidth:o,minHeight:l,maxHeight:c}),ref:g},h.createElement("div",{style:XE({width:i,height:s})},h.createElement(zw,{width:N,height:P},d)))}),p0=h.forwardRef((e,t)=>{var r=Qh();if(Er(r.width)&&Er(r.height))return e.children;var{width:n,height:i}=JE({width:e.width,height:e.height,aspect:e.aspect}),{calculatedWidth:s,calculatedHeight:o}=$w(void 0,void 0,{width:n,height:i,aspect:e.aspect,maxHeight:e.maxHeight});return Y(s)&&Y(o)?h.createElement(zw,{width:s,height:o},e.children):h.createElement(n3,Kf({},e,{width:n,height:i,ref:t}))});function Rw(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}var uu=()=>{var e,t=pt(),r=G(UE),n=G(cu),i=(e=G(lu))===null||e===void 0?void 0:e.padding;return!t||!n||!i?r:{width:n.width-i.left-i.right,height:n.height-i.top-i.bottom,x:i.left,y:i.top}},i3={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},Bw=()=>{var e;return(e=G(rt))!==null&&e!==void 0?e:i3},Fw=()=>G(ln),Ww=()=>G(cn),ue=e=>e.layout.layoutType,to=()=>G(ue),a3=()=>{var e=to();return e!==void 0},du=e=>{var t=Ve(),r=pt(),{width:n,height:i}=e,s=Qh(),o=n,l=i;return s&&(o=s.width>0?s.width:n,l=s.height>0?s.height:i),h.useEffect(()=>{!r&&Er(o)&&Er(l)&&t(hE({width:o,height:l}))},[t,r,o,l]),null},s3={settings:{layout:"horizontal",align:"center",verticalAlign:"middle",itemSorter:"value"},size:{width:0,height:0},payload:[]},Uw=At({name:"legend",initialState:s3,reducers:{setLegendSize(e,t){e.size.width=t.payload.width,e.size.height=t.payload.height},setLegendSettings(e,t){e.settings.align=t.payload.align,e.settings.layout=t.payload.layout,e.settings.verticalAlign=t.payload.verticalAlign,e.settings.itemSorter=t.payload.itemSorter},addLegendPayload:{reducer(e,t){e.payload.push(t.payload)},prepare:Le()},removeLegendPayload:{reducer(e,t){var r=Kr(e).payload.indexOf(t.payload);r>-1&&e.payload.splice(r,1)},prepare:Le()}}}),{setLegendSize:kF,setLegendSettings:PF,addLegendPayload:o3,removeLegendPayload:l3}=Uw.actions,c3=Uw.reducer;function Vf(){return Vf=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{separator:t=" : ",contentStyle:r={},itemStyle:n={},labelStyle:i={},payload:s,formatter:o,itemSorter:l,wrapperClassName:c,labelClassName:d,label:u,labelFormatter:f,accessibilityLayer:p=!1}=e,m=()=>{if(s&&s.length){var S={padding:0,margin:0},N=(l?Qc(s,l):s).map((P,_)=>{if(P.type==="none")return null;var T=P.formatter||o||p3,{value:$,name:M}=P,C=$,R=M;if(T){var q=T($,M,P,_,s);if(Array.isArray(q))[C,R]=q;else if(q!=null)C=q;else return null}var Z=hd({display:"block",paddingTop:4,paddingBottom:4,color:P.color||"#000"},n);return h.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(_),style:Z},Or(R)?h.createElement("span",{className:"recharts-tooltip-item-name"},R):null,Or(R)?h.createElement("span",{className:"recharts-tooltip-item-separator"},t):null,h.createElement("span",{className:"recharts-tooltip-item-value"},C),h.createElement("span",{className:"recharts-tooltip-item-unit"},P.unit||""))});return h.createElement("ul",{className:"recharts-tooltip-item-list",style:S},N)}return null},x=hd({margin:0,padding:10,backgroundColor:"#fff",border:"1px solid #ccc",whiteSpace:"nowrap"},r),g=hd({margin:0},i),b=!Re(u),v=b?u:"",j=ce("recharts-default-tooltip",c),y=ce("recharts-tooltip-label",d);b&&f&&s!==void 0&&s!==null&&(v=f(u,s));var w=p?{role:"status","aria-live":"assertive"}:{};return h.createElement("div",Vf({className:j,style:x},w),h.createElement("p",{className:y,style:g},h.isValidElement(v)?v:"".concat(v)),m())},Ua="recharts-tooltip-wrapper",m3={visibility:"hidden"};function g3(e){var{coordinate:t,translateX:r,translateY:n}=e;return ce(Ua,{["".concat(Ua,"-right")]:Y(r)&&t&&Y(t.x)&&r>=t.x,["".concat(Ua,"-left")]:Y(r)&&t&&Y(t.x)&&r=t.y,["".concat(Ua,"-top")]:Y(n)&&t&&Y(t.y)&&n0?i:0),f=r[n]+i;if(t[n])return o[n]?u:f;var p=c[n];if(p==null)return 0;if(o[n]){var m=u,x=p;return mb?Math.max(u,p):Math.max(f,p)}function x3(e){var{translateX:t,translateY:r,useTranslate3d:n}=e;return{transform:n?"translate3d(".concat(t,"px, ").concat(r,"px, 0)"):"translate(".concat(t,"px, ").concat(r,"px)")}}function y3(e){var{allowEscapeViewBox:t,coordinate:r,offsetTopLeft:n,position:i,reverseDirection:s,tooltipBox:o,useTranslate3d:l,viewBox:c}=e,d,u,f;return o.height>0&&o.width>0&&r?(u=m0({allowEscapeViewBox:t,coordinate:r,key:"x",offsetTopLeft:n,position:i,reverseDirection:s,tooltipDimension:o.width,viewBox:c,viewBoxDimension:c.width}),f=m0({allowEscapeViewBox:t,coordinate:r,key:"y",offsetTopLeft:n,position:i,reverseDirection:s,tooltipDimension:o.height,viewBox:c,viewBoxDimension:c.height}),d=x3({translateX:u,translateY:f,useTranslate3d:l})):d=m3,{cssProperties:d,cssClasses:g3({translateX:u,translateY:f,coordinate:r})}}function g0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Bo(e){for(var t=1;t{if(t.key==="Escape"){var r,n,i,s;this.setState({dismissed:!0,dismissedAtCoordinate:{x:(r=(n=this.props.coordinate)===null||n===void 0?void 0:n.x)!==null&&r!==void 0?r:0,y:(i=(s=this.props.coordinate)===null||s===void 0?void 0:s.y)!==null&&i!==void 0?i:0}})}})}componentDidMount(){document.addEventListener("keydown",this.handleKeyDown)}componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyDown)}componentDidUpdate(){var t,r;this.state.dismissed&&(((t=this.props.coordinate)===null||t===void 0?void 0:t.x)!==this.state.dismissedAtCoordinate.x||((r=this.props.coordinate)===null||r===void 0?void 0:r.y)!==this.state.dismissedAtCoordinate.y)&&(this.state.dismissed=!1)}render(){var{active:t,allowEscapeViewBox:r,animationDuration:n,animationEasing:i,children:s,coordinate:o,hasPayload:l,isAnimationActive:c,offset:d,position:u,reverseDirection:f,useTranslate3d:p,viewBox:m,wrapperStyle:x,lastBoundingBox:g,innerRef:b,hasPortalFromProps:v}=this.props,{cssClasses:j,cssProperties:y}=y3({allowEscapeViewBox:r,coordinate:o,offsetTopLeft:d,position:u,reverseDirection:f,tooltipBox:{height:g.height,width:g.width},useTranslate3d:p,viewBox:m}),w=v?{}:Bo(Bo({transition:c&&t?"transform ".concat(n,"ms ").concat(i):void 0},y),{},{pointerEvents:"none",visibility:!this.state.dismissed&&t&&l?"visible":"hidden",position:"absolute",top:0,left:0}),S=Bo(Bo({},w),{},{visibility:!this.state.dismissed&&t&&l?"visible":"hidden"},x);return h.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:j,style:S,ref:b},s)}}var w3=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),Ci={devToolsEnabled:!1,isSsr:w3()},qw=()=>{var e;return(e=G(t=>t.rootProps.accessibilityLayer))!==null&&e!==void 0?e:!0};function Gf(){return Gf=Object.assign?Object.assign.bind():function(e){for(var t=1;t_e(e.x)&&_e(e.y),b0=e=>e.base!=null&&Zl(e.base)&&Zl(e),qa=e=>e.x,Ha=e=>e.y,P3=(e,t)=>{if(typeof e=="function")return e;var r="curve".concat(Xs(e));return(r==="curveMonotone"||r==="curveBump")&&t?v0["".concat(r).concat(t==="vertical"?"Y":"X")]:v0[r]||Kc},_3=e=>{var{type:t="linear",points:r=[],baseLine:n,layout:i,connectNulls:s=!1}=e,o=P3(t,i),l=s?r.filter(Zl):r,c;if(Array.isArray(n)){var d=r.map((m,x)=>y0(y0({},m),{},{base:n[x]}));i==="vertical"?c=To().y(Ha).x1(qa).x0(m=>m.base.x):c=To().x(qa).y1(Ha).y0(m=>m.base.y);var u=c.defined(b0).curve(o),f=s?d.filter(b0):d;return u(f)}i==="vertical"&&Y(n)?c=To().y(Ha).x1(qa).x0(n):Y(n)?c=To().x(qa).y1(Ha).y0(n):c=hj().x(qa).y(Ha);var p=c.defined(Zl).curve(o);return p(l)},ds=e=>{var{className:t,points:r,path:n,pathRef:i}=e;if((!r||!r.length)&&!n)return null;var s=r&&r.length?_3(e):n;return h.createElement("path",Gf({},nr(e),Ih(e),{className:ce("recharts-curve",t),d:s===null?void 0:s,ref:i}))},C3=["x","y","top","left","width","height","className"];function Zf(){return Zf=Object.assign?Object.assign.bind():function(e){for(var t=1;t"M".concat(e,",").concat(i,"v").concat(n,"M").concat(s,",").concat(t,"h").concat(r),$3=e=>{var{x:t=0,y:r=0,top:n=0,left:i=0,width:s=0,height:o=0,className:l}=e,c=T3(e,C3),d=A3({x:t,y:r,top:n,left:i,width:s,height:o},c);return!Y(t)||!Y(r)||!Y(s)||!Y(o)||!Y(n)||!Y(i)?null:h.createElement("path",Zf({},ut(d),{className:ce("recharts-cross",l),d:I3(t,r,s,o,n,i)}))};function L3(e,t,r,n){var i=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-i:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-i,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}function w0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function S0(e){for(var t=1;te.replace(/([A-Z])/g,t=>"-".concat(t.toLowerCase())),Hw=(e,t,r)=>e.map(n=>"".concat(F3(n)," ").concat(t,"ms ").concat(r)).join(","),W3=(e,t)=>[Object.keys(e),Object.keys(t)].reduce((r,n)=>r.filter(i=>n.includes(i))),Ls=(e,t)=>Object.keys(t).reduce((r,n)=>S0(S0({},r),{},{[n]:e(n,t[n])}),{});function N0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function $e(e){for(var t=1;te+(t-e)*r,Xf=e=>{var{from:t,to:r}=e;return t!==r},Kw=(e,t,r)=>{var n=Ls((i,s)=>{if(Xf(s)){var[o,l]=e(s.from,s.to,s.velocity);return $e($e({},s),{},{from:o,velocity:l})}return s},t);return r<1?Ls((i,s)=>Xf(s)?$e($e({},s),{},{velocity:Xl(s.velocity,n[i].velocity,r),from:Xl(s.from,n[i].from,r)}):s,t):Kw(e,n,r-1)};function K3(e,t,r,n,i,s){var o,l=n.reduce((p,m)=>$e($e({},p),{},{[m]:{from:e[m],velocity:0,to:t[m]}}),{}),c=()=>Ls((p,m)=>m.from,l),d=()=>!Object.values(l).filter(Xf).length,u=null,f=p=>{o||(o=p);var m=p-o,x=m/r.dt;l=Kw(r,l,x),i($e($e($e({},e),t),c())),o=p,d()||(u=s.setTimeout(f))};return()=>(u=s.setTimeout(f),()=>{var p;(p=u)===null||p===void 0||p()})}function V3(e,t,r,n,i,s,o){var l=null,c=i.reduce((f,p)=>$e($e({},f),{},{[p]:[e[p],t[p]]}),{}),d,u=f=>{d||(d=f);var p=(f-d)/n,m=Ls((g,b)=>Xl(...b,r(p)),c);if(s($e($e($e({},e),t),m)),p<1)l=o.setTimeout(u);else{var x=Ls((g,b)=>Xl(...b,r(1)),c);s($e($e($e({},e),t),x))}};return()=>(l=o.setTimeout(u),()=>{var f;(f=l)===null||f===void 0||f()})}const Y3=(e,t,r,n,i,s)=>{var o=W3(e,t);return r==null?()=>(i($e($e({},e),t)),()=>{}):r.isStepper===!0?K3(e,t,r,o,i,s):V3(e,t,r,n,o,i,s)};var Jl=1e-4,Vw=(e,t)=>[0,3*e,3*t-6*e,3*e-3*t+1],Yw=(e,t)=>e.map((r,n)=>r*t**n).reduce((r,n)=>r+n),k0=(e,t)=>r=>{var n=Vw(e,t);return Yw(n,r)},G3=(e,t)=>r=>{var n=Vw(e,t),i=[...n.map((s,o)=>s*o).slice(1),0];return Yw(i,r)},Z3=function(){for(var t=arguments.length,r=new Array(t),n=0;nparseFloat(l));return[o[0],o[1],o[2],o[3]]}}}return r.length===4?r:[0,0,1,1]},X3=(e,t,r,n)=>{var i=k0(e,r),s=k0(t,n),o=G3(e,r),l=d=>d>1?1:d<0?0:d,c=d=>{for(var u=d>1?1:d,f=u,p=0;p<8;++p){var m=i(f)-u,x=o(f);if(Math.abs(m-u)0&&arguments[0]!==void 0?arguments[0]:{},{stiff:r=100,damping:n=8,dt:i=17}=t,s=(o,l,c)=>{var d=-(o-l)*r,u=c*n,f=c+(d-u)*i/1e3,p=c*i/1e3+o;return Math.abs(p-l){if(typeof e=="string")switch(e){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return P0(e);case"spring":return J3();default:if(e.split("(")[0]==="cubic-bezier")return P0(e)}return typeof e=="function"?e:null};function eD(e){var t,r=()=>null,n=!1,i=null,s=o=>{if(!n){if(Array.isArray(o)){if(!o.length)return;var l=o,[c,...d]=l;if(typeof c=="number"){i=e.setTimeout(s.bind(null,d),c);return}s(c),i=e.setTimeout(s.bind(null,d));return}typeof o=="string"&&(t=o,r(t)),typeof o=="object"&&(t=o,r(t)),typeof o=="function"&&o()}};return{stop:()=>{n=!0},start:o=>{n=!1,i&&(i(),i=null),s(o)},subscribe:o=>(r=o,()=>{r=()=>null}),getTimeoutController:()=>e}}class tD{setTimeout(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=performance.now(),i=null,s=o=>{o-n>=r?t(o):typeof requestAnimationFrame=="function"&&(i=requestAnimationFrame(s))};return i=requestAnimationFrame(s),()=>{i!=null&&cancelAnimationFrame(i)}}}function rD(){return eD(new tD)}var nD=h.createContext(rD);function iD(e,t){var r=h.useContext(nD);return h.useMemo(()=>t??r(e),[e,t,r])}var aD={begin:0,duration:1e3,easing:"ease",isActive:!0,canBegin:!0,onAnimationEnd:()=>{},onAnimationStart:()=>{}},_0={t:0},md={t:1};function fu(e){var t=ft(e,aD),{isActive:r,canBegin:n,duration:i,easing:s,begin:o,onAnimationEnd:l,onAnimationStart:c,children:d}=t,u=iD(t.animationId,t.animationManager),[f,p]=h.useState(r?_0:md),m=h.useRef(null);return h.useEffect(()=>{r||p(md)},[r]),h.useEffect(()=>{if(!r||!n)return Pa;var x=Y3(_0,md,Q3(s),i,p,u.getTimeoutController()),g=()=>{m.current=x()};return u.start([c,o,g,i,l]),()=>{u.stop(),m.current&&m.current(),l()}},[r,n,i,s,o,c,l,u]),d(f.t)}function pu(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",r=h.useRef(Ts(t)),n=h.useRef(e);return n.current!==e&&(r.current=Ts(t),n.current=e),r.current}var sD=["radius"],oD=["radius"];function C0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function A0(e){for(var t=1;t{var s=Math.min(Math.abs(r)/2,Math.abs(n)/2),o=n>=0?1:-1,l=r>=0?1:-1,c=n>=0&&r>=0||n<0&&r<0?1:0,d;if(s>0&&i instanceof Array){for(var u=[0,0,0,0],f=0,p=4;fs?s:i[f];d="M".concat(e,",").concat(t+o*u[0]),u[0]>0&&(d+="A ".concat(u[0],",").concat(u[0],",0,0,").concat(c,",").concat(e+l*u[0],",").concat(t)),d+="L ".concat(e+r-l*u[1],",").concat(t),u[1]>0&&(d+="A ".concat(u[1],",").concat(u[1],",0,0,").concat(c,`, - `).concat(e+r,",").concat(t+o*u[1])),d+="L ".concat(e+r,",").concat(t+n-o*u[2]),u[2]>0&&(d+="A ".concat(u[2],",").concat(u[2],",0,0,").concat(c,`, - `).concat(e+r-l*u[2],",").concat(t+n)),d+="L ".concat(e+l*u[3],",").concat(t+n),u[3]>0&&(d+="A ".concat(u[3],",").concat(u[3],",0,0,").concat(c,`, - `).concat(e,",").concat(t+n-o*u[3])),d+="Z"}else if(s>0&&i===+i&&i>0){var m=Math.min(s,i);d="M ".concat(e,",").concat(t+o*m,` - A `).concat(m,",").concat(m,",0,0,").concat(c,",").concat(e+l*m,",").concat(t,` - L `).concat(e+r-l*m,",").concat(t,` - A `).concat(m,",").concat(m,",0,0,").concat(c,",").concat(e+r,",").concat(t+o*m,` - L `).concat(e+r,",").concat(t+n-o*m,` - A `).concat(m,",").concat(m,",0,0,").concat(c,",").concat(e+r-l*m,",").concat(t+n,` - L `).concat(e+l*m,",").concat(t+n,` - A `).concat(m,",").concat(m,",0,0,").concat(c,",").concat(e,",").concat(t+n-o*m," Z")}else d="M ".concat(e,",").concat(t," h ").concat(r," v ").concat(n," h ").concat(-r," Z");return d},D0={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},Gw=e=>{var t=ft(e,D0),r=h.useRef(null),[n,i]=h.useState(-1);h.useEffect(()=>{if(r.current&&r.current.getTotalLength)try{var D=r.current.getTotalLength();D&&i(D)}catch{}},[]);var{x:s,y:o,width:l,height:c,radius:d,className:u}=t,{animationEasing:f,animationDuration:p,animationBegin:m,isAnimationActive:x,isUpdateAnimationActive:g}=t,b=h.useRef(l),v=h.useRef(c),j=h.useRef(s),y=h.useRef(o),w=h.useMemo(()=>({x:s,y:o,width:l,height:c,radius:d}),[s,o,l,c,d]),S=pu(w,"rectangle-");if(s!==+s||o!==+o||l!==+l||c!==+c||l===0||c===0)return null;var N=ce("recharts-rectangle",u);if(!g){var P=ut(t),{radius:_}=P,T=O0(P,sD);return h.createElement("path",Ql({},T,{radius:typeof d=="number"?d:void 0,className:N,d:E0(s,o,l,c,d)}))}var $=b.current,M=v.current,C=j.current,R=y.current,q="0px ".concat(n===-1?1:n,"px"),Z="".concat(n,"px 0px"),E=Hw(["strokeDasharray"],p,typeof f=="string"?f:D0.animationEasing);return h.createElement(fu,{animationId:S,key:S,canBegin:n>0,duration:p,easing:f,isActive:g,begin:m},D=>{var O=De($,l,D),k=De(M,c,D),L=De(C,s,D),F=De(R,o,D);r.current&&(b.current=O,v.current=k,j.current=L,y.current=F);var H;x?D>0?H={transition:E,strokeDasharray:Z}:H={strokeDasharray:q}:H={strokeDasharray:Z};var te=ut(t),{radius:re}=te,we=O0(te,oD);return h.createElement("path",Ql({},we,{radius:typeof d=="number"?d:void 0,className:N,d:E0(L,F,O,k,d),ref:r,style:A0(A0({},H),t.style)}))})};function T0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function M0(e){for(var t=1;te*180/Math.PI,Je=(e,t,r,n)=>({x:e+Math.cos(-ec*n)*r,y:t+Math.sin(-ec*n)*r}),gD=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{top:0,right:0,bottom:0,left:0};return Math.min(Math.abs(t-(n.left||0)-(n.right||0)),Math.abs(r-(n.top||0)-(n.bottom||0)))/2},xD=(e,t)=>{var{x:r,y:n}=e,{x:i,y:s}=t;return Math.sqrt((r-i)**2+(n-s)**2)},yD=(e,t)=>{var{x:r,y:n}=e,{cx:i,cy:s}=t,o=xD({x:r,y:n},{x:i,y:s});if(o<=0)return{radius:o,angle:0};var l=(r-i)/o,c=Math.acos(l);return n>s&&(c=2*Math.PI-c),{radius:o,angle:mD(c),angleInRadian:c}},vD=e=>{var{startAngle:t,endAngle:r}=e,n=Math.floor(t/360),i=Math.floor(r/360),s=Math.min(n,i);return{startAngle:t-s*360,endAngle:r-s*360}},bD=(e,t)=>{var{startAngle:r,endAngle:n}=t,i=Math.floor(r/360),s=Math.floor(n/360),o=Math.min(i,s);return e+o*360},jD=(e,t)=>{var{chartX:r,chartY:n}=e,{radius:i,angle:s}=yD({x:r,y:n},t),{innerRadius:o,outerRadius:l}=t;if(il||i===0)return null;var{startAngle:c,endAngle:d}=vD(t),u=s,f;if(c<=d){for(;u>d;)u-=360;for(;u=c&&u<=d}else{for(;u>c;)u-=360;for(;u=d&&u<=c}return f?M0(M0({},t),{},{radius:i,angle:bD(u,t)}):null};function Zw(e){var{cx:t,cy:r,radius:n,startAngle:i,endAngle:s}=e,o=Je(t,r,n,i),l=Je(t,r,n,s);return{points:[o,l],cx:t,cy:r,radius:n,startAngle:i,endAngle:s}}function Jf(){return Jf=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=Jt(t-e),n=Math.min(Math.abs(t-e),359.999);return r*n},Fo=e=>{var{cx:t,cy:r,radius:n,angle:i,sign:s,isExternal:o,cornerRadius:l,cornerIsExternal:c}=e,d=l*(o?1:-1)+n,u=Math.asin(l/d)/ec,f=c?i:i+s*u,p=Je(t,r,d,f),m=Je(t,r,n,f),x=c?i-s*u:i,g=Je(t,r,d*Math.cos(u*ec),x);return{center:p,circleTangency:m,lineTangency:g,theta:u}},Xw=e=>{var{cx:t,cy:r,innerRadius:n,outerRadius:i,startAngle:s,endAngle:o}=e,l=wD(s,o),c=s+l,d=Je(t,r,i,s),u=Je(t,r,i,c),f="M ".concat(d.x,",").concat(d.y,` - A `).concat(i,",").concat(i,`,0, - `).concat(+(Math.abs(l)>180),",").concat(+(s>c),`, - `).concat(u.x,",").concat(u.y,` - `);if(n>0){var p=Je(t,r,n,s),m=Je(t,r,n,c);f+="L ".concat(m.x,",").concat(m.y,` - A `).concat(n,",").concat(n,`,0, - `).concat(+(Math.abs(l)>180),",").concat(+(s<=c),`, - `).concat(p.x,",").concat(p.y," Z")}else f+="L ".concat(t,",").concat(r," Z");return f},SD=e=>{var{cx:t,cy:r,innerRadius:n,outerRadius:i,cornerRadius:s,forceCornerRadius:o,cornerIsExternal:l,startAngle:c,endAngle:d}=e,u=Jt(d-c),{circleTangency:f,lineTangency:p,theta:m}=Fo({cx:t,cy:r,radius:i,angle:c,sign:u,cornerRadius:s,cornerIsExternal:l}),{circleTangency:x,lineTangency:g,theta:b}=Fo({cx:t,cy:r,radius:i,angle:d,sign:-u,cornerRadius:s,cornerIsExternal:l}),v=l?Math.abs(c-d):Math.abs(c-d)-m-b;if(v<0)return o?"M ".concat(p.x,",").concat(p.y,` - a`).concat(s,",").concat(s,",0,0,1,").concat(s*2,`,0 - a`).concat(s,",").concat(s,",0,0,1,").concat(-s*2,`,0 - `):Xw({cx:t,cy:r,innerRadius:n,outerRadius:i,startAngle:c,endAngle:d});var j="M ".concat(p.x,",").concat(p.y,` - A`).concat(s,",").concat(s,",0,0,").concat(+(u<0),",").concat(f.x,",").concat(f.y,` - A`).concat(i,",").concat(i,",0,").concat(+(v>180),",").concat(+(u<0),",").concat(x.x,",").concat(x.y,` - A`).concat(s,",").concat(s,",0,0,").concat(+(u<0),",").concat(g.x,",").concat(g.y,` - `);if(n>0){var{circleTangency:y,lineTangency:w,theta:S}=Fo({cx:t,cy:r,radius:n,angle:c,sign:u,isExternal:!0,cornerRadius:s,cornerIsExternal:l}),{circleTangency:N,lineTangency:P,theta:_}=Fo({cx:t,cy:r,radius:n,angle:d,sign:-u,isExternal:!0,cornerRadius:s,cornerIsExternal:l}),T=l?Math.abs(c-d):Math.abs(c-d)-S-_;if(T<0&&s===0)return"".concat(j,"L").concat(t,",").concat(r,"Z");j+="L".concat(P.x,",").concat(P.y,` - A`).concat(s,",").concat(s,",0,0,").concat(+(u<0),",").concat(N.x,",").concat(N.y,` - A`).concat(n,",").concat(n,",0,").concat(+(T>180),",").concat(+(u>0),",").concat(y.x,",").concat(y.y,` - A`).concat(s,",").concat(s,",0,0,").concat(+(u<0),",").concat(w.x,",").concat(w.y,"Z")}else j+="L".concat(t,",").concat(r,"Z");return j},ND={cx:0,cy:0,innerRadius:0,outerRadius:0,startAngle:0,endAngle:0,cornerRadius:0,forceCornerRadius:!1,cornerIsExternal:!1},Jw=e=>{var t=ft(e,ND),{cx:r,cy:n,innerRadius:i,outerRadius:s,cornerRadius:o,forceCornerRadius:l,cornerIsExternal:c,startAngle:d,endAngle:u,className:f}=t;if(s0&&Math.abs(d-u)<360?g=SD({cx:r,cy:n,innerRadius:i,outerRadius:s,cornerRadius:Math.min(x,m/2),forceCornerRadius:l,cornerIsExternal:c,startAngle:d,endAngle:u}):g=Xw({cx:r,cy:n,innerRadius:i,outerRadius:s,startAngle:d,endAngle:u}),h.createElement("path",Jf({},ut(t),{className:p,d:g}))};function kD(e,t,r){if(e==="horizontal")return[{x:t.x,y:r.top},{x:t.x,y:r.top+r.height}];if(e==="vertical")return[{x:r.left,y:t.y},{x:r.left+r.width,y:t.y}];if(Ej(t)){if(e==="centric"){var{cx:n,cy:i,innerRadius:s,outerRadius:o,angle:l}=t,c=Je(n,i,s,l),d=Je(n,i,o,l);return[{x:c.x,y:c.y},{x:d.x,y:d.y}]}return Zw(t)}}var Qw={},eS={},tS={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Kh;function r(n){return t.isSymbol(n)?NaN:Number(n)}e.toNumber=r})(tS);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=tS;function r(n){return n?(n=t.toNumber(n),n===1/0||n===-1/0?(n<0?-1:1)*Number.MAX_VALUE:n===n?n:0):n===0?n:0}e.toFinite=r})(eS);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Vh,r=eS;function n(i,s,o){o&&typeof o!="number"&&t.isIterateeCall(i,s,o)&&(s=o=void 0),i=r.toFinite(i),s===void 0?(s=i,i=0):s=r.toFinite(s),o=o===void 0?it?1:e>=t?0:NaN}function _D(e,t){return e==null||t==null?NaN:te?1:t>=e?0:NaN}function em(e){let t,r,n;e.length!==2?(t=Mn,r=(l,c)=>Mn(e(l),c),n=(l,c)=>e(l)-c):(t=e===Mn||e===_D?e:CD,r=e,n=e);function i(l,c,d=0,u=l.length){if(d>>1;r(l[f],c)<0?d=f+1:u=f}while(d>>1;r(l[f],c)<=0?d=f+1:u=f}while(dd&&n(l[f-1],c)>-n(l[f],c)?f-1:f}return{left:i,center:o,right:s}}function CD(){return 0}function nS(e){return e===null?NaN:+e}function*AD(e,t){for(let r of e)r!=null&&(r=+r)>=r&&(yield r)}const OD=em(Mn),ro=OD.right;em(nS).center;class I0 extends Map{constructor(t,r=TD){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),t!=null)for(const[n,i]of t)this.set(n,i)}get(t){return super.get($0(this,t))}has(t){return super.has($0(this,t))}set(t,r){return super.set(ED(this,t),r)}delete(t){return super.delete(DD(this,t))}}function $0({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):r}function ED({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}function DD({_intern:e,_key:t},r){const n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}function TD(e){return e!==null&&typeof e=="object"?e.valueOf():e}function MD(e=Mn){if(e===Mn)return iS;if(typeof e!="function")throw new TypeError("compare is not a function");return(t,r)=>{const n=e(t,r);return n||n===0?n:(e(r,r)===0)-(e(t,t)===0)}}function iS(e,t){return(e==null||!(e>=e))-(t==null||!(t>=t))||(et?1:0)}const ID=Math.sqrt(50),$D=Math.sqrt(10),LD=Math.sqrt(2);function tc(e,t,r){const n=(t-e)/Math.max(0,r),i=Math.floor(Math.log10(n)),s=n/Math.pow(10,i),o=s>=ID?10:s>=$D?5:s>=LD?2:1;let l,c,d;return i<0?(d=Math.pow(10,-i)/o,l=Math.round(e*d),c=Math.round(t*d),l/dt&&--c,d=-d):(d=Math.pow(10,i)*o,l=Math.round(e/d),c=Math.round(t/d),l*dt&&--c),c0))return[];if(e===t)return[e];const n=t=i))return[];const l=s-i+1,c=new Array(l);if(n)if(o<0)for(let d=0;d=n)&&(r=n);return r}function z0(e,t){let r;for(const n of e)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);return r}function aS(e,t,r=0,n=1/0,i){if(t=Math.floor(t),r=Math.floor(Math.max(0,r)),n=Math.floor(Math.min(e.length-1,n)),!(r<=t&&t<=n))return e;for(i=i===void 0?iS:MD(i);n>r;){if(n-r>600){const c=n-r+1,d=t-r+1,u=Math.log(c),f=.5*Math.exp(2*u/3),p=.5*Math.sqrt(u*f*(c-f)/c)*(d-c/2<0?-1:1),m=Math.max(r,Math.floor(t-d*f/c+p)),x=Math.min(n,Math.floor(t+(c-d)*f/c+p));aS(e,t,m,x,i)}const s=e[t];let o=r,l=n;for(Ka(e,r,t),i(e[n],s)>0&&Ka(e,r,n);o0;)--l}i(e[r],s)===0?Ka(e,r,l):(++l,Ka(e,l,n)),l<=t&&(r=l+1),t<=l&&(n=l-1)}return e}function Ka(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function zD(e,t,r){if(e=Float64Array.from(AD(e)),!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return z0(e);if(t>=1)return L0(e);var n,i=(n-1)*t,s=Math.floor(i),o=L0(aS(e,s).subarray(0,s+1)),l=z0(e.subarray(s+1));return o+(l-o)*(i-s)}}function RD(e,t,r=nS){if(!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return+r(e[0],0,e);if(t>=1)return+r(e[n-1],n-1,e);var n,i=(n-1)*t,s=Math.floor(i),o=+r(e[s],s,e),l=+r(e[s+1],s+1,e);return o+(l-o)*(i-s)}}function BD(e,t,r){e=+e,t=+t,r=(i=arguments.length)<2?(t=e,e=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((t-e)/r))|0,s=new Array(i);++n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):r===8?Wo(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):r===4?Wo(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=UD.exec(e))?new Nt(t[1],t[2],t[3],1):(t=qD.exec(e))?new Nt(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=HD.exec(e))?Wo(t[1],t[2],t[3],t[4]):(t=KD.exec(e))?Wo(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=VD.exec(e))?H0(t[1],t[2]/100,t[3]/100,1):(t=YD.exec(e))?H0(t[1],t[2]/100,t[3]/100,t[4]):R0.hasOwnProperty(e)?W0(R0[e]):e==="transparent"?new Nt(NaN,NaN,NaN,0):null}function W0(e){return new Nt(e>>16&255,e>>8&255,e&255,1)}function Wo(e,t,r,n){return n<=0&&(e=t=r=NaN),new Nt(e,t,r,n)}function XD(e){return e instanceof no||(e=Bs(e)),e?(e=e.rgb(),new Nt(e.r,e.g,e.b,e.opacity)):new Nt}function np(e,t,r,n){return arguments.length===1?XD(e):new Nt(e,t,r,n??1)}function Nt(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}nm(Nt,np,oS(no,{brighter(e){return e=e==null?rc:Math.pow(rc,e),new Nt(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?zs:Math.pow(zs,e),new Nt(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Nt(ui(this.r),ui(this.g),ui(this.b),nc(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:U0,formatHex:U0,formatHex8:JD,formatRgb:q0,toString:q0}));function U0(){return`#${ni(this.r)}${ni(this.g)}${ni(this.b)}`}function JD(){return`#${ni(this.r)}${ni(this.g)}${ni(this.b)}${ni((isNaN(this.opacity)?1:this.opacity)*255)}`}function q0(){const e=nc(this.opacity);return`${e===1?"rgb(":"rgba("}${ui(this.r)}, ${ui(this.g)}, ${ui(this.b)}${e===1?")":`, ${e})`}`}function nc(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function ui(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function ni(e){return e=ui(e),(e<16?"0":"")+e.toString(16)}function H0(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new pr(e,t,r,n)}function lS(e){if(e instanceof pr)return new pr(e.h,e.s,e.l,e.opacity);if(e instanceof no||(e=Bs(e)),!e)return new pr;if(e instanceof pr)return e;e=e.rgb();var t=e.r/255,r=e.g/255,n=e.b/255,i=Math.min(t,r,n),s=Math.max(t,r,n),o=NaN,l=s-i,c=(s+i)/2;return l?(t===s?o=(r-n)/l+(r0&&c<1?0:o,new pr(o,l,c,e.opacity)}function QD(e,t,r,n){return arguments.length===1?lS(e):new pr(e,t,r,n??1)}function pr(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}nm(pr,QD,oS(no,{brighter(e){return e=e==null?rc:Math.pow(rc,e),new pr(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?zs:Math.pow(zs,e),new pr(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,i=2*r-n;return new Nt(gd(e>=240?e-240:e+120,i,n),gd(e,i,n),gd(e<120?e+240:e-120,i,n),this.opacity)},clamp(){return new pr(K0(this.h),Uo(this.s),Uo(this.l),nc(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=nc(this.opacity);return`${e===1?"hsl(":"hsla("}${K0(this.h)}, ${Uo(this.s)*100}%, ${Uo(this.l)*100}%${e===1?")":`, ${e})`}`}}));function K0(e){return e=(e||0)%360,e<0?e+360:e}function Uo(e){return Math.max(0,Math.min(1,e||0))}function gd(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}const im=e=>()=>e;function e5(e,t){return function(r){return e+r*t}}function t5(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}function r5(e){return(e=+e)==1?cS:function(t,r){return r-t?t5(t,r,e):im(isNaN(t)?r:t)}}function cS(e,t){var r=t-e;return r?e5(e,r):im(isNaN(e)?t:e)}const V0=function e(t){var r=r5(t);function n(i,s){var o=r((i=np(i)).r,(s=np(s)).r),l=r(i.g,s.g),c=r(i.b,s.b),d=cS(i.opacity,s.opacity);return function(u){return i.r=o(u),i.g=l(u),i.b=c(u),i.opacity=d(u),i+""}}return n.gamma=e,n}(1);function n5(e,t){t||(t=[]);var r=e?Math.min(t.length,e.length):0,n=t.slice(),i;return function(s){for(i=0;ir&&(s=t.slice(r,s),l[o]?l[o]+=s:l[++o]=s),(n=n[0])===(i=i[0])?l[o]?l[o]+=i:l[++o]=i:(l[++o]=null,c.push({i:o,x:ic(n,i)})),r=xd.lastIndex;return rt&&(r=e,e=t,t=r),function(n){return Math.max(e,Math.min(t,n))}}function h5(e,t,r){var n=e[0],i=e[1],s=t[0],o=t[1];return i2?m5:h5,c=d=null,f}function f(p){return p==null||isNaN(p=+p)?s:(c||(c=l(e.map(n),t,r)))(n(o(p)))}return f.invert=function(p){return o(i((d||(d=l(t,e.map(n),ic)))(p)))},f.domain=function(p){return arguments.length?(e=Array.from(p,ac),u()):e.slice()},f.range=function(p){return arguments.length?(t=Array.from(p),u()):t.slice()},f.rangeRound=function(p){return t=Array.from(p),r=am,u()},f.clamp=function(p){return arguments.length?(o=p?!0:mt,u()):o!==mt},f.interpolate=function(p){return arguments.length?(r=p,u()):r},f.unknown=function(p){return arguments.length?(s=p,f):s},function(p,m){return n=p,i=m,u()}}function sm(){return hu()(mt,mt)}function g5(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function sc(e,t){if((r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"))<0)return null;var r,n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function ga(e){return e=sc(Math.abs(e)),e?e[1]:NaN}function x5(e,t){return function(r,n){for(var i=r.length,s=[],o=0,l=e[0],c=0;i>0&&l>0&&(c+l+1>n&&(l=Math.max(1,n-c)),s.push(r.substring(i-=l,i+l)),!((c+=l+1)>n));)l=e[o=(o+1)%e.length];return s.reverse().join(t)}}function y5(e){return function(t){return t.replace(/[0-9]/g,function(r){return e[+r]})}}var v5=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Fs(e){if(!(t=v5.exec(e)))throw new Error("invalid format: "+e);var t;return new om({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}Fs.prototype=om.prototype;function om(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}om.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function b5(e){e:for(var t=e.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?e.slice(0,n)+e.slice(i+1):e}var uS;function j5(e,t){var r=sc(e,t);if(!r)return e+"";var n=r[0],i=r[1],s=i-(uS=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,o=n.length;return s===o?n:s>o?n+new Array(s-o+1).join("0"):s>0?n.slice(0,s)+"."+n.slice(s):"0."+new Array(1-s).join("0")+sc(e,Math.max(0,t+s-1))[0]}function G0(e,t){var r=sc(e,t);if(!r)return e+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}const Z0={"%":(e,t)=>(e*100).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:g5,e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>G0(e*100,t),r:G0,s:j5,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function X0(e){return e}var J0=Array.prototype.map,Q0=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function w5(e){var t=e.grouping===void 0||e.thousands===void 0?X0:x5(J0.call(e.grouping,Number),e.thousands+""),r=e.currency===void 0?"":e.currency[0]+"",n=e.currency===void 0?"":e.currency[1]+"",i=e.decimal===void 0?".":e.decimal+"",s=e.numerals===void 0?X0:y5(J0.call(e.numerals,String)),o=e.percent===void 0?"%":e.percent+"",l=e.minus===void 0?"−":e.minus+"",c=e.nan===void 0?"NaN":e.nan+"";function d(f){f=Fs(f);var p=f.fill,m=f.align,x=f.sign,g=f.symbol,b=f.zero,v=f.width,j=f.comma,y=f.precision,w=f.trim,S=f.type;S==="n"?(j=!0,S="g"):Z0[S]||(y===void 0&&(y=12),w=!0,S="g"),(b||p==="0"&&m==="=")&&(b=!0,p="0",m="=");var N=g==="$"?r:g==="#"&&/[boxX]/.test(S)?"0"+S.toLowerCase():"",P=g==="$"?n:/[%p]/.test(S)?o:"",_=Z0[S],T=/[defgprs%]/.test(S);y=y===void 0?6:/[gprs]/.test(S)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y));function $(M){var C=N,R=P,q,Z,E;if(S==="c")R=_(M)+R,M="";else{M=+M;var D=M<0||1/M<0;if(M=isNaN(M)?c:_(Math.abs(M),y),w&&(M=b5(M)),D&&+M==0&&x!=="+"&&(D=!1),C=(D?x==="("?x:l:x==="-"||x==="("?"":x)+C,R=(S==="s"?Q0[8+uS/3]:"")+R+(D&&x==="("?")":""),T){for(q=-1,Z=M.length;++qE||E>57){R=(E===46?i+M.slice(q+1):M.slice(q))+R,M=M.slice(0,q);break}}}j&&!b&&(M=t(M,1/0));var O=C.length+M.length+R.length,k=O>1)+C+M+R+k.slice(O);break;default:M=k+C+M+R;break}return s(M)}return $.toString=function(){return f+""},$}function u(f,p){var m=d((f=Fs(f),f.type="f",f)),x=Math.max(-8,Math.min(8,Math.floor(ga(p)/3)))*3,g=Math.pow(10,-x),b=Q0[8+x/3];return function(v){return m(g*v)+b}}return{format:d,formatPrefix:u}}var qo,lm,dS;S5({thousands:",",grouping:[3],currency:["$",""]});function S5(e){return qo=w5(e),lm=qo.format,dS=qo.formatPrefix,qo}function N5(e){return Math.max(0,-ga(Math.abs(e)))}function k5(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(ga(t)/3)))*3-ga(Math.abs(e)))}function P5(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,ga(t)-ga(e))+1}function fS(e,t,r,n){var i=tp(e,t,r),s;switch(n=Fs(n??",f"),n.type){case"s":{var o=Math.max(Math.abs(e),Math.abs(t));return n.precision==null&&!isNaN(s=k5(i,o))&&(n.precision=s),dS(n,o)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(s=P5(i,Math.max(Math.abs(e),Math.abs(t))))&&(n.precision=s-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(s=N5(i))&&(n.precision=s-(n.type==="%")*2);break}}return lm(n)}function qn(e){var t=e.domain;return e.ticks=function(r){var n=t();return Qf(n[0],n[n.length-1],r??10)},e.tickFormat=function(r,n){var i=t();return fS(i[0],i[i.length-1],r??10,n)},e.nice=function(r){r==null&&(r=10);var n=t(),i=0,s=n.length-1,o=n[i],l=n[s],c,d,u=10;for(l0;){if(d=ep(o,l,r),d===c)return n[i]=o,n[s]=l,t(n);if(d>0)o=Math.floor(o/d)*d,l=Math.ceil(l/d)*d;else if(d<0)o=Math.ceil(o*d)/d,l=Math.floor(l*d)/d;else break;c=d}return e},e}function pS(){var e=sm();return e.copy=function(){return io(e,pS())},or.apply(e,arguments),qn(e)}function hS(e){var t;function r(n){return n==null||isNaN(n=+n)?t:n}return r.invert=r,r.domain=r.range=function(n){return arguments.length?(e=Array.from(n,ac),r):e.slice()},r.unknown=function(n){return arguments.length?(t=n,r):t},r.copy=function(){return hS(e).unknown(t)},e=arguments.length?Array.from(e,ac):[0,1],qn(r)}function mS(e,t){e=e.slice();var r=0,n=e.length-1,i=e[r],s=e[n],o;return sMath.pow(e,t)}function E5(e){return e===Math.E?Math.log:e===10&&Math.log10||e===2&&Math.log2||(e=Math.log(e),t=>Math.log(t)/e)}function ry(e){return(t,r)=>-e(-t,r)}function cm(e){const t=e(ey,ty),r=t.domain;let n=10,i,s;function o(){return i=E5(n),s=O5(n),r()[0]<0?(i=ry(i),s=ry(s),e(_5,C5)):e(ey,ty),t}return t.base=function(l){return arguments.length?(n=+l,o()):n},t.domain=function(l){return arguments.length?(r(l),o()):r()},t.ticks=l=>{const c=r();let d=c[0],u=c[c.length-1];const f=u0){for(;p<=m;++p)for(x=1;xu)break;v.push(g)}}else for(;p<=m;++p)for(x=n-1;x>=1;--x)if(g=p>0?x/s(-p):x*s(p),!(gu)break;v.push(g)}v.length*2{if(l==null&&(l=10),c==null&&(c=n===10?"s":","),typeof c!="function"&&(!(n%1)&&(c=Fs(c)).precision==null&&(c.trim=!0),c=lm(c)),l===1/0)return c;const d=Math.max(1,n*l/t.ticks().length);return u=>{let f=u/s(Math.round(i(u)));return f*nr(mS(r(),{floor:l=>s(Math.floor(i(l))),ceil:l=>s(Math.ceil(i(l)))})),t}function gS(){const e=cm(hu()).domain([1,10]);return e.copy=()=>io(e,gS()).base(e.base()),or.apply(e,arguments),e}function ny(e){return function(t){return Math.sign(t)*Math.log1p(Math.abs(t/e))}}function iy(e){return function(t){return Math.sign(t)*Math.expm1(Math.abs(t))*e}}function um(e){var t=1,r=e(ny(t),iy(t));return r.constant=function(n){return arguments.length?e(ny(t=+n),iy(t)):t},qn(r)}function xS(){var e=um(hu());return e.copy=function(){return io(e,xS()).constant(e.constant())},or.apply(e,arguments)}function ay(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function D5(e){return e<0?-Math.sqrt(-e):Math.sqrt(e)}function T5(e){return e<0?-e*e:e*e}function dm(e){var t=e(mt,mt),r=1;function n(){return r===1?e(mt,mt):r===.5?e(D5,T5):e(ay(r),ay(1/r))}return t.exponent=function(i){return arguments.length?(r=+i,n()):r},qn(t)}function fm(){var e=dm(hu());return e.copy=function(){return io(e,fm()).exponent(e.exponent())},or.apply(e,arguments),e}function M5(){return fm.apply(null,arguments).exponent(.5)}function sy(e){return Math.sign(e)*e*e}function I5(e){return Math.sign(e)*Math.sqrt(Math.abs(e))}function yS(){var e=sm(),t=[0,1],r=!1,n;function i(s){var o=I5(e(s));return isNaN(o)?n:r?Math.round(o):o}return i.invert=function(s){return e.invert(sy(s))},i.domain=function(s){return arguments.length?(e.domain(s),i):e.domain()},i.range=function(s){return arguments.length?(e.range((t=Array.from(s,ac)).map(sy)),i):t.slice()},i.rangeRound=function(s){return i.range(s).round(!0)},i.round=function(s){return arguments.length?(r=!!s,i):r},i.clamp=function(s){return arguments.length?(e.clamp(s),i):e.clamp()},i.unknown=function(s){return arguments.length?(n=s,i):n},i.copy=function(){return yS(e.domain(),t).round(r).clamp(e.clamp()).unknown(n)},or.apply(i,arguments),qn(i)}function vS(){var e=[],t=[],r=[],n;function i(){var o=0,l=Math.max(1,t.length);for(r=new Array(l-1);++o0?r[l-1]:e[0],l=r?[n[r-1],t]:[n[d-1],n[d]]},o.unknown=function(c){return arguments.length&&(s=c),o},o.thresholds=function(){return n.slice()},o.copy=function(){return bS().domain([e,t]).range(i).unknown(s)},or.apply(qn(o),arguments)}function jS(){var e=[.5],t=[0,1],r,n=1;function i(s){return s!=null&&s<=s?t[ro(e,s,0,n)]:r}return i.domain=function(s){return arguments.length?(e=Array.from(s),n=Math.min(e.length,t.length-1),i):e.slice()},i.range=function(s){return arguments.length?(t=Array.from(s),n=Math.min(e.length,t.length-1),i):t.slice()},i.invertExtent=function(s){var o=t.indexOf(s);return[e[o-1],e[o]]},i.unknown=function(s){return arguments.length?(r=s,i):r},i.copy=function(){return jS().domain(e).range(t).unknown(r)},or.apply(i,arguments)}const yd=new Date,vd=new Date;function Be(e,t,r,n){function i(s){return e(s=arguments.length===0?new Date:new Date(+s)),s}return i.floor=s=>(e(s=new Date(+s)),s),i.ceil=s=>(e(s=new Date(s-1)),t(s,1),e(s),s),i.round=s=>{const o=i(s),l=i.ceil(s);return s-o(t(s=new Date(+s),o==null?1:Math.floor(o)),s),i.range=(s,o,l)=>{const c=[];if(s=i.ceil(s),l=l==null?1:Math.floor(l),!(s0))return c;let d;do c.push(d=new Date(+s)),t(s,l),e(s);while(dBe(o=>{if(o>=o)for(;e(o),!s(o);)o.setTime(o-1)},(o,l)=>{if(o>=o)if(l<0)for(;++l<=0;)for(;t(o,-1),!s(o););else for(;--l>=0;)for(;t(o,1),!s(o););}),r&&(i.count=(s,o)=>(yd.setTime(+s),vd.setTime(+o),e(yd),e(vd),Math.floor(r(yd,vd))),i.every=s=>(s=Math.floor(s),!isFinite(s)||!(s>0)?null:s>1?i.filter(n?o=>n(o)%s===0:o=>i.count(0,o)%s===0):i)),i}const oc=Be(()=>{},(e,t)=>{e.setTime(+e+t)},(e,t)=>t-e);oc.every=e=>(e=Math.floor(e),!isFinite(e)||!(e>0)?null:e>1?Be(t=>{t.setTime(Math.floor(t/e)*e)},(t,r)=>{t.setTime(+t+r*e)},(t,r)=>(r-t)/e):oc);oc.range;const Wr=1e3,Qt=Wr*60,Ur=Qt*60,tn=Ur*24,pm=tn*7,oy=tn*30,bd=tn*365,ii=Be(e=>{e.setTime(e-e.getMilliseconds())},(e,t)=>{e.setTime(+e+t*Wr)},(e,t)=>(t-e)/Wr,e=>e.getUTCSeconds());ii.range;const hm=Be(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*Wr)},(e,t)=>{e.setTime(+e+t*Qt)},(e,t)=>(t-e)/Qt,e=>e.getMinutes());hm.range;const mm=Be(e=>{e.setUTCSeconds(0,0)},(e,t)=>{e.setTime(+e+t*Qt)},(e,t)=>(t-e)/Qt,e=>e.getUTCMinutes());mm.range;const gm=Be(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*Wr-e.getMinutes()*Qt)},(e,t)=>{e.setTime(+e+t*Ur)},(e,t)=>(t-e)/Ur,e=>e.getHours());gm.range;const xm=Be(e=>{e.setUTCMinutes(0,0,0)},(e,t)=>{e.setTime(+e+t*Ur)},(e,t)=>(t-e)/Ur,e=>e.getUTCHours());xm.range;const ao=Be(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*Qt)/tn,e=>e.getDate()-1);ao.range;const mu=Be(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/tn,e=>e.getUTCDate()-1);mu.range;const wS=Be(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/tn,e=>Math.floor(e/tn));wS.range;function Ai(e){return Be(t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},(t,r)=>{t.setDate(t.getDate()+r*7)},(t,r)=>(r-t-(r.getTimezoneOffset()-t.getTimezoneOffset())*Qt)/pm)}const gu=Ai(0),lc=Ai(1),$5=Ai(2),L5=Ai(3),xa=Ai(4),z5=Ai(5),R5=Ai(6);gu.range;lc.range;$5.range;L5.range;xa.range;z5.range;R5.range;function Oi(e){return Be(t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCDate(t.getUTCDate()+r*7)},(t,r)=>(r-t)/pm)}const xu=Oi(0),cc=Oi(1),B5=Oi(2),F5=Oi(3),ya=Oi(4),W5=Oi(5),U5=Oi(6);xu.range;cc.range;B5.range;F5.range;ya.range;W5.range;U5.range;const ym=Be(e=>{e.setDate(1),e.setHours(0,0,0,0)},(e,t)=>{e.setMonth(e.getMonth()+t)},(e,t)=>t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12,e=>e.getMonth());ym.range;const vm=Be(e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)},(e,t)=>t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12,e=>e.getUTCMonth());vm.range;const rn=Be(e=>{e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t)},(e,t)=>t.getFullYear()-e.getFullYear(),e=>e.getFullYear());rn.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Be(t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},(t,r)=>{t.setFullYear(t.getFullYear()+r*e)});rn.range;const nn=Be(e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)},(e,t)=>t.getUTCFullYear()-e.getUTCFullYear(),e=>e.getUTCFullYear());nn.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Be(t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)});nn.range;function SS(e,t,r,n,i,s){const o=[[ii,1,Wr],[ii,5,5*Wr],[ii,15,15*Wr],[ii,30,30*Wr],[s,1,Qt],[s,5,5*Qt],[s,15,15*Qt],[s,30,30*Qt],[i,1,Ur],[i,3,3*Ur],[i,6,6*Ur],[i,12,12*Ur],[n,1,tn],[n,2,2*tn],[r,1,pm],[t,1,oy],[t,3,3*oy],[e,1,bd]];function l(d,u,f){const p=ub).right(o,p);if(m===o.length)return e.every(tp(d/bd,u/bd,f));if(m===0)return oc.every(Math.max(tp(d,u,f),1));const[x,g]=o[p/o[m-1][2]53)return null;"w"in U||(U.w=1),"Z"in U?(pe=wd(Va(U.y,0,1)),Et=pe.getUTCDay(),pe=Et>4||Et===0?cc.ceil(pe):cc(pe),pe=mu.offset(pe,(U.V-1)*7),U.y=pe.getUTCFullYear(),U.m=pe.getUTCMonth(),U.d=pe.getUTCDate()+(U.w+6)%7):(pe=jd(Va(U.y,0,1)),Et=pe.getDay(),pe=Et>4||Et===0?lc.ceil(pe):lc(pe),pe=ao.offset(pe,(U.V-1)*7),U.y=pe.getFullYear(),U.m=pe.getMonth(),U.d=pe.getDate()+(U.w+6)%7)}else("W"in U||"U"in U)&&("w"in U||(U.w="u"in U?U.u%7:"W"in U?1:0),Et="Z"in U?wd(Va(U.y,0,1)).getUTCDay():jd(Va(U.y,0,1)).getDay(),U.m=0,U.d="W"in U?(U.w+6)%7+U.W*7-(Et+5)%7:U.w+U.U*7-(Et+6)%7);return"Z"in U?(U.H+=U.Z/100|0,U.M+=U.Z%100,wd(U)):jd(U)}}function _(z,Q,ne,U){for(var bt=0,pe=Q.length,Et=ne.length,Dt,Yn;bt=Et)return-1;if(Dt=Q.charCodeAt(bt++),Dt===37){if(Dt=Q.charAt(bt++),Yn=S[Dt in ly?Q.charAt(bt++):Dt],!Yn||(U=Yn(z,ne,U))<0)return-1}else if(Dt!=ne.charCodeAt(U++))return-1}return U}function T(z,Q,ne){var U=d.exec(Q.slice(ne));return U?(z.p=u.get(U[0].toLowerCase()),ne+U[0].length):-1}function $(z,Q,ne){var U=m.exec(Q.slice(ne));return U?(z.w=x.get(U[0].toLowerCase()),ne+U[0].length):-1}function M(z,Q,ne){var U=f.exec(Q.slice(ne));return U?(z.w=p.get(U[0].toLowerCase()),ne+U[0].length):-1}function C(z,Q,ne){var U=v.exec(Q.slice(ne));return U?(z.m=j.get(U[0].toLowerCase()),ne+U[0].length):-1}function R(z,Q,ne){var U=g.exec(Q.slice(ne));return U?(z.m=b.get(U[0].toLowerCase()),ne+U[0].length):-1}function q(z,Q,ne){return _(z,t,Q,ne)}function Z(z,Q,ne){return _(z,r,Q,ne)}function E(z,Q,ne){return _(z,n,Q,ne)}function D(z){return o[z.getDay()]}function O(z){return s[z.getDay()]}function k(z){return c[z.getMonth()]}function L(z){return l[z.getMonth()]}function F(z){return i[+(z.getHours()>=12)]}function H(z){return 1+~~(z.getMonth()/3)}function te(z){return o[z.getUTCDay()]}function re(z){return s[z.getUTCDay()]}function we(z){return c[z.getUTCMonth()]}function A(z){return l[z.getUTCMonth()]}function J(z){return i[+(z.getUTCHours()>=12)]}function Ot(z){return 1+~~(z.getUTCMonth()/3)}return{format:function(z){var Q=N(z+="",y);return Q.toString=function(){return z},Q},parse:function(z){var Q=P(z+="",!1);return Q.toString=function(){return z},Q},utcFormat:function(z){var Q=N(z+="",w);return Q.toString=function(){return z},Q},utcParse:function(z){var Q=P(z+="",!0);return Q.toString=function(){return z},Q}}}var ly={"-":"",_:" ",0:"0"},Ye=/^\s*\d+/,G5=/^%/,Z5=/[\\^$*+?|[\]().{}]/g;function se(e,t,r){var n=e<0?"-":"",i=(n?-e:e)+"",s=i.length;return n+(s[t.toLowerCase(),r]))}function J5(e,t,r){var n=Ye.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function Q5(e,t,r){var n=Ye.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function eT(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function tT(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function rT(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function cy(e,t,r){var n=Ye.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function uy(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function nT(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function iT(e,t,r){var n=Ye.exec(t.slice(r,r+1));return n?(e.q=n[0]*3-3,r+n[0].length):-1}function aT(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function dy(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function sT(e,t,r){var n=Ye.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function fy(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function oT(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function lT(e,t,r){var n=Ye.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function cT(e,t,r){var n=Ye.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function uT(e,t,r){var n=Ye.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function dT(e,t,r){var n=G5.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function fT(e,t,r){var n=Ye.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function pT(e,t,r){var n=Ye.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function py(e,t){return se(e.getDate(),t,2)}function hT(e,t){return se(e.getHours(),t,2)}function mT(e,t){return se(e.getHours()%12||12,t,2)}function gT(e,t){return se(1+ao.count(rn(e),e),t,3)}function NS(e,t){return se(e.getMilliseconds(),t,3)}function xT(e,t){return NS(e,t)+"000"}function yT(e,t){return se(e.getMonth()+1,t,2)}function vT(e,t){return se(e.getMinutes(),t,2)}function bT(e,t){return se(e.getSeconds(),t,2)}function jT(e){var t=e.getDay();return t===0?7:t}function wT(e,t){return se(gu.count(rn(e)-1,e),t,2)}function kS(e){var t=e.getDay();return t>=4||t===0?xa(e):xa.ceil(e)}function ST(e,t){return e=kS(e),se(xa.count(rn(e),e)+(rn(e).getDay()===4),t,2)}function NT(e){return e.getDay()}function kT(e,t){return se(lc.count(rn(e)-1,e),t,2)}function PT(e,t){return se(e.getFullYear()%100,t,2)}function _T(e,t){return e=kS(e),se(e.getFullYear()%100,t,2)}function CT(e,t){return se(e.getFullYear()%1e4,t,4)}function AT(e,t){var r=e.getDay();return e=r>=4||r===0?xa(e):xa.ceil(e),se(e.getFullYear()%1e4,t,4)}function OT(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+se(t/60|0,"0",2)+se(t%60,"0",2)}function hy(e,t){return se(e.getUTCDate(),t,2)}function ET(e,t){return se(e.getUTCHours(),t,2)}function DT(e,t){return se(e.getUTCHours()%12||12,t,2)}function TT(e,t){return se(1+mu.count(nn(e),e),t,3)}function PS(e,t){return se(e.getUTCMilliseconds(),t,3)}function MT(e,t){return PS(e,t)+"000"}function IT(e,t){return se(e.getUTCMonth()+1,t,2)}function $T(e,t){return se(e.getUTCMinutes(),t,2)}function LT(e,t){return se(e.getUTCSeconds(),t,2)}function zT(e){var t=e.getUTCDay();return t===0?7:t}function RT(e,t){return se(xu.count(nn(e)-1,e),t,2)}function _S(e){var t=e.getUTCDay();return t>=4||t===0?ya(e):ya.ceil(e)}function BT(e,t){return e=_S(e),se(ya.count(nn(e),e)+(nn(e).getUTCDay()===4),t,2)}function FT(e){return e.getUTCDay()}function WT(e,t){return se(cc.count(nn(e)-1,e),t,2)}function UT(e,t){return se(e.getUTCFullYear()%100,t,2)}function qT(e,t){return e=_S(e),se(e.getUTCFullYear()%100,t,2)}function HT(e,t){return se(e.getUTCFullYear()%1e4,t,4)}function KT(e,t){var r=e.getUTCDay();return e=r>=4||r===0?ya(e):ya.ceil(e),se(e.getUTCFullYear()%1e4,t,4)}function VT(){return"+0000"}function my(){return"%"}function gy(e){return+e}function xy(e){return Math.floor(+e/1e3)}var Di,CS,AS;YT({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function YT(e){return Di=Y5(e),CS=Di.format,Di.parse,AS=Di.utcFormat,Di.utcParse,Di}function GT(e){return new Date(e)}function ZT(e){return e instanceof Date?+e:+new Date(+e)}function bm(e,t,r,n,i,s,o,l,c,d){var u=sm(),f=u.invert,p=u.domain,m=d(".%L"),x=d(":%S"),g=d("%I:%M"),b=d("%I %p"),v=d("%a %d"),j=d("%b %d"),y=d("%B"),w=d("%Y");function S(N){return(c(N)t(i/(e.length-1)))},r.quantiles=function(n){return Array.from({length:n+1},(i,s)=>zD(e,s/n))},r.copy=function(){return TS(t).domain(e)},un.apply(r,arguments)}function vu(){var e=0,t=.5,r=1,n=1,i,s,o,l,c,d=mt,u,f=!1,p;function m(g){return isNaN(g=+g)?p:(g=.5+((g=+u(g))-s)*(n*ge.chartData,tM=I([Kn],e=>{var t=e.chartData!=null?e.chartData.length-1:0;return{chartData:e.chartData,computedData:e.computedData,dataEndIndex:t,dataStartIndex:0}}),bu=(e,t,r,n)=>n?tM(e):Kn(e);function ji(e){if(Array.isArray(e)&&e.length===2){var[t,r]=e;if(_e(t)&&_e(r))return!0}return!1}function yy(e,t,r){return r?e:[Math.min(e[0],t[0]),Math.max(e[1],t[1])]}function LS(e,t){if(t&&typeof e!="function"&&Array.isArray(e)&&e.length===2){var[r,n]=e,i,s;if(_e(r))i=r;else if(typeof r=="function")return;if(_e(n))s=n;else if(typeof n=="function")return;var o=[i,s];if(ji(o))return o}}function rM(e,t,r){if(!(!r&&t==null)){if(typeof e=="function"&&t!=null)try{var n=e(t,r);if(ji(n))return yy(n,t,r)}catch{}if(Array.isArray(e)&&e.length===2){var[i,s]=e,o,l;if(i==="auto")t!=null&&(o=Math.min(...t));else if(Y(i))o=i;else if(typeof i=="function")try{t!=null&&(o=i(t==null?void 0:t[0]))}catch{}else if(typeof i=="string"&&o0.test(i)){var c=o0.exec(i);if(c==null||t==null)o=void 0;else{var d=+c[1];o=t[0]-d}}else o=t==null?void 0:t[0];if(s==="auto")t!=null&&(l=Math.max(...t));else if(Y(s))l=s;else if(typeof s=="function")try{t!=null&&(l=s(t==null?void 0:t[1]))}catch{}else if(typeof s=="string"&&l0.test(s)){var u=l0.exec(s);if(u==null||t==null)l=void 0;else{var f=+u[1];l=t[1]+f}}else l=t==null?void 0:t[1];var p=[o,l];if(ji(p))return t==null?p:yy(p,t,r)}}}var Ca=1e9,nM={precision:20,rounding:4,toExpNeg:-7,toExpPos:21,LN10:"2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286"},Nm,je=!0,sr="[DecimalError] ",di=sr+"Invalid argument: ",Sm=sr+"Exponent out of range: ",Aa=Math.floor,Qn=Math.pow,iM=/^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,Lt,qe=1e7,xe=7,zS=9007199254740991,uc=Aa(zS/xe),V={};V.absoluteValue=V.abs=function(){var e=new this.constructor(this);return e.s&&(e.s=1),e};V.comparedTo=V.cmp=function(e){var t,r,n,i,s=this;if(e=new s.constructor(e),s.s!==e.s)return s.s||-e.s;if(s.e!==e.e)return s.e>e.e^s.s<0?1:-1;for(n=s.d.length,i=e.d.length,t=0,r=ne.d[t]^s.s<0?1:-1;return n===i?0:n>i^s.s<0?1:-1};V.decimalPlaces=V.dp=function(){var e=this,t=e.d.length-1,r=(t-e.e)*xe;if(t=e.d[t],t)for(;t%10==0;t/=10)r--;return r<0?0:r};V.dividedBy=V.div=function(e){return Vr(this,new this.constructor(e))};V.dividedToIntegerBy=V.idiv=function(e){var t=this,r=t.constructor;return fe(Vr(t,new r(e),0,1),r.precision)};V.equals=V.eq=function(e){return!this.cmp(e)};V.exponent=function(){return Me(this)};V.greaterThan=V.gt=function(e){return this.cmp(e)>0};V.greaterThanOrEqualTo=V.gte=function(e){return this.cmp(e)>=0};V.isInteger=V.isint=function(){return this.e>this.d.length-2};V.isNegative=V.isneg=function(){return this.s<0};V.isPositive=V.ispos=function(){return this.s>0};V.isZero=function(){return this.s===0};V.lessThan=V.lt=function(e){return this.cmp(e)<0};V.lessThanOrEqualTo=V.lte=function(e){return this.cmp(e)<1};V.logarithm=V.log=function(e){var t,r=this,n=r.constructor,i=n.precision,s=i+5;if(e===void 0)e=new n(10);else if(e=new n(e),e.s<1||e.eq(Lt))throw Error(sr+"NaN");if(r.s<1)throw Error(sr+(r.s?"NaN":"-Infinity"));return r.eq(Lt)?new n(0):(je=!1,t=Vr(Ws(r,s),Ws(e,s),s),je=!0,fe(t,i))};V.minus=V.sub=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?FS(t,e):RS(t,(e.s=-e.s,e))};V.modulo=V.mod=function(e){var t,r=this,n=r.constructor,i=n.precision;if(e=new n(e),!e.s)throw Error(sr+"NaN");return r.s?(je=!1,t=Vr(r,e,0,1).times(e),je=!0,r.minus(t)):fe(new n(r),i)};V.naturalExponential=V.exp=function(){return BS(this)};V.naturalLogarithm=V.ln=function(){return Ws(this)};V.negated=V.neg=function(){var e=new this.constructor(this);return e.s=-e.s||0,e};V.plus=V.add=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?RS(t,e):FS(t,(e.s=-e.s,e))};V.precision=V.sd=function(e){var t,r,n,i=this;if(e!==void 0&&e!==!!e&&e!==1&&e!==0)throw Error(di+e);if(t=Me(i)+1,n=i.d.length-1,r=n*xe+1,n=i.d[n],n){for(;n%10==0;n/=10)r--;for(n=i.d[0];n>=10;n/=10)r++}return e&&t>r?t:r};V.squareRoot=V.sqrt=function(){var e,t,r,n,i,s,o,l=this,c=l.constructor;if(l.s<1){if(!l.s)return new c(0);throw Error(sr+"NaN")}for(e=Me(l),je=!1,i=Math.sqrt(+l),i==0||i==1/0?(t=Nr(l.d),(t.length+e)%2==0&&(t+="0"),i=Math.sqrt(t),e=Aa((e+1)/2)-(e<0||e%2),i==1/0?t="5e"+e:(t=i.toExponential(),t=t.slice(0,t.indexOf("e")+1)+e),n=new c(t)):n=new c(i.toString()),r=c.precision,i=o=r+3;;)if(s=n,n=s.plus(Vr(l,s,o+2)).times(.5),Nr(s.d).slice(0,o)===(t=Nr(n.d)).slice(0,o)){if(t=t.slice(o-3,o+1),i==o&&t=="4999"){if(fe(s,r+1,0),s.times(s).eq(l)){n=s;break}}else if(t!="9999")break;o+=4}return je=!0,fe(n,r)};V.times=V.mul=function(e){var t,r,n,i,s,o,l,c,d,u=this,f=u.constructor,p=u.d,m=(e=new f(e)).d;if(!u.s||!e.s)return new f(0);for(e.s*=u.s,r=u.e+e.e,c=p.length,d=m.length,c=0;){for(t=0,i=c+n;i>n;)l=s[i]+m[n]*p[i-n-1]+t,s[i--]=l%qe|0,t=l/qe|0;s[i]=(s[i]+t)%qe|0}for(;!s[--o];)s.pop();return t?++r:s.shift(),e.d=s,e.e=r,je?fe(e,f.precision):e};V.toDecimalPlaces=V.todp=function(e,t){var r=this,n=r.constructor;return r=new n(r),e===void 0?r:(Dr(e,0,Ca),t===void 0?t=n.rounding:Dr(t,0,8),fe(r,e+Me(r)+1,t))};V.toExponential=function(e,t){var r,n=this,i=n.constructor;return e===void 0?r=wi(n,!0):(Dr(e,0,Ca),t===void 0?t=i.rounding:Dr(t,0,8),n=fe(new i(n),e+1,t),r=wi(n,!0,e+1)),r};V.toFixed=function(e,t){var r,n,i=this,s=i.constructor;return e===void 0?wi(i):(Dr(e,0,Ca),t===void 0?t=s.rounding:Dr(t,0,8),n=fe(new s(i),e+Me(i)+1,t),r=wi(n.abs(),!1,e+Me(n)+1),i.isneg()&&!i.isZero()?"-"+r:r)};V.toInteger=V.toint=function(){var e=this,t=e.constructor;return fe(new t(e),Me(e)+1,t.rounding)};V.toNumber=function(){return+this};V.toPower=V.pow=function(e){var t,r,n,i,s,o,l=this,c=l.constructor,d=12,u=+(e=new c(e));if(!e.s)return new c(Lt);if(l=new c(l),!l.s){if(e.s<1)throw Error(sr+"Infinity");return l}if(l.eq(Lt))return l;if(n=c.precision,e.eq(Lt))return fe(l,n);if(t=e.e,r=e.d.length-1,o=t>=r,s=l.s,o){if((r=u<0?-u:u)<=zS){for(i=new c(Lt),t=Math.ceil(n/xe+4),je=!1;r%2&&(i=i.times(l),by(i.d,t)),r=Aa(r/2),r!==0;)l=l.times(l),by(l.d,t);return je=!0,e.s<0?new c(Lt).div(i):fe(i,n)}}else if(s<0)throw Error(sr+"NaN");return s=s<0&&e.d[Math.max(t,r)]&1?-1:1,l.s=1,je=!1,i=e.times(Ws(l,n+d)),je=!0,i=BS(i),i.s=s,i};V.toPrecision=function(e,t){var r,n,i=this,s=i.constructor;return e===void 0?(r=Me(i),n=wi(i,r<=s.toExpNeg||r>=s.toExpPos)):(Dr(e,1,Ca),t===void 0?t=s.rounding:Dr(t,0,8),i=fe(new s(i),e,t),r=Me(i),n=wi(i,e<=r||r<=s.toExpNeg,e)),n};V.toSignificantDigits=V.tosd=function(e,t){var r=this,n=r.constructor;return e===void 0?(e=n.precision,t=n.rounding):(Dr(e,1,Ca),t===void 0?t=n.rounding:Dr(t,0,8)),fe(new n(r),e,t)};V.toString=V.valueOf=V.val=V.toJSON=V[Symbol.for("nodejs.util.inspect.custom")]=function(){var e=this,t=Me(e),r=e.constructor;return wi(e,t<=r.toExpNeg||t>=r.toExpPos)};function RS(e,t){var r,n,i,s,o,l,c,d,u=e.constructor,f=u.precision;if(!e.s||!t.s)return t.s||(t=new u(e)),je?fe(t,f):t;if(c=e.d,d=t.d,o=e.e,i=t.e,c=c.slice(),s=o-i,s){for(s<0?(n=c,s=-s,l=d.length):(n=d,i=o,l=c.length),o=Math.ceil(f/xe),l=o>l?o+1:l+1,s>l&&(s=l,n.length=1),n.reverse();s--;)n.push(0);n.reverse()}for(l=c.length,s=d.length,l-s<0&&(s=l,n=d,d=c,c=n),r=0;s;)r=(c[--s]=c[s]+d[s]+r)/qe|0,c[s]%=qe;for(r&&(c.unshift(r),++i),l=c.length;c[--l]==0;)c.pop();return t.d=c,t.e=i,je?fe(t,f):t}function Dr(e,t,r){if(e!==~~e||er)throw Error(di+e)}function Nr(e){var t,r,n,i=e.length-1,s="",o=e[0];if(i>0){for(s+=o,t=1;to?1:-1;else for(l=c=0;li[l]?1:-1;break}return c}function r(n,i,s){for(var o=0;s--;)n[s]-=o,o=n[s]1;)n.shift()}return function(n,i,s,o){var l,c,d,u,f,p,m,x,g,b,v,j,y,w,S,N,P,_,T=n.constructor,$=n.s==i.s?1:-1,M=n.d,C=i.d;if(!n.s)return new T(n);if(!i.s)throw Error(sr+"Division by zero");for(c=n.e-i.e,P=C.length,S=M.length,m=new T($),x=m.d=[],d=0;C[d]==(M[d]||0);)++d;if(C[d]>(M[d]||0)&&--c,s==null?j=s=T.precision:o?j=s+(Me(n)-Me(i))+1:j=s,j<0)return new T(0);if(j=j/xe+2|0,d=0,P==1)for(u=0,C=C[0],j++;(d1&&(C=e(C,u),M=e(M,u),P=C.length,S=M.length),w=P,g=M.slice(0,P),b=g.length;b=qe/2&&++N;do u=0,l=t(C,g,P,b),l<0?(v=g[0],P!=b&&(v=v*qe+(g[1]||0)),u=v/N|0,u>1?(u>=qe&&(u=qe-1),f=e(C,u),p=f.length,b=g.length,l=t(f,g,p,b),l==1&&(u--,r(f,P16)throw Error(Sm+Me(e));if(!e.s)return new u(Lt);for(je=!1,l=f,o=new u(.03125);e.abs().gte(.1);)e=e.times(o),d+=5;for(n=Math.log(Qn(2,d))/Math.LN10*2+5|0,l+=n,r=i=s=new u(Lt),u.precision=l;;){if(i=fe(i.times(e),l),r=r.times(++c),o=s.plus(Vr(i,r,l)),Nr(o.d).slice(0,l)===Nr(s.d).slice(0,l)){for(;d--;)s=fe(s.times(s),l);return u.precision=f,t==null?(je=!0,fe(s,f)):s}s=o}}function Me(e){for(var t=e.e*xe,r=e.d[0];r>=10;r/=10)t++;return t}function Sd(e,t,r){if(t>e.LN10.sd())throw je=!0,r&&(e.precision=r),Error(sr+"LN10 precision limit exceeded");return fe(new e(e.LN10),t)}function xn(e){for(var t="";e--;)t+="0";return t}function Ws(e,t){var r,n,i,s,o,l,c,d,u,f=1,p=10,m=e,x=m.d,g=m.constructor,b=g.precision;if(m.s<1)throw Error(sr+(m.s?"NaN":"-Infinity"));if(m.eq(Lt))return new g(0);if(t==null?(je=!1,d=b):d=t,m.eq(10))return t==null&&(je=!0),Sd(g,d);if(d+=p,g.precision=d,r=Nr(x),n=r.charAt(0),s=Me(m),Math.abs(s)<15e14){for(;n<7&&n!=1||n==1&&r.charAt(1)>3;)m=m.times(e),r=Nr(m.d),n=r.charAt(0),f++;s=Me(m),n>1?(m=new g("0."+r),s++):m=new g(n+"."+r.slice(1))}else return c=Sd(g,d+2,b).times(s+""),m=Ws(new g(n+"."+r.slice(1)),d-p).plus(c),g.precision=b,t==null?(je=!0,fe(m,b)):m;for(l=o=m=Vr(m.minus(Lt),m.plus(Lt),d),u=fe(m.times(m),d),i=3;;){if(o=fe(o.times(u),d),c=l.plus(Vr(o,new g(i),d)),Nr(c.d).slice(0,d)===Nr(l.d).slice(0,d))return l=l.times(2),s!==0&&(l=l.plus(Sd(g,d+2,b).times(s+""))),l=Vr(l,new g(f),d),g.precision=b,t==null?(je=!0,fe(l,b)):l;l=c,i+=2}}function vy(e,t){var r,n,i;for((r=t.indexOf("."))>-1&&(t=t.replace(".","")),(n=t.search(/e/i))>0?(r<0&&(r=n),r+=+t.slice(n+1),t=t.substring(0,n)):r<0&&(r=t.length),n=0;t.charCodeAt(n)===48;)++n;for(i=t.length;t.charCodeAt(i-1)===48;)--i;if(t=t.slice(n,i),t){if(i-=n,r=r-n-1,e.e=Aa(r/xe),e.d=[],n=(r+1)%xe,r<0&&(n+=xe),nuc||e.e<-uc))throw Error(Sm+r)}else e.s=0,e.e=0,e.d=[0];return e}function fe(e,t,r){var n,i,s,o,l,c,d,u,f=e.d;for(o=1,s=f[0];s>=10;s/=10)o++;if(n=t-o,n<0)n+=xe,i=t,d=f[u=0];else{if(u=Math.ceil((n+1)/xe),s=f.length,u>=s)return e;for(d=s=f[u],o=1;s>=10;s/=10)o++;n%=xe,i=n-xe+o}if(r!==void 0&&(s=Qn(10,o-i-1),l=d/s%10|0,c=t<0||f[u+1]!==void 0||d%s,c=r<4?(l||c)&&(r==0||r==(e.s<0?3:2)):l>5||l==5&&(r==4||c||r==6&&(n>0?i>0?d/Qn(10,o-i):0:f[u-1])%10&1||r==(e.s<0?8:7))),t<1||!f[0])return c?(s=Me(e),f.length=1,t=t-s-1,f[0]=Qn(10,(xe-t%xe)%xe),e.e=Aa(-t/xe)||0):(f.length=1,f[0]=e.e=e.s=0),e;if(n==0?(f.length=u,s=1,u--):(f.length=u+1,s=Qn(10,xe-n),f[u]=i>0?(d/Qn(10,o-i)%Qn(10,i)|0)*s:0),c)for(;;)if(u==0){(f[0]+=s)==qe&&(f[0]=1,++e.e);break}else{if(f[u]+=s,f[u]!=qe)break;f[u--]=0,s=1}for(n=f.length;f[--n]===0;)f.pop();if(je&&(e.e>uc||e.e<-uc))throw Error(Sm+Me(e));return e}function FS(e,t){var r,n,i,s,o,l,c,d,u,f,p=e.constructor,m=p.precision;if(!e.s||!t.s)return t.s?t.s=-t.s:t=new p(e),je?fe(t,m):t;if(c=e.d,f=t.d,n=t.e,d=e.e,c=c.slice(),o=d-n,o){for(u=o<0,u?(r=c,o=-o,l=f.length):(r=f,n=d,l=c.length),i=Math.max(Math.ceil(m/xe),l)+2,o>i&&(o=i,r.length=1),r.reverse(),i=o;i--;)r.push(0);r.reverse()}else{for(i=c.length,l=f.length,u=i0;--i)c[l++]=0;for(i=f.length;i>o;){if(c[--i]0?s=s.charAt(0)+"."+s.slice(1)+xn(n):o>1&&(s=s.charAt(0)+"."+s.slice(1)),s=s+(i<0?"e":"e+")+i):i<0?(s="0."+xn(-i-1)+s,r&&(n=r-o)>0&&(s+=xn(n))):i>=o?(s+=xn(i+1-o),r&&(n=r-i-1)>0&&(s=s+"."+xn(n))):((n=i+1)0&&(i+1===o&&(s+="."),s+=xn(n))),e.s<0?"-"+s:s}function by(e,t){if(e.length>t)return e.length=t,!0}function WS(e){var t,r,n;function i(s){var o=this;if(!(o instanceof i))return new i(s);if(o.constructor=i,s instanceof i){o.s=s.s,o.e=s.e,o.d=(s=s.d)?s.slice():s;return}if(typeof s=="number"){if(s*0!==0)throw Error(di+s);if(s>0)o.s=1;else if(s<0)s=-s,o.s=-1;else{o.s=0,o.e=0,o.d=[0];return}if(s===~~s&&s<1e7){o.e=0,o.d=[s];return}return vy(o,s.toString())}else if(typeof s!="string")throw Error(di+s);if(s.charCodeAt(0)===45?(s=s.slice(1),o.s=-1):o.s=1,iM.test(s))vy(o,s);else throw Error(di+s)}if(i.prototype=V,i.ROUND_UP=0,i.ROUND_DOWN=1,i.ROUND_CEIL=2,i.ROUND_FLOOR=3,i.ROUND_HALF_UP=4,i.ROUND_HALF_DOWN=5,i.ROUND_HALF_EVEN=6,i.ROUND_HALF_CEIL=7,i.ROUND_HALF_FLOOR=8,i.clone=WS,i.config=i.set=aM,e===void 0&&(e={}),e)for(n=["precision","rounding","toExpNeg","toExpPos","LN10"],t=0;t=i[t+1]&&n<=i[t+2])this[r]=n;else throw Error(di+r+": "+n);if((n=e[r="LN10"])!==void 0)if(n==Math.LN10)this[r]=new this(n);else throw Error(di+r+": "+n);return this}var Nm=WS(nM);Lt=new Nm(1);const oe=Nm;var sM=e=>e,US={},qS=e=>e===US,jy=e=>function t(){return arguments.length===0||arguments.length===1&&qS(arguments.length<=0?void 0:arguments[0])?t:e(...arguments)},HS=(e,t)=>e===1?t:jy(function(){for(var r=arguments.length,n=new Array(r),i=0;io!==US).length;return s>=e?t(...n):HS(e-s,jy(function(){for(var o=arguments.length,l=new Array(o),c=0;cqS(u)?l.shift():u);return t(...d,...l)}))}),ju=e=>HS(e.length,e),sp=(e,t)=>{for(var r=[],n=e;nArray.isArray(t)?t.map(e):Object.keys(t).map(r=>t[r]).map(e)),lM=function(){for(var t=arguments.length,r=new Array(t),n=0;nc(l),s(...arguments))}},op=e=>Array.isArray(e)?e.reverse():e.split("").reverse().join(""),KS=e=>{var t=null,r=null;return function(){for(var n=arguments.length,i=new Array(n),s=0;s{var c;return o===((c=t)===null||c===void 0?void 0:c[l])})||(t=i,r=e(...i)),r}};function VS(e){var t;return e===0?t=1:t=Math.floor(new oe(e).abs().log(10).toNumber())+1,t}function YS(e,t,r){for(var n=new oe(e),i=0,s=[];n.lt(t)&&i<1e5;)s.push(n.toNumber()),n=n.add(r),i++;return s}ju((e,t,r)=>{var n=+e,i=+t;return n+r*(i-n)});ju((e,t,r)=>{var n=t-+e;return n=n||1/0,(r-e)/n});ju((e,t,r)=>{var n=t-+e;return n=n||1/0,Math.max(0,Math.min(1,(r-e)/n))});var GS=e=>{var[t,r]=e,[n,i]=[t,r];return t>r&&([n,i]=[r,t]),[n,i]},ZS=(e,t,r)=>{if(e.lte(0))return new oe(0);var n=VS(e.toNumber()),i=new oe(10).pow(n),s=e.div(i),o=n!==1?.05:.1,l=new oe(Math.ceil(s.div(o).toNumber())).add(r).mul(o),c=l.mul(i);return t?new oe(c.toNumber()):new oe(Math.ceil(c.toNumber()))},cM=(e,t,r)=>{var n=new oe(1),i=new oe(e);if(!i.isint()&&r){var s=Math.abs(e);s<1?(n=new oe(10).pow(VS(e)-1),i=new oe(Math.floor(i.div(n).toNumber())).mul(n)):s>1&&(i=new oe(Math.floor(e)))}else e===0?i=new oe(Math.floor((t-1)/2)):r||(i=new oe(Math.floor(e)));var o=Math.floor((t-1)/2),l=lM(oM(c=>i.add(new oe(c-o).mul(n)).toNumber()),sp);return l(0,t)},XS=function(t,r,n,i){var s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:0;if(!Number.isFinite((r-t)/(n-1)))return{step:new oe(0),tickMin:new oe(0),tickMax:new oe(0)};var o=ZS(new oe(r).sub(t).div(n-1),i,s),l;t<=0&&r>=0?l=new oe(0):(l=new oe(t).add(r).div(2),l=l.sub(new oe(l).mod(o)));var c=Math.ceil(l.sub(t).div(o).toNumber()),d=Math.ceil(new oe(r).sub(l).div(o).toNumber()),u=c+d+1;return u>n?XS(t,r,n,i,s+1):(u0?d+(n-u):d,c=r>0?c:c+(n-u)),{step:o,tickMin:l.sub(new oe(c).mul(o)),tickMax:l.add(new oe(d).mul(o))})};function uM(e){var[t,r]=e,n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:6,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=Math.max(n,2),[o,l]=GS([t,r]);if(o===-1/0||l===1/0){var c=l===1/0?[o,...sp(0,n-1).map(()=>1/0)]:[...sp(0,n-1).map(()=>-1/0),l];return t>r?op(c):c}if(o===l)return cM(o,n,i);var{step:d,tickMin:u,tickMax:f}=XS(o,l,s,i,0),p=YS(u,f.add(new oe(.1).mul(d)),d);return t>r?op(p):p}function dM(e,t){var[r,n]=e,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,[s,o]=GS([r,n]);if(s===-1/0||o===1/0)return[r,n];if(s===o)return[s];var l=Math.max(t,2),c=ZS(new oe(o).sub(s).div(l-1),i,0),d=[...YS(new oe(s),new oe(o),c),o];return i===!1&&(d=d.map(u=>Math.round(u))),r>n?op(d):d}var fM=KS(uM),pM=KS(dM),hM=e=>e.rootProps.barCategoryGap,wu=e=>e.rootProps.stackOffset,km=e=>e.options.chartName,Pm=e=>e.rootProps.syncId,JS=e=>e.rootProps.syncMethod,_m=e=>e.options.eventEmitter,mM=e=>e.rootProps.baseValue,lt={grid:-100,barBackground:-50,area:100,cursorRectangle:200,bar:300,line:400,axis:500,scatter:600,activeBar:1e3,cursorLine:1100,activeDot:1200,label:2e3},zr={allowDuplicatedCategory:!0,angleAxisId:0,reversed:!1,scale:"auto",tick:!0,type:"category"},$t={allowDataOverflow:!1,allowDuplicatedCategory:!0,radiusAxisId:0,scale:"auto",tick:!0,tickCount:5,type:"number"},Su=(e,t)=>{if(!(!e||!t))return e!=null&&e.reversed?[t[1],t[0]]:t},gM={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:!1,dataKey:void 0,domain:void 0,id:zr.angleAxisId,includeHidden:!1,name:void 0,reversed:zr.reversed,scale:zr.scale,tick:zr.tick,tickCount:void 0,ticks:void 0,type:zr.type,unit:void 0},xM={allowDataOverflow:$t.allowDataOverflow,allowDecimals:!1,allowDuplicatedCategory:$t.allowDuplicatedCategory,dataKey:void 0,domain:void 0,id:$t.radiusAxisId,includeHidden:!1,name:void 0,reversed:!1,scale:$t.scale,tick:$t.tick,tickCount:$t.tickCount,ticks:void 0,type:$t.type,unit:void 0},yM={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:zr.allowDuplicatedCategory,dataKey:void 0,domain:void 0,id:zr.angleAxisId,includeHidden:!1,name:void 0,reversed:!1,scale:zr.scale,tick:zr.tick,tickCount:void 0,ticks:void 0,type:"number",unit:void 0},vM={allowDataOverflow:$t.allowDataOverflow,allowDecimals:!1,allowDuplicatedCategory:$t.allowDuplicatedCategory,dataKey:void 0,domain:void 0,id:$t.radiusAxisId,includeHidden:!1,name:void 0,reversed:!1,scale:$t.scale,tick:$t.tick,tickCount:$t.tickCount,ticks:void 0,type:"category",unit:void 0},Cm=(e,t)=>e.polarAxis.angleAxis[t]!=null?e.polarAxis.angleAxis[t]:e.layout.layoutType==="radial"?yM:gM,Am=(e,t)=>e.polarAxis.radiusAxis[t]!=null?e.polarAxis.radiusAxis[t]:e.layout.layoutType==="radial"?vM:xM,Nu=e=>e.polarOptions,Om=I([ln,cn,rt],gD),QS=I([Nu,Om],(e,t)=>{if(e!=null)return Rn(e.innerRadius,t,0)}),e2=I([Nu,Om],(e,t)=>{if(e!=null)return Rn(e.outerRadius,t,t*.8)}),bM=e=>{if(e==null)return[0,0];var{startAngle:t,endAngle:r}=e;return[t,r]},t2=I([Nu],bM);I([Cm,t2],Su);var r2=I([Om,QS,e2],(e,t,r)=>{if(!(e==null||t==null||r==null))return[t,r]});I([Am,r2],Su);var n2=I([ue,Nu,QS,e2,ln,cn],(e,t,r,n,i,s)=>{if(!(e!=="centric"&&e!=="radial"||t==null||r==null||n==null)){var{cx:o,cy:l,startAngle:c,endAngle:d}=t;return{cx:Rn(o,i,i/2),cy:Rn(l,s,s/2),innerRadius:r,outerRadius:n,startAngle:c,endAngle:d,clockWise:!1}}}),Fe=(e,t)=>t,ku=(e,t,r)=>r;function Em(e){return e==null?void 0:e.id}function i2(e,t,r){var{chartData:n=[]}=t,{allowDuplicatedCategory:i,dataKey:s}=r,o=new Map;return e.forEach(l=>{var c,d=(c=l.data)!==null&&c!==void 0?c:n;if(!(d==null||d.length===0)){var u=Em(l);d.forEach((f,p)=>{var m=s==null||i?p:String(et(f,s,null)),x=et(f,l.dataKey,0),g;o.has(m)?g=o.get(m):g={},Object.assign(g,{[u]:x}),o.set(m,g)})}}),Array.from(o.values())}function Dm(e){return e.stackId!=null&&e.dataKey!=null}var Pu=(e,t)=>e===t?!0:e==null||t==null?!1:e[0]===t[0]&&e[1]===t[1];function _u(e,t){return Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t}function jM(e,t){if(e.length===t.length){for(var r=0;r{var t=ue(e);return t==="horizontal"?"xAxis":t==="vertical"?"yAxis":t==="centric"?"angleAxis":"radiusAxis"},Oa=e=>e.tooltip.settings.axisId;function wy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function dc(e){for(var t=1;te.cartesianAxis.xAxis[t],dn=(e,t)=>{var r=a2(e,t);return r??Tt},Mt={allowDataOverflow:!1,allowDecimals:!0,allowDuplicatedCategory:!0,angle:0,dataKey:void 0,domain:lp,hide:!0,id:0,includeHidden:!1,interval:"preserveEnd",minTickGap:5,mirror:!1,name:void 0,orientation:"left",padding:{top:0,bottom:0},reversed:!1,scale:"auto",tick:!0,tickCount:5,tickFormatter:void 0,ticks:void 0,type:"number",unit:void 0,width:eo},s2=(e,t)=>e.cartesianAxis.yAxis[t],fn=(e,t)=>{var r=s2(e,t);return r??Mt},kM={domain:[0,"auto"],includeHidden:!1,reversed:!1,allowDataOverflow:!1,allowDuplicatedCategory:!1,dataKey:void 0,id:0,name:"",range:[64,64],scale:"auto",type:"number",unit:""},Tm=(e,t)=>{var r=e.cartesianAxis.zAxis[t];return r??kM},vt=(e,t,r)=>{switch(t){case"xAxis":return dn(e,r);case"yAxis":return fn(e,r);case"zAxis":return Tm(e,r);case"angleAxis":return Cm(e,r);case"radiusAxis":return Am(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},PM=(e,t,r)=>{switch(t){case"xAxis":return dn(e,r);case"yAxis":return fn(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},so=(e,t,r)=>{switch(t){case"xAxis":return dn(e,r);case"yAxis":return fn(e,r);case"angleAxis":return Cm(e,r);case"radiusAxis":return Am(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},o2=e=>e.graphicalItems.cartesianItems.some(t=>t.type==="bar")||e.graphicalItems.polarItems.some(t=>t.type==="radialBar");function l2(e,t){return r=>{switch(e){case"xAxis":return"xAxisId"in r&&r.xAxisId===t;case"yAxis":return"yAxisId"in r&&r.yAxisId===t;case"zAxis":return"zAxisId"in r&&r.zAxisId===t;case"angleAxis":return"angleAxisId"in r&&r.angleAxisId===t;case"radiusAxis":return"radiusAxisId"in r&&r.radiusAxisId===t;default:return!1}}}var Mm=e=>e.graphicalItems.cartesianItems,_M=I([Fe,ku],l2),c2=(e,t,r)=>e.filter(r).filter(n=>(t==null?void 0:t.includeHidden)===!0?!0:!n.hide),oo=I([Mm,vt,_M],c2,{memoizeOptions:{resultEqualityCheck:_u}}),u2=I([oo],e=>e.filter(t=>t.type==="area"||t.type==="bar").filter(Dm)),d2=e=>e.filter(t=>!("stackId"in t)||t.stackId===void 0),CM=I([oo],d2),f2=e=>e.map(t=>t.data).filter(Boolean).flat(1),AM=I([oo],f2,{memoizeOptions:{resultEqualityCheck:_u}}),p2=(e,t)=>{var{chartData:r=[],dataStartIndex:n,dataEndIndex:i}=t;return e.length>0?e:r.slice(n,i+1)},Im=I([AM,bu],p2),h2=(e,t,r)=>(t==null?void 0:t.dataKey)!=null?e.map(n=>({value:et(n,t.dataKey)})):r.length>0?r.map(n=>n.dataKey).flatMap(n=>e.map(i=>({value:et(i,n)}))):e.map(n=>({value:n})),Cu=I([Im,vt,oo],h2);function m2(e,t){switch(e){case"xAxis":return t.direction==="x";case"yAxis":return t.direction==="y";default:return!1}}function ll(e){if(Or(e)||e instanceof Date){var t=Number(e);if(_e(t))return t}}function Sy(e){if(Array.isArray(e)){var t=[ll(e[0]),ll(e[1])];return ji(t)?t:void 0}var r=ll(e);if(r!=null)return[r,r]}function an(e){return e.map(ll).filter(R6)}function OM(e,t,r){return!r||typeof t!="number"||yr(t)?[]:r.length?an(r.flatMap(n=>{var i=et(e,n.dataKey),s,o;if(Array.isArray(i)?[s,o]=i:s=o=i,!(!_e(s)||!_e(o)))return[t-s,t+o]})):[]}var Ue=e=>{var t=We(e),r=Oa(e);return so(e,t,r)},g2=I([Ue],e=>e==null?void 0:e.dataKey),EM=I([u2,bu,Ue],i2),x2=(e,t,r)=>{var n={},i=t.reduce((s,o)=>(o.stackId==null||(s[o.stackId]==null&&(s[o.stackId]=[]),s[o.stackId].push(o)),s),n);return Object.fromEntries(Object.entries(i).map(s=>{var[o,l]=s,c=l.map(Em);return[o,{stackedData:kE(e,c,r),graphicalItems:l}]}))},cp=I([EM,u2,wu],x2),y2=(e,t,r,n)=>{var{dataStartIndex:i,dataEndIndex:s}=t;if(n==null&&r!=="zAxis"){var o=AE(e,i,s);if(!(o!=null&&o[0]===0&&o[1]===0))return o}},DM=I([vt],e=>e.allowDataOverflow),$m=e=>{var t;if(e==null||!("domain"in e))return lp;if(e.domain!=null)return e.domain;if(e.ticks!=null){if(e.type==="number"){var r=an(e.ticks);return[Math.min(...r),Math.max(...r)]}if(e.type==="category")return e.ticks.map(String)}return(t=e==null?void 0:e.domain)!==null&&t!==void 0?t:lp},v2=I([vt],$m),b2=I([v2,DM],LS),TM=I([cp,Kn,Fe,b2],y2,{memoizeOptions:{resultEqualityCheck:Pu}}),Lm=e=>e.errorBars,MM=(e,t,r)=>e.flatMap(n=>t[n.id]).filter(Boolean).filter(n=>m2(r,n)),fc=function(){for(var t=arguments.length,r=new Array(t),n=0;n{var s,o;if(r.length>0&&e.forEach(l=>{r.forEach(c=>{var d,u,f=(d=n[c.id])===null||d===void 0?void 0:d.filter(v=>m2(i,v)),p=et(l,(u=t.dataKey)!==null&&u!==void 0?u:c.dataKey),m=OM(l,p,f);if(m.length>=2){var x=Math.min(...m),g=Math.max(...m);(s==null||xo)&&(o=g)}var b=Sy(p);b!=null&&(s=s==null?b[0]:Math.min(s,b[0]),o=o==null?b[1]:Math.max(o,b[1]))})}),(t==null?void 0:t.dataKey)!=null&&e.forEach(l=>{var c=Sy(et(l,t.dataKey));c!=null&&(s=s==null?c[0]:Math.min(s,c[0]),o=o==null?c[1]:Math.max(o,c[1]))}),_e(s)&&_e(o))return[s,o]},IM=I([Im,vt,CM,Lm,Fe],j2,{memoizeOptions:{resultEqualityCheck:Pu}});function $M(e){var{value:t}=e;if(Or(t)||t instanceof Date)return t}var LM=(e,t,r)=>{var n=e.map($M).filter(i=>i!=null);return r&&(t.dataKey==null||t.allowDuplicatedCategory&&_j(n))?rS(0,e.length):t.allowDuplicatedCategory?n:Array.from(new Set(n))},w2=e=>e.referenceElements.dots,Ea=(e,t,r)=>e.filter(n=>n.ifOverflow==="extendDomain").filter(n=>t==="xAxis"?n.xAxisId===r:n.yAxisId===r),zM=I([w2,Fe,ku],Ea),S2=e=>e.referenceElements.areas,RM=I([S2,Fe,ku],Ea),N2=e=>e.referenceElements.lines,BM=I([N2,Fe,ku],Ea),k2=(e,t)=>{var r=an(e.map(n=>t==="xAxis"?n.x:n.y));if(r.length!==0)return[Math.min(...r),Math.max(...r)]},FM=I(zM,Fe,k2),P2=(e,t)=>{var r=an(e.flatMap(n=>[t==="xAxis"?n.x1:n.y1,t==="xAxis"?n.x2:n.y2]));if(r.length!==0)return[Math.min(...r),Math.max(...r)]},WM=I([RM,Fe],P2);function UM(e){var t;if(e.x!=null)return an([e.x]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.x);return r==null||r.length===0?[]:an(r)}function qM(e){var t;if(e.y!=null)return an([e.y]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.y);return r==null||r.length===0?[]:an(r)}var _2=(e,t)=>{var r=e.flatMap(n=>t==="xAxis"?UM(n):qM(n));if(r.length!==0)return[Math.min(...r),Math.max(...r)]},HM=I([BM,Fe],_2),KM=I(FM,HM,WM,(e,t,r)=>fc(e,r,t)),C2=(e,t,r,n,i,s,o,l)=>{if(r!=null)return r;var c=o==="vertical"&&l==="xAxis"||o==="horizontal"&&l==="yAxis",d=c?fc(n,s,i):fc(s,i);return rM(t,d,e.allowDataOverflow)},VM=I([vt,v2,b2,TM,IM,KM,ue,Fe],C2,{memoizeOptions:{resultEqualityCheck:Pu}}),YM=[0,1],A2=(e,t,r,n,i,s,o)=>{if(!((e==null||r==null||r.length===0)&&o===void 0)){var{dataKey:l,type:c}=e,d=Mr(t,s);if(d&&l==null){var u;return rS(0,(u=r==null?void 0:r.length)!==null&&u!==void 0?u:0)}return c==="category"?LM(n,e,d):i==="expand"?YM:o}},zm=I([vt,ue,Im,Cu,wu,Fe,VM],A2),O2=(e,t,r,n,i)=>{if(e!=null){var{scale:s,type:o}=e;if(s==="auto")return t==="radial"&&i==="radiusAxis"?"band":t==="radial"&&i==="angleAxis"?"linear":o==="category"&&n&&(n.indexOf("LineChart")>=0||n.indexOf("AreaChart")>=0||n.indexOf("ComposedChart")>=0&&!r)?"point":o==="category"?"band":"linear";if(typeof s=="string"){var l="scale".concat(Xs(s));return l in ts?l:"point"}}},lo=I([vt,ue,o2,km,Fe],O2);function GM(e){if(e!=null){if(e in ts)return ts[e]();var t="scale".concat(Xs(e));if(t in ts)return ts[t]()}}function Rm(e,t,r,n){if(!(r==null||n==null)){if(typeof e.scale=="function")return e.scale.copy().domain(r).range(n);var i=GM(t);if(i!=null){var s=i.domain(r).range(n);return jE(s),s}}}var E2=(e,t,r)=>{var n=$m(t);if(!(r!=="auto"&&r!=="linear")){if(t!=null&&t.tickCount&&Array.isArray(n)&&(n[0]==="auto"||n[1]==="auto")&&ji(e))return fM(e,t.tickCount,t.allowDecimals);if(t!=null&&t.tickCount&&t.type==="number"&&ji(e))return pM(e,t.tickCount,t.allowDecimals)}},Bm=I([zm,so,lo],E2),D2=(e,t,r,n)=>{if(n!=="angleAxis"&&(e==null?void 0:e.type)==="number"&&ji(t)&&Array.isArray(r)&&r.length>0){var i=t[0],s=r[0],o=t[1],l=r[r.length-1];return[Math.min(i,s),Math.max(o,l)]}return t},ZM=I([vt,zm,Bm,Fe],D2),XM=I(Cu,vt,(e,t)=>{if(!(!t||t.type!=="number")){var r=1/0,n=Array.from(an(e.map(l=>l.value))).sort((l,c)=>l-c);if(n.length<2)return 1/0;var i=n[n.length-1]-n[0];if(i===0)return 1/0;for(var s=0;sn,(e,t,r,n,i)=>{if(!_e(e))return 0;var s=t==="vertical"?n.height:n.width;if(i==="gap")return e*s/2;if(i==="no-gap"){var o=Rn(r,e*s),l=e*s/2;return l-o-(l-o)/s*o}return 0}),JM=(e,t)=>{var r=dn(e,t);return r==null||typeof r.padding!="string"?0:T2(e,"xAxis",t,r.padding)},QM=(e,t)=>{var r=fn(e,t);return r==null||typeof r.padding!="string"?0:T2(e,"yAxis",t,r.padding)},eI=I(dn,JM,(e,t)=>{var r,n;if(e==null)return{left:0,right:0};var{padding:i}=e;return typeof i=="string"?{left:t,right:t}:{left:((r=i.left)!==null&&r!==void 0?r:0)+t,right:((n=i.right)!==null&&n!==void 0?n:0)+t}}),tI=I(fn,QM,(e,t)=>{var r,n;if(e==null)return{top:0,bottom:0};var{padding:i}=e;return typeof i=="string"?{top:t,bottom:t}:{top:((r=i.top)!==null&&r!==void 0?r:0)+t,bottom:((n=i.bottom)!==null&&n!==void 0?n:0)+t}}),rI=I([rt,eI,cu,lu,(e,t,r)=>r],(e,t,r,n,i)=>{var{padding:s}=n;return i?[s.left,r.width-s.right]:[e.left+t.left,e.left+e.width-t.right]}),nI=I([rt,ue,tI,cu,lu,(e,t,r)=>r],(e,t,r,n,i,s)=>{var{padding:o}=i;return s?[n.height-o.bottom,o.top]:t==="horizontal"?[e.top+e.height-r.bottom,e.top+r.top]:[e.top+r.top,e.top+e.height-r.bottom]}),co=(e,t,r,n)=>{var i;switch(t){case"xAxis":return rI(e,r,n);case"yAxis":return nI(e,r,n);case"zAxis":return(i=Tm(e,r))===null||i===void 0?void 0:i.range;case"angleAxis":return t2(e);case"radiusAxis":return r2(e,r);default:return}},M2=I([vt,co],Su),Da=I([vt,lo,ZM,M2],Rm);I([oo,Lm,Fe],MM);function I2(e,t){return e.idt.id?1:0}var Au=(e,t)=>t,Ou=(e,t,r)=>r,iI=I(su,Au,Ou,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(I2)),aI=I(ou,Au,Ou,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(I2)),$2=(e,t)=>({width:e.width,height:t.height}),sI=(e,t)=>{var r=typeof t.width=="number"?t.width:eo;return{width:r,height:e.height}},oI=I(rt,dn,$2),lI=(e,t,r)=>{switch(t){case"top":return e.top;case"bottom":return r-e.bottom;default:return 0}},cI=(e,t,r)=>{switch(t){case"left":return e.left;case"right":return r-e.right;default:return 0}},uI=I(cn,rt,iI,Au,Ou,(e,t,r,n,i)=>{var s={},o;return r.forEach(l=>{var c=$2(t,l);o==null&&(o=lI(t,n,e));var d=n==="top"&&!i||n==="bottom"&&i;s[l.id]=o-Number(d)*c.height,o+=(d?-1:1)*c.height}),s}),dI=I(ln,rt,aI,Au,Ou,(e,t,r,n,i)=>{var s={},o;return r.forEach(l=>{var c=sI(t,l);o==null&&(o=cI(t,n,e));var d=n==="left"&&!i||n==="right"&&i;s[l.id]=o-Number(d)*c.width,o+=(d?-1:1)*c.width}),s}),fI=(e,t)=>{var r=dn(e,t);if(r!=null)return uI(e,r.orientation,r.mirror)},pI=I([rt,dn,fI,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var i=r==null?void 0:r[n];return i==null?{x:e.left,y:0}:{x:e.left,y:i}}}),hI=(e,t)=>{var r=fn(e,t);if(r!=null)return dI(e,r.orientation,r.mirror)},mI=I([rt,fn,hI,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var i=r==null?void 0:r[n];return i==null?{x:0,y:e.top}:{x:i,y:e.top}}}),gI=I(rt,fn,(e,t)=>{var r=typeof t.width=="number"?t.width:eo;return{width:r,height:e.height}}),L2=(e,t,r,n)=>{if(r!=null){var{allowDuplicatedCategory:i,type:s,dataKey:o}=r,l=Mr(e,n),c=t.map(d=>d.value);if(o&&l&&s==="category"&&i&&_j(c))return c}},Fm=I([ue,Cu,vt,Fe],L2),z2=(e,t,r,n)=>{if(!(r==null||r.dataKey==null)){var{type:i,scale:s}=r,o=Mr(e,n);if(o&&(i==="number"||s!=="auto"))return t.map(l=>l.value)}},Wm=I([ue,Cu,so,Fe],z2),Ny=I([ue,PM,lo,Da,Fm,Wm,co,Bm,Fe],(e,t,r,n,i,s,o,l,c)=>{if(t!=null){var d=Mr(e,c);return{angle:t.angle,interval:t.interval,minTickGap:t.minTickGap,orientation:t.orientation,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,axisType:c,categoricalDomain:s,duplicateDomain:i,isCategorical:d,niceTicks:l,range:o,realScaleType:r,scale:n}}}),xI=(e,t,r,n,i,s,o,l,c)=>{if(!(t==null||n==null)){var d=Mr(e,c),{type:u,ticks:f,tickCount:p}=t,m=r==="scaleBand"&&typeof n.bandwidth=="function"?n.bandwidth()/2:2,x=u==="category"&&n.bandwidth?n.bandwidth()/m:0;x=c==="angleAxis"&&s!=null&&s.length>=2?Jt(s[0]-s[1])*2*x:x;var g=f||i;if(g){var b=g.map((v,j)=>{var y=o?o.indexOf(v):v;return{index:j,coordinate:n(y)+x,value:v,offset:x}});return b.filter(v=>_e(v.coordinate))}return d&&l?l.map((v,j)=>({coordinate:n(v)+x,value:v,index:j,offset:x})).filter(v=>_e(v.coordinate)):n.ticks?n.ticks(p).map(v=>({coordinate:n(v)+x,value:v,offset:x})):n.domain().map((v,j)=>({coordinate:n(v)+x,value:o?o[v]:v,index:j,offset:x}))}},R2=I([ue,so,lo,Da,Bm,co,Fm,Wm,Fe],xI),yI=(e,t,r,n,i,s,o)=>{if(!(t==null||r==null||n==null||n[0]===n[1])){var l=Mr(e,o),{tickCount:c}=t,d=0;return d=o==="angleAxis"&&(n==null?void 0:n.length)>=2?Jt(n[0]-n[1])*2*d:d,l&&s?s.map((u,f)=>({coordinate:r(u)+d,value:u,index:f,offset:d})):r.ticks?r.ticks(c).map(u=>({coordinate:r(u)+d,value:u,offset:d})):r.domain().map((u,f)=>({coordinate:r(u)+d,value:i?i[u]:u,index:f,offset:d}))}},Eu=I([ue,so,Da,co,Fm,Wm,Fe],yI),Du=I(vt,Da,(e,t)=>{if(!(e==null||t==null))return dc(dc({},e),{},{scale:t})}),vI=I([vt,lo,zm,M2],Rm);I((e,t,r)=>Tm(e,r),vI,(e,t)=>{if(!(e==null||t==null))return dc(dc({},e),{},{scale:t})});var bI=I([ue,su,ou],(e,t,r)=>{switch(e){case"horizontal":return t.some(n=>n.reversed)?"right-to-left":"left-to-right";case"vertical":return r.some(n=>n.reversed)?"bottom-to-top":"top-to-bottom";case"centric":case"radial":return"left-to-right";default:return}}),B2=e=>e.options.defaultTooltipEventType,F2=e=>e.options.validateTooltipEventTypes;function W2(e,t,r){if(e==null)return t;var n=e?"axis":"item";return r==null?t:r.includes(n)?n:t}function Um(e,t){var r=B2(e),n=F2(e);return W2(t,r,n)}function jI(e){return G(t=>Um(t,e))}var U2=(e,t)=>{var r,n=Number(t);if(!(yr(n)||t==null))return n>=0?e==null||(r=e[n])===null||r===void 0?void 0:r.value:void 0},wI=e=>e.tooltip.settings,jn={active:!1,index:null,dataKey:void 0,coordinate:void 0},SI={itemInteraction:{click:jn,hover:jn},axisInteraction:{click:jn,hover:jn},keyboardInteraction:jn,syncInteraction:{active:!1,index:null,dataKey:void 0,label:void 0,coordinate:void 0,sourceViewBox:void 0},tooltipItemPayloads:[],settings:{shared:void 0,trigger:"hover",axisId:0,active:!1,defaultIndex:void 0}},q2=At({name:"tooltip",initialState:SI,reducers:{addTooltipEntrySettings:{reducer(e,t){e.tooltipItemPayloads.push(t.payload)},prepare:Le()},removeTooltipEntrySettings:{reducer(e,t){var r=Kr(e).tooltipItemPayloads.indexOf(t.payload);r>-1&&e.tooltipItemPayloads.splice(r,1)},prepare:Le()},setTooltipSettingsState(e,t){e.settings=t.payload},setActiveMouseOverItemIndex(e,t){e.syncInteraction.active=!1,e.keyboardInteraction.active=!1,e.itemInteraction.hover.active=!0,e.itemInteraction.hover.index=t.payload.activeIndex,e.itemInteraction.hover.dataKey=t.payload.activeDataKey,e.itemInteraction.hover.coordinate=t.payload.activeCoordinate},mouseLeaveChart(e){e.itemInteraction.hover.active=!1,e.axisInteraction.hover.active=!1},mouseLeaveItem(e){e.itemInteraction.hover.active=!1},setActiveClickItemIndex(e,t){e.syncInteraction.active=!1,e.itemInteraction.click.active=!0,e.keyboardInteraction.active=!1,e.itemInteraction.click.index=t.payload.activeIndex,e.itemInteraction.click.dataKey=t.payload.activeDataKey,e.itemInteraction.click.coordinate=t.payload.activeCoordinate},setMouseOverAxisIndex(e,t){e.syncInteraction.active=!1,e.axisInteraction.hover.active=!0,e.keyboardInteraction.active=!1,e.axisInteraction.hover.index=t.payload.activeIndex,e.axisInteraction.hover.dataKey=t.payload.activeDataKey,e.axisInteraction.hover.coordinate=t.payload.activeCoordinate},setMouseClickAxisIndex(e,t){e.syncInteraction.active=!1,e.keyboardInteraction.active=!1,e.axisInteraction.click.active=!0,e.axisInteraction.click.index=t.payload.activeIndex,e.axisInteraction.click.dataKey=t.payload.activeDataKey,e.axisInteraction.click.coordinate=t.payload.activeCoordinate},setSyncInteraction(e,t){e.syncInteraction=t.payload},setKeyboardInteraction(e,t){e.keyboardInteraction.active=t.payload.active,e.keyboardInteraction.index=t.payload.activeIndex,e.keyboardInteraction.coordinate=t.payload.activeCoordinate,e.keyboardInteraction.dataKey=t.payload.activeDataKey}}}),{addTooltipEntrySettings:NI,removeTooltipEntrySettings:kI,setTooltipSettingsState:PI,setActiveMouseOverItemIndex:_I,mouseLeaveItem:_F,mouseLeaveChart:H2,setActiveClickItemIndex:CF,setMouseOverAxisIndex:K2,setMouseClickAxisIndex:CI,setSyncInteraction:up,setKeyboardInteraction:dp}=q2.actions,AI=q2.reducer;function ky(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ho(e){for(var t=1;t{if(t==null)return jn;var i=TI(e,t,r);if(i==null)return jn;if(i.active)return i;if(e.keyboardInteraction.active)return e.keyboardInteraction;if(e.syncInteraction.active&&e.syncInteraction.index!=null)return e.syncInteraction;var s=e.settings.active===!0;if(MI(i)){if(s)return Ho(Ho({},i),{},{active:!0})}else if(n!=null)return{active:!0,coordinate:void 0,dataKey:void 0,index:n};return Ho(Ho({},jn),{},{coordinate:i.coordinate})},qm=(e,t)=>{var r=e==null?void 0:e.index;if(r==null)return null;var n=Number(r);if(!_e(n))return r;var i=0,s=1/0;return t.length>0&&(s=t.length-1),String(Math.max(i,Math.min(n,s)))},Y2=(e,t,r,n,i,s,o,l)=>{if(!(s==null||l==null)){var c=o[0],d=c==null?void 0:l(c.positions,s);if(d!=null)return d;var u=i==null?void 0:i[Number(s)];if(u)switch(r){case"horizontal":return{x:u.coordinate,y:(n.top+t)/2};default:return{x:(n.left+e)/2,y:u.coordinate}}}},G2=(e,t,r,n)=>{if(t==="axis")return e.tooltipItemPayloads;if(e.tooltipItemPayloads.length===0)return[];var i;return r==="hover"?i=e.itemInteraction.hover.dataKey:i=e.itemInteraction.click.dataKey,i==null&&n!=null?[e.tooltipItemPayloads[0]]:e.tooltipItemPayloads.filter(s=>{var o;return((o=s.settings)===null||o===void 0?void 0:o.dataKey)===i})},uo=e=>e.options.tooltipPayloadSearcher,Ta=e=>e.tooltip;function Py(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function _y(e){for(var t=1;t{if(!(t==null||s==null)){var{chartData:l,computedData:c,dataStartIndex:d,dataEndIndex:u}=r,f=[];return e.reduce((p,m)=>{var x,{dataDefinedOnItem:g,settings:b}=m,v=zI(g,l),j=Array.isArray(v)?Cw(v,d,u):v,y=(x=b==null?void 0:b.dataKey)!==null&&x!==void 0?x:n,w=b==null?void 0:b.nameKey,S;if(n&&Array.isArray(j)&&!Array.isArray(j[0])&&o==="axis"?S=Cj(j,n,i):S=s(j,t,c,w),Array.isArray(S))S.forEach(P=>{var _=_y(_y({},b),{},{name:P.name,unit:P.unit,color:void 0,fill:void 0});p.push(c0({tooltipEntrySettings:_,dataKey:P.dataKey,payload:P.payload,value:et(P.payload,P.dataKey),name:P.name}))});else{var N;p.push(c0({tooltipEntrySettings:b,dataKey:y,payload:S,value:et(S,y),name:(N=et(S,w))!==null&&N!==void 0?N:b==null?void 0:b.name}))}return p},f)}},Hm=I([Ue,ue,o2,km,We],O2),RI=I([e=>e.graphicalItems.cartesianItems,e=>e.graphicalItems.polarItems],(e,t)=>[...e,...t]),BI=I([We,Oa],l2),fo=I([RI,Ue,BI],c2,{memoizeOptions:{resultEqualityCheck:_u}}),FI=I([fo],e=>e.filter(Dm)),WI=I([fo],f2,{memoizeOptions:{resultEqualityCheck:_u}}),Ma=I([WI,Kn],p2),UI=I([FI,Kn,Ue],i2),Km=I([Ma,Ue,fo],h2),X2=I([Ue],$m),qI=I([Ue],e=>e.allowDataOverflow),J2=I([X2,qI],LS),HI=I([fo],e=>e.filter(Dm)),KI=I([UI,HI,wu],x2),VI=I([KI,Kn,We,J2],y2),YI=I([fo],d2),GI=I([Ma,Ue,YI,Lm,We],j2,{memoizeOptions:{resultEqualityCheck:Pu}}),ZI=I([w2,We,Oa],Ea),XI=I([ZI,We],k2),JI=I([S2,We,Oa],Ea),QI=I([JI,We],P2),e$=I([N2,We,Oa],Ea),t$=I([e$,We],_2),r$=I([XI,t$,QI],fc),n$=I([Ue,X2,J2,VI,GI,r$,ue,We],C2),Q2=I([Ue,ue,Ma,Km,wu,We,n$],A2),i$=I([Q2,Ue,Hm],E2),a$=I([Ue,Q2,i$,We],D2),eN=e=>{var t=We(e),r=Oa(e),n=!1;return co(e,t,r,n)},tN=I([Ue,eN],Su),rN=I([Ue,Hm,a$,tN],Rm),s$=I([ue,Km,Ue,We],L2),o$=I([ue,Km,Ue,We],z2),l$=(e,t,r,n,i,s,o,l)=>{if(t){var{type:c}=t,d=Mr(e,l);if(n){var u=r==="scaleBand"&&n.bandwidth?n.bandwidth()/2:2,f=c==="category"&&n.bandwidth?n.bandwidth()/u:0;return f=l==="angleAxis"&&i!=null&&(i==null?void 0:i.length)>=2?Jt(i[0]-i[1])*2*f:f,d&&o?o.map((p,m)=>({coordinate:n(p)+f,value:p,index:m,offset:f})):n.domain().map((p,m)=>({coordinate:n(p)+f,value:s?s[p]:p,index:m,offset:f}))}}},pn=I([ue,Ue,Hm,rN,eN,s$,o$,We],l$),Vm=I([B2,F2,wI],(e,t,r)=>W2(r.shared,e,t)),nN=e=>e.tooltip.settings.trigger,Ym=e=>e.tooltip.settings.defaultIndex,Tu=I([Ta,Vm,nN,Ym],V2),Us=I([Tu,Ma],qm),iN=I([pn,Us],U2),c$=I([Tu],e=>{if(e)return e.dataKey}),aN=I([Ta,Vm,nN,Ym],G2),u$=I([ln,cn,ue,rt,pn,Ym,aN,uo],Y2),d$=I([Tu,u$],(e,t)=>e!=null&&e.coordinate?e.coordinate:t),f$=I([Tu],e=>e.active),p$=I([aN,Us,Kn,g2,iN,uo,Vm],Z2),h$=I([p$],e=>{if(e!=null){var t=e.map(r=>r.payload).filter(r=>r!=null);return Array.from(new Set(t))}});function Cy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ay(e){for(var t=1;tG(Ue),v$=()=>{var e=y$(),t=G(pn),r=G(rN);return ma(!e||!r?void 0:Ay(Ay({},e),{},{scale:r}),t)};function Oy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ti(e){for(var t=1;t{var i=t.find(s=>s&&s.index===r);if(i){if(e==="horizontal")return{x:i.coordinate,y:n.chartY};if(e==="vertical")return{x:n.chartX,y:i.coordinate}}return{x:0,y:0}},N$=(e,t,r,n)=>{var i=t.find(d=>d&&d.index===r);if(i){if(e==="centric"){var s=i.coordinate,{radius:o}=n;return Ti(Ti(Ti({},n),Je(n.cx,n.cy,o,s)),{},{angle:s,radius:o})}var l=i.coordinate,{angle:c}=n;return Ti(Ti(Ti({},n),Je(n.cx,n.cy,l,c)),{},{angle:c,radius:l})}return{angle:0,clockWise:!1,cx:0,cy:0,endAngle:0,innerRadius:0,outerRadius:0,radius:0,startAngle:0,x:0,y:0}};function k$(e,t){var{chartX:r,chartY:n}=e;return r>=t.left&&r<=t.left+t.width&&n>=t.top&&n<=t.top+t.height}var sN=(e,t,r,n,i)=>{var s,o=-1,l=(s=t==null?void 0:t.length)!==null&&s!==void 0?s:0;if(l<=1||e==null)return 0;if(n==="angleAxis"&&i!=null&&Math.abs(Math.abs(i[1]-i[0])-360)<=1e-6)for(var c=0;c0?r[c-1].coordinate:r[l-1].coordinate,u=r[c].coordinate,f=c>=l-1?r[0].coordinate:r[c+1].coordinate,p=void 0;if(Jt(u-d)!==Jt(f-u)){var m=[];if(Jt(f-u)===Jt(i[1]-i[0])){p=f;var x=u+i[1]-i[0];m[0]=Math.min(x,(x+d)/2),m[1]=Math.max(x,(x+d)/2)}else{p=d;var g=f+i[1]-i[0];m[0]=Math.min(u,(g+u)/2),m[1]=Math.max(u,(g+u)/2)}var b=[Math.min(u,(p+u)/2),Math.max(u,(p+u)/2)];if(e>b[0]&&e<=b[1]||e>=m[0]&&e<=m[1]){({index:o}=r[c]);break}}else{var v=Math.min(d,f),j=Math.max(d,f);if(e>(v+u)/2&&e<=(j+u)/2){({index:o}=r[c]);break}}}else if(t){for(var y=0;y0&&y(t[y].coordinate+t[y-1].coordinate)/2&&e<=(t[y].coordinate+t[y+1].coordinate)/2||y===l-1&&e>(t[y].coordinate+t[y-1].coordinate)/2){({index:o}=t[y]);break}}return o},oN=()=>G(km),Gm=(e,t)=>t,lN=(e,t,r)=>r,Zm=(e,t,r,n)=>n,P$=I(pn,e=>Qc(e,t=>t.coordinate)),Xm=I([Ta,Gm,lN,Zm],V2),cN=I([Xm,Ma],qm),_$=(e,t,r)=>{if(t!=null){var n=Ta(e);return t==="axis"?r==="hover"?n.axisInteraction.hover.dataKey:n.axisInteraction.click.dataKey:r==="hover"?n.itemInteraction.hover.dataKey:n.itemInteraction.click.dataKey}},uN=I([Ta,Gm,lN,Zm],G2),pc=I([ln,cn,ue,rt,pn,Zm,uN,uo],Y2),C$=I([Xm,pc],(e,t)=>{var r;return(r=e.coordinate)!==null&&r!==void 0?r:t}),dN=I([pn,cN],U2),A$=I([uN,cN,Kn,g2,dN,uo,Gm],Z2),O$=I([Xm],e=>({isActive:e.active,activeIndex:e.index})),E$=(e,t,r,n,i,s,o)=>{if(!(!e||!r||!n||!i)&&k$(e,o)){var l=OE(e,t),c=sN(l,s,i,r,n),d=S$(t,i,c,e);return{activeIndex:String(c),activeCoordinate:d}}},D$=(e,t,r,n,i,s,o)=>{if(!(!e||!n||!i||!s||!r)){var l=jD(e,r);if(l){var c=EE(l,t),d=sN(c,o,s,n,i),u=N$(t,s,d,l);return{activeIndex:String(d),activeCoordinate:u}}}},T$=(e,t,r,n,i,s,o,l)=>{if(!(!e||!t||!n||!i||!s))return t==="horizontal"||t==="vertical"?E$(e,t,n,i,s,o,l):D$(e,t,r,n,i,s,o)},M$=I(e=>e.zIndex.zIndexMap,(e,t)=>t,(e,t,r)=>r,(e,t,r)=>{if(t!=null){var n=e[t];if(n!=null)return r?n.panoramaElementId:n.elementId}}),I$=I(e=>e.zIndex.zIndexMap,e=>{var t=Object.keys(e).map(n=>parseInt(n,10)).concat(Object.values(lt)),r=Array.from(new Set(t));return r.sort((n,i)=>n-i)},{memoizeOptions:{resultEqualityCheck:jM}});function Ey(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Dy(e){for(var t=1;tDy(Dy({},e),{},{[t]:{elementId:void 0,panoramaElementId:void 0,consumers:0}}),R$)},F$=new Set(Object.values(lt));function W$(e){return F$.has(e)}var fN=At({name:"zIndex",initialState:B$,reducers:{registerZIndexPortal:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]?e.zIndexMap[r].consumers+=1:e.zIndexMap[r]={consumers:1,elementId:void 0,panoramaElementId:void 0}},prepare:Le()},unregisterZIndexPortal:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]&&(e.zIndexMap[r].consumers-=1,e.zIndexMap[r].consumers<=0&&!W$(r)&&delete e.zIndexMap[r])},prepare:Le()},registerZIndexPortalId:{reducer:(e,t)=>{var{zIndex:r,elementId:n,isPanorama:i}=t.payload;e.zIndexMap[r]?i?e.zIndexMap[r].panoramaElementId=n:e.zIndexMap[r].elementId=n:e.zIndexMap[r]={consumers:0,elementId:i?void 0:n,panoramaElementId:i?n:void 0}},prepare:Le()},unregisterZIndexPortalId:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]&&(t.payload.isPanorama?e.zIndexMap[r].panoramaElementId=void 0:e.zIndexMap[r].elementId=void 0)},prepare:Le()}}}),{registerZIndexPortal:U$,unregisterZIndexPortal:q$,registerZIndexPortalId:H$,unregisterZIndexPortalId:K$}=fN.actions,V$=fN.reducer;function Ir(e){var{zIndex:t,children:r}=e,n=a3(),i=n&&t!==void 0&&t!==0,s=pt(),o=Ve();h.useLayoutEffect(()=>i?(o(U$({zIndex:t})),()=>{o(q$({zIndex:t}))}):Pa,[o,t,i]);var l=G(d=>M$(d,t,s));if(!i)return r;if(!l)return null;var c=document.getElementById(l);return c?bh.createPortal(r,c):null}function fp(){return fp=Object.assign?Object.assign.bind():function(e){for(var t=1;th.useContext(pN),hN={exports:{}};(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function i(c,d,u){this.fn=c,this.context=d,this.once=u||!1}function s(c,d,u,f,p){if(typeof u!="function")throw new TypeError("The listener must be a function");var m=new i(u,f||c,p),x=r?r+d:d;return c._events[x]?c._events[x].fn?c._events[x]=[c._events[x],m]:c._events[x].push(m):(c._events[x]=m,c._eventsCount++),c}function o(c,d){--c._eventsCount===0?c._events=new n:delete c._events[d]}function l(){this._events=new n,this._eventsCount=0}l.prototype.eventNames=function(){var d=[],u,f;if(this._eventsCount===0)return d;for(f in u=this._events)t.call(u,f)&&d.push(r?f.slice(1):f);return Object.getOwnPropertySymbols?d.concat(Object.getOwnPropertySymbols(u)):d},l.prototype.listeners=function(d){var u=r?r+d:d,f=this._events[u];if(!f)return[];if(f.fn)return[f.fn];for(var p=0,m=f.length,x=new Array(m);p{e.eventEmitter==null&&(e.eventEmitter=Symbol("rechartsEventEmitter"))}}}),iL=gN.reducer,{createEventEmitter:aL}=gN.actions;function sL(e){return e.tooltip.syncInteraction}var oL={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},xN=At({name:"chartData",initialState:oL,reducers:{setChartData(e,t){if(e.chartData=t.payload,t.payload==null){e.dataStartIndex=0,e.dataEndIndex=0;return}t.payload.length>0&&e.dataEndIndex!==t.payload.length-1&&(e.dataEndIndex=t.payload.length-1)},setComputedData(e,t){e.computedData=t.payload},setDataStartEndIndexes(e,t){var{startIndex:r,endIndex:n}=t.payload;r!=null&&(e.dataStartIndex=r),n!=null&&(e.dataEndIndex=n)}}}),{setChartData:Iy,setDataStartEndIndexes:lL,setComputedData:AF}=xN.actions,cL=xN.reducer,uL=["x","y"];function $y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Mi(e){for(var t=1;tc.rootProps.className);h.useEffect(()=>{if(e==null)return Pa;var c=(d,u,f)=>{if(t!==f&&e===d){if(n==="index"){var p;if(o&&u!==null&&u!==void 0&&(p=u.payload)!==null&&p!==void 0&&p.coordinate&&u.payload.sourceViewBox){var m=u.payload.coordinate,{x,y:g}=m,b=hL(m,uL),{x:v,y:j,width:y,height:w}=u.payload.sourceViewBox,S=Mi(Mi({},b),{},{x:o.x+(y?(x-v)/y:0)*o.width,y:o.y+(w?(g-j)/w:0)*o.height});r(Mi(Mi({},u),{},{payload:Mi(Mi({},u.payload),{},{coordinate:S})}))}else r(u);return}if(i!=null){var N;if(typeof n=="function"){var P={activeTooltipIndex:u.payload.index==null?void 0:Number(u.payload.index),isTooltipActive:u.payload.active,activeIndex:u.payload.index==null?void 0:Number(u.payload.index),activeLabel:u.payload.label,activeDataKey:u.payload.dataKey,activeCoordinate:u.payload.coordinate},_=n(i,P);N=i[_]}else n==="value"&&(N=i.find(E=>String(E.value)===u.payload.label));var{coordinate:T}=u.payload;if(N==null||u.payload.active===!1||T==null||o==null){r(up({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0}));return}var{x:$,y:M}=T,C=Math.min($,o.x+o.width),R=Math.min(M,o.y+o.height),q={x:s==="horizontal"?N.coordinate:C,y:s==="horizontal"?R:N.coordinate},Z=up({active:u.payload.active,coordinate:q,dataKey:u.payload.dataKey,index:String(N.index),label:u.payload.label,sourceViewBox:u.payload.sourceViewBox});r(Z)}}};return qs.on(pp,c),()=>{qs.off(pp,c)}},[l,r,t,e,n,i,s,o])}function xL(){var e=G(Pm),t=G(_m),r=Ve();h.useEffect(()=>{if(e==null)return Pa;var n=(i,s,o)=>{t!==o&&e===i&&r(lL(s))};return qs.on(My,n),()=>{qs.off(My,n)}},[r,t,e])}function yL(){var e=Ve();h.useEffect(()=>{e(aL())},[e]),gL(),xL()}function vL(e,t,r,n,i,s){var o=G(m=>_$(m,e,t)),l=G(_m),c=G(Pm),d=G(JS),u=G(sL),f=u==null?void 0:u.active,p=uu();h.useEffect(()=>{if(!f&&c!=null&&l!=null){var m=up({active:s,coordinate:r,dataKey:o,index:i,label:typeof n=="number"?String(n):n,sourceViewBox:p});qs.emit(pp,c,m,l)}},[f,r,o,i,n,l,c,d,s,p])}function Ly(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function zy(e){for(var t=1;t{P(PI({shared:j,trigger:y,axisId:N,active:i,defaultIndex:_}))},[P,j,y,N,i,_]);var T=uu(),$=qw(),M=jI(j),{activeIndex:C,isActive:R}=(t=G(J=>O$(J,M,y,_)))!==null&&t!==void 0?t:{},q=G(J=>A$(J,M,y,_)),Z=G(J=>dN(J,M,y,_)),E=G(J=>C$(J,M,y,_)),D=q,O=eL(),k=(r=i??R)!==null&&r!==void 0?r:!1,[L,F]=b4([D,k]),H=M==="axis"?Z:void 0;vL(M,y,E,H,C,k);var te=S??O;if(te==null||T==null||M==null)return null;var re=D??Ry;k||(re=Ry),d&&re.length&&(re=n4(re.filter(J=>J.value!=null&&(J.hide!==!0||n.includeHidden)),p,SL));var we=re.length>0,A=h.createElement(j3,{allowEscapeViewBox:s,animationDuration:o,animationEasing:l,isAnimationActive:u,active:k,coordinate:E,hasPayload:we,offset:f,position:m,reverseDirection:x,useTranslate3d:g,viewBox:T,wrapperStyle:b,lastBoundingBox:L,innerRef:F,hasPortalFromProps:!!S},NL(c,zy(zy({},n),{},{payload:re,label:H,active:k,activeIndex:C,coordinate:E,accessibilityLayer:$})));return h.createElement(h.Fragment,null,bh.createPortal(A,te),k&&h.createElement(Q$,{cursor:v,tooltipEventType:M,coordinate:E,payload:re,index:C}))}function PL(e,t,r){return(t=_L(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _L(e){var t=CL(e,"string");return typeof t=="symbol"?t:t+""}function CL(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class AL{constructor(t){PL(this,"cache",new Map),this.maxSize=t}get(t){var r=this.cache.get(t);return r!==void 0&&(this.cache.delete(t),this.cache.set(t,r)),r}set(t,r){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){var n=this.cache.keys().next().value;this.cache.delete(n)}this.cache.set(t,r)}clear(){this.cache.clear()}size(){return this.cache.size}}function Fy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function OL(e){for(var t=1;t{try{var r=document.getElementById(Uy);r||(r=document.createElement("span"),r.setAttribute("id",Uy),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),Object.assign(r.style,IL,t),r.textContent="".concat(e);var n=r.getBoundingClientRect();return{width:n.width,height:n.height}}catch{return{width:0,height:0}}},fs=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t==null||Ci.isSsr)return{width:0,height:0};if(!yN.enableCache)return qy(t,r);var n=$L(t,r),i=Wy.get(n);if(i)return i;var s=qy(t,r);return Wy.set(n,s),s},Hy=/(-?\d+(?:\.\d+)?[a-zA-Z%]*)([*/])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/,Ky=/(-?\d+(?:\.\d+)?[a-zA-Z%]*)([+-])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/,LL=/^px|cm|vh|vw|em|rem|%|mm|in|pt|pc|ex|ch|vmin|vmax|Q$/,zL=/(-?\d+(?:\.\d+)?)([a-zA-Z%]+)?/,vN={cm:96/2.54,mm:96/25.4,pt:96/72,pc:96/6,in:96,Q:96/(2.54*40),px:1},RL=Object.keys(vN),Gi="NaN";function BL(e,t){return e*vN[t]}class jt{static parse(t){var r,[,n,i]=(r=zL.exec(t))!==null&&r!==void 0?r:[];return new jt(parseFloat(n),i??"")}constructor(t,r){this.num=t,this.unit=r,this.num=t,this.unit=r,yr(t)&&(this.unit=""),r!==""&&!LL.test(r)&&(this.num=NaN,this.unit=""),RL.includes(r)&&(this.num=BL(t,r),this.unit="px")}add(t){return this.unit!==t.unit?new jt(NaN,""):new jt(this.num+t.num,this.unit)}subtract(t){return this.unit!==t.unit?new jt(NaN,""):new jt(this.num-t.num,this.unit)}multiply(t){return this.unit!==""&&t.unit!==""&&this.unit!==t.unit?new jt(NaN,""):new jt(this.num*t.num,this.unit||t.unit)}divide(t){return this.unit!==""&&t.unit!==""&&this.unit!==t.unit?new jt(NaN,""):new jt(this.num/t.num,this.unit||t.unit)}toString(){return"".concat(this.num).concat(this.unit)}isNaN(){return yr(this.num)}}function bN(e){if(e.includes(Gi))return Gi;for(var t=e;t.includes("*")||t.includes("/");){var r,[,n,i,s]=(r=Hy.exec(t))!==null&&r!==void 0?r:[],o=jt.parse(n??""),l=jt.parse(s??""),c=i==="*"?o.multiply(l):o.divide(l);if(c.isNaN())return Gi;t=t.replace(Hy,c.toString())}for(;t.includes("+")||/.-\d+(?:\.\d+)?/.test(t);){var d,[,u,f,p]=(d=Ky.exec(t))!==null&&d!==void 0?d:[],m=jt.parse(u??""),x=jt.parse(p??""),g=f==="+"?m.add(x):m.subtract(x);if(g.isNaN())return Gi;t=t.replace(Ky,g.toString())}return t}var Vy=/\(([^()]*)\)/;function FL(e){for(var t=e,r;(r=Vy.exec(t))!=null;){var[,n]=r;t=t.replace(Vy,bN(n))}return t}function WL(e){var t=e.replace(/\s+/g,"");return t=FL(t),t=bN(t),t}function UL(e){try{return WL(e)}catch{return Gi}}function Nd(e){var t=UL(e.slice(5,-1));return t===Gi?"":t}var qL=["x","y","lineHeight","capHeight","fill","scaleToFit","textAnchor","verticalAnchor"],HL=["dx","dy","angle","className","breakAll"];function hp(){return hp=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{children:t,breakAll:r,style:n}=e;try{var i=[];Re(t)||(r?i=t.toString().split(""):i=t.toString().split(jN));var s=i.map(l=>({word:l,width:fs(l,n).width})),o=r?0:fs(" ",n).width;return{wordsWithComputedWidth:s,spaceWidth:o}}catch{return null}};function VL(e){return e==="start"||e==="middle"||e==="end"||e==="inherit"}var SN=(e,t,r,n)=>e.reduce((i,s)=>{var{word:o,width:l}=s,c=i[i.length-1];if(c&&l!=null&&(t==null||n||c.width+l+re.reduce((t,r)=>t.width>r.width?t:r),YL="…",Gy=(e,t,r,n,i,s,o,l)=>{var c=e.slice(0,t),d=wN({breakAll:r,style:n,children:c+YL});if(!d)return[!1,[]];var u=SN(d.wordsWithComputedWidth,s,o,l),f=u.length>i||NN(u).width>Number(s);return[f,u]},GL=(e,t,r,n,i)=>{var{maxLines:s,children:o,style:l,breakAll:c}=e,d=Y(s),u=String(o),f=SN(t,n,r,i);if(!d||i)return f;var p=f.length>s||NN(f).width>Number(n);if(!p)return f;for(var m=0,x=u.length-1,g=0,b;m<=x&&g<=u.length-1;){var v=Math.floor((m+x)/2),j=v-1,[y,w]=Gy(u,j,c,l,s,n,r,i),[S]=Gy(u,v,c,l,s,n,r,i);if(!y&&!S&&(m=v+1),y&&S&&(x=v-1),!y&&S){b=w;break}g++}return b||f},Zy=e=>{var t=Re(e)?[]:e.toString().split(jN);return[{words:t,width:void 0}]},ZL=e=>{var{width:t,scaleToFit:r,children:n,style:i,breakAll:s,maxLines:o}=e;if((t||r)&&!Ci.isSsr){var l,c,d=wN({breakAll:s,children:n,style:i});if(d){var{wordsWithComputedWidth:u,spaceWidth:f}=d;l=u,c=f}else return Zy(n);return GL({breakAll:s,children:n,maxLines:o,style:i},l,c,t,!!r)}return Zy(n)},kN="#808080",XL={breakAll:!1,capHeight:"0.71em",fill:kN,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},Jm=h.forwardRef((e,t)=>{var r=ft(e,XL),{x:n,y:i,lineHeight:s,capHeight:o,fill:l,scaleToFit:c,textAnchor:d,verticalAnchor:u}=r,f=Yy(r,qL),p=h.useMemo(()=>ZL({breakAll:f.breakAll,children:f.children,maxLines:f.maxLines,scaleToFit:c,style:f.style,width:f.width}),[f.breakAll,f.children,f.maxLines,c,f.style,f.width]),{dx:m,dy:x,angle:g,className:b,breakAll:v}=f,j=Yy(f,HL);if(!Or(n)||!Or(i)||p.length===0)return null;var y=Number(n)+(Y(m)?m:0),w=Number(i)+(Y(x)?x:0);if(!_e(y)||!_e(w))return null;var S;switch(u){case"start":S=Nd("calc(".concat(o,")"));break;case"middle":S=Nd("calc(".concat((p.length-1)/2," * -").concat(s," + (").concat(o," / 2))"));break;default:S=Nd("calc(".concat(p.length-1," * -").concat(s,")"));break}var N=[];if(c){var P=p[0].width,{width:_}=f;N.push("scale(".concat(Y(_)&&Y(P)?_/P:1,")"))}return g&&N.push("rotate(".concat(g,", ").concat(y,", ").concat(w,")")),N.length&&(j.transform=N.join(" ")),h.createElement("text",hp({},ut(j),{ref:t,x:y,y:w,className:ce("recharts-text",b),textAnchor:d,fill:l.includes("url")?kN:l}),p.map((T,$)=>{var M=T.words.join(v?"":" ");return h.createElement("tspan",{x:y,dy:$===0?S:s,key:"".concat(M,"-").concat($)},M)}))});Jm.displayName="Text";var JL=["labelRef"];function QL(e,t){if(e==null)return{};var r,n,i=e8(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{var{x:t,y:r,upperWidth:n,lowerWidth:i,width:s,height:o,children:l}=e,c=h.useMemo(()=>({x:t,y:r,upperWidth:n,lowerWidth:i,width:s,height:o}),[t,r,n,i,s,o]);return h.createElement(PN.Provider,{value:c},l)},_N=()=>{var e=h.useContext(PN),t=uu();return e||Rw(t)},a8=h.createContext(null),s8=()=>{var e=h.useContext(a8),t=G(n2);return e||t},o8=e=>{var{value:t,formatter:r}=e,n=Re(e.children)?t:e.children;return typeof r=="function"?r(n):n},Qm=e=>e!=null&&typeof e=="function",l8=(e,t)=>{var r=Jt(t-e),n=Math.min(Math.abs(t-e),360);return r*n},c8=(e,t,r,n,i)=>{var{offset:s,className:o}=e,{cx:l,cy:c,innerRadius:d,outerRadius:u,startAngle:f,endAngle:p,clockWise:m}=i,x=(d+u)/2,g=l8(f,p),b=g>=0?1:-1,v,j;switch(t){case"insideStart":v=f+b*s,j=m;break;case"insideEnd":v=p-b*s,j=!m;break;case"end":v=p+b*s,j=m;break;default:throw new Error("Unsupported position ".concat(t))}j=g<=0?j:!j;var y=Je(l,c,x,v),w=Je(l,c,x,v+(j?1:-1)*359),S="M".concat(y.x,",").concat(y.y,` - A`).concat(x,",").concat(x,",0,1,").concat(j?0:1,`, - `).concat(w.x,",").concat(w.y),N=Re(e.id)?Ts("recharts-radial-line-"):e.id;return h.createElement("text",Rr({},n,{dominantBaseline:"central",className:ce("recharts-radial-bar-label",o)}),h.createElement("defs",null,h.createElement("path",{id:N,d:S})),h.createElement("textPath",{xlinkHref:"#".concat(N)},r))},u8=(e,t,r)=>{var{cx:n,cy:i,innerRadius:s,outerRadius:o,startAngle:l,endAngle:c}=e,d=(l+c)/2;if(r==="outside"){var{x:u,y:f}=Je(n,i,o+t,d);return{x:u,y:f,textAnchor:u>=n?"start":"end",verticalAnchor:"middle"}}if(r==="center")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"middle"};if(r==="centerTop")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"start"};if(r==="centerBottom")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"end"};var p=(s+o)/2,{x:m,y:x}=Je(n,i,p,d);return{x:m,y:x,textAnchor:"middle",verticalAnchor:"middle"}},mp=e=>"cx"in e&&Y(e.cx),d8=(e,t)=>{var{parentViewBox:r,offset:n,position:i}=e,s;r!=null&&!mp(r)&&(s=r);var{x:o,y:l,upperWidth:c,lowerWidth:d,height:u}=t,f=o,p=o+(c-d)/2,m=(f+p)/2,x=(c+d)/2,g=f+c/2,b=u>=0?1:-1,v=b*n,j=b>0?"end":"start",y=b>0?"start":"end",w=c>=0?1:-1,S=w*n,N=w>0?"end":"start",P=w>0?"start":"end";if(i==="top"){var _={x:f+c/2,y:l-v,textAnchor:"middle",verticalAnchor:j};return Ce(Ce({},_),s?{height:Math.max(l-s.y,0),width:c}:{})}if(i==="bottom"){var T={x:p+d/2,y:l+u+v,textAnchor:"middle",verticalAnchor:y};return Ce(Ce({},T),s?{height:Math.max(s.y+s.height-(l+u),0),width:d}:{})}if(i==="left"){var $={x:m-S,y:l+u/2,textAnchor:N,verticalAnchor:"middle"};return Ce(Ce({},$),s?{width:Math.max($.x-s.x,0),height:u}:{})}if(i==="right"){var M={x:m+x+S,y:l+u/2,textAnchor:P,verticalAnchor:"middle"};return Ce(Ce({},M),s?{width:Math.max(s.x+s.width-M.x,0),height:u}:{})}var C=s?{width:x,height:u}:{};return i==="insideLeft"?Ce({x:m+S,y:l+u/2,textAnchor:P,verticalAnchor:"middle"},C):i==="insideRight"?Ce({x:m+x-S,y:l+u/2,textAnchor:N,verticalAnchor:"middle"},C):i==="insideTop"?Ce({x:f+c/2,y:l+v,textAnchor:"middle",verticalAnchor:y},C):i==="insideBottom"?Ce({x:p+d/2,y:l+u-v,textAnchor:"middle",verticalAnchor:j},C):i==="insideTopLeft"?Ce({x:f+S,y:l+v,textAnchor:P,verticalAnchor:y},C):i==="insideTopRight"?Ce({x:f+c-S,y:l+v,textAnchor:N,verticalAnchor:y},C):i==="insideBottomLeft"?Ce({x:p+S,y:l+u-v,textAnchor:P,verticalAnchor:j},C):i==="insideBottomRight"?Ce({x:p+d-S,y:l+u-v,textAnchor:N,verticalAnchor:j},C):i&&typeof i=="object"&&(Y(i.x)||Qr(i.x))&&(Y(i.y)||Qr(i.y))?Ce({x:o+Rn(i.x,x),y:l+Rn(i.y,u),textAnchor:"end",verticalAnchor:"end"},C):Ce({x:g,y:l+u/2,textAnchor:"middle",verticalAnchor:"middle"},C)},f8={offset:5,zIndex:lt.label};function yn(e){var t=ft(e,f8),{viewBox:r,position:n,value:i,children:s,content:o,className:l="",textBreakAll:c,labelRef:d}=t,u=s8(),f=_N(),p=n==="center"?f:u??f,m,x,g;if(r==null?m=p:mp(r)?m=r:m=Rw(r),!m||Re(i)&&Re(s)&&!h.isValidElement(o)&&typeof o!="function")return null;var b=Ce(Ce({},t),{},{viewBox:m});if(h.isValidElement(o)){var{labelRef:v}=b,j=QL(b,JL);return h.cloneElement(o,j)}if(typeof o=="function"){if(x=h.createElement(o,b),h.isValidElement(x))return x}else x=o8(t);var y=ut(t);if(mp(m)){if(n==="insideStart"||n==="insideEnd"||n==="end")return c8(t,n,x,y,m);g=u8(m,t.offset,t.position)}else g=d8(t,m);return h.createElement(Ir,{zIndex:t.zIndex},h.createElement(Jm,Rr({ref:d,className:ce("recharts-label",l)},y,g,{textAnchor:VL(y.textAnchor)?y.textAnchor:g.textAnchor,breakAll:c}),x))}yn.displayName="Label";var p8=(e,t,r)=>{if(!e)return null;var n={viewBox:t,labelRef:r};return e===!0?h.createElement(yn,Rr({key:"label-implicit"},n)):Or(e)?h.createElement(yn,Rr({key:"label-implicit",value:e},n)):h.isValidElement(e)?e.type===yn?h.cloneElement(e,Ce({key:"label-implicit"},n)):h.createElement(yn,Rr({key:"label-implicit",content:e},n)):Qm(e)?h.createElement(yn,Rr({key:"label-implicit",content:e},n)):e&&typeof e=="object"?h.createElement(yn,Rr({},e,{key:"label-implicit"},n)):null};function h8(e){var{label:t,labelRef:r}=e,n=_N();return p8(t,n,r)||null}var CN={},AN={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r[r.length-1]}e.last=t})(AN);var ON={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return Array.isArray(r)?r:Array.from(r)}e.toArray=t})(ON);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=AN,r=ON,n=Jc;function i(s){if(n.isArrayLike(s))return t.last(r.toArray(s))}e.last=i})(CN);var m8=CN.last;const g8=Tr(m8);var x8=["valueAccessor"],y8=["dataKey","clockWise","id","textBreakAll","zIndex"];function hc(){return hc=Object.assign?Object.assign.bind():function(e){for(var t=1;tArray.isArray(e.value)?g8(e.value):e.value,EN=h.createContext(void 0),DN=EN.Provider,TN=h.createContext(void 0);TN.Provider;function j8(){return h.useContext(EN)}function w8(){return h.useContext(TN)}function cl(e){var{valueAccessor:t=b8}=e,r=Jy(e,x8),{dataKey:n,clockWise:i,id:s,textBreakAll:o,zIndex:l}=r,c=Jy(r,y8),d=j8(),u=w8(),f=d||u;return!f||!f.length?null:h.createElement(Ir,{zIndex:l??lt.label},h.createElement(ir,{className:"recharts-label-list"},f.map((p,m)=>{var x,g=Re(n)?t(p,m):et(p&&p.payload,n),b=Re(s)?{}:{id:"".concat(s,"-").concat(m)};return h.createElement(yn,hc({key:"label-".concat(m)},ut(p),c,b,{fill:(x=r.fill)!==null&&x!==void 0?x:p.fill,parentViewBox:p.parentViewBox,value:g,textBreakAll:o,viewBox:p.viewBox,index:m,zIndex:0}))})))}cl.displayName="LabelList";function MN(e){var{label:t}=e;return t?t===!0?h.createElement(cl,{key:"labelList-implicit"}):h.isValidElement(t)||Qm(t)?h.createElement(cl,{key:"labelList-implicit",content:t}):typeof t=="object"?h.createElement(cl,hc({key:"labelList-implicit"},t,{type:String(t.type)})):null:null}function gp(){return gp=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{cx:t,cy:r,r:n,className:i}=e,s=ce("recharts-dot",i);return Y(t)&&Y(r)&&Y(n)?h.createElement("circle",gp({},nr(e),Ih(e),{className:s,cx:t,cy:r,r:n})):null},S8={radiusAxis:{},angleAxis:{}},$N=At({name:"polarAxis",initialState:S8,reducers:{addRadiusAxis(e,t){e.radiusAxis[t.payload.id]=t.payload},removeRadiusAxis(e,t){delete e.radiusAxis[t.payload.id]},addAngleAxis(e,t){e.angleAxis[t.payload.id]=t.payload},removeAngleAxis(e,t){delete e.angleAxis[t.payload.id]}}}),{addRadiusAxis:OF,removeRadiusAxis:EF,addAngleAxis:DF,removeAngleAxis:TF}=$N.actions,N8=$N.reducer,eg=e=>e&&typeof e=="object"&&"clipDot"in e?!!e.clipDot:!0,LN={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){var i;if(typeof r!="object"||r==null)return!1;if(Object.getPrototypeOf(r)===null)return!0;if(Object.prototype.toString.call(r)!=="[object Object]"){const s=r[Symbol.toStringTag];return s==null||!((i=Object.getOwnPropertyDescriptor(r,Symbol.toStringTag))!=null&&i.writable)?!1:r.toString()===`[object ${s}]`}let n=r;for(;Object.getPrototypeOf(n)!==null;)n=Object.getPrototypeOf(n);return Object.getPrototypeOf(r)===n}e.isPlainObject=t})(LN);var k8=LN.isPlainObject;const P8=Tr(k8);function Qy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function ev(e){for(var t=1;t{var s=r-n,o;return o="M ".concat(e,",").concat(t),o+="L ".concat(e+r,",").concat(t),o+="L ".concat(e+r-s/2,",").concat(t+i),o+="L ".concat(e+r-s/2-n,",").concat(t+i),o+="L ".concat(e,",").concat(t," Z"),o},O8={x:0,y:0,upperWidth:0,lowerWidth:0,height:0,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},E8=e=>{var t=ft(e,O8),{x:r,y:n,upperWidth:i,lowerWidth:s,height:o,className:l}=t,{animationEasing:c,animationDuration:d,animationBegin:u,isUpdateAnimationActive:f}=t,p=h.useRef(null),[m,x]=h.useState(-1),g=h.useRef(i),b=h.useRef(s),v=h.useRef(o),j=h.useRef(r),y=h.useRef(n),w=pu(e,"trapezoid-");if(h.useEffect(()=>{if(p.current&&p.current.getTotalLength)try{var q=p.current.getTotalLength();q&&x(q)}catch{}},[]),r!==+r||n!==+n||i!==+i||s!==+s||o!==+o||i===0&&s===0||o===0)return null;var S=ce("recharts-trapezoid",l);if(!f)return h.createElement("g",null,h.createElement("path",mc({},ut(t),{className:S,d:tv(r,n,i,s,o)})));var N=g.current,P=b.current,_=v.current,T=j.current,$=y.current,M="0px ".concat(m===-1?1:m,"px"),C="".concat(m,"px 0px"),R=Hw(["strokeDasharray"],d,c);return h.createElement(fu,{animationId:w,key:w,canBegin:m>0,duration:d,easing:c,isActive:f,begin:u},q=>{var Z=De(N,i,q),E=De(P,s,q),D=De(_,o,q),O=De(T,r,q),k=De($,n,q);p.current&&(g.current=Z,b.current=E,v.current=D,j.current=O,y.current=k);var L=q>0?{transition:R,strokeDasharray:C}:{strokeDasharray:M};return h.createElement("path",mc({},ut(t),{className:S,d:tv(O,k,Z,E,D),ref:p,style:ev(ev({},L),t.style)}))})},D8=["option","shapeType","propTransformer","activeClassName","isActive"];function T8(e,t){if(e==null)return{};var r,n,i=M8(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{if(!i){var s=t(r);return n(NI(s)),()=>{n(kI(s))}}},[t,r,n,i]),null}function RN(e){var{legendPayload:t}=e,r=Ve(),n=pt();return h.useLayoutEffect(()=>n?Pa:(r(o3(t)),()=>{r(l3(t))}),[r,n,t]),null}var kd,W8=()=>{var[e]=h.useState(()=>Ts("uid-"));return e},U8=(kd=Tv.useId)!==null&&kd!==void 0?kd:W8;function BN(e,t){var r=U8();return t||(e?"".concat(e,"-").concat(r):r)}var q8=h.createContext(void 0),FN=e=>{var{id:t,type:r,children:n}=e,i=BN("recharts-".concat(r),t);return h.createElement(q8.Provider,{value:i},n(i))},H8={cartesianItems:[],polarItems:[]},WN=At({name:"graphicalItems",initialState:H8,reducers:{addCartesianGraphicalItem:{reducer(e,t){e.cartesianItems.push(t.payload)},prepare:Le()},replaceCartesianGraphicalItem:{reducer(e,t){var{prev:r,next:n}=t.payload,i=Kr(e).cartesianItems.indexOf(r);i>-1&&(e.cartesianItems[i]=n)},prepare:Le()},removeCartesianGraphicalItem:{reducer(e,t){var r=Kr(e).cartesianItems.indexOf(t.payload);r>-1&&e.cartesianItems.splice(r,1)},prepare:Le()},addPolarGraphicalItem:{reducer(e,t){e.polarItems.push(t.payload)},prepare:Le()},removePolarGraphicalItem:{reducer(e,t){var r=Kr(e).polarItems.indexOf(t.payload);r>-1&&e.polarItems.splice(r,1)},prepare:Le()}}}),{addCartesianGraphicalItem:K8,replaceCartesianGraphicalItem:V8,removeCartesianGraphicalItem:Y8,addPolarGraphicalItem:MF,removePolarGraphicalItem:IF}=WN.actions,G8=WN.reducer;function UN(e){var t=Ve(),r=h.useRef(null);return h.useLayoutEffect(()=>{r.current===null?t(K8(e)):r.current!==e&&t(V8({prev:r.current,next:e})),r.current=e},[t,e]),h.useLayoutEffect(()=>()=>{r.current&&(t(Y8(r.current)),r.current=null)},[t]),null}var Z8=["points"];function iv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Pd(e){for(var t=1;t{var b,v,j=Pd(Pd(Pd({r:3},o),f),{},{index:g,cx:(b=x.x)!==null&&b!==void 0?b:void 0,cy:(v=x.y)!==null&&v!==void 0?v:void 0,dataKey:s,value:x.value,payload:x.payload,points:t});return h.createElement(rz,{key:"dot-".concat(g),option:r,dotProps:j,className:i})}),m={};return l&&c!=null&&(m.clipPath="url(#clipPath-".concat(u?"":"dots-").concat(c,")")),h.createElement(Ir,{zIndex:d},h.createElement(ir,xc({className:n},m),p))}function av(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function sv(e){for(var t=1;t({top:e.top,bottom:e.bottom,left:e.left,right:e.right})),mz=I([hz,ln,cn],(e,t,r)=>{if(!(!e||t==null||r==null))return{x:e.left,y:e.top,width:Math.max(0,t-e.left-e.right),height:Math.max(0,r-e.top-e.bottom)}}),Mu=()=>G(mz),gz=()=>G(h$);function ov(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function _d(e){for(var t=1;t{var{point:t,childIndex:r,mainColor:n,activeDot:i,dataKey:s}=e;if(i===!1||t.x==null||t.y==null)return null;var o={index:r,dataKey:s,cx:t.x,cy:t.y,r:4,fill:n??"none",strokeWidth:2,stroke:"#fff",payload:t.payload,value:t.value},l=_d(_d(_d({},o),qc(i)),Ih(i)),c;return h.isValidElement(i)?c=h.cloneElement(i,l):typeof i=="function"?c=i(l):c=h.createElement(IN,l),h.createElement(ir,{className:"recharts-active-dot"},c)};function xp(e){var{points:t,mainColor:r,activeDot:n,itemDataKey:i,zIndex:s=lt.activeDot}=e,o=G(Us),l=gz();if(t==null||l==null)return null;var c=t.find(d=>l.includes(d.payload));return Re(c)?null:h.createElement(Ir,{zIndex:s},h.createElement(bz,{point:c,childIndex:Number(o),mainColor:r,dataKey:i,activeDot:n}))}var jz={},KN=At({name:"errorBars",initialState:jz,reducers:{addErrorBar:(e,t)=>{var{itemId:r,errorBar:n}=t.payload;e[r]||(e[r]=[]),e[r].push(n)},replaceErrorBar:(e,t)=>{var{itemId:r,prev:n,next:i}=t.payload;e[r]&&(e[r]=e[r].map(s=>s.dataKey===n.dataKey&&s.direction===n.direction?i:s))},removeErrorBar:(e,t)=>{var{itemId:r,errorBar:n}=t.payload;e[r]&&(e[r]=e[r].filter(i=>i.dataKey!==n.dataKey||i.direction!==n.direction))}}}),{addErrorBar:zF,replaceErrorBar:RF,removeErrorBar:BF}=KN.actions,wz=KN.reducer,Sz=["children"];function Nz(e,t){if(e==null)return{};var r,n,i=kz(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n({x:0,y:0,value:0}),errorBarOffset:0},_z=h.createContext(Pz);function Cz(e){var{children:t}=e,r=Nz(e,Sz);return h.createElement(_z.Provider,{value:r},t)}function tg(e,t){var r,n,i=G(d=>dn(d,e)),s=G(d=>fn(d,t)),o=(r=i==null?void 0:i.allowDataOverflow)!==null&&r!==void 0?r:Tt.allowDataOverflow,l=(n=s==null?void 0:s.allowDataOverflow)!==null&&n!==void 0?n:Mt.allowDataOverflow,c=o||l;return{needClip:c,needClipX:o,needClipY:l}}function VN(e){var{xAxisId:t,yAxisId:r,clipPathId:n}=e,i=Mu(),{needClipX:s,needClipY:o,needClip:l}=tg(t,r);if(!l||!i)return null;var{x:c,y:d,width:u,height:f}=i;return h.createElement("clipPath",{id:"clipPath-".concat(n)},h.createElement("rect",{x:s?c:c-u/2,y:o?d:d-f/2,width:s?u:u*2,height:o?f:f*2}))}var Az=e=>{var{chartData:t}=e,r=Ve(),n=pt();return h.useEffect(()=>n?()=>{}:(r(Iy(t)),()=>{r(Iy(void 0))}),[t,r,n]),null},lv={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},YN=At({name:"brush",initialState:lv,reducers:{setBrushSettings(e,t){return t.payload==null?lv:t.payload}}}),{setBrushSettings:FF}=YN.actions,Oz=YN.reducer;function Ez(e,t,r){return(t=Dz(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Dz(e){var t=Tz(e,"string");return typeof t=="symbol"?t:t+""}function Tz(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class rg{static create(t){return new rg(t)}constructor(t){this.scale=t}get domain(){return this.scale.domain}get range(){return this.scale.range}get rangeMin(){return this.range()[0]}get rangeMax(){return this.range()[1]}get bandwidth(){return this.scale.bandwidth}apply(t){var{bandAware:r,position:n}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t!==void 0){if(n)switch(n){case"start":return this.scale(t);case"middle":{var i=this.bandwidth?this.bandwidth()/2:0;return this.scale(t)+i}case"end":{var s=this.bandwidth?this.bandwidth():0;return this.scale(t)+s}default:return this.scale(t)}if(r){var o=this.bandwidth?this.bandwidth()/2:0;return this.scale(t)+o}return this.scale(t)}}isInRange(t){var r=this.range(),n=r[0],i=r[r.length-1];return n<=i?t>=n&&t<=i:t>=i&&t<=n}}Ez(rg,"EPS",1e-4);function Mz(e){return(e%180+180)%180}var Iz=function(t){var{width:r,height:n}=t,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,s=Mz(i),o=s*Math.PI/180,l=Math.atan(n/r),c=o>l&&o{e.dots.push(t.payload)},removeDot:(e,t)=>{var r=Kr(e).dots.findIndex(n=>n===t.payload);r!==-1&&e.dots.splice(r,1)},addArea:(e,t)=>{e.areas.push(t.payload)},removeArea:(e,t)=>{var r=Kr(e).areas.findIndex(n=>n===t.payload);r!==-1&&e.areas.splice(r,1)},addLine:(e,t)=>{e.lines.push(t.payload)},removeLine:(e,t)=>{var r=Kr(e).lines.findIndex(n=>n===t.payload);r!==-1&&e.lines.splice(r,1)}}}),{addDot:WF,removeDot:UF,addArea:qF,removeArea:HF,addLine:KF,removeLine:VF}=GN.actions,Lz=GN.reducer,zz=h.createContext(void 0),Rz=e=>{var{children:t}=e,[r]=h.useState("".concat(Ts("recharts"),"-clip")),n=Mu();if(n==null)return null;var{x:i,y:s,width:o,height:l}=n;return h.createElement(zz.Provider,{value:r},h.createElement("defs",null,h.createElement("clipPath",{id:r},h.createElement("rect",{x:i,y:s,height:l,width:o}))),t)};function va(e,t){for(var r in e)if({}.hasOwnProperty.call(e,r)&&(!{}.hasOwnProperty.call(t,r)||e[r]!==t[r]))return!1;for(var n in t)if({}.hasOwnProperty.call(t,n)&&!{}.hasOwnProperty.call(e,n))return!1;return!0}function ZN(e,t){if(t<1)return[];if(t===1)return e;for(var r=[],n=0;ne*i)return!1;var s=r();return e*(t-e*s/2-n)>=0&&e*(t+e*s/2-i)<=0}function Wz(e,t){return ZN(e,t+1)}function Uz(e,t,r,n,i){for(var s=(n||[]).slice(),{start:o,end:l}=t,c=0,d=1,u=o,f=function(){var x=n==null?void 0:n[c];if(x===void 0)return{v:ZN(n,d)};var g=c,b,v=()=>(b===void 0&&(b=r(x,g)),b),j=x.coordinate,y=c===0||yc(e,j,v,u,l);y||(c=0,u=o,d+=1),y&&(u=j+e*(v()/2+i),c+=d)},p;d<=s.length;)if(p=f(),p)return p.v;return[]}function cv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function at(e){for(var t=1;t(x===void 0&&(x=r(m,p)),x);if(p===o-1){var b=e*(m.coordinate+e*g()/2-c);s[p]=m=at(at({},m),{},{tickCoord:b>0?m.coordinate-b*e:m.coordinate})}else s[p]=m=at(at({},m),{},{tickCoord:m.coordinate});if(m.tickCoord!=null){var v=yc(e,m.tickCoord,g,l,c);v&&(c=m.tickCoord-e*(g()/2+i),s[p]=at(at({},m),{},{isShow:!0}))}},u=o-1;u>=0;u--)d(u);return s}function Yz(e,t,r,n,i,s){var o=(n||[]).slice(),l=o.length,{start:c,end:d}=t;if(s){var u=n[l-1],f=r(u,l-1),p=e*(u.coordinate+e*f/2-d);if(o[l-1]=u=at(at({},u),{},{tickCoord:p>0?u.coordinate-p*e:u.coordinate}),u.tickCoord!=null){var m=yc(e,u.tickCoord,()=>f,c,d);m&&(d=u.tickCoord-e*(f/2+i),o[l-1]=at(at({},u),{},{isShow:!0}))}}for(var x=s?l-1:l,g=function(j){var y=o[j],w,S=()=>(w===void 0&&(w=r(y,j)),w);if(j===0){var N=e*(y.coordinate-e*S()/2-c);o[j]=y=at(at({},y),{},{tickCoord:N<0?y.coordinate-N*e:y.coordinate})}else o[j]=y=at(at({},y),{},{tickCoord:y.coordinate});if(y.tickCoord!=null){var P=yc(e,y.tickCoord,S,c,d);P&&(c=y.tickCoord+e*(S()/2+i),o[j]=at(at({},y),{},{isShow:!0}))}},b=0;b{var S=typeof d=="function"?d(y.value,w):y.value;return x==="width"?Bz(fs(S,{fontSize:t,letterSpacing:r}),g,f):fs(S,{fontSize:t,letterSpacing:r})[x]},v=i.length>=2?Jt(i[1].coordinate-i[0].coordinate):1,j=Fz(s,v,x);return c==="equidistantPreserveStart"?Uz(v,j,b,i,o):(c==="preserveStart"||c==="preserveStartEnd"?m=Yz(v,j,b,i,o,c==="preserveStartEnd"):m=Vz(v,j,b,i,o),m.filter(y=>y.isShow))}var Gz=e=>{var{ticks:t,label:r,labelGapWithTick:n=5,tickSize:i=0,tickMargin:s=0}=e,o=0;if(t){Array.from(t).forEach(u=>{if(u){var f=u.getBoundingClientRect();f.width>o&&(o=f.width)}});var l=r?r.getBoundingClientRect().width:0,c=i+s,d=o+c+l+(r?n:0);return Math.round(d)}return 0},Zz=["axisLine","width","height","className","hide","ticks","axisType"],Xz=["viewBox"],Jz=["viewBox"];function yp(e,t){if(e==null)return{};var r,n,i=Qz(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{var{ticks:r=[],tick:n,tickLine:i,stroke:s,tickFormatter:o,unit:l,padding:c,tickTextProps:d,orientation:u,mirror:f,x:p,y:m,width:x,height:g,tickSize:b,tickMargin:v,fontSize:j,letterSpacing:y,getTicksConfig:w,events:S,axisType:N}=e,P=ng(Ee(Ee({},w),{},{ticks:r}),j,y),_=aR(u,f),T=sR(u,f),$=nr(w),M=qc(n),C={};typeof i=="object"&&(C=i);var R=Ee(Ee({},$),{},{fill:"none"},C),q=P.map(D=>Ee({entry:D},iR(D,p,m,x,g,u,b,f,v))),Z=q.map(D=>{var{entry:O,line:k}=D;return h.createElement(ir,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(O.value,"-").concat(O.coordinate,"-").concat(O.tickCoord)},i&&h.createElement("line",Si({},R,k,{className:ce("recharts-cartesian-axis-tick-line",Xc(i,"className"))})))}),E=q.map((D,O)=>{var{entry:k,tick:L}=D,F=Ee(Ee(Ee(Ee({textAnchor:_,verticalAnchor:T},$),{},{stroke:"none",fill:s},M),L),{},{index:O,payload:k,visibleTicksCount:P.length,tickFormatter:o,padding:c},d);return h.createElement(ir,Si({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(k.value,"-").concat(k.coordinate,"-").concat(k.tickCoord)},X6(S,k,O)),n&&h.createElement(oR,{option:n,tickProps:F,value:"".concat(typeof o=="function"?o(k.value,O):k.value).concat(l||"")}))});return h.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(N,"-ticks")},E.length>0&&h.createElement(Ir,{zIndex:lt.label},h.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(N,"-tick-labels"),ref:t},E)),Z.length>0&&h.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(N,"-tick-lines")},Z))}),cR=h.forwardRef((e,t)=>{var{axisLine:r,width:n,height:i,className:s,hide:o,ticks:l,axisType:c}=e,d=yp(e,Zz),[u,f]=h.useState(""),[p,m]=h.useState(""),x=h.useRef(null);h.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var b;return Gz({ticks:x.current,label:(b=e.labelRef)===null||b===void 0?void 0:b.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var g=h.useCallback(b=>{if(b){var v=b.getElementsByClassName("recharts-cartesian-axis-tick-value");x.current=v;var j=v[0];if(j){var y=window.getComputedStyle(j),w=y.fontSize,S=y.letterSpacing;(w!==u||S!==p)&&(f(w),m(S))}}},[u,p]);return o||n!=null&&n<=0||i!=null&&i<=0?null:h.createElement(Ir,{zIndex:e.zIndex},h.createElement(ir,{className:ce("recharts-cartesian-axis",s)},h.createElement(nR,{x:e.x,y:e.y,width:n,height:i,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:nr(e)}),h.createElement(lR,{ref:g,axisType:c,events:d,fontSize:u,getTicksConfig:e,height:e.height,letterSpacing:p,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:l,unit:e.unit,width:e.width,x:e.x,y:e.y}),h.createElement(i8,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},h.createElement(h8,{label:e.label,labelRef:e.labelRef}),e.children)))}),uR=h.memo(cR,(e,t)=>{var{viewBox:r}=e,n=yp(e,Xz),{viewBox:i}=t,s=yp(t,Jz);return va(r,i)&&va(n,s)}),ag=h.forwardRef((e,t)=>{var r=ft(e,ig);return h.createElement(uR,Si({},r,{ref:t}))});ag.displayName="CartesianAxis";var dR=["x1","y1","x2","y2","key"],fR=["offset"],pR=["xAxisId","yAxisId"],hR=["xAxisId","yAxisId"];function dv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function ot(e){for(var t=1;t{var{fill:t}=e;if(!t||t==="none")return null;var{fillOpacity:r,x:n,y:i,width:s,height:o,ry:l}=e;return h.createElement("rect",{x:n,y:i,ry:l,width:s,height:o,stroke:"none",fill:t,fillOpacity:r,className:"recharts-cartesian-grid-bg"})};function XN(e){var{option:t,lineItemProps:r}=e,n;if(h.isValidElement(t))n=h.cloneElement(t,r);else if(typeof t=="function")n=t(r);else{var i,{x1:s,y1:o,x2:l,y2:c,key:d}=r,u=vc(r,dR),f=(i=nr(u))!==null&&i!==void 0?i:{},{offset:p}=f,m=vc(f,fR);n=h.createElement("line",ai({},m,{x1:s,y1:o,x2:l,y2:c,fill:"none",key:d}))}return n}function bR(e){var{x:t,width:r,horizontal:n=!0,horizontalPoints:i}=e;if(!n||!i||!i.length)return null;var{xAxisId:s,yAxisId:o}=e,l=vc(e,pR),c=i.map((d,u)=>{var f=ot(ot({},l),{},{x1:t,y1:d,x2:t+r,y2:d,key:"line-".concat(u),index:u});return h.createElement(XN,{key:"line-".concat(u),option:n,lineItemProps:f})});return h.createElement("g",{className:"recharts-cartesian-grid-horizontal"},c)}function jR(e){var{y:t,height:r,vertical:n=!0,verticalPoints:i}=e;if(!n||!i||!i.length)return null;var{xAxisId:s,yAxisId:o}=e,l=vc(e,hR),c=i.map((d,u)=>{var f=ot(ot({},l),{},{x1:d,y1:t,x2:d,y2:t+r,key:"line-".concat(u),index:u});return h.createElement(XN,{option:n,lineItemProps:f,key:"line-".concat(u)})});return h.createElement("g",{className:"recharts-cartesian-grid-vertical"},c)}function wR(e){var{horizontalFill:t,fillOpacity:r,x:n,y:i,width:s,height:o,horizontalPoints:l,horizontal:c=!0}=e;if(!c||!t||!t.length||l==null)return null;var d=l.map(f=>Math.round(f+i-i)).sort((f,p)=>f-p);i!==d[0]&&d.unshift(0);var u=d.map((f,p)=>{var m=!d[p+1],x=m?i+o-f:d[p+1]-f;if(x<=0)return null;var g=p%t.length;return h.createElement("rect",{key:"react-".concat(p),y:f,x:n,height:x,width:s,stroke:"none",fill:t[g],fillOpacity:r,className:"recharts-cartesian-grid-bg"})});return h.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},u)}function SR(e){var{vertical:t=!0,verticalFill:r,fillOpacity:n,x:i,y:s,width:o,height:l,verticalPoints:c}=e;if(!t||!r||!r.length)return null;var d=c.map(f=>Math.round(f+i-i)).sort((f,p)=>f-p);i!==d[0]&&d.unshift(0);var u=d.map((f,p)=>{var m=!d[p+1],x=m?i+o-f:d[p+1]-f;if(x<=0)return null;var g=p%r.length;return h.createElement("rect",{key:"react-".concat(p),x:f,y:s,width:x,height:l,stroke:"none",fill:r[g],fillOpacity:n,className:"recharts-cartesian-grid-bg"})});return h.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},u)}var NR=(e,t)=>{var{xAxis:r,width:n,height:i,offset:s}=e;return Aw(ng(ot(ot(ot({},ig),r),{},{ticks:Ow(r),viewBox:{x:0,y:0,width:n,height:i}})),s.left,s.left+s.width,t)},kR=(e,t)=>{var{yAxis:r,width:n,height:i,offset:s}=e;return Aw(ng(ot(ot(ot({},ig),r),{},{ticks:Ow(r),viewBox:{x:0,y:0,width:n,height:i}})),s.top,s.top+s.height,t)},PR={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:lt.grid};function vp(e){var t=Fw(),r=Ww(),n=Bw(),i=ot(ot({},ft(e,PR)),{},{x:Y(e.x)?e.x:n.left,y:Y(e.y)?e.y:n.top,width:Y(e.width)?e.width:n.width,height:Y(e.height)?e.height:n.height}),{xAxisId:s,yAxisId:o,x:l,y:c,width:d,height:u,syncWithTicks:f,horizontalValues:p,verticalValues:m}=i,x=pt(),g=G(T=>Ny(T,"xAxis",s,x)),b=G(T=>Ny(T,"yAxis",o,x));if(!Er(d)||!Er(u)||!Y(l)||!Y(c))return null;var v=i.verticalCoordinatesGenerator||NR,j=i.horizontalCoordinatesGenerator||kR,{horizontalPoints:y,verticalPoints:w}=i;if((!y||!y.length)&&typeof j=="function"){var S=p&&p.length,N=j({yAxis:b?ot(ot({},b),{},{ticks:S?p:b.ticks}):void 0,width:t??d,height:r??u,offset:n},S?!0:f);Gl(Array.isArray(N),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof N,"]")),Array.isArray(N)&&(y=N)}if((!w||!w.length)&&typeof v=="function"){var P=m&&m.length,_=v({xAxis:g?ot(ot({},g),{},{ticks:P?m:g.ticks}):void 0,width:t??d,height:r??u,offset:n},P?!0:f);Gl(Array.isArray(_),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof _,"]")),Array.isArray(_)&&(w=_)}return h.createElement(Ir,{zIndex:i.zIndex},h.createElement("g",{className:"recharts-cartesian-grid"},h.createElement(vR,{fill:i.fill,fillOpacity:i.fillOpacity,x:i.x,y:i.y,width:i.width,height:i.height,ry:i.ry}),h.createElement(wR,ai({},i,{horizontalPoints:y})),h.createElement(SR,ai({},i,{verticalPoints:w})),h.createElement(bR,ai({},i,{offset:n,horizontalPoints:y,xAxis:g,yAxis:b})),h.createElement(jR,ai({},i,{offset:n,verticalPoints:w,xAxis:g,yAxis:b}))))}vp.displayName="CartesianGrid";var JN=(e,t,r,n)=>Du(e,"xAxis",t,n),QN=(e,t,r,n)=>Eu(e,"xAxis",t,n),ek=(e,t,r,n)=>Du(e,"yAxis",r,n),tk=(e,t,r,n)=>Eu(e,"yAxis",r,n),_R=I([ue,JN,ek,QN,tk],(e,t,r,n,i)=>Mr(e,"xAxis")?ma(t,n,!1):ma(r,i,!1)),CR=(e,t,r,n,i)=>i;function AR(e){return e.type==="line"}var OR=I([Mm,CR],(e,t)=>e.filter(AR).find(r=>r.id===t)),ER=I([ue,JN,ek,QN,tk,OR,_R,bu],(e,t,r,n,i,s,o,l)=>{var{chartData:c,dataStartIndex:d,dataEndIndex:u}=l;if(!(s==null||t==null||r==null||n==null||i==null||n.length===0||i.length===0||o==null)){var{dataKey:f,data:p}=s,m;if(p!=null&&p.length>0?m=p:m=c==null?void 0:c.slice(d,u+1),m!=null)return XR({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:i,dataKey:f,bandSize:o,displayedData:m})}});function rk(e){var t=qc(e),r=3,n=2;if(t!=null){var{r:i,strokeWidth:s}=t,o=Number(i),l=Number(s);return(Number.isNaN(o)||o<0)&&(o=r),(Number.isNaN(l)||l<0)&&(l=n),{r:o,strokeWidth:l}}return{r,strokeWidth:n}}var DR=["id"],TR=["type","layout","connectNulls","needClip","shape"],MR=["activeDot","animateNewValues","animationBegin","animationDuration","animationEasing","connectNulls","dot","hide","isAnimationActive","label","legendType","xAxisId","yAxisId","id"];function Hs(){return Hs=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{dataKey:t,name:r,stroke:n,legendType:i,hide:s}=e;return[{inactive:s,dataKey:t,type:i,color:n,value:au(r,t),payload:e}]};function BR(e){var{dataKey:t,data:r,stroke:n,strokeWidth:i,fill:s,name:o,hide:l,unit:c}=e;return{dataDefinedOnItem:r,positions:void 0,settings:{stroke:n,strokeWidth:i,fill:s,dataKey:t,nameKey:void 0,name:au(o,t),hide:l,type:e.tooltipType,color:e.stroke,unit:c}}}var nk=(e,t)=>"".concat(t,"px ").concat(e-t,"px");function FR(e,t){for(var r=e.length%2!==0?[...e,0]:e,n=[],i=0;i{var n=r.reduce((f,p)=>f+p);if(!n)return nk(t,e);for(var i=Math.floor(e/n),s=e%n,o=t-e,l=[],c=0,d=0;cs){l=[...r.slice(0,c),s-d];break}var u=l.length%2===0?[0,o]:[o];return[...FR(r,i),...l,...u].map(f=>"".concat(f,"px")).join(", ")};function UR(e){var{clipPathId:t,points:r,props:n}=e,{dot:i,dataKey:s,needClip:o}=n,{id:l}=n,c=sg(n,DR),d=nr(c);return h.createElement(qN,{points:r,dot:i,className:"recharts-line-dots",dotClassName:"recharts-line-dot",dataKey:s,baseProps:d,needClip:o,clipPathId:t})}function qR(e){var{showLabels:t,children:r,points:n}=e,i=h.useMemo(()=>n==null?void 0:n.map(s=>{var o,l,c={x:(o=s.x)!==null&&o!==void 0?o:0,y:(l=s.y)!==null&&l!==void 0?l:0,width:0,lowerWidth:0,upperWidth:0,height:0};return wr(wr({},c),{},{value:s.value,payload:s.payload,viewBox:c,parentViewBox:void 0,fill:void 0})}),[n]);return h.createElement(DN,{value:t?i:void 0},r)}function pv(e){var{clipPathId:t,pathRef:r,points:n,strokeDasharray:i,props:s}=e,{type:o,layout:l,connectNulls:c,needClip:d,shape:u}=s,f=sg(s,TR),p=wr(wr({},ut(f)),{},{fill:"none",className:"recharts-line-curve",clipPath:d?"url(#clipPath-".concat(t,")"):void 0,points:n,type:o,layout:l,connectNulls:c,strokeDasharray:i??s.strokeDasharray});return h.createElement(h.Fragment,null,(n==null?void 0:n.length)>1&&h.createElement(F8,Hs({shapeType:"curve",option:u},p,{pathRef:r})),h.createElement(UR,{points:n,clipPathId:t,props:s}))}function HR(e){try{return e&&e.getTotalLength&&e.getTotalLength()||0}catch{return 0}}function KR(e){var{clipPathId:t,props:r,pathRef:n,previousPointsRef:i,longestAnimatedLengthRef:s}=e,{points:o,strokeDasharray:l,isAnimationActive:c,animationBegin:d,animationDuration:u,animationEasing:f,animateNewValues:p,width:m,height:x,onAnimationEnd:g,onAnimationStart:b}=r,v=i.current,j=pu(r,"recharts-line-"),[y,w]=h.useState(!1),S=!y,N=h.useCallback(()=>{typeof g=="function"&&g(),w(!1)},[g]),P=h.useCallback(()=>{typeof b=="function"&&b(),w(!0)},[b]),_=HR(n.current),T=s.current;return h.createElement(qR,{points:o,showLabels:S},r.children,h.createElement(fu,{animationId:j,begin:d,duration:u,isActive:c,easing:f,onAnimationEnd:N,onAnimationStart:P,key:j},$=>{var M=De(T,_+T,$),C=Math.min(M,_),R;if(c)if(l){var q="".concat(l).split(/[,\s]+/gim).map(D=>parseFloat(D));R=WR(C,_,q)}else R=nk(_,C);else R=l==null?void 0:String(l);if(v){var Z=v.length/o.length,E=$===1?o:o.map((D,O)=>{var k=Math.floor(O*Z);if(v[k]){var L=v[k];return wr(wr({},D),{},{x:De(L.x,D.x,$),y:De(L.y,D.y,$)})}return p?wr(wr({},D),{},{x:De(m*2,D.x,$),y:De(x/2,D.y,$)}):wr(wr({},D),{},{x:D.x,y:D.y})});return i.current=E,h.createElement(pv,{props:r,points:E,clipPathId:t,pathRef:n,strokeDasharray:R})}return $>0&&_>0&&(i.current=o,s.current=C),h.createElement(pv,{props:r,points:o,clipPathId:t,pathRef:n,strokeDasharray:R})}),h.createElement(MN,{label:r.label}))}function VR(e){var{clipPathId:t,props:r}=e,n=h.useRef(null),i=h.useRef(0),s=h.useRef(null);return h.createElement(KR,{props:r,clipPathId:t,previousPointsRef:n,longestAnimatedLengthRef:i,pathRef:s})}var YR=(e,t)=>{var r,n;return{x:(r=e.x)!==null&&r!==void 0?r:void 0,y:(n=e.y)!==null&&n!==void 0?n:void 0,value:e.value,errorVal:et(e.payload,t)}};class GR extends h.Component{render(){var{hide:t,dot:r,points:n,className:i,xAxisId:s,yAxisId:o,top:l,left:c,width:d,height:u,id:f,needClip:p,zIndex:m}=this.props;if(t)return null;var x=ce("recharts-line",i),g=f,{r:b,strokeWidth:v}=rk(r),j=eg(r),y=b*2+v;return h.createElement(Ir,{zIndex:m},h.createElement(ir,{className:x},p&&h.createElement("defs",null,h.createElement(VN,{clipPathId:g,xAxisId:s,yAxisId:o}),!j&&h.createElement("clipPath",{id:"clipPath-dots-".concat(g)},h.createElement("rect",{x:c-y/2,y:l-y/2,width:d+y,height:u+y}))),h.createElement(Cz,{xAxisId:s,yAxisId:o,data:n,dataPointFormatter:YR,errorBarOffset:0},h.createElement(VR,{props:this.props,clipPathId:g}))),h.createElement(xp,{activeDot:this.props.activeDot,points:n,mainColor:this.props.stroke,itemDataKey:this.props.dataKey}))}}var ik={activeDot:!0,animateNewValues:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",connectNulls:!1,dot:!0,fill:"#fff",hide:!1,isAnimationActive:!Ci.isSsr,label:!1,legendType:"line",stroke:"#3182bd",strokeWidth:1,xAxisId:0,yAxisId:0,zIndex:lt.line};function ZR(e){var t=ft(e,ik),{activeDot:r,animateNewValues:n,animationBegin:i,animationDuration:s,animationEasing:o,connectNulls:l,dot:c,hide:d,isAnimationActive:u,label:f,legendType:p,xAxisId:m,yAxisId:x,id:g}=t,b=sg(t,MR),{needClip:v}=tg(m,x),j=Mu(),y=to(),w=pt(),S=G($=>ER($,m,x,w,g));if(y!=="horizontal"&&y!=="vertical"||S==null||j==null)return null;var{height:N,width:P,x:_,y:T}=j;return h.createElement(GR,Hs({},b,{id:g,connectNulls:l,dot:c,activeDot:r,animateNewValues:n,animationBegin:i,animationDuration:s,animationEasing:o,isAnimationActive:u,hide:d,label:f,legendType:p,xAxisId:m,yAxisId:x,points:S,layout:y,height:N,width:P,left:_,top:T,needClip:v}))}function XR(e){var{layout:t,xAxis:r,yAxis:n,xAxisTicks:i,yAxisTicks:s,dataKey:o,bandSize:l,displayedData:c}=e;return c.map((d,u)=>{var f=et(d,o);if(t==="horizontal"){var p=Yl({axis:r,ticks:i,bandSize:l,entry:d,index:u}),m=Re(f)?null:n.scale(f);return{x:p,y:m,value:f,payload:d}}var x=Re(f)?null:r.scale(f),g=Yl({axis:n,ticks:s,bandSize:l,entry:d,index:u});return x==null||g==null?null:{x,y:g,value:f,payload:d}}).filter(Boolean)}function JR(e){var t=ft(e,ik),r=pt();return h.createElement(FN,{id:t.id,type:"line"},n=>h.createElement(h.Fragment,null,h.createElement(RN,{legendPayload:RR(t)}),h.createElement(zN,{fn:BR,args:t}),h.createElement(UN,{type:"line",id:n,data:t.data,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,dataKey:t.dataKey,hide:t.hide,isPanorama:r}),h.createElement(ZR,Hs({},t,{id:n}))))}var ak=h.memo(JR);ak.displayName="Line";var sk=(e,t,r,n)=>Du(e,"xAxis",t,n),ok=(e,t,r,n)=>Eu(e,"xAxis",t,n),lk=(e,t,r,n)=>Du(e,"yAxis",r,n),ck=(e,t,r,n)=>Eu(e,"yAxis",r,n),QR=I([ue,sk,lk,ok,ck],(e,t,r,n,i)=>Mr(e,"xAxis")?ma(t,n,!1):ma(r,i,!1)),e9=(e,t,r,n,i)=>i,uk=I([Mm,e9],(e,t)=>e.filter(r=>r.type==="area").find(r=>r.id===t)),t9=(e,t,r,n,i)=>{var s,o=uk(e,t,r,n,i);if(o!=null){var l=ue(e),c=Mr(l,"xAxis"),d;if(c?d=cp(e,"yAxis",r,n):d=cp(e,"xAxis",t,n),d!=null){var{stackId:u}=o,f=Em(o);if(!(u==null||f==null)){var p=(s=d[u])===null||s===void 0?void 0:s.stackedData;return p==null?void 0:p.find(m=>m.key===f)}}}},r9=I([ue,sk,lk,ok,ck,t9,bu,QR,uk,mM],(e,t,r,n,i,s,o,l,c,d)=>{var{chartData:u,dataStartIndex:f,dataEndIndex:p}=o;if(!(c==null||e!=="horizontal"&&e!=="vertical"||t==null||r==null||n==null||i==null||n.length===0||i.length===0||l==null)){var{data:m}=c,x;if(m&&m.length>0?x=m:x=u==null?void 0:u.slice(f,p+1),x!=null)return j9({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:i,dataStartIndex:f,areaSettings:c,stackedData:s,displayedData:x,chartBaseValue:d,bandSize:l})}}),n9=["id"],i9=["activeDot","animationBegin","animationDuration","animationEasing","connectNulls","dot","fill","fillOpacity","hide","isAnimationActive","legendType","stroke","xAxisId","yAxisId"];function fi(){return fi=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{dataKey:t,name:r,stroke:n,fill:i,legendType:s,hide:o}=e;return[{inactive:o,dataKey:t,type:s,color:bc(n,i),value:au(r,t),payload:e}]};function u9(e){var{dataKey:t,data:r,stroke:n,strokeWidth:i,fill:s,name:o,hide:l,unit:c}=e;return{dataDefinedOnItem:r,positions:void 0,settings:{stroke:n,strokeWidth:i,fill:s,dataKey:t,nameKey:void 0,name:au(o,t),hide:l,type:e.tooltipType,color:bc(n,s),unit:c}}}function d9(e){var{clipPathId:t,points:r,props:n}=e,{needClip:i,dot:s,dataKey:o}=n,l=nr(n);return h.createElement(qN,{points:r,dot:s,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:o,baseProps:l,needClip:i,clipPathId:t})}function f9(e){var{showLabels:t,children:r,points:n}=e,i=n.map(s=>{var o,l,c={x:(o=s.x)!==null&&o!==void 0?o:0,y:(l=s.y)!==null&&l!==void 0?l:0,width:0,lowerWidth:0,upperWidth:0,height:0};return Zi(Zi({},c),{},{value:s.value,payload:s.payload,parentViewBox:void 0,viewBox:c,fill:void 0})});return h.createElement(DN,{value:t?i:void 0},r)}function mv(e){var{points:t,baseLine:r,needClip:n,clipPathId:i,props:s}=e,{layout:o,type:l,stroke:c,connectNulls:d,isRange:u}=s,{id:f}=s,p=dk(s,n9),m=nr(p),x=ut(p);return h.createElement(h.Fragment,null,(t==null?void 0:t.length)>1&&h.createElement(ir,{clipPath:n?"url(#clipPath-".concat(i,")"):void 0},h.createElement(ds,fi({},x,{id:f,points:t,connectNulls:d,type:l,baseLine:r,layout:o,stroke:"none",className:"recharts-area-area"})),c!=="none"&&h.createElement(ds,fi({},m,{className:"recharts-area-curve",layout:o,type:l,connectNulls:d,fill:"none",points:t})),c!=="none"&&u&&h.createElement(ds,fi({},m,{className:"recharts-area-curve",layout:o,type:l,connectNulls:d,fill:"none",points:r}))),h.createElement(d9,{points:t,props:p,clipPathId:i}))}function p9(e){var{alpha:t,baseLine:r,points:n,strokeWidth:i}=e,s=n[0].y,o=n[n.length-1].y;if(!_e(s)||!_e(o))return null;var l=t*Math.abs(s-o),c=Math.max(...n.map(d=>d.x||0));return Y(r)?c=Math.max(r,c):r&&Array.isArray(r)&&r.length&&(c=Math.max(...r.map(d=>d.x||0),c)),Y(c)?h.createElement("rect",{x:0,y:sd.y||0));return Y(r)?c=Math.max(r,c):r&&Array.isArray(r)&&r.length&&(c=Math.max(...r.map(d=>d.y||0),c)),Y(c)?h.createElement("rect",{x:s{typeof m=="function"&&m(),b(!1)},[m]),y=h.useCallback(()=>{typeof p=="function"&&p(),b(!0)},[p]),w=i.current,S=s.current;return h.createElement(f9,{showLabels:v,points:o},n.children,h.createElement(fu,{animationId:x,begin:d,duration:u,isActive:c,easing:f,onAnimationEnd:j,onAnimationStart:y,key:x},N=>{if(w){var P=w.length/o.length,_=N===1?o:o.map(($,M)=>{var C=Math.floor(M*P);if(w[C]){var R=w[C];return Zi(Zi({},$),{},{x:De(R.x,$.x,N),y:De(R.y,$.y,N)})}return $}),T;return Y(l)?T=De(S,l,N):Re(l)||yr(l)?T=De(S,0,N):T=l.map(($,M)=>{var C=Math.floor(M*P);if(Array.isArray(S)&&S[C]){var R=S[C];return Zi(Zi({},$),{},{x:De(R.x,$.x,N),y:De(R.y,$.y,N)})}return $}),N>0&&(i.current=_,s.current=T),h.createElement(mv,{points:_,baseLine:T,needClip:t,clipPathId:r,props:n})}return N>0&&(i.current=o,s.current=l),h.createElement(ir,null,c&&h.createElement("defs",null,h.createElement("clipPath",{id:"animationClipPath-".concat(r)},h.createElement(m9,{alpha:N,points:o,baseLine:l,layout:n.layout,strokeWidth:n.strokeWidth}))),h.createElement(ir,{clipPath:"url(#animationClipPath-".concat(r,")")},h.createElement(mv,{points:o,baseLine:l,needClip:t,clipPathId:r,props:n})))}),h.createElement(MN,{label:n.label}))}function x9(e){var{needClip:t,clipPathId:r,props:n}=e,i=h.useRef(null),s=h.useRef();return h.createElement(g9,{needClip:t,clipPathId:r,props:n,previousPointsRef:i,previousBaselineRef:s})}class y9 extends h.PureComponent{render(){var{hide:t,dot:r,points:n,className:i,top:s,left:o,needClip:l,xAxisId:c,yAxisId:d,width:u,height:f,id:p,baseLine:m,zIndex:x}=this.props;if(t)return null;var g=ce("recharts-area",i),b=p,{r:v,strokeWidth:j}=rk(r),y=eg(r),w=v*2+j;return h.createElement(Ir,{zIndex:x},h.createElement(ir,{className:g},l&&h.createElement("defs",null,h.createElement(VN,{clipPathId:b,xAxisId:c,yAxisId:d}),!y&&h.createElement("clipPath",{id:"clipPath-dots-".concat(b)},h.createElement("rect",{x:o-w/2,y:s-w/2,width:u+w,height:f+w}))),h.createElement(x9,{needClip:l,clipPathId:b,props:this.props})),h.createElement(xp,{points:n,mainColor:bc(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot}),this.props.isRange&&Array.isArray(m)&&h.createElement(xp,{points:m,mainColor:bc(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot}))}}var fk={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:!Ci.isSsr,legendType:"line",stroke:"#3182bd",xAxisId:0,yAxisId:0,zIndex:lt.area};function v9(e){var t,r=ft(e,fk),{activeDot:n,animationBegin:i,animationDuration:s,animationEasing:o,connectNulls:l,dot:c,fill:d,fillOpacity:u,hide:f,isAnimationActive:p,legendType:m,stroke:x,xAxisId:g,yAxisId:b}=r,v=dk(r,i9),j=to(),y=oN(),{needClip:w}=tg(g,b),S=pt(),{points:N,isRange:P,baseLine:_}=(t=G(q=>r9(q,g,b,S,e.id)))!==null&&t!==void 0?t:{},T=Mu();if(j!=="horizontal"&&j!=="vertical"||T==null||y!=="AreaChart"&&y!=="ComposedChart")return null;var{height:$,width:M,x:C,y:R}=T;return!N||!N.length?null:h.createElement(y9,fi({},v,{activeDot:n,animationBegin:i,animationDuration:s,animationEasing:o,baseLine:_,connectNulls:l,dot:c,fill:d,fillOpacity:u,height:$,hide:f,layout:j,isAnimationActive:p,isRange:P,legendType:m,needClip:w,points:N,stroke:x,width:M,left:C,top:R,xAxisId:g,yAxisId:b}))}var b9=(e,t,r,n,i)=>{var s=r??t;if(Y(s))return s;var o=e==="horizontal"?i:n,l=o.scale.domain();if(o.type==="number"){var c=Math.max(l[0],l[1]),d=Math.min(l[0],l[1]);return s==="dataMin"?d:s==="dataMax"||c<0?c:Math.max(Math.min(l[0],l[1]),0)}return s==="dataMin"?l[0]:s==="dataMax"?l[1]:l[0]};function j9(e){var{areaSettings:{connectNulls:t,baseValue:r,dataKey:n},stackedData:i,layout:s,chartBaseValue:o,xAxis:l,yAxis:c,displayedData:d,dataStartIndex:u,xAxisTicks:f,yAxisTicks:p,bandSize:m}=e,x=i&&i.length,g=b9(s,o,r,l,c),b=s==="horizontal",v=!1,j=d.map((w,S)=>{var N;x?N=i[u+S]:(N=et(w,n),Array.isArray(N)?v=!0:N=[g,N]);var P=N[1]==null||x&&!t&&et(w,n)==null;return b?{x:Yl({axis:l,ticks:f,bandSize:m,entry:w,index:S}),y:P?null:c.scale(N[1]),value:N,payload:w}:{x:P?null:l.scale(N[1]),y:Yl({axis:c,ticks:p,bandSize:m,entry:w,index:S}),value:N,payload:w}}),y;return x||v?y=j.map(w=>{var S=Array.isArray(w.value)?w.value[0]:null;return b?{x:w.x,y:S!=null&&w.y!=null?c.scale(S):null,payload:w.payload}:{x:S!=null?l.scale(S):null,y:w.y,payload:w.payload}}):y=b?c.scale(g):l.scale(g),{points:j,baseLine:y,isRange:v}}function w9(e){var t=ft(e,fk),r=pt();return h.createElement(FN,{id:t.id,type:"area"},n=>h.createElement(h.Fragment,null,h.createElement(RN,{legendPayload:c9(t)}),h.createElement(zN,{fn:u9,args:t}),h.createElement(UN,{type:"area",id:n,data:t.data,dataKey:t.dataKey,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,stackId:PE(t.stackId),hide:t.hide,barSize:void 0,baseValue:t.baseValue,isPanorama:r,connectNulls:t.connectNulls}),h.createElement(v9,fi({},t,{id:n}))))}var pk=h.memo(w9);pk.displayName="Area";var S9=["dangerouslySetInnerHTML","ticks"],N9=["id"],k9=["domain"],P9=["domain"];function bp(){return bp=Object.assign?Object.assign.bind():function(e){for(var t=1;t(t(lz(e)),()=>{t(cz(e))}),[e,t]),null}var A9=e=>{var{xAxisId:t,className:r}=e,n=G(Dw),i=pt(),s="xAxis",o=G(b=>Da(b,s,t,i)),l=G(b=>R2(b,s,t,i)),c=G(b=>oI(b,t)),d=G(b=>pI(b,t)),u=G(b=>a2(b,t));if(c==null||d==null||u==null)return null;var{dangerouslySetInnerHTML:f,ticks:p}=e,m=jc(e,S9),{id:x}=u,g=jc(u,N9);return h.createElement(ag,bp({},m,g,{scale:o,x:d.x,y:d.y,width:c.width,height:c.height,className:ce("recharts-".concat(s," ").concat(s),r),viewBox:n,ticks:l,axisType:s}))},O9={allowDataOverflow:Tt.allowDataOverflow,allowDecimals:Tt.allowDecimals,allowDuplicatedCategory:Tt.allowDuplicatedCategory,height:Tt.height,hide:!1,mirror:Tt.mirror,orientation:Tt.orientation,padding:Tt.padding,reversed:Tt.reversed,scale:Tt.scale,tickCount:Tt.tickCount,type:Tt.type,xAxisId:0},E9=e=>{var t,r,n,i,s,o=ft(e,O9);return h.createElement(h.Fragment,null,h.createElement(C9,{interval:(t=o.interval)!==null&&t!==void 0?t:"preserveEnd",id:o.xAxisId,scale:o.scale,type:o.type,padding:o.padding,allowDataOverflow:o.allowDataOverflow,domain:o.domain,dataKey:o.dataKey,allowDuplicatedCategory:o.allowDuplicatedCategory,allowDecimals:o.allowDecimals,tickCount:o.tickCount,includeHidden:(r=o.includeHidden)!==null&&r!==void 0?r:!1,reversed:o.reversed,ticks:o.ticks,height:o.height,orientation:o.orientation,mirror:o.mirror,hide:o.hide,unit:o.unit,name:o.name,angle:(n=o.angle)!==null&&n!==void 0?n:0,minTickGap:(i=o.minTickGap)!==null&&i!==void 0?i:5,tick:(s=o.tick)!==null&&s!==void 0?s:!0,tickFormatter:o.tickFormatter}),h.createElement(A9,o))},D9=(e,t)=>{var{domain:r}=e,n=jc(e,k9),{domain:i}=t,s=jc(t,P9);return va(n,s)?Array.isArray(r)&&r.length===2&&Array.isArray(i)&&i.length===2?r[0]===i[0]&&r[1]===i[1]:va({domain:r},{domain:i}):!1},jp=h.memo(E9,D9);jp.displayName="XAxis";var T9=["dangerouslySetInnerHTML","ticks"],M9=["id"],I9=["domain"],$9=["domain"];function wp(){return wp=Object.assign?Object.assign.bind():function(e){for(var t=1;t(t(uz(e)),()=>{t(dz(e))}),[e,t]),null}var R9=e=>{var{yAxisId:t,className:r,width:n,label:i}=e,s=h.useRef(null),o=h.useRef(null),l=G(Dw),c=pt(),d=Ve(),u="yAxis",f=G(S=>Da(S,u,t,c)),p=G(S=>gI(S,t)),m=G(S=>mI(S,t)),x=G(S=>R2(S,u,t,c)),g=G(S=>s2(S,t));if(h.useLayoutEffect(()=>{if(!(n!=="auto"||!p||Qm(i)||h.isValidElement(i)||g==null)){var S=s.current;if(S){var N=S.getCalculatedWidth();Math.round(p.width)!==Math.round(N)&&d(fz({id:t,width:N}))}}},[x,p,d,i,t,n,g]),p==null||m==null||g==null)return null;var{dangerouslySetInnerHTML:b,ticks:v}=e,j=wc(e,T9),{id:y}=g,w=wc(g,M9);return h.createElement(ag,wp({},j,w,{ref:s,labelRef:o,scale:f,x:m.x,y:m.y,tickTextProps:n==="auto"?{width:void 0}:{width:n},width:p.width,height:p.height,className:ce("recharts-".concat(u," ").concat(u),r),viewBox:l,ticks:x,axisType:u}))},B9={allowDataOverflow:Mt.allowDataOverflow,allowDecimals:Mt.allowDecimals,allowDuplicatedCategory:Mt.allowDuplicatedCategory,hide:!1,mirror:Mt.mirror,orientation:Mt.orientation,padding:Mt.padding,reversed:Mt.reversed,scale:Mt.scale,tickCount:Mt.tickCount,type:Mt.type,width:Mt.width,yAxisId:0},F9=e=>{var t,r,n,i,s,o=ft(e,B9);return h.createElement(h.Fragment,null,h.createElement(z9,{interval:(t=o.interval)!==null&&t!==void 0?t:"preserveEnd",id:o.yAxisId,scale:o.scale,type:o.type,domain:o.domain,allowDataOverflow:o.allowDataOverflow,dataKey:o.dataKey,allowDuplicatedCategory:o.allowDuplicatedCategory,allowDecimals:o.allowDecimals,tickCount:o.tickCount,padding:o.padding,includeHidden:(r=o.includeHidden)!==null&&r!==void 0?r:!1,reversed:o.reversed,ticks:o.ticks,width:o.width,orientation:o.orientation,mirror:o.mirror,hide:o.hide,unit:o.unit,name:o.name,angle:(n=o.angle)!==null&&n!==void 0?n:0,minTickGap:(i=o.minTickGap)!==null&&i!==void 0?i:5,tick:(s=o.tick)!==null&&s!==void 0?s:!0,tickFormatter:o.tickFormatter}),h.createElement(R9,o))},W9=(e,t)=>{var{domain:r}=e,n=wc(e,I9),{domain:i}=t,s=wc(t,$9);return va(n,s)?Array.isArray(r)&&r.length===2&&Array.isArray(i)&&i.length===2?r[0]===i[0]&&r[1]===i[1]:va({domain:r},{domain:i}):!1},Sp=h.memo(F9,W9);Sp.displayName="YAxis";var U9={};/** - * @license React - * use-sync-external-store-with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var po=h;function q9(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var H9=typeof Object.is=="function"?Object.is:q9,K9=po.useSyncExternalStore,V9=po.useRef,Y9=po.useEffect,G9=po.useMemo,Z9=po.useDebugValue;U9.useSyncExternalStoreWithSelector=function(e,t,r,n,i){var s=V9(null);if(s.current===null){var o={hasValue:!1,value:null};s.current=o}else o=s.current;s=G9(function(){function c(m){if(!d){if(d=!0,u=m,m=n(m),i!==void 0&&o.hasValue){var x=o.value;if(i(x,m))return f=x}return f=m}if(x=f,H9(u,m))return x;var g=n(m);return i!==void 0&&i(x,g)?(u=m,x):(u=m,f=g)}var d=!1,u,f,p=r===void 0?null:r;return[function(){return c(t())},p===null?void 0:function(){return c(p())}]},[t,r,n,i]);var l=K9(e,s[0],s[1]);return Y9(function(){o.hasValue=!0,o.value=l},[l]),Z9(l),l};function X9(e){e()}function J9(){let e=null,t=null;return{clear(){e=null,t=null},notify(){X9(()=>{let r=e;for(;r;)r.callback(),r=r.next})},get(){const r=[];let n=e;for(;n;)r.push(n),n=n.next;return r},subscribe(r){let n=!0;const i=t={callback:r,next:null,prev:t};return i.prev?i.prev.next=i:e=i,function(){!n||e===null||(n=!1,i.next?i.next.prev=i.prev:t=i.prev,i.prev?i.prev.next=i.next:e=i.next)}}}}var gv={notify(){},get:()=>[]};function Q9(e,t){let r,n=gv,i=0,s=!1;function o(g){u();const b=n.subscribe(g);let v=!1;return()=>{v||(v=!0,b(),f())}}function l(){n.notify()}function c(){x.onStateChange&&x.onStateChange()}function d(){return s}function u(){i++,r||(r=e.subscribe(c),n=J9())}function f(){i--,r&&i===0&&(r(),r=void 0,n.clear(),n=gv)}function p(){s||(s=!0,u())}function m(){s&&(s=!1,f())}const x={addNestedSub:o,notifyNestedSubs:l,handleChangeWrapper:c,isSubscribed:d,trySubscribe:p,tryUnsubscribe:m,getListeners:()=>n};return x}var eB=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",tB=eB(),rB=()=>typeof navigator<"u"&&navigator.product==="ReactNative",nB=rB(),iB=()=>tB||nB?h.useLayoutEffect:h.useEffect,aB=iB(),Cd=Symbol.for("react-redux-context"),Ad=typeof globalThis<"u"?globalThis:{};function sB(){if(!h.createContext)return{};const e=Ad[Cd]??(Ad[Cd]=new Map);let t=e.get(h.createContext);return t||(t=h.createContext(null),e.set(h.createContext,t)),t}var oB=sB();function lB(e){const{children:t,context:r,serverState:n,store:i}=e,s=h.useMemo(()=>{const c=Q9(i);return{store:i,subscription:c,getServerState:n?()=>n:void 0}},[i,n]),o=h.useMemo(()=>i.getState(),[i]);aB(()=>{const{subscription:c}=s;return c.onStateChange=c.notifyNestedSubs,c.trySubscribe(),o!==i.getState()&&c.notifyNestedSubs(),()=>{c.tryUnsubscribe(),c.onStateChange=void 0}},[s,o]);const l=r||oB;return h.createElement(l.Provider,{value:s},t)}var cB=lB,uB=(e,t)=>t,og=I([uB,ue,n2,We,tN,pn,P$,rt],T$),lg=e=>{var t=e.currentTarget.getBoundingClientRect(),r=t.width/e.currentTarget.offsetWidth,n=t.height/e.currentTarget.offsetHeight;return{chartX:Math.round((e.clientX-t.left)/r),chartY:Math.round((e.clientY-t.top)/n)}},hk=ar("mouseClick"),mk=Qs();mk.startListening({actionCreator:hk,effect:(e,t)=>{var r=e.payload,n=og(t.getState(),lg(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(CI({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var Np=ar("mouseMove"),gk=Qs();gk.startListening({actionCreator:Np,effect:(e,t)=>{var r=e.payload,n=t.getState(),i=Um(n,n.tooltip.settings.shared),s=og(n,lg(r));i==="axis"&&((s==null?void 0:s.activeIndex)!=null?t.dispatch(K2({activeIndex:s.activeIndex,activeDataKey:void 0,activeCoordinate:s.activeCoordinate})):t.dispatch(H2()))}});var xv={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0},xk=At({name:"rootProps",initialState:xv,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:xv.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue}}}),dB=xk.reducer,{updateOptions:fB}=xk.actions,yk=At({name:"polarOptions",initialState:null,reducers:{updatePolarOptions:(e,t)=>t.payload}}),{updatePolarOptions:YF}=yk.actions,pB=yk.reducer,vk=ar("keyDown"),bk=ar("focus"),cg=Qs();cg.startListening({actionCreator:vk,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var{keyboardInteraction:i}=r.tooltip,s=e.payload;if(!(s!=="ArrowRight"&&s!=="ArrowLeft"&&s!=="Enter")){var o=Number(qm(i,Ma(r))),l=pn(r);if(s==="Enter"){var c=pc(r,"axis","hover",String(i.index));t.dispatch(dp({active:!i.active,activeIndex:i.index,activeDataKey:i.dataKey,activeCoordinate:c}));return}var d=bI(r),u=d==="left-to-right"?1:-1,f=s==="ArrowRight"?1:-1,p=o+f*u;if(!(l==null||p>=l.length||p<0)){var m=pc(r,"axis","hover",String(p));t.dispatch(dp({active:!0,activeIndex:p.toString(),activeDataKey:void 0,activeCoordinate:m}))}}}}});cg.startListening({actionCreator:bk,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var{keyboardInteraction:i}=r.tooltip;if(!i.active&&i.index==null){var s="0",o=pc(r,"axis","hover",String(s));t.dispatch(dp({activeDataKey:void 0,active:!0,activeIndex:s,activeCoordinate:o}))}}}});var Vt=ar("externalEvent"),jk=Qs();jk.startListening({actionCreator:Vt,effect:(e,t)=>{if(e.payload.handler!=null){var r=t.getState(),n={activeCoordinate:d$(r),activeDataKey:c$(r),activeIndex:Us(r),activeLabel:iN(r),activeTooltipIndex:Us(r),isTooltipActive:f$(r)};e.payload.handler(n,e.payload.reactEvent)}}});var hB=I([Ta],e=>e.tooltipItemPayloads),mB=I([hB,uo,(e,t,r)=>t,(e,t,r)=>r],(e,t,r,n)=>{var i=e.find(l=>l.settings.dataKey===n);if(i!=null){var{positions:s}=i;if(s!=null){var o=t(s,r);return o}}}),wk=ar("touchMove"),Sk=Qs();Sk.startListening({actionCreator:wk,effect:(e,t)=>{var r=e.payload;if(!(r.touches==null||r.touches.length===0)){var n=t.getState(),i=Um(n,n.tooltip.settings.shared);if(i==="axis"){var s=og(n,lg({clientX:r.touches[0].clientX,clientY:r.touches[0].clientY,currentTarget:r.currentTarget}));(s==null?void 0:s.activeIndex)!=null&&t.dispatch(K2({activeIndex:s.activeIndex,activeDataKey:void 0,activeCoordinate:s.activeCoordinate}))}else if(i==="item"){var o,l=r.touches[0];if(document.elementFromPoint==null)return;var c=document.elementFromPoint(l.clientX,l.clientY);if(!c||!c.getAttribute)return;var d=c.getAttribute(TE),u=(o=c.getAttribute(ME))!==null&&o!==void 0?o:void 0,f=mB(t.getState(),d,u);t.dispatch(_I({activeDataKey:u,activeIndex:d,activeCoordinate:f}))}}}});var gB=nw({brush:Oz,cartesianAxis:pz,chartData:cL,errorBars:wz,graphicalItems:G8,layout:gE,legend:c3,options:iL,polarAxis:N8,polarOptions:pB,referenceElements:Lz,rootProps:dB,tooltip:AI,zIndex:V$}),xB=function(t){return F4({reducer:gB,preloadedState:t,middleware:r=>r({serializableCheck:!1}).concat([mk.middleware,gk.middleware,cg.middleware,jk.middleware,Sk.middleware]),enhancers:r=>{var n=r;return typeof r=="function"&&(n=r()),n.concat(mw({type:"raf"}))},devTools:Ci.devToolsEnabled})};function yB(e){var{preloadedState:t,children:r,reduxStoreName:n}=e,i=pt(),s=h.useRef(null);if(i)return r;s.current==null&&(s.current=xB(t));var o=Hh;return h.createElement(cB,{context:o,store:s.current},r)}function vB(e){var{layout:t,margin:r}=e,n=Ve(),i=pt();return h.useEffect(()=>{i||(n(pE(t)),n(fE(r)))},[n,i,t,r]),null}function bB(e){var t=Ve();return h.useEffect(()=>{t(fB(e))},[t,e]),null}function yv(e){var{zIndex:t,isPanorama:r}=e,n=r?"recharts-zindex-panorama-":"recharts-zindex-",i=BN("".concat(n).concat(t)),s=Ve();return h.useLayoutEffect(()=>(s(H$({zIndex:t,elementId:i,isPanorama:r})),()=>{s(K$({zIndex:t,isPanorama:r}))}),[s,t,i,r]),h.createElement("g",{id:i})}function vv(e){var{children:t,isPanorama:r}=e,n=G(I$);if(!n||n.length===0)return t;var i=n.filter(o=>o<0),s=n.filter(o=>o>0);return h.createElement(h.Fragment,null,i.map(o=>h.createElement(yv,{key:o,zIndex:o,isPanorama:r})),t,s.map(o=>h.createElement(yv,{key:o,zIndex:o,isPanorama:r})))}var jB=["children"];function wB(e,t){if(e==null)return{};var r,n,i=SB(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{var r=Fw(),n=Ww(),i=qw();if(!Er(r)||!Er(n))return null;var{children:s,otherAttributes:o,title:l,desc:c}=e,d,u;return o!=null&&(typeof o.tabIndex=="number"?d=o.tabIndex:d=i?0:void 0,typeof o.role=="string"?u=o.role:u=i?"application":void 0),h.createElement(lj,Sc({},o,{title:l,desc:c,role:u,tabIndex:d,width:r,height:n,style:NB,ref:t}),s)}),PB=e=>{var{children:t}=e,r=G(cu);if(!r)return null;var{width:n,height:i,y:s,x:o}=r;return h.createElement(lj,{width:n,height:i,x:o,y:s},t)},bv=h.forwardRef((e,t)=>{var{children:r}=e,n=wB(e,jB),i=pt();return i?h.createElement(PB,null,h.createElement(vv,{isPanorama:!0},r)):h.createElement(kB,Sc({ref:t},n),h.createElement(vv,{isPanorama:!1},r))});function _B(){var e=Ve(),[t,r]=h.useState(null),n=G(DE);return h.useEffect(()=>{if(t!=null){var i=t.getBoundingClientRect(),s=i.width/t.offsetWidth;_e(s)&&s!==n&&e(mE(s))}},[t,e,n]),r}function jv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function CB(e){for(var t=1;t(yL(),null);function Nc(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var TB=h.forwardRef((e,t)=>{var r,n,i=h.useRef(null),[s,o]=h.useState({containerWidth:Nc((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:Nc((n=e.style)===null||n===void 0?void 0:n.height)}),l=h.useCallback((d,u)=>{o(f=>{var p=Math.round(d),m=Math.round(u);return f.containerWidth===p&&f.containerHeight===m?f:{containerWidth:p,containerHeight:m}})},[]),c=h.useCallback(d=>{if(typeof t=="function"&&t(d),d!=null&&typeof ResizeObserver<"u"){var{width:u,height:f}=d.getBoundingClientRect();l(u,f);var p=x=>{var{width:g,height:b}=x[0].contentRect;l(g,b)},m=new ResizeObserver(p);m.observe(d),i.current=m}},[t,l]);return h.useEffect(()=>()=>{var d=i.current;d!=null&&d.disconnect()},[l]),h.createElement(h.Fragment,null,h.createElement(du,{width:s.containerWidth,height:s.containerHeight}),h.createElement("div",Ni({ref:c},e)))}),MB=h.forwardRef((e,t)=>{var{width:r,height:n}=e,[i,s]=h.useState({containerWidth:Nc(r),containerHeight:Nc(n)}),o=h.useCallback((c,d)=>{s(u=>{var f=Math.round(c),p=Math.round(d);return u.containerWidth===f&&u.containerHeight===p?u:{containerWidth:f,containerHeight:p}})},[]),l=h.useCallback(c=>{if(typeof t=="function"&&t(c),c!=null){var{width:d,height:u}=c.getBoundingClientRect();o(d,u)}},[t,o]);return h.createElement(h.Fragment,null,h.createElement(du,{width:i.containerWidth,height:i.containerHeight}),h.createElement("div",Ni({ref:l},e)))}),IB=h.forwardRef((e,t)=>{var{width:r,height:n}=e;return h.createElement(h.Fragment,null,h.createElement(du,{width:r,height:n}),h.createElement("div",Ni({ref:t},e)))}),$B=h.forwardRef((e,t)=>{var{width:r,height:n}=e;return Qr(r)||Qr(n)?h.createElement(MB,Ni({},e,{ref:t})):h.createElement(IB,Ni({},e,{ref:t}))});function LB(e){return e===!0?TB:$B}var zB=h.forwardRef((e,t)=>{var{children:r,className:n,height:i,onClick:s,onContextMenu:o,onDoubleClick:l,onMouseDown:c,onMouseEnter:d,onMouseLeave:u,onMouseMove:f,onMouseUp:p,onTouchEnd:m,onTouchMove:x,onTouchStart:g,style:b,width:v,responsive:j,dispatchTouchEvents:y=!0}=e,w=h.useRef(null),S=Ve(),[N,P]=h.useState(null),[_,T]=h.useState(null),$=_B(),M=Qh(),C=(M==null?void 0:M.width)>0?M.width:v,R=(M==null?void 0:M.height)>0?M.height:i,q=h.useCallback(z=>{$(z),typeof t=="function"&&t(z),P(z),T(z),z!=null&&(w.current=z)},[$,t,P,T]),Z=h.useCallback(z=>{S(hk(z)),S(Vt({handler:s,reactEvent:z}))},[S,s]),E=h.useCallback(z=>{S(Np(z)),S(Vt({handler:d,reactEvent:z}))},[S,d]),D=h.useCallback(z=>{S(H2()),S(Vt({handler:u,reactEvent:z}))},[S,u]),O=h.useCallback(z=>{S(Np(z)),S(Vt({handler:f,reactEvent:z}))},[S,f]),k=h.useCallback(()=>{S(bk())},[S]),L=h.useCallback(z=>{S(vk(z.key))},[S]),F=h.useCallback(z=>{S(Vt({handler:o,reactEvent:z}))},[S,o]),H=h.useCallback(z=>{S(Vt({handler:l,reactEvent:z}))},[S,l]),te=h.useCallback(z=>{S(Vt({handler:c,reactEvent:z}))},[S,c]),re=h.useCallback(z=>{S(Vt({handler:p,reactEvent:z}))},[S,p]),we=h.useCallback(z=>{S(Vt({handler:g,reactEvent:z}))},[S,g]),A=h.useCallback(z=>{y&&S(wk(z)),S(Vt({handler:x,reactEvent:z}))},[S,y,x]),J=h.useCallback(z=>{S(Vt({handler:m,reactEvent:z}))},[S,m]),Ot=LB(j);return h.createElement(pN.Provider,{value:N},h.createElement(n6.Provider,{value:_},h.createElement(Ot,{width:C??(b==null?void 0:b.width),height:R??(b==null?void 0:b.height),className:ce("recharts-wrapper",n),style:CB({position:"relative",cursor:"default",width:C,height:R},b),onClick:Z,onContextMenu:F,onDoubleClick:H,onFocus:k,onKeyDown:L,onMouseDown:te,onMouseEnter:E,onMouseLeave:D,onMouseMove:O,onMouseUp:re,onTouchEnd:J,onTouchMove:A,onTouchStart:we,ref:q},h.createElement(DB,null),r)))}),RB=["width","height","responsive","children","className","style","compact","title","desc"];function BB(e,t){if(e==null)return{};var r,n,i=FB(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{var{width:r,height:n,responsive:i,children:s,className:o,style:l,compact:c,title:d,desc:u}=e,f=BB(e,RB),p=nr(f);return c?h.createElement(h.Fragment,null,h.createElement(du,{width:r,height:n}),h.createElement(bv,{otherAttributes:p,title:d,desc:u},s)):h.createElement(zB,{className:o,style:l,width:r,height:n,responsive:i??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},h.createElement(bv,{otherAttributes:p,title:d,desc:u,ref:t},h.createElement(Rz,null,s)))});function kp(){return kp=Object.assign?Object.assign.bind():function(e){for(var t=1;th.createElement(Nk,{chartName:"LineChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:HB,tooltipPayloadSearcher:mN,categoricalChartProps:e,ref:t})),VB=["axis"],YB=h.forwardRef((e,t)=>h.createElement(Nk,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:VB,tooltipPayloadSearcher:mN,categoricalChartProps:e,ref:t}));function GB(){var b,v,j,y,w,S,N,P,_,T,$,M,C,R,q,Z,E,D,O,k,L;const[e,t]=h.useState(null),[r,n]=h.useState(null),[i,s]=h.useState(!0),[o,l]=h.useState(0),[c,d]=h.useState(!1);h.useEffect(()=>{f(),u()},[]);const u=async()=>{try{const H=(await B.getChangeStats()).pending_count;l(H);const te=localStorage.getItem("dismissedPendingChangesCount"),re=te&&parseInt(te)>=H;d(H>0&&!re)}catch(F){console.error("Failed to load change stats:",F),d(!1)}},f=async()=>{try{const F=await B.getDutchieAZDashboard();t({products:{total:F.productCount,in_stock:F.productCount,with_images:0},stores:{total:F.dispensaryCount,active:F.dispensaryCount},brands:{total:F.brandCount},campaigns:{active:0,total:0},clicks:{clicks_24h:F.snapshotCount24h},failedJobs:F.failedJobCount,lastCrawlTime:F.lastCrawlTime});try{const H=await B.getDashboardActivity();n(H)}catch{n(null)}}catch(F){console.error("Failed to load dashboard:",F)}finally{s(!1)}},p=()=>{localStorage.setItem("dismissedPendingChangesCount",o.toString()),d(!1)};if(i)return a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx(Xt,{className:"w-8 h-8 animate-spin text-gray-400"})})});const m=Math.round(((b=e==null?void 0:e.products)==null?void 0:b.with_images)/((v=e==null?void 0:e.products)==null?void 0:v.total)*100)||0;Math.round(((j=e==null?void 0:e.stores)==null?void 0:j.active)/((y=e==null?void 0:e.stores)==null?void 0:y.total)*100);const x=[{date:"Mon",products:120},{date:"Tue",products:145},{date:"Wed",products:132},{date:"Thu",products:178},{date:"Fri",products:195},{date:"Sat",products:210},{date:"Sun",products:((w=e==null?void 0:e.products)==null?void 0:w.total)||225}],g=[{time:"00:00",scrapes:5},{time:"04:00",scrapes:12},{time:"08:00",scrapes:18},{time:"12:00",scrapes:25},{time:"16:00",scrapes:30},{time:"20:00",scrapes:22},{time:"24:00",scrapes:((S=r==null?void 0:r.recent_scrapes)==null?void 0:S.length)||15}];return a.jsxs(X,{children:[c&&a.jsx("div",{className:"mb-6 bg-amber-50 border-l-4 border-amber-500 rounded-lg p-4",children:a.jsxs("div",{className:"flex items-center justify-between gap-4",children:[a.jsxs("div",{className:"flex items-center gap-3 flex-1",children:[a.jsx(nj,{className:"w-5 h-5 text-amber-600 flex-shrink-0"}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("h3",{className:"text-sm font-semibold text-amber-900",children:[o," pending change",o!==1?"s":""," require review"]}),a.jsx("p",{className:"text-sm text-amber-700 mt-0.5",children:"Proposed changes to dispensary data are waiting for approval"})]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("button",{className:"btn btn-sm bg-amber-600 hover:bg-amber-700 text-white border-none",children:"Review Changes"}),a.jsx("button",{onClick:p,className:"btn btn-sm btn-ghost text-amber-900 hover:bg-amber-100","aria-label":"Dismiss notification",children:a.jsx(ij,{className:"w-4 h-4"})})]})]})}),a.jsxs("div",{className:"space-y-8",children:[a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-semibold text-gray-900",children:"Dashboard"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Monitor your dispensary data aggregation"})]}),a.jsxs("button",{onClick:f,className:"inline-flex items-center gap-2 px-4 py-2 bg-white border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors text-sm font-medium text-gray-700",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Refresh"]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Ct,{className:"w-5 h-5 text-blue-600"})}),a.jsxs("div",{className:"flex items-center gap-1 text-xs text-green-600",children:[a.jsx(zn,{className:"w-3 h-3"}),a.jsx("span",{children:"12.5%"})]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Total Products"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((P=(N=e==null?void 0:e.products)==null?void 0:N.total)==null?void 0:P.toLocaleString())||0}),a.jsxs("p",{className:"text-xs text-gray-500",children:[((_=e==null?void 0:e.products)==null?void 0:_.in_stock)||0," in stock"]})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-emerald-50 rounded-lg",children:a.jsx(Il,{className:"w-5 h-5 text-emerald-600"})}),a.jsxs("div",{className:"flex items-center gap-1 text-xs text-green-600",children:[a.jsx(zn,{className:"w-3 h-3"}),a.jsx("span",{children:"8.2%"})]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Total Dispensaries"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((T=e==null?void 0:e.stores)==null?void 0:T.total)||0}),a.jsxs("p",{className:"text-xs text-gray-500",children:[(($=e==null?void 0:e.stores)==null?void 0:$.active)||0," active (crawlable)"]})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(rj,{className:"w-5 h-5 text-purple-600"})}),a.jsxs("div",{className:"flex items-center gap-1 text-xs text-red-600",children:[a.jsx(RO,{className:"w-3 h-3"}),a.jsx("span",{children:"3.1%"})]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Active Campaigns"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((M=e==null?void 0:e.campaigns)==null?void 0:M.active)||0}),a.jsxs("p",{className:"text-xs text-gray-500",children:[((C=e==null?void 0:e.campaigns)==null?void 0:C.total)||0," total campaigns"]})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-amber-50 rounded-lg",children:a.jsx(lO,{className:"w-5 h-5 text-amber-600"})}),a.jsxs("span",{className:"text-xs font-medium text-gray-600",children:[m,"%"]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Images Downloaded"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((q=(R=e==null?void 0:e.products)==null?void 0:R.with_images)==null?void 0:q.toLocaleString())||0}),a.jsx("div",{className:"mt-3",children:a.jsx("div",{className:"w-full bg-gray-100 rounded-full h-1.5",children:a.jsx("div",{className:"bg-amber-500 h-1.5 rounded-full transition-all",style:{width:`${m}%`}})})})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-cyan-50 rounded-lg",children:a.jsx(na,{className:"w-5 h-5 text-cyan-600"})}),a.jsx(xr,{className:"w-4 h-4 text-gray-400"})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Snapshots (24h)"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((E=(Z=e==null?void 0:e.clicks)==null?void 0:Z.clicks_24h)==null?void 0:E.toLocaleString())||0}),a.jsx("p",{className:"text-xs text-gray-500",children:"Product snapshots created"})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-indigo-50 rounded-lg",children:a.jsx(Cr,{className:"w-5 h-5 text-indigo-600"})}),a.jsx(na,{className:"w-4 h-4 text-gray-400"})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Brands"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((D=e==null?void 0:e.brands)==null?void 0:D.total)||((O=e==null?void 0:e.products)==null?void 0:O.unique_brands)||0}),a.jsx("p",{className:"text-xs text-gray-500",children:"Unique brands tracked"})]})]})]}),a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"mb-6",children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:"Product Growth"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Weekly product count trend"})]}),a.jsx(p0,{width:"100%",height:200,children:a.jsxs(YB,{data:x,children:[a.jsx("defs",{children:a.jsxs("linearGradient",{id:"productGradient",x1:"0",y1:"0",x2:"0",y2:"1",children:[a.jsx("stop",{offset:"5%",stopColor:"#3b82f6",stopOpacity:.1}),a.jsx("stop",{offset:"95%",stopColor:"#3b82f6",stopOpacity:0})]})}),a.jsx(vp,{strokeDasharray:"3 3",stroke:"#f1f5f9"}),a.jsx(jp,{dataKey:"date",tick:{fill:"#94a3b8",fontSize:12},axisLine:{stroke:"#e2e8f0"}}),a.jsx(Sp,{tick:{fill:"#94a3b8",fontSize:12},axisLine:{stroke:"#e2e8f0"}}),a.jsx(By,{contentStyle:{backgroundColor:"#ffffff",border:"1px solid #e2e8f0",borderRadius:"8px",fontSize:"12px"}}),a.jsx(pk,{type:"monotone",dataKey:"products",stroke:"#3b82f6",strokeWidth:2,fill:"url(#productGradient)"})]})})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"mb-6",children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:"Scrape Activity"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Scrapes over the last 24 hours"})]}),a.jsx(p0,{width:"100%",height:200,children:a.jsxs(KB,{data:g,children:[a.jsx(vp,{strokeDasharray:"3 3",stroke:"#f1f5f9"}),a.jsx(jp,{dataKey:"time",tick:{fill:"#94a3b8",fontSize:12},axisLine:{stroke:"#e2e8f0"}}),a.jsx(Sp,{tick:{fill:"#94a3b8",fontSize:12},axisLine:{stroke:"#e2e8f0"}}),a.jsx(By,{contentStyle:{backgroundColor:"#ffffff",border:"1px solid #e2e8f0",borderRadius:"8px",fontSize:"12px"}}),a.jsx(ak,{type:"monotone",dataKey:"scrapes",stroke:"#10b981",strokeWidth:2,dot:{fill:"#10b981",r:4}})]})})]})]}),a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200",children:[a.jsxs("div",{className:"px-6 py-4 border-b border-gray-200",children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:"Recent Scrapes"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Latest data collection activities"})]}),a.jsx("div",{className:"divide-y divide-gray-100",children:((k=r==null?void 0:r.recent_scrapes)==null?void 0:k.length)>0?r.recent_scrapes.slice(0,5).map((F,H)=>a.jsx("div",{className:"px-6 py-4 hover:bg-gray-50 transition-colors",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsx("p",{className:"text-sm font-medium text-gray-900 truncate",children:F.name}),a.jsx("p",{className:"text-xs text-gray-500 mt-1",children:new Date(F.last_scraped_at).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})})]}),a.jsx("div",{className:"ml-4 flex-shrink-0",children:a.jsxs("span",{className:"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-blue-50 text-blue-700",children:[F.product_count," products"]})})]})},H)):a.jsxs("div",{className:"px-6 py-12 text-center",children:[a.jsx(na,{className:"w-8 h-8 text-gray-300 mx-auto mb-2"}),a.jsx("p",{className:"text-sm text-gray-500",children:"No recent scrapes"})]})})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200",children:[a.jsxs("div",{className:"px-6 py-4 border-b border-gray-200",children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:"Recent Products"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Newly added to inventory"})]}),a.jsx("div",{className:"divide-y divide-gray-100",children:((L=r==null?void 0:r.recent_products)==null?void 0:L.length)>0?r.recent_products.slice(0,5).map((F,H)=>a.jsx("div",{className:"px-6 py-4 hover:bg-gray-50 transition-colors",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsx("p",{className:"text-sm font-medium text-gray-900 truncate",children:F.name}),a.jsx("p",{className:"text-xs text-gray-500 mt-1",children:F.store_name})]}),F.price&&a.jsx("div",{className:"ml-4 flex-shrink-0",children:a.jsxs("span",{className:"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-emerald-50 text-emerald-700",children:["$",F.price]})})]})},H)):a.jsxs("div",{className:"px-6 py-12 text-center",children:[a.jsx(Ct,{className:"w-8 h-8 text-gray-300 mx-auto mb-2"}),a.jsx("p",{className:"text-sm text-gray-500",children:"No recent products"})]})})]})]})]})]})}function ZB(){const[e,t]=nA(),r=dt(),[n,i]=h.useState([]),[s,o]=h.useState([]),[l,c]=h.useState([]),[d,u]=h.useState(!1),[f,p]=h.useState(""),[m,x]=h.useState(""),[g,b]=h.useState(""),[v,j]=h.useState(""),[y,w]=h.useState(0),[S,N]=h.useState(0),P=50;h.useEffect(()=>{const k=e.get("store");k&&x(k),T()},[]),h.useEffect(()=>{m&&($(),_())},[f,m,g,v,S]);const _=async()=>{try{const k=await B.getCategoryTree(parseInt(m));c(k.categories||[])}catch(k){console.error("Failed to load categories:",k)}},T=async()=>{try{const k=await B.getStores();o(k.stores)}catch(k){console.error("Failed to load stores:",k)}},$=async()=>{u(!0);try{const k={limit:P,offset:S,store_id:m};f&&(k.search=f),g&&(k.category_id=g),v&&(k.in_stock=v);const L=await B.getProducts(k);i(L.products),w(L.total)}catch(k){console.error("Failed to load products:",k)}finally{u(!1)}},M=k=>{p(k),N(0)},C=k=>{x(k),b(""),N(0),p(""),t(k?{store:k}:{})},R=k=>{b(k),N(0)},q=(k,L=0)=>k.map(F=>a.jsxs("div",{style:{marginLeft:`${L*20}px`},children:[a.jsxs("button",{onClick:()=>R(F.id.toString()),style:{width:"100%",textAlign:"left",padding:"10px 15px",background:g===F.id.toString()?"#667eea":"transparent",color:g===F.id.toString()?"white":"#333",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:L===0?"600":"400",fontSize:L===0?"15px":"14px",marginBottom:"4px",transition:"all 0.2s"},onMouseEnter:H=>{g!==F.id.toString()&&(H.currentTarget.style.background="#f5f5f5")},onMouseLeave:H=>{g!==F.id.toString()&&(H.currentTarget.style.background="transparent")},children:[F.name," (",F.product_count||0,")"]}),F.children&&F.children.length>0&&q(F.children,L+1)]},F.id)),Z=l.find(k=>k.id.toString()===g),E=()=>{S+P{S>0&&N(Math.max(0,S-P))},O=s.find(k=>k.id.toString()===m);return a.jsx(X,{children:a.jsxs("div",{children:[a.jsx("h1",{style:{fontSize:"32px",marginBottom:"30px"},children:"Products"}),a.jsxs("div",{style:{background:"white",padding:"30px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"30px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"15px",fontSize:"18px",fontWeight:"600",color:"#333"},children:"Select a Store to View Products:"}),a.jsxs("select",{value:m,onChange:k=>C(k.target.value),style:{width:"100%",padding:"15px",border:"2px solid #667eea",borderRadius:"8px",fontSize:"16px",fontWeight:"500",cursor:"pointer",background:"white"},children:[a.jsx("option",{value:"",children:"-- Select a Store --"}),s.map(k=>a.jsx("option",{value:k.id,children:k.name},k.id))]})]}),m?a.jsxs(a.Fragment,{children:[a.jsxs("div",{style:{background:"#667eea",color:"white",padding:"20px",borderRadius:"8px",marginBottom:"20px",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("div",{children:[a.jsx("h2",{style:{margin:0,fontSize:"24px"},children:O==null?void 0:O.name}),Z&&a.jsx("div",{style:{marginTop:"8px",fontSize:"14px",opacity:.9},children:Z.name})]}),a.jsxs("div",{style:{fontSize:"18px",fontWeight:"bold"},children:[y," Products"]})]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"280px 1fr",gap:"20px"},children:[a.jsx("div",{children:a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",position:"sticky",top:"20px"},children:[a.jsx("h3",{style:{margin:"0 0 16px 0",fontSize:"18px",fontWeight:"600",color:"#333"},children:"Categories"}),a.jsxs("button",{onClick:()=>R(""),style:{width:"100%",textAlign:"left",padding:"10px 15px",background:g===""?"#667eea":"transparent",color:g===""?"white":"#333",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600",fontSize:"15px",marginBottom:"12px"},children:["All Products (",y,")"]}),a.jsx("div",{style:{borderTop:"1px solid #eee",marginBottom:"12px"}}),q(l)]})}),a.jsxs("div",{children:[a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"20px",display:"flex",gap:"15px",flexWrap:"wrap"},children:[a.jsx("input",{type:"text",placeholder:"Search products...",value:f,onChange:k=>M(k.target.value),style:{flex:"1",minWidth:"200px",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"}}),a.jsxs("select",{value:v,onChange:k=>{j(k.target.value),N(0)},style:{padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"",children:"All Products"}),a.jsx("option",{value:"true",children:"In Stock"}),a.jsx("option",{value:"false",children:"Out of Stock"})]})]}),d?a.jsx("div",{style:{textAlign:"center",padding:"40px"},children:"Loading..."}):a.jsxs(a.Fragment,{children:[a.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(250px, 1fr))",gap:"20px",marginBottom:"20px"},children:n.map(k=>a.jsx(XB,{product:k,onViewDetails:()=>r(`/products/${k.id}`)},k.id))}),n.length===0&&a.jsx("div",{style:{background:"white",padding:"40px",borderRadius:"8px",textAlign:"center",color:"#999"},children:"No products found"}),y>P&&a.jsxs("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:"15px",marginTop:"30px"},children:[a.jsx("button",{onClick:D,disabled:S===0,style:{padding:"10px 20px",background:S===0?"#ddd":"#667eea",color:S===0?"#999":"white",border:"none",borderRadius:"6px",cursor:S===0?"not-allowed":"pointer"},children:"Previous"}),a.jsxs("span",{children:["Showing ",S+1," - ",Math.min(S+P,y)," of ",y]}),a.jsx("button",{onClick:E,disabled:S+P>=y,style:{padding:"10px 20px",background:S+P>=y?"#ddd":"#667eea",color:S+P>=y?"#999":"white",border:"none",borderRadius:"6px",cursor:S+P>=y?"not-allowed":"pointer"},children:"Next"})]})]})]})]})]}):a.jsxs("div",{style:{background:"white",padding:"60px 40px",borderRadius:"8px",textAlign:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"48px",marginBottom:"20px"},children:"🏪"}),a.jsx("div",{style:{fontSize:"18px",color:"#666"},children:"Please select a store from the dropdown above to view products"})]})]})})}function XB({product:e,onViewDetails:t}){const r=n=>{if(!n)return"Never";const i=new Date(n),o=new Date().getTime()-i.getTime(),l=Math.floor(o/(1e3*60*60*24));return l===0?"Today":l===1?"Yesterday":l<7?`${l} days ago`:i.toLocaleDateString()};return a.jsxs("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden",transition:"transform 0.2s"},onMouseEnter:n=>n.currentTarget.style.transform="translateY(-4px)",onMouseLeave:n=>n.currentTarget.style.transform="translateY(0)",children:[e.image_url_full?a.jsx("img",{src:e.image_url_full,alt:e.name,style:{width:"100%",height:"200px",objectFit:"cover",background:"#f5f5f5"},onError:n=>{n.currentTarget.src='data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="200" height="200"%3E%3Crect fill="%23ddd" width="200" height="200"/%3E%3Ctext x="50%25" y="50%25" text-anchor="middle" dy=".3em" fill="%23999"%3ENo Image%3C/text%3E%3C/svg%3E'}}):a.jsx("div",{style:{width:"100%",height:"200px",background:"#f5f5f5",display:"flex",alignItems:"center",justifyContent:"center",color:"#999"},children:"No Image"}),a.jsxs("div",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"500",marginBottom:"8px",fontSize:"14px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"8px"},children:[a.jsx("div",{style:{fontWeight:"bold",color:"#667eea"},children:e.price?`$${e.price}`:"N/A"}),a.jsx("div",{style:{padding:"4px 8px",borderRadius:"4px",fontSize:"12px",background:e.in_stock?"#d4edda":"#f8d7da",color:e.in_stock?"#155724":"#721c24"},children:e.in_stock?"In Stock":"Out of Stock"})]}),a.jsxs("div",{style:{fontSize:"11px",color:"#888",marginBottom:"12px",borderTop:"1px solid #eee",paddingTop:"8px"},children:["Last Updated: ",r(e.last_seen_at)]}),a.jsxs("div",{style:{display:"flex",gap:"8px"},children:[e.dutchie_url&&a.jsx("a",{href:e.dutchie_url,target:"_blank",rel:"noopener noreferrer",style:{flex:1,padding:"8px 12px",background:"#f0f0f0",color:"#333",textDecoration:"none",borderRadius:"6px",fontSize:"12px",fontWeight:"500",textAlign:"center",border:"1px solid #ddd"},onClick:n=>n.stopPropagation(),children:"Dutchie"}),a.jsx("button",{onClick:n=>{n.stopPropagation(),t()},style:{flex:1,padding:"8px 12px",background:"#667eea",color:"white",border:"none",borderRadius:"6px",fontSize:"12px",fontWeight:"500",cursor:"pointer"},children:"Details"})]})]})]})}function JB(){const{id:e}=ka(),t=dt(),[r,n]=h.useState(null),[i,s]=h.useState(!0),[o,l]=h.useState(null);h.useEffect(()=>{c()},[e]);const c=async()=>{if(e){s(!0),l(null);try{const p=await B.getProduct(parseInt(e));n(p.product)}catch(p){l(p.message||"Failed to load product")}finally{s(!1)}}};if(i)return a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 border-t-blue-600 rounded-full animate-spin"})})});if(o||!r)return a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx(Ct,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:"Product not found"}),a.jsx("p",{className:"text-gray-500 mb-4",children:o}),a.jsx("button",{onClick:()=>t(-1),className:"text-blue-600 hover:text-blue-700",children:"← Go back"})]})});const d=r.metadata||{},f=r.image_url_full?r.image_url_full:r.medium_path?`http://localhost:9020/dutchie/${r.medium_path}`:r.thumbnail_path?`http://localhost:9020/dutchie/${r.thumbnail_path}`:null;return a.jsx(X,{children:a.jsxs("div",{className:"max-w-6xl mx-auto",children:[a.jsxs("button",{onClick:()=>t(-1),className:"flex items-center gap-2 text-gray-600 hover:text-gray-900 mb-6",children:[a.jsx(_h,{className:"w-4 h-4"}),"Back"]}),a.jsx("div",{className:"bg-white rounded-xl border border-gray-200 overflow-hidden",children:a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-8 p-6",children:[a.jsx("div",{className:"aspect-square bg-gray-50 rounded-lg overflow-hidden",children:f?a.jsx("img",{src:f,alt:r.name,className:"w-full h-full object-contain"}):a.jsx("div",{className:"w-full h-full flex items-center justify-center text-gray-400",children:a.jsx(Ct,{className:"w-24 h-24"})})}),a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[r.in_stock?a.jsx("span",{className:"px-2 py-1 bg-green-100 text-green-700 text-xs font-medium rounded",children:"In Stock"}):a.jsx("span",{className:"px-2 py-1 bg-red-100 text-red-700 text-xs font-medium rounded",children:"Out of Stock"}),r.strain_type&&a.jsx("span",{className:"px-2 py-1 bg-purple-100 text-purple-700 text-xs font-medium rounded capitalize",children:r.strain_type})]}),a.jsx("h1",{className:"text-2xl font-bold text-gray-900 mb-2",children:r.name}),r.brand&&a.jsx("p",{className:"text-lg text-gray-600 font-medium",children:r.brand}),a.jsxs("div",{className:"flex items-center gap-4 mt-2 text-sm text-gray-500",children:[r.store_name&&a.jsx("span",{children:r.store_name}),r.category_name&&a.jsxs(a.Fragment,{children:[a.jsx("span",{children:"•"}),a.jsx("span",{children:r.category_name})]})]})]}),r.price!==null&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsxs("div",{className:"text-3xl font-bold text-blue-600",children:["$",parseFloat(r.price).toFixed(2)]}),r.weight&&a.jsx("div",{className:"text-sm text-gray-500 mt-1",children:r.weight})]}),(r.thc_percentage||r.cbd_percentage)&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Cannabinoid Content"}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[r.thc_percentage!==null&&a.jsxs("div",{className:"bg-green-50 rounded-lg p-3",children:[a.jsx("div",{className:"text-xs text-gray-500 uppercase",children:"THC"}),a.jsxs("div",{className:"text-xl font-bold text-green-600",children:[r.thc_percentage,"%"]})]}),r.cbd_percentage!==null&&a.jsxs("div",{className:"bg-blue-50 rounded-lg p-3",children:[a.jsx("div",{className:"text-xs text-gray-500 uppercase",children:"CBD"}),a.jsxs("div",{className:"text-xl font-bold text-blue-600",children:[r.cbd_percentage,"%"]})]})]})]}),r.description&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Description"}),a.jsx("p",{className:"text-gray-600 text-sm leading-relaxed",children:r.description})]}),d.terpenes&&d.terpenes.length>0&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Terpenes"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:d.terpenes.map(p=>a.jsx("span",{className:"px-2 py-1 bg-amber-100 text-amber-700 text-xs font-medium rounded",children:p},p))})]}),d.effects&&d.effects.length>0&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Effects"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:d.effects.map(p=>a.jsx("span",{className:"px-2 py-1 bg-indigo-100 text-indigo-700 text-xs font-medium rounded",children:p},p))})]}),d.flavors&&d.flavors.length>0&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Flavors"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:d.flavors.map(p=>a.jsx("span",{className:"px-2 py-1 bg-pink-100 text-pink-700 text-xs font-medium rounded",children:p},p))})]}),d.lineage&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Lineage"}),a.jsx("p",{className:"text-gray-600 text-sm",children:d.lineage})]}),r.dutchie_url&&a.jsx("div",{className:"border-t border-gray-100 pt-4",children:a.jsxs("a",{href:r.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-2 text-sm text-blue-600 hover:text-blue-700",children:["View on Dutchie",a.jsx(Jr,{className:"w-4 h-4"})]})}),r.last_seen_at&&a.jsxs("div",{className:"text-xs text-gray-400 pt-4 border-t border-gray-100",children:["Last updated: ",new Date(r.last_seen_at).toLocaleString()]})]})]})})]})})}function QB(){const[e,t]=h.useState([]),[r,n]=h.useState(!0),[i,s]=h.useState(new Set),[o,l]=h.useState(new Set),c=dt();h.useEffect(()=>{d()},[]);const d=async()=>{n(!0);try{const v=await B.getStores();t(v.stores)}catch(v){console.error("Failed to load stores:",v)}finally{n(!1)}},u=v=>{const j=v.match(/(?:^|-)(al|ak|az|ar|ca|co|ct|de|fl|ga|hi|id|il|in|ia|ks|ky|la|me|md|ma|mi|mn|ms|mo|mt|ne|nv|nh|nj|nm|ny|nc|nd|oh|ok|or|pa|ri|sc|sd|tn|tx|ut|vt|va|wa|wv|wi|wy)-/i),y={peoria:"AZ"};let w=j?j[1].toUpperCase():null;if(!w){for(const[S,N]of Object.entries(y))if(v.toLowerCase().includes(S)){w=N;break}}return w||"UNKNOWN"},f=v=>{const j=u(v.slug).toLowerCase(),y=v.name.match(/^([^-]+)/),w=y?y[1].trim().toLowerCase().replace(/\s+/g,"-"):"other";return`/stores/${j}/${w}/${v.slug}`},p=e.reduce((v,j)=>{const y=j.name.match(/^([^-]+)/),w=y?y[1].trim():"Other",S=u(j.slug),P={AZ:"Arizona",FL:"Florida",PA:"Pennsylvania",NJ:"New Jersey",MA:"Massachusetts",IL:"Illinois",NY:"New York",MD:"Maryland",MI:"Michigan",OH:"Ohio",CT:"Connecticut",ME:"Maine",MO:"Missouri",NV:"Nevada",OR:"Oregon",UT:"Utah"}[S]||S;return v[w]||(v[w]={}),v[w][P]||(v[w][P]=[]),v[w][P].push(j),v},{}),m=async(v,j,y)=>{y.stopPropagation();try{await B.updateStore(v,{scrape_enabled:!j}),t(e.map(w=>w.id===v?{...w,scrape_enabled:!j}:w))}catch(w){console.error("Failed to update scraping status:",w)}},x=v=>v?new Date(v).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"}):"Never",g=v=>{const j=new Set(i);j.has(v)?j.delete(v):j.add(v),s(j)},b=(v,j)=>{const y=`${v}-${j}`,w=new Set(o);w.has(y)?w.delete(y):w.add(y),l(w)};return r?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 border-t-blue-600 rounded-full animate-spin"})})}):a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsx("div",{className:"flex items-center justify-between",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Il,{className:"w-6 h-6 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-semibold text-gray-900",children:"Stores"}),a.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:[e.length," total stores"]})]})]})}),a.jsx("div",{className:"bg-white rounded-xl border border-gray-200 overflow-hidden",children:a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full",children:[a.jsx("thead",{className:"bg-gray-50 border-b border-gray-200",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Store Name"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Type"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"View Online"}),a.jsx("th",{className:"px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Categories"}),a.jsx("th",{className:"px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Products"}),a.jsx("th",{className:"px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Scraping"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Last Scraped"})]})}),a.jsx("tbody",{children:Object.entries(p).map(([v,j])=>{const y=Object.values(j).flat().length,w=y===1,S=i.has(v);if(w){const _=Object.values(j).flat()[0];return a.jsxs("tr",{className:"border-b border-gray-100 hover:bg-gray-50 cursor-pointer transition-colors",onClick:()=>c(f(_)),title:"Click to view store",children:[a.jsx("td",{className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[_.logo_url?a.jsx("img",{src:_.logo_url,alt:`${_.name} logo`,className:"w-8 h-8 object-contain flex-shrink-0",onError:T=>{T.target.style.display="none"}}):null,a.jsxs("div",{children:[a.jsx("div",{className:"font-semibold text-gray-900",children:_.name}),a.jsx("div",{className:"text-xs text-gray-500",children:_.slug})]})]})}),a.jsx("td",{className:"px-6 py-4",children:a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-blue-50 text-blue-700 rounded",children:"Dutchie"})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("a",{href:_.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-sm text-blue-600 hover:text-blue-700",onClick:T=>T.stopPropagation(),children:[a.jsx("span",{children:"View Online"}),a.jsx(Jr,{className:"w-3 h-3"})]})}),a.jsx("td",{className:"px-6 py-4 text-center",children:a.jsxs("div",{className:"flex items-center justify-center gap-1",children:[a.jsx(Cr,{className:"w-4 h-4 text-gray-400"}),a.jsx("span",{className:"text-sm font-medium text-gray-900",children:_.category_count||0})]})}),a.jsx("td",{className:"px-6 py-4 text-center",children:a.jsxs("div",{className:"flex items-center justify-center gap-1",children:[a.jsx(Ct,{className:"w-4 h-4 text-gray-400"}),a.jsx("span",{className:"text-sm font-medium text-gray-900",children:_.product_count||0})]})}),a.jsx("td",{className:"px-6 py-4 text-center",onClick:T=>T.stopPropagation(),children:a.jsx("button",{onClick:T=>m(_.id,_.scrape_enabled,T),className:"inline-flex items-center gap-1 text-sm font-medium transition-colors",children:_.scrape_enabled?a.jsxs(a.Fragment,{children:[a.jsx(Ix,{className:"w-5 h-5 text-green-600"}),a.jsx("span",{className:"text-green-600",children:"On"})]}):a.jsxs(a.Fragment,{children:[a.jsx(Mx,{className:"w-5 h-5 text-gray-400"}),a.jsx("span",{className:"text-gray-500",children:"Off"})]})})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(xr,{className:"w-4 h-4 text-gray-400"}),x(_.last_scraped_at)]})})]},_.id)}const N=Object.values(j).flat()[0],P=N==null?void 0:N.logo_url;return a.jsxs(ps.Fragment,{children:[a.jsx("tr",{className:"bg-gray-100 border-b border-gray-200 cursor-pointer hover:bg-gray-150 transition-colors",onClick:()=>g(v),children:a.jsx("td",{colSpan:7,className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(Cf,{className:`w-5 h-5 text-gray-600 transition-transform ${S?"rotate-90":""}`}),P&&a.jsx("img",{src:P,alt:`${v} logo`,className:"w-8 h-8 object-contain flex-shrink-0",onError:_=>{_.target.style.display="none"}}),a.jsx("span",{className:"text-base font-semibold text-gray-900",children:v}),a.jsxs("span",{className:"text-sm text-gray-500",children:["(",y," stores)"]})]})})}),S&&Object.entries(j).map(([_,T])=>{const $=`${v}-${_}`,M=o.has($);return a.jsxs(ps.Fragment,{children:[a.jsx("tr",{className:"bg-gray-50 border-b border-gray-100 cursor-pointer hover:bg-gray-100 transition-colors",onClick:()=>b(v,_),children:a.jsx("td",{colSpan:7,className:"px-6 py-3 pl-12",children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Cf,{className:`w-4 h-4 text-gray-500 transition-transform ${M?"rotate-90":""}`}),a.jsx("span",{className:"text-sm font-medium text-gray-700",children:_}),a.jsxs("span",{className:"text-xs text-gray-500",children:["(",T.length," locations)"]})]})})}),M&&T.map(C=>a.jsxs("tr",{className:"border-b border-gray-100 hover:bg-gray-50 cursor-pointer transition-colors",onClick:()=>c(f(C)),title:"Click to view store",children:[a.jsx("td",{className:"px-6 py-4 pl-16",children:a.jsxs("div",{children:[a.jsx("div",{className:"font-semibold text-gray-900",children:C.name}),a.jsx("div",{className:"text-xs text-gray-500",children:C.slug})]})}),a.jsx("td",{className:"px-6 py-4",children:a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-blue-50 text-blue-700 rounded",children:"Dutchie"})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("a",{href:C.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-sm text-blue-600 hover:text-blue-700",onClick:R=>R.stopPropagation(),children:[a.jsx("span",{children:"View Online"}),a.jsx(Jr,{className:"w-3 h-3"})]})}),a.jsx("td",{className:"px-6 py-4 text-center",children:a.jsxs("div",{className:"flex items-center justify-center gap-1",children:[a.jsx(Cr,{className:"w-4 h-4 text-gray-400"}),a.jsx("span",{className:"text-sm font-medium text-gray-900",children:C.category_count||0})]})}),a.jsx("td",{className:"px-6 py-4 text-center",children:a.jsxs("div",{className:"flex items-center justify-center gap-1",children:[a.jsx(Ct,{className:"w-4 h-4 text-gray-400"}),a.jsx("span",{className:"text-sm font-medium text-gray-900",children:C.product_count||0})]})}),a.jsx("td",{className:"px-6 py-4 text-center",onClick:R=>R.stopPropagation(),children:a.jsx("button",{onClick:R=>m(C.id,C.scrape_enabled,R),className:"inline-flex items-center gap-1 text-sm font-medium transition-colors",children:C.scrape_enabled?a.jsxs(a.Fragment,{children:[a.jsx(Ix,{className:"w-5 h-5 text-green-600"}),a.jsx("span",{className:"text-green-600",children:"On"})]}):a.jsxs(a.Fragment,{children:[a.jsx(Mx,{className:"w-5 h-5 text-gray-400"}),a.jsx("span",{className:"text-gray-500",children:"Off"})]})})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(xr,{className:"w-4 h-4 text-gray-400"}),x(C.last_scraped_at)]})})]},C.id))]},`state-${$}`)})]},`chain-${v}`)})})]})})}),e.length===0&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-12 text-center",children:[a.jsx(Il,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"No stores found"}),a.jsx("p",{className:"text-gray-500",children:"Start by adding stores to your database"})]})]})})}function eF(){const e=dt(),[t,r]=h.useState([]),[n,i]=h.useState(!0),[s,o]=h.useState(""),[l,c]=h.useState(""),[d,u]=h.useState(null),[f,p]=h.useState({});h.useEffect(()=>{m()},[]);const m=async()=>{i(!0);try{const y=await B.getDispensaries();r(y.dispensaries)}catch(y){console.error("Failed to load dispensaries:",y)}finally{i(!1)}},x=y=>{u(y),p({dba_name:y.dba_name||"",website:y.website||"",phone:y.phone||"",google_rating:y.google_rating||"",google_review_count:y.google_review_count||""})},g=async()=>{if(d)try{await B.updateDispensary(d.id,f),await m(),u(null),p({})}catch(y){console.error("Failed to update dispensary:",y),alert("Failed to update dispensary")}},b=()=>{u(null),p({})},v=t.filter(y=>{const w=s.toLowerCase(),S=!s||y.name.toLowerCase().includes(w)||y.company_name&&y.company_name.toLowerCase().includes(w)||y.dba_name&&y.dba_name.toLowerCase().includes(w),N=!l||y.city===l;return S&&N}),j=Array.from(new Set(t.map(y=>y.city).filter(Boolean))).sort();return a.jsxs(X,{children:[a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Dispensaries"}),a.jsxs("p",{className:"text-sm text-gray-600 mt-1",children:["AZDHS official dispensary directory (",t.length," total)"]})]}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Search"}),a.jsxs("div",{className:"relative",children:[a.jsx(_O,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400"}),a.jsx("input",{type:"text",value:s,onChange:y=>o(y.target.value),placeholder:"Search by name or company...",className:"w-full pl-10 pr-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Filter by City"}),a.jsxs("select",{value:l,onChange:y=>c(y.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"",children:"All Cities"}),j.map(y=>a.jsx("option",{value:y,children:y},y))]})]})]})}),n?a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading dispensaries..."})]}):a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 overflow-hidden",children:[a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full",children:[a.jsx("thead",{className:"bg-gray-50 border-b border-gray-200",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Name"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Company"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Address"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"City"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Phone"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Email"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Website"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Actions"})]})}),a.jsx("tbody",{className:"divide-y divide-gray-200",children:v.length===0?a.jsx("tr",{children:a.jsx("td",{colSpan:8,className:"px-4 py-8 text-center text-sm text-gray-500",children:"No dispensaries found"})}):v.map(y=>a.jsxs("tr",{className:"hover:bg-gray-50",children:[a.jsx("td",{className:"px-4 py-3",children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Ln,{className:"w-4 h-4 text-gray-400 flex-shrink-0"}),a.jsxs("div",{className:"flex flex-col",children:[a.jsx("span",{className:"text-sm font-medium text-gray-900",children:y.dba_name||y.name}),y.dba_name&&y.google_rating&&a.jsxs("span",{className:"text-xs text-gray-500",children:["⭐ ",y.google_rating," (",y.google_review_count," reviews)"]})]})]})}),a.jsx("td",{className:"px-4 py-3",children:a.jsx("span",{className:"text-sm text-gray-600",children:y.company_name||"-"})}),a.jsx("td",{className:"px-4 py-3",children:a.jsxs("div",{className:"flex items-start gap-1",children:[a.jsx(yi,{className:"w-3 h-3 text-gray-400 flex-shrink-0 mt-0.5"}),a.jsx("span",{className:"text-sm text-gray-600",children:y.address||"-"})]})}),a.jsxs("td",{className:"px-4 py-3",children:[a.jsx("span",{className:"text-sm text-gray-600",children:y.city||"-"}),y.zip&&a.jsxs("span",{className:"text-xs text-gray-400 ml-1",children:["(",y.zip,")"]})]}),a.jsx("td",{className:"px-4 py-3",children:y.phone?a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(Ah,{className:"w-3 h-3 text-gray-400"}),a.jsx("span",{className:"text-sm text-gray-600",children:y.phone.replace(/(\d{3})(\d{3})(\d{4})/,"($1) $2-$3")})]}):a.jsx("span",{className:"text-sm text-gray-400",children:"-"})}),a.jsx("td",{className:"px-4 py-3",children:y.email?a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(tj,{className:"w-3 h-3 text-gray-400"}),a.jsx("a",{href:`mailto:${y.email}`,className:"text-sm text-blue-600 hover:text-blue-800",children:y.email})]}):a.jsx("span",{className:"text-sm text-gray-400",children:"-"})}),a.jsx("td",{className:"px-4 py-3",children:y.website?a.jsxs("a",{href:y.website,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-sm text-blue-600 hover:text-blue-800",children:[a.jsx(Jr,{className:"w-3 h-3"}),a.jsx("span",{children:"Visit Site"})]}):a.jsx("span",{className:"text-sm text-gray-400",children:"-"})}),a.jsx("td",{className:"px-4 py-3",children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("button",{onClick:()=>x(y),className:"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 rounded-lg transition-colors",title:"Edit",children:a.jsx(bO,{className:"w-4 h-4"})}),a.jsx("button",{onClick:()=>{const w=y.city.toLowerCase().replace(/\s+/g,"-");e(`/dispensaries/${y.state}/${w}/${y.slug}`)},className:"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium text-blue-600 hover:text-blue-800 hover:bg-blue-50 rounded-lg transition-colors",title:"View",children:a.jsx(rO,{className:"w-4 h-4"})})]})})]},y.id))})]})}),a.jsx("div",{className:"bg-gray-50 px-4 py-3 border-t border-gray-200",children:a.jsxs("div",{className:"text-sm text-gray-600",children:["Showing ",v.length," of ",t.length," dispensaries"]})})]})]}),d&&a.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:a.jsxs("div",{className:"bg-white rounded-lg shadow-xl max-w-2xl w-full mx-4 max-h-[90vh] overflow-y-auto",children:[a.jsxs("div",{className:"flex items-center justify-between p-6 border-b border-gray-200",children:[a.jsxs("h2",{className:"text-xl font-bold text-gray-900",children:["Edit Dispensary: ",d.name]}),a.jsx("button",{onClick:b,className:"text-gray-400 hover:text-gray-600",children:a.jsx(ij,{className:"w-6 h-6"})})]}),a.jsxs("div",{className:"p-6 space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"DBA Name (Display Name)"}),a.jsx("input",{type:"text",value:f.dba_name,onChange:y=>p({...f,dba_name:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"e.g., Green Med Wellness"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Website"}),a.jsx("input",{type:"url",value:f.website,onChange:y=>p({...f,website:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"https://example.com"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Phone Number"}),a.jsx("input",{type:"tel",value:f.phone,onChange:y=>p({...f,phone:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"5551234567"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Google Rating"}),a.jsx("input",{type:"number",step:"0.1",min:"0",max:"5",value:f.google_rating,onChange:y=>p({...f,google_rating:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"4.5"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Review Count"}),a.jsx("input",{type:"number",min:"0",value:f.google_review_count,onChange:y=>p({...f,google_review_count:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"123"})]})]}),a.jsxs("div",{className:"bg-gray-50 p-4 rounded-lg space-y-2",children:[a.jsxs("div",{className:"text-sm",children:[a.jsx("span",{className:"font-medium text-gray-700",children:"AZDHS Name:"})," ",a.jsx("span",{className:"text-gray-600",children:d.name})]}),a.jsxs("div",{className:"text-sm",children:[a.jsx("span",{className:"font-medium text-gray-700",children:"Address:"})," ",a.jsxs("span",{className:"text-gray-600",children:[d.address,", ",d.city,", ",d.state," ",d.zip]})]})]})]}),a.jsxs("div",{className:"flex items-center justify-end gap-3 p-6 border-t border-gray-200",children:[a.jsx("button",{onClick:b,className:"px-4 py-2 text-sm font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-100 rounded-lg transition-colors",children:"Cancel"}),a.jsxs("button",{onClick:g,className:"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg transition-colors",children:[a.jsx(kO,{className:"w-4 h-4"}),"Save Changes"]})]})]})})]})}function tF(){const{state:e,city:t,slug:r}=ka(),n=dt(),[i,s]=h.useState(null),[o,l]=h.useState([]),[c,d]=h.useState([]),[u,f]=h.useState([]),[p,m]=h.useState(!0),[x,g]=h.useState("products"),[b,v]=h.useState(!1),[j,y]=h.useState(!1),[w,S]=h.useState(""),[N,P]=h.useState(1),[_]=h.useState(25),T=D=>{if(!D)return"Never";const O=new Date(D),L=new Date().getTime()-O.getTime(),F=Math.floor(L/(1e3*60*60*24));return F===0?"Today":F===1?"Yesterday":F<7?`${F} days ago`:O.toLocaleDateString()};h.useEffect(()=>{$()},[r]);const $=async()=>{m(!0);try{const[D,O,k,L]=await Promise.all([B.getDispensary(r),B.getDispensaryProducts(r).catch(()=>({products:[]})),B.getDispensaryBrands(r).catch(()=>({brands:[]})),B.getDispensarySpecials(r).catch(()=>({specials:[]}))]);s(D),l(O.products),d(k.brands),f(L.specials)}catch(D){console.error("Failed to load dispensary:",D)}finally{m(!1)}},M=async D=>{v(!1),y(!0);try{const O=await fetch(`http://localhost:3010/api/dispensaries/${r}/scrape`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${localStorage.getItem("token")}`},body:JSON.stringify({type:D})});if(!O.ok)throw new Error("Failed to trigger scraping");const k=await O.json();alert(`${D.charAt(0).toUpperCase()+D.slice(1)} update started! ${k.message||""}`)}catch(O){console.error("Failed to trigger scraping:",O),alert("Failed to start update. Please try again.")}finally{y(!1)}},C=o.filter(D=>{var k,L,F,H,te;if(!w)return!0;const O=w.toLowerCase();return((k=D.name)==null?void 0:k.toLowerCase().includes(O))||((L=D.brand)==null?void 0:L.toLowerCase().includes(O))||((F=D.variant)==null?void 0:F.toLowerCase().includes(O))||((H=D.description)==null?void 0:H.toLowerCase().includes(O))||((te=D.strain_type)==null?void 0:te.toLowerCase().includes(O))}),R=Math.ceil(C.length/_),q=(N-1)*_,Z=q+_,E=C.slice(q,Z);return h.useEffect(()=>{P(1)},[w]),p?a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading dispensary..."})]})}):i?a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between gap-4",children:[a.jsxs("button",{onClick:()=>n("/dispensaries"),className:"flex items-center gap-2 text-sm text-gray-600 hover:text-gray-900",children:[a.jsx(_h,{className:"w-4 h-4"}),"Back to Dispensaries"]}),a.jsxs("div",{className:"relative",children:[a.jsxs("button",{onClick:()=>v(!b),disabled:j,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed",children:[a.jsx(Xt,{className:`w-4 h-4 ${j?"animate-spin":""}`}),j?"Updating...":"Update",!j&&a.jsx(ej,{className:"w-4 h-4"})]}),b&&!j&&a.jsxs("div",{className:"absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-lg border border-gray-200 z-10",children:[a.jsx("button",{onClick:()=>M("products"),className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-t-lg",children:"Products"}),a.jsx("button",{onClick:()=>M("brands"),className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100",children:"Brands"}),a.jsx("button",{onClick:()=>M("specials"),className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100",children:"Specials"}),a.jsx("button",{onClick:()=>M("all"),className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-b-lg border-t border-gray-200",children:"All"})]})]})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-start justify-between gap-4 mb-4",children:[a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"p-3 bg-blue-50 rounded-lg",children:a.jsx(Ln,{className:"w-8 h-8 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:i.dba_name||i.name}),i.company_name&&a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:i.company_name})]})]}),a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 bg-gray-50 px-4 py-2 rounded-lg",children:[a.jsx(Ch,{className:"w-4 h-4"}),a.jsxs("div",{children:[a.jsx("span",{className:"font-medium",children:"Last Crawl Date:"}),a.jsx("span",{className:"ml-2",children:i.last_menu_scrape?new Date(i.last_menu_scrape).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"Never"})]})]})]}),a.jsxs("div",{className:"flex flex-wrap gap-4",children:[i.address&&a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(yi,{className:"w-4 h-4"}),a.jsxs("span",{children:[i.address,", ",i.city,", ",i.state," ",i.zip]})]}),i.phone&&a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(Ah,{className:"w-4 h-4"}),a.jsx("span",{children:i.phone.replace(/(\d{3})(\d{3})(\d{4})/,"($1) $2-$3")})]}),a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(Jr,{className:"w-4 h-4"}),i.website?a.jsx("a",{href:i.website,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800",children:"Website"}):a.jsx("span",{children:"Website N/A"})]}),i.email&&a.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[a.jsx(tj,{className:"w-4 h-4 text-gray-400"}),a.jsx("a",{href:`mailto:${i.email}`,className:"text-blue-600 hover:text-blue-800",children:i.email})]}),i.azdhs_url&&a.jsxs("a",{href:i.azdhs_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-sm text-blue-600 hover:text-blue-800",children:[a.jsx(Jr,{className:"w-4 h-4"}),a.jsx("span",{children:"AZDHS Profile"})]}),a.jsxs(K1,{to:"/schedule",className:"flex items-center gap-2 text-sm text-blue-600 hover:text-blue-800",children:[a.jsx(xr,{className:"w-4 h-4"}),a.jsx("span",{children:"View Schedule"})]})]})]}),a.jsxs("div",{className:"grid grid-cols-4 gap-6",children:[a.jsx("button",{onClick:()=>{g("products"),S("")},className:"bg-white rounded-lg border border-gray-200 p-6 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(Ct,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Total Products"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:o.length})]})]})}),a.jsx("button",{onClick:()=>g("brands"),className:"bg-white rounded-lg border border-gray-200 p-6 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(Cr,{className:"w-5 h-5 text-purple-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Brands"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:c.length})]})]})}),a.jsx("button",{onClick:()=>g("specials"),className:"bg-white rounded-lg border border-gray-200 p-6 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(zn,{className:"w-5 h-5 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Active Specials"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:u.length})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-orange-50 rounded-lg",children:a.jsx(QA,{className:"w-5 h-5 text-orange-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Avg Price"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:o.length>0?`$${(o.reduce((D,O)=>D+(O.sale_price||O.regular_price||0),0)/o.length).toFixed(2)}`:"-"})]})]})})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200",children:[a.jsx("div",{className:"border-b border-gray-200",children:a.jsxs("div",{className:"flex gap-4 px-6",children:[a.jsxs("button",{onClick:()=>g("products"),className:`py-4 px-2 text-sm font-medium border-b-2 ${x==="products"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Products (",o.length,")"]}),a.jsxs("button",{onClick:()=>g("brands"),className:`py-4 px-2 text-sm font-medium border-b-2 ${x==="brands"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Brands (",c.length,")"]}),a.jsxs("button",{onClick:()=>g("specials"),className:`py-4 px-2 text-sm font-medium border-b-2 ${x==="specials"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Specials (",u.length,")"]})]})}),a.jsxs("div",{className:"p-6",children:[x==="products"&&a.jsx("div",{className:"space-y-4",children:o.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No products available"}):a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[a.jsx("input",{type:"text",placeholder:"Search products by name, brand, variant, description, or strain type...",value:w,onChange:D=>S(D.target.value),className:"input input-bordered input-sm flex-1"}),w&&a.jsx("button",{onClick:()=>S(""),className:"btn btn-sm btn-ghost",children:"Clear"}),a.jsxs("div",{className:"text-sm text-gray-600",children:["Showing ",q+1,"-",Math.min(Z,C.length)," of ",C.length," products"]})]}),a.jsx("div",{className:"overflow-x-auto -mx-6 px-6",children:a.jsxs("table",{className:"table table-xs table-zebra table-pin-rows w-full",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Image"}),a.jsx("th",{children:"Product Name"}),a.jsx("th",{children:"Brand"}),a.jsx("th",{children:"Variant"}),a.jsx("th",{children:"Description"}),a.jsx("th",{className:"text-right",children:"Price"}),a.jsx("th",{className:"text-center",children:"THC %"}),a.jsx("th",{className:"text-center",children:"CBD %"}),a.jsx("th",{className:"text-center",children:"Strain Type"}),a.jsx("th",{className:"text-center",children:"In Stock"}),a.jsx("th",{children:"Last Updated"}),a.jsx("th",{children:"Actions"})]})}),a.jsx("tbody",{children:E.map(D=>a.jsxs("tr",{children:[a.jsx("td",{className:"whitespace-nowrap",children:D.image_url?a.jsx("img",{src:D.image_url,alt:D.name,className:"w-12 h-12 object-cover rounded",onError:O=>O.currentTarget.style.display="none"}):"-"}),a.jsx("td",{className:"font-medium max-w-[150px]",children:a.jsx("div",{className:"line-clamp-2",title:D.name,children:D.name})}),a.jsx("td",{className:"max-w-[120px]",children:a.jsx("div",{className:"line-clamp-2",title:D.brand||"-",children:D.brand||"-"})}),a.jsx("td",{className:"max-w-[100px]",children:a.jsx("div",{className:"line-clamp-2",title:D.variant||"-",children:D.variant||"-"})}),a.jsx("td",{className:"w-[120px]",children:a.jsx("span",{title:D.description,children:D.description?D.description.length>15?D.description.substring(0,15)+"...":D.description:"-"})}),a.jsx("td",{className:"text-right font-semibold whitespace-nowrap",children:D.sale_price?a.jsxs("div",{className:"flex flex-col items-end",children:[a.jsxs("span",{className:"text-error",children:["$",D.sale_price]}),a.jsxs("span",{className:"text-gray-400 line-through text-xs",children:["$",D.regular_price]})]}):D.regular_price?`$${D.regular_price}`:"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:D.thc_percentage?a.jsxs("span",{className:"badge badge-success badge-sm",children:[D.thc_percentage,"%"]}):"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:D.cbd_percentage?a.jsxs("span",{className:"badge badge-info badge-sm",children:[D.cbd_percentage,"%"]}):"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:D.strain_type?a.jsx("span",{className:"badge badge-ghost badge-sm",children:D.strain_type}):"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:D.in_stock?a.jsx("span",{className:"badge badge-success badge-sm",children:"Yes"}):D.in_stock===!1?a.jsx("span",{className:"badge badge-error badge-sm",children:"No"}):"-"}),a.jsx("td",{className:"whitespace-nowrap text-xs text-gray-500",children:D.updated_at?T(D.updated_at):"-"}),a.jsx("td",{children:a.jsxs("div",{className:"flex gap-1",children:[D.dutchie_url&&a.jsx("a",{href:D.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"btn btn-xs btn-outline",children:"Dutchie"}),a.jsx("button",{onClick:()=>n(`/products/${D.id}`),className:"btn btn-xs btn-primary",children:"Details"})]})})]},D.id))})]})}),R>1&&a.jsxs("div",{className:"flex justify-center items-center gap-2 mt-4",children:[a.jsx("button",{onClick:()=>P(D=>Math.max(1,D-1)),disabled:N===1,className:"btn btn-sm btn-outline",children:"Previous"}),a.jsx("div",{className:"flex gap-1",children:Array.from({length:R},(D,O)=>O+1).map(D=>{const O=D===1||D===R||D>=N-1&&D<=N+1;return D===2&&N>3||D===R-1&&NP(D),className:`btn btn-sm ${N===D?"btn-primary":"btn-outline"}`,children:D},D):null})}),a.jsx("button",{onClick:()=>P(D=>Math.min(R,D+1)),disabled:N===R,className:"btn btn-sm btn-outline",children:"Next"})]})]})}),x==="brands"&&a.jsx("div",{className:"space-y-4",children:c.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No brands available"}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:c.map(D=>a.jsxs("button",{onClick:()=>{g("products"),S(D.brand)},className:"border border-gray-200 rounded-lg p-4 text-center hover:border-blue-300 hover:shadow-md transition-all cursor-pointer",children:[a.jsx("p",{className:"font-medium text-gray-900 line-clamp-2",children:D.brand}),a.jsxs("p",{className:"text-sm text-gray-600 mt-1",children:[D.product_count," product",D.product_count!==1?"s":""]})]},D.brand))})}),x==="specials"&&a.jsx("div",{className:"space-y-4",children:u.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No active specials"}):a.jsx("div",{className:"space-y-3",children:u.map(D=>a.jsxs("div",{className:"border border-gray-200 rounded-lg p-4",children:[a.jsx("h4",{className:"font-medium text-gray-900",children:D.name}),D.description&&a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:D.description}),a.jsxs("div",{className:"flex items-center gap-4 mt-2 text-sm text-gray-500",children:[a.jsxs("span",{children:[new Date(D.start_date).toLocaleDateString()," -"," ",D.end_date?new Date(D.end_date).toLocaleDateString():"Ongoing"]}),a.jsxs("span",{children:[D.product_count," products"]})]})]},D.id))})})]})]})]})}):a.jsx(X,{children:a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-600",children:"Dispensary not found"})})})}function rF(){var $,M;const{slug:e}=ka(),t=dt(),[r,n]=h.useState(null),[i,s]=h.useState([]),[o,l]=h.useState([]),[c,d]=h.useState([]),[u,f]=h.useState(!0),[p,m]=h.useState(null),[x,g]=h.useState(""),[b,v]=h.useState("products"),[j,y]=h.useState("name");h.useEffect(()=>{w()},[e]),h.useEffect(()=>{r&&S()},[p,x,j,r]);const w=async()=>{f(!0);try{const R=(await B.getStores()).stores.find(D=>D.slug===e);if(!R)throw new Error("Store not found");const[q,Z,E]=await Promise.all([B.getStore(R.id),B.getCategories(R.id),B.getStoreBrands(R.id)]);n(q),l(Z.categories||[]),d(E.brands||[])}catch(C){console.error("Failed to load store data:",C)}finally{f(!1)}},S=async()=>{if(r)try{const C={store_id:r.id,limit:1e3};p&&(C.category_id=p),x&&(C.brand=x);let q=(await B.getProducts(C)).products||[];q.sort((Z,E)=>{switch(j){case"name":return(Z.name||"").localeCompare(E.name||"");case"price_asc":return(Z.price||0)-(E.price||0);case"price_desc":return(E.price||0)-(Z.price||0);case"thc":return(E.thc_percentage||0)-(Z.thc_percentage||0);default:return 0}}),s(q)}catch(C){console.error("Failed to load products:",C)}},N=C=>C.image_url_full?C.image_url_full:C.medium_path?`http://localhost:9020/dutchie/${C.medium_path}`:C.thumbnail_path?`http://localhost:9020/dutchie/${C.thumbnail_path}`:"https://via.placeholder.com/300x300?text=No+Image",P=C=>C?new Date(C).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"}):"Never",_=C=>{switch(C==null?void 0:C.toLowerCase()){case"dutchie":return"bg-green-100 text-green-700";case"jane":return"bg-purple-100 text-purple-700";case"treez":return"bg-blue-100 text-blue-700";case"weedmaps":return"bg-orange-100 text-orange-700";case"leafly":return"bg-emerald-100 text-emerald-700";default:return"bg-gray-100 text-gray-700"}},T=C=>{switch(C){case"completed":return a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-green-100 text-green-700 rounded-full flex items-center gap-1",children:[a.jsx(_r,{className:"w-3 h-3"})," Completed"]});case"running":return a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-blue-100 text-blue-700 rounded-full flex items-center gap-1",children:[a.jsx(Xt,{className:"w-3 h-3 animate-spin"})," Running"]});case"failed":return a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-red-100 text-red-700 rounded-full flex items-center gap-1",children:[a.jsx(Hr,{className:"w-3 h-3"})," Failed"]});case"pending":return a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-yellow-100 text-yellow-700 rounded-full flex items-center gap-1",children:[a.jsx(xr,{className:"w-3 h-3"})," Pending"]});default:return a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-gray-100 text-gray-700 rounded-full",children:C})}};return u?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 border-t-blue-600 rounded-full animate-spin"})})}):r?a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-start justify-between mb-6",children:[a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("button",{onClick:()=>t("/stores"),className:"text-gray-600 hover:text-gray-900 mt-1",children:"← Back"}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("h1",{className:"text-2xl font-semibold text-gray-900",children:r.name}),a.jsx("span",{className:`px-2 py-1 text-xs font-medium rounded ${_(r.provider)}`,children:r.provider||"Unknown"})]}),a.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:["Store ID: ",r.id]})]})]}),a.jsxs("a",{href:r.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-sm text-blue-600 hover:text-blue-700",children:["View Menu ",a.jsx(Jr,{className:"w-4 h-4"})]})]}),a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4 mb-6",children:[a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-gray-500 text-xs mb-1",children:[a.jsx(Ct,{className:"w-4 h-4"}),"Products"]}),a.jsx("p",{className:"text-xl font-semibold text-gray-900",children:r.product_count||0})]}),a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-gray-500 text-xs mb-1",children:[a.jsx(Cr,{className:"w-4 h-4"}),"Categories"]}),a.jsx("p",{className:"text-xl font-semibold text-gray-900",children:r.category_count||0})]}),a.jsxs("div",{className:"p-4 bg-green-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-green-600 text-xs mb-1",children:[a.jsx(_r,{className:"w-4 h-4"}),"In Stock"]}),a.jsx("p",{className:"text-xl font-semibold text-green-700",children:r.in_stock_count||0})]}),a.jsxs("div",{className:"p-4 bg-red-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-red-600 text-xs mb-1",children:[a.jsx(Hr,{className:"w-4 h-4"}),"Out of Stock"]}),a.jsx("p",{className:"text-xl font-semibold text-red-700",children:r.out_of_stock_count||0})]}),a.jsxs("div",{className:`p-4 rounded-lg ${r.is_stale?"bg-yellow-50":"bg-blue-50"}`,children:[a.jsxs("div",{className:`flex items-center gap-2 text-xs mb-1 ${r.is_stale?"text-yellow-600":"text-blue-600"}`,children:[a.jsx(xr,{className:"w-4 h-4"}),"Freshness"]}),a.jsx("p",{className:`text-sm font-semibold ${r.is_stale?"text-yellow-700":"text-blue-700"}`,children:r.freshness||"Never scraped"})]}),a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-gray-500 text-xs mb-1",children:[a.jsx(Ch,{className:"w-4 h-4"}),"Next Crawl"]}),a.jsx("p",{className:"text-sm font-semibold text-gray-700",children:($=r.schedule)!=null&&$.next_run_at?P(r.schedule.next_run_at):"Not scheduled"})]})]}),r.linked_dispensary&&a.jsxs("div",{className:"p-4 bg-indigo-50 rounded-lg mb-6",children:[a.jsxs("div",{className:"flex items-center gap-2 text-indigo-600 text-xs mb-2",children:[a.jsx(WA,{className:"w-4 h-4"}),"Linked Dispensary"]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"font-semibold text-indigo-900",children:r.linked_dispensary.name}),a.jsxs("p",{className:"text-sm text-indigo-700 flex items-center gap-1",children:[a.jsx(yi,{className:"w-3 h-3"}),r.linked_dispensary.city,", ",r.linked_dispensary.state,r.linked_dispensary.address&&` - ${r.linked_dispensary.address}`]})]}),a.jsx("button",{onClick:()=>t(`/dispensaries/${r.linked_dispensary.slug}`),className:"text-sm text-indigo-600 hover:text-indigo-700 font-medium",children:"View Dispensary →"})]})]}),a.jsxs("div",{className:"flex gap-2 border-b border-gray-200",children:[a.jsx("button",{onClick:()=>v("products"),className:`px-4 py-2 border-b-2 transition-colors ${b==="products"?"border-blue-600 text-blue-600 font-medium":"border-transparent text-gray-600 hover:text-gray-900"}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Ct,{className:"w-4 h-4"}),"Products (",i.length,")"]})}),a.jsx("button",{onClick:()=>v("brands"),className:`px-4 py-2 border-b-2 transition-colors ${b==="brands"?"border-blue-600 text-blue-600 font-medium":"border-transparent text-gray-600 hover:text-gray-900"}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Cr,{className:"w-4 h-4"}),"Brands (",c.length,")"]})}),a.jsx("button",{onClick:()=>v("specials"),className:`px-4 py-2 border-b-2 transition-colors ${b==="specials"?"border-blue-600 text-blue-600 font-medium":"border-transparent text-gray-600 hover:text-gray-900"}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx($x,{className:"w-4 h-4"}),"Specials"]})}),a.jsx("button",{onClick:()=>v("crawl-history"),className:`px-4 py-2 border-b-2 transition-colors ${b==="crawl-history"?"border-blue-600 text-blue-600 font-medium":"border-transparent text-gray-600 hover:text-gray-900"}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(na,{className:"w-4 h-4"}),"Crawl History (",((M=r.recent_jobs)==null?void 0:M.length)||0,")"]})})]})]}),b==="crawl-history"&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 overflow-hidden",children:[a.jsxs("div",{className:"p-4 border-b border-gray-200",children:[a.jsx("h2",{className:"text-lg font-semibold text-gray-900",children:"Recent Crawl Jobs"}),a.jsx("p",{className:"text-sm text-gray-500",children:"Last 10 crawl jobs for this store"})]}),r.recent_jobs&&r.recent_jobs.length>0?a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full",children:[a.jsx("thead",{className:"bg-gray-50",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Status"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Type"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Started"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Completed"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"Found"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"New"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"Updated"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"In Stock"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"Out of Stock"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Error"})]})}),a.jsx("tbody",{className:"divide-y divide-gray-100",children:r.recent_jobs.map(C=>a.jsxs("tr",{className:"hover:bg-gray-50",children:[a.jsx("td",{className:"px-4 py-3",children:T(C.status)}),a.jsx("td",{className:"px-4 py-3 text-sm text-gray-700",children:C.job_type||"-"}),a.jsx("td",{className:"px-4 py-3 text-sm text-gray-700",children:P(C.started_at)}),a.jsx("td",{className:"px-4 py-3 text-sm text-gray-700",children:P(C.completed_at)}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-gray-900",children:C.products_found??"-"}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-green-600",children:C.products_new??"-"}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-blue-600",children:C.products_updated??"-"}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-green-600",children:C.in_stock_count??"-"}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-red-600",children:C.out_of_stock_count??"-"}),a.jsx("td",{className:"px-4 py-3 text-sm text-red-600 max-w-xs truncate",title:C.error_message||"",children:C.error_message||"-"})]},C.id))})]})}):a.jsxs("div",{className:"text-center py-12",children:[a.jsx(na,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("p",{className:"text-gray-500",children:"No crawl history available"})]})]}),b==="products"&&a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"bg-white rounded-xl border border-gray-200 p-4",children:a.jsxs("div",{className:"flex flex-wrap gap-4",children:[a.jsxs("div",{className:"flex-1 min-w-[200px]",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Category"}),a.jsxs("select",{value:p||"",onChange:C=>m(C.target.value?parseInt(C.target.value):null),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"",children:"All Categories"}),o.map(C=>a.jsxs("option",{value:C.id,children:[C.name," (",i.filter(R=>R.category_id===C.id).length,")"]},C.id))]})]}),a.jsxs("div",{className:"flex-1 min-w-[200px]",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Brand"}),a.jsxs("select",{value:x,onChange:C=>g(C.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"",children:"All Brands"}),c.map(C=>a.jsx("option",{value:C,children:C},C))]})]}),a.jsxs("div",{className:"flex-1 min-w-[200px]",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Sort By"}),a.jsxs("select",{value:j,onChange:C=>y(C.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"name",children:"Name (A-Z)"}),a.jsx("option",{value:"price_asc",children:"Price (Low to High)"}),a.jsx("option",{value:"price_desc",children:"Price (High to Low)"}),a.jsx("option",{value:"thc",children:"THC % (High to Low)"})]})]})]})}),i.length>0?a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:i.map(C=>a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 overflow-hidden hover:shadow-lg transition-shadow",children:[a.jsxs("div",{className:"aspect-square bg-gray-50 relative",children:[a.jsx("img",{src:N(C),alt:C.name,className:"w-full h-full object-cover"}),C.in_stock?a.jsx("span",{className:"absolute top-2 right-2 px-2 py-1 bg-green-500 text-white text-xs font-medium rounded",children:"In Stock"}):a.jsx("span",{className:"absolute top-2 right-2 px-2 py-1 bg-red-500 text-white text-xs font-medium rounded",children:"Out of Stock"})]}),a.jsxs("div",{className:"p-3 space-y-2",children:[a.jsx("h3",{className:"font-semibold text-sm text-gray-900 line-clamp-2",children:C.name}),C.brand&&a.jsx("p",{className:"text-xs text-gray-600 font-medium",children:C.brand}),C.category_name&&a.jsx("p",{className:"text-xs text-gray-500",children:C.category_name}),a.jsxs("div",{className:"grid grid-cols-2 gap-2 pt-2 border-t border-gray-100",children:[C.price!==null&&a.jsxs("div",{className:"text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"Price:"}),a.jsxs("span",{className:"ml-1 font-semibold text-blue-600",children:["$",parseFloat(C.price).toFixed(2)]})]}),C.weight&&a.jsxs("div",{className:"text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"Weight:"}),a.jsx("span",{className:"ml-1 font-medium",children:C.weight})]}),C.thc_percentage!==null&&a.jsxs("div",{className:"text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"THC:"}),a.jsxs("span",{className:"ml-1 font-medium text-green-600",children:[C.thc_percentage,"%"]})]}),C.cbd_percentage!==null&&a.jsxs("div",{className:"text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"CBD:"}),a.jsxs("span",{className:"ml-1 font-medium text-blue-600",children:[C.cbd_percentage,"%"]})]}),C.strain_type&&a.jsxs("div",{className:"text-xs col-span-2",children:[a.jsx("span",{className:"text-gray-500",children:"Type:"}),a.jsx("span",{className:"ml-1 font-medium capitalize",children:C.strain_type})]})]}),C.description&&a.jsx("p",{className:"text-xs text-gray-600 line-clamp-2 pt-2 border-t border-gray-100",children:C.description}),C.last_seen_at&&a.jsxs("p",{className:"text-xs text-gray-400 pt-2 border-t border-gray-100",children:["Updated: ",new Date(C.last_seen_at).toLocaleDateString()]}),a.jsxs("div",{className:"flex gap-2 mt-3 pt-3 border-t border-gray-100",children:[C.dutchie_url&&a.jsx("a",{href:C.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"flex-1 px-3 py-2 bg-gray-100 text-gray-700 text-sm font-medium rounded-lg hover:bg-gray-200 transition-colors text-center border border-gray-200",children:"Dutchie"}),a.jsx("button",{onClick:()=>t(`/products/${C.id}`),className:"flex-1 px-3 py-2 bg-blue-600 text-white text-sm font-medium rounded-lg hover:bg-blue-700 transition-colors",children:"Details"})]})]})]},C.id))}):a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-12 text-center",children:[a.jsx(Ct,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"No products found"}),a.jsx("p",{className:"text-gray-500",children:"Try adjusting your filters"})]})]}),b==="brands"&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("h2",{className:"text-lg font-semibold text-gray-900 mb-4",children:["All Brands (",c.length,")"]}),c.length>0?a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-3",children:c.map(C=>{const R=i.filter(q=>q.brand===C);return a.jsxs("div",{className:"p-4 border border-gray-200 rounded-lg hover:border-blue-500 hover:bg-blue-50 transition-all cursor-pointer",onClick:()=>{v("products"),g(C)},children:[a.jsx("p",{className:"font-medium text-gray-900 text-sm",children:C}),a.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:[R.length," products"]})]},C)})}):a.jsxs("div",{className:"text-center py-12",children:[a.jsx(Cr,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("p",{className:"text-gray-500",children:"No brands found"})]})]}),b==="specials"&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsx("h2",{className:"text-lg font-semibold text-gray-900 mb-4",children:"Daily Specials"}),a.jsxs("div",{className:"text-center py-12",children:[a.jsx($x,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("p",{className:"text-gray-500",children:"No specials available"})]})]})]})}):a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:"Store not found"}),a.jsx("button",{onClick:()=>t("/stores"),className:"text-blue-600 hover:text-blue-700",children:"← Back to stores"})]})})}function nF(){const{state:e,storeName:t,slug:r}=ka(),n=dt(),[i,s]=h.useState(null),[o,l]=h.useState([]),[c,d]=h.useState(!0);h.useEffect(()=>{u()},[r]);const u=async()=>{d(!0);try{const p=(await B.getStores()).stores.find(x=>x.slug===r);if(!p)throw new Error("Store not found");s(p);const m=await B.getStoreBrands(p.id);l(m.brands)}catch(f){console.error("Failed to load brands:",f)}finally{d(!1)}};return c?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("span",{className:"loading loading-spinner loading-lg"})})}):i?a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsx("button",{onClick:()=>n(`/stores/${e}/${t}/${r}`),className:"btn btn-ghost btn-sm",children:"← Back to Store"}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("h1",{className:"text-3xl font-bold",children:[i.name," - Brands"]}),a.jsxs("div",{className:"flex gap-3 mt-2",children:[a.jsx("a",{href:`${i.dutchie_url}/brands`,target:"_blank",rel:"noopener noreferrer",className:"link link-primary text-sm",children:"View Live Brands Page"}),a.jsx("span",{className:"text-sm text-gray-500",children:"•"}),a.jsxs("span",{className:"text-sm text-gray-500",children:[o.length," ",o.length===1?"Brand":"Brands"]})]})]})]}),o.length>0?a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:o.map((f,p)=>a.jsx("div",{className:"card bg-base-100 shadow-md hover:shadow-lg transition-shadow",children:a.jsx("div",{className:"card-body p-6",children:a.jsx("h3",{className:"text-lg font-semibold text-center",children:f})})},p))}):a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body text-center py-12",children:[a.jsx("p",{className:"text-gray-500",children:"No brands found for this store"}),a.jsx("p",{className:"text-sm text-gray-400 mt-2",children:"Brands are automatically extracted from products"})]})})]})}):a.jsx(X,{children:a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-500",children:"Store not found"})})})}function iF(){const{state:e,storeName:t,slug:r}=ka(),n=dt(),[i,s]=h.useState(null),[o,l]=h.useState([]),[c,d]=h.useState(new Date().toISOString().split("T")[0]),[u,f]=h.useState(!0);h.useEffect(()=>{p()},[r,c]);const p=async()=>{f(!0);try{const x=(await B.getStores()).stores.find(b=>b.slug===r);if(!x)throw new Error("Store not found");s(x);const g=await B.getStoreSpecials(x.id,c);l(g.specials)}catch(m){console.error("Failed to load specials:",m)}finally{f(!1)}};return u?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("span",{className:"loading loading-spinner loading-lg"})})}):i?a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsx("button",{onClick:()=>n(`/stores/${e}/${t}/${r}`),className:"btn btn-ghost btn-sm",children:"← Back to Store"}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("h1",{className:"text-3xl font-bold",children:[i.name," - Specials"]}),a.jsxs("div",{className:"flex gap-3 mt-2",children:[a.jsx("a",{href:`${i.dutchie_url}/specials`,target:"_blank",rel:"noopener noreferrer",className:"link link-primary text-sm",children:"View Live Specials Page"}),a.jsx("span",{className:"text-sm text-gray-500",children:"•"}),a.jsxs("span",{className:"text-sm text-gray-500",children:[o.length," ",o.length===1?"Special":"Specials"]})]})]})]}),a.jsx("div",{className:"card bg-base-100 shadow-md",children:a.jsx("div",{className:"card-body p-4",children:a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsx("label",{className:"font-semibold",children:"Select Date:"}),a.jsx("input",{type:"date",value:c,onChange:m=>d(m.target.value),className:"input input-bordered input-sm"})]})})}),o.length>0?a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:o.map((m,x)=>a.jsx("div",{className:"card bg-base-100 shadow-xl hover:shadow-2xl transition-shadow",children:a.jsxs("div",{className:"card-body",children:[a.jsx("h3",{className:"card-title text-lg",children:m.name}),m.description&&a.jsx("p",{className:"text-sm text-gray-600",children:m.description}),a.jsxs("div",{className:"space-y-2 mt-2",children:[m.original_price&&a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsx("span",{className:"text-sm opacity-60",children:"Original Price:"}),a.jsxs("span",{className:"line-through text-gray-500",children:["$",parseFloat(m.original_price).toFixed(2)]})]}),m.special_price&&a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsx("span",{className:"text-sm opacity-60",children:"Special Price:"}),a.jsxs("span",{className:"text-lg font-bold text-success",children:["$",parseFloat(m.special_price).toFixed(2)]})]}),m.discount_percentage&&a.jsxs("div",{className:"badge badge-success badge-lg",children:[m.discount_percentage,"% OFF"]}),m.discount_amount&&a.jsxs("div",{className:"badge badge-info badge-lg",children:["Save $",parseFloat(m.discount_amount).toFixed(2)]})]})]})},x))}):a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body text-center py-12",children:[a.jsxs("p",{className:"text-gray-500",children:["No specials found for ",c]}),a.jsx("p",{className:"text-sm text-gray-400 mt-2",children:"Try selecting a different date"})]})})]})}):a.jsx(X,{children:a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-500",children:"Store not found"})})})}function aF(){const[e,t]=h.useState([]),[r,n]=h.useState(null),[i,s]=h.useState([]),[o,l]=h.useState(!0);h.useEffect(()=>{c()},[]),h.useEffect(()=>{r&&d()},[r]);const c=async()=>{try{const f=await B.getStores();t(f.stores),f.stores.length>0&&n(f.stores[0].id)}catch(f){console.error("Failed to load stores:",f)}finally{l(!1)}},d=async()=>{if(r)try{const f=await B.getCategoryTree(r);s(f.tree)}catch(f){console.error("Failed to load categories:",f)}};if(o)return a.jsx(X,{children:a.jsx("div",{children:"Loading..."})});const u=e.find(f=>f.id===r);return a.jsx(X,{children:a.jsxs("div",{children:[a.jsx("h1",{style:{fontSize:"32px",marginBottom:"30px"},children:"Categories"}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"30px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"10px",fontWeight:"600"},children:"Select Store:"}),a.jsx("select",{value:r||"",onChange:f=>n(parseInt(f.target.value)),style:{width:"100%",padding:"12px",border:"2px solid #667eea",borderRadius:"6px",fontSize:"16px",cursor:"pointer"},children:e.map(f=>a.jsxs("option",{value:f.id,children:[f.name," (",f.category_count||0," categories)"]},f.id))})]}),u&&a.jsxs("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsxs("h2",{style:{marginBottom:"20px",fontSize:"24px"},children:[u.name," - Categories"]}),i.length===0?a.jsx("div",{style:{color:"#999",textAlign:"center",padding:"40px"},children:'No categories found. Run "Discover Categories" from the Stores page.'}):a.jsx("div",{children:i.map(f=>a.jsx(kk,{category:f},f.id))})]})]})})}function kk({category:e,level:t=0}){return a.jsxs("div",{style:{marginLeft:t*30+"px",marginBottom:"10px"},children:[a.jsxs("div",{style:{padding:"12px 15px",background:t===0?"#f0f0ff":"#f8f9fa",borderRadius:"6px",borderLeft:`4px solid ${t===0?"#667eea":"#999"}`,display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("div",{children:[a.jsxs("strong",{style:{fontSize:t===0?"16px":"14px"},children:[t>0&&"└── ",e.name]}),a.jsxs("span",{style:{marginLeft:"10px",color:"#666",fontSize:"12px"},children:["(",e.product_count||0," products)"]})]}),a.jsx("div",{style:{fontSize:"12px",color:"#999"},children:a.jsx("code",{children:e.path})})]}),e.children&&e.children.length>0&&a.jsx("div",{style:{marginTop:"5px"},children:e.children.map(r=>a.jsx(kk,{category:r,level:t+1},r.id))})]})}function Vn({message:e,type:t,onClose:r,duration:n=4e3}){h.useEffect(()=>{const s=setTimeout(r,n);return()=>clearTimeout(s)},[n,r]);const i={success:"#10b981",error:"#ef4444",info:"#3b82f6"};return a.jsxs("div",{style:{position:"fixed",top:"20px",right:"20px",background:i[t],color:"white",padding:"16px 24px",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:9999,maxWidth:"400px",animation:"slideIn 0.3s ease-out",fontSize:"14px",fontWeight:"500"},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"12px"},children:[a.jsx("div",{style:{flex:1,whiteSpace:"pre-wrap"},children:e}),a.jsx("button",{onClick:r,style:{background:"transparent",border:"none",color:"white",cursor:"pointer",fontSize:"18px",padding:"0 4px",opacity:.8},children:"×"})]}),a.jsx("style",{children:` - @keyframes slideIn { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } - } - `})]})}function sF(){const[e,t]=h.useState([]),[r,n]=h.useState(!0),[i,s]=h.useState(!1),[o,l]=h.useState(null);h.useEffect(()=>{c()},[]);const c=async()=>{n(!0);try{const u=await B.getCampaigns();t(u.campaigns)}catch(u){console.error("Failed to load campaigns:",u)}finally{n(!1)}},d=async(u,f)=>{if(confirm(`Are you sure you want to delete campaign "${f}"?`))try{await B.deleteCampaign(u),c()}catch(p){l({message:"Failed to delete campaign: "+p.message,type:"error"})}};return r?a.jsx(X,{children:a.jsx("div",{children:"Loading..."})}):a.jsxs(X,{children:[o&&a.jsx(Vn,{message:o.message,type:o.type,onClose:()=>l(null)}),a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Campaigns"}),a.jsx("button",{onClick:()=>s(!0),style:{padding:"12px 24px",background:"#667eea",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px",fontWeight:"500"},children:"+ Create Campaign"})]}),i&&a.jsx(oF,{onClose:()=>s(!1),onSuccess:()=>{s(!1),c()}}),a.jsx("div",{style:{display:"grid",gap:"20px"},children:e.map(u=>a.jsx("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsxs("h3",{style:{marginBottom:"10px",fontSize:"20px"},children:[u.name,a.jsx("span",{style:{marginLeft:"10px",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",background:u.active?"#d4edda":"#f8d7da",color:u.active?"#155724":"#721c24"},children:u.active?"Active":"Inactive"})]}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"5px"},children:[a.jsx("strong",{children:"Slug:"})," ",u.slug]}),u.description&&a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"5px"},children:[a.jsx("strong",{children:"Description:"})," ",u.description]}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"5px"},children:[a.jsx("strong",{children:"Display Style:"})," ",u.display_style]}),a.jsxs("div",{style:{fontSize:"14px",color:"#666"},children:[a.jsx("strong",{children:"Products:"})," ",u.product_count||0]})]}),a.jsx("div",{style:{display:"flex",gap:"10px"},children:a.jsx("button",{onClick:()=>d(u.id,u.name),style:{padding:"8px 16px",background:"#e74c3c",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px"},children:"Delete"})})]})},u.id))}),e.length===0&&!i&&a.jsx("div",{style:{background:"white",padding:"40px",borderRadius:"8px",textAlign:"center",color:"#999"},children:"No campaigns found"})]})]})}function oF({onClose:e,onSuccess:t}){const[r,n]=h.useState(""),[i,s]=h.useState(""),[o,l]=h.useState(""),[c,d]=h.useState("grid"),[u,f]=h.useState(!0),[p,m]=h.useState(!1),[x,g]=h.useState(null),b=async v=>{v.preventDefault(),m(!0);try{await B.createCampaign({name:r,slug:i,description:o,display_style:c,active:u}),t()}catch(j){g({message:"Failed to create campaign: "+j.message,type:"error"})}finally{m(!1)}};return a.jsxs("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"20px"},children:[x&&a.jsx(Vn,{message:x.message,type:x.type,onClose:()=>g(null)}),a.jsx("h3",{style:{marginBottom:"20px"},children:"Create New Campaign"}),a.jsxs("form",{onSubmit:b,children:[a.jsxs("div",{style:{display:"grid",gap:"15px"},children:[a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"5px",fontWeight:"500"},children:"Name *"}),a.jsx("input",{type:"text",value:r,onChange:v=>n(v.target.value),required:!0,style:{width:"100%",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"}})]}),a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"5px",fontWeight:"500"},children:"Slug *"}),a.jsx("input",{type:"text",value:i,onChange:v=>s(v.target.value),required:!0,placeholder:"e.g., summer-sale",style:{width:"100%",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"}})]}),a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"5px",fontWeight:"500"},children:"Description"}),a.jsx("textarea",{value:o,onChange:v=>l(v.target.value),rows:3,style:{width:"100%",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"}})]}),a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"5px",fontWeight:"500"},children:"Display Style"}),a.jsxs("select",{value:c,onChange:v=>d(v.target.value),style:{width:"100%",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"grid",children:"Grid"}),a.jsx("option",{value:"list",children:"List"}),a.jsx("option",{value:"carousel",children:"Carousel"})]})]}),a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[a.jsx("input",{type:"checkbox",id:"active",checked:u,onChange:v=>f(v.target.checked)}),a.jsx("label",{htmlFor:"active",children:"Active"})]})]}),a.jsxs("div",{style:{display:"flex",gap:"10px",marginTop:"20px"},children:[a.jsx("button",{type:"submit",disabled:p,style:{padding:"10px 20px",background:p?"#999":"#667eea",color:"white",border:"none",borderRadius:"6px",cursor:p?"not-allowed":"pointer",fontSize:"14px"},children:p?"Creating...":"Create Campaign"}),a.jsx("button",{type:"button",onClick:e,style:{padding:"10px 20px",background:"#ddd",color:"#333",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px"},children:"Cancel"})]})]})]})}function lF(){var l,c,d,u;const[e,t]=h.useState(null),[r,n]=h.useState(!0),[i,s]=h.useState(30);h.useEffect(()=>{o()},[i]);const o=async()=>{n(!0);try{const f=await B.getAnalyticsOverview(i);t(f)}catch(f){console.error("Failed to load analytics:",f)}finally{n(!1)}};return r?a.jsx(X,{children:a.jsx("div",{children:"Loading..."})}):a.jsx(X,{children:a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Analytics"}),a.jsxs("select",{value:i,onChange:f=>s(parseInt(f.target.value)),style:{padding:"10px 15px",border:"1px solid #ddd",borderRadius:"6px",fontSize:"14px"},children:[a.jsx("option",{value:7,children:"Last 7 days"}),a.jsx("option",{value:30,children:"Last 30 days"}),a.jsx("option",{value:90,children:"Last 90 days"}),a.jsx("option",{value:365,children:"Last year"})]})]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(250px, 1fr))",gap:"20px",marginBottom:"30px"},children:[a.jsx(wv,{title:"Total Clicks",value:((l=e==null?void 0:e.overview)==null?void 0:l.total_clicks)||0,icon:"👆",color:"#3498db"}),a.jsx(wv,{title:"Unique Products Clicked",value:((c=e==null?void 0:e.overview)==null?void 0:c.unique_products)||0,icon:"📦",color:"#2ecc71"})]}),a.jsxs("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"30px"},children:[a.jsx("h3",{style:{marginBottom:"20px"},children:"Clicks Over Time"}),((d=e==null?void 0:e.clicks_by_day)==null?void 0:d.length)>0?a.jsx("div",{style:{overflowX:"auto"},children:a.jsx("div",{style:{display:"flex",alignItems:"flex-end",gap:"8px",minWidth:"600px",height:"200px"},children:e.clicks_by_day.slice().reverse().map((f,p)=>{const m=Math.max(...e.clicks_by_day.map(g=>g.clicks)),x=f.clicks/m*180;return a.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",alignItems:"center"},children:[a.jsx("div",{style:{width:"100%",height:`${x}px`,background:"#667eea",borderRadius:"4px 4px 0 0",position:"relative",minHeight:"2px"},title:`${f.clicks} clicks`,children:a.jsx("div",{style:{position:"absolute",top:"-25px",left:"50%",transform:"translateX(-50%)",fontSize:"12px",fontWeight:"bold"},children:f.clicks})}),a.jsx("div",{style:{fontSize:"10px",marginTop:"5px",color:"#666",transform:"rotate(-45deg)",transformOrigin:"left",whiteSpace:"nowrap"},children:new Date(f.date).toLocaleDateString("en-US",{month:"short",day:"numeric"})})]},p)})})}):a.jsx("div",{style:{color:"#999",textAlign:"center",padding:"40px"},children:"No click data for this period"})]}),a.jsxs("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("h3",{style:{marginBottom:"20px"},children:"Top Products"}),((u=e==null?void 0:e.top_products)==null?void 0:u.length)>0?a.jsx("div",{children:e.top_products.map((f,p)=>a.jsxs("div",{style:{padding:"15px 0",borderBottom:p{u()},[]);const u=async()=>{n(!0);try{const x=await B.getSettings();t(x.settings)}catch(x){console.error("Failed to load settings:",x)}finally{n(!1)}},f=(x,g)=>{l(b=>({...b,[x]:g}))},p=async()=>{s(!0);try{const x=Object.entries(o).map(([g,b])=>({key:g,value:b}));await B.updateSettings(x),l({}),u(),d({message:"Settings saved successfully!",type:"success"})}catch(x){d({message:"Failed to save settings: "+x.message,type:"error"})}finally{s(!1)}},m=Object.keys(o).length>0;return r?a.jsx(X,{children:a.jsx("div",{children:"Loading..."})}):a.jsxs(X,{children:[c&&a.jsx(Vn,{message:c.message,type:c.type,onClose:()=>d(null)}),a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Settings"}),m&&a.jsx("button",{onClick:p,disabled:i,style:{padding:"12px 24px",background:i?"#999":"#2ecc71",color:"white",border:"none",borderRadius:"6px",cursor:i?"not-allowed":"pointer",fontSize:"14px",fontWeight:"500"},children:i?"Saving...":"Save Changes"})]}),a.jsx("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:a.jsx("div",{style:{display:"grid",gap:"25px"},children:e.map(x=>{const g=o[x.key]!==void 0?o[x.key]:x.value;return a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"500",fontSize:"16px"},children:uF(x.key)}),x.description&&a.jsx("div",{style:{fontSize:"13px",color:"#666",marginBottom:"8px"},children:x.description}),a.jsx("input",{type:"text",value:g,onChange:b=>f(x.key,b.target.value),style:{width:"100%",maxWidth:"500px",padding:"10px",border:o[x.key]!==void 0?"2px solid #667eea":"1px solid #ddd",borderRadius:"6px",fontSize:"14px"}}),a.jsxs("div",{style:{fontSize:"12px",color:"#999",marginTop:"5px"},children:["Last updated: ",new Date(x.updated_at).toLocaleString()]})]},x.key)})})}),m&&a.jsx("div",{style:{marginTop:"20px",padding:"15px",background:"#fff3cd",border:"1px solid #ffc107",borderRadius:"6px",color:"#856404"},children:'⚠️ You have unsaved changes. Click "Save Changes" to apply them.'})]})]})}function uF(e){return e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function dF(){const[e,t]=h.useState([]),[r,n]=h.useState(!0),[i,s]=h.useState(!1),[o,l]=h.useState({}),[c,d]=h.useState(null),[u,f]=h.useState(null);h.useEffect(()=>{p(),m()},[]),h.useEffect(()=>{if(!(c!=null&&c.id))return;if(c.status==="completed"||c.status==="cancelled"||c.status==="failed"){p();return}const P=setInterval(async()=>{try{const _=await B.getProxyTestJob(c.id);d(_.job),(_.job.status==="completed"||_.job.status==="cancelled"||_.job.status==="failed")&&(clearInterval(P),p())}catch(_){console.error("Failed to poll job status:",_)}},2e3);return()=>clearInterval(P)},[c==null?void 0:c.id]);const p=async()=>{n(!0);try{const N=await B.getProxies();t(N.proxies)}catch(N){console.error("Failed to load proxies:",N)}finally{n(!1)}},m=async()=>{try{const N=await B.getActiveProxyTestJob();N.job&&d(N.job)}catch{console.log("No active job found")}},x=async N=>{l(P=>({...P,[N]:!0}));try{await B.testProxy(N),p()}catch(P){f({message:"Test failed: "+P.message,type:"error"})}finally{l(P=>({...P,[N]:!1}))}},g=async N=>{l(P=>({...P,[N]:!0})),B.testProxy(N).then(()=>{p(),l(P=>({...P,[N]:!1}))}).catch(()=>{l(P=>({...P,[N]:!1}))})},b=async()=>{try{const N=await B.testAllProxies();f({message:"Proxy testing job started",type:"success"}),d({id:N.jobId,status:"pending",tested_proxies:0,total_proxies:e.length,passed_proxies:0,failed_proxies:0})}catch(N){f({message:"Failed to start testing: "+N.message,type:"error"})}},v=async()=>{if(c!=null&&c.id)try{await B.cancelProxyTestJob(c.id),f({message:"Job cancelled",type:"info"})}catch(N){f({message:"Failed to cancel job: "+N.message,type:"error"})}},j=async()=>{try{await B.updateProxyLocations(),f({message:"Location update job started",type:"success"})}catch(N){f({message:"Failed to start location update: "+N.message,type:"error"})}},y=async N=>{if(confirm("Delete this proxy?"))try{await B.deleteProxy(N),p()}catch(P){f({message:"Failed to delete proxy: "+P.message,type:"error"})}};if(r)return a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 border-t-blue-600 rounded-full animate-spin"})})});const w={total:e.length,passed:e.filter(N=>N.active).length,failed:e.filter(N=>!N.active).length},S=w.total>0?Math.round(w.passed/w.total*100):0;return a.jsxs(X,{children:[u&&a.jsx(Vn,{message:u.message,type:u.type,onClose:()=>f(null)}),a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(sl,{className:"w-6 h-6 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-semibold text-gray-900",children:"Proxies"}),a.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:[w.total," total • ",w.passed," active • ",w.failed," inactive"]})]})]}),a.jsxs("div",{className:"flex gap-2",children:[a.jsxs("button",{onClick:b,disabled:!!c&&c.status!=="completed"&&c.status!=="cancelled"&&c.status!=="failed",className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-50 text-blue-700 rounded-lg hover:bg-blue-100 transition-colors text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Test All"]}),a.jsxs("button",{onClick:j,className:"inline-flex items-center gap-2 px-4 py-2 bg-purple-50 text-purple-700 rounded-lg hover:bg-purple-100 transition-colors text-sm font-medium",children:[a.jsx(yi,{className:"w-4 h-4"}),"Update Locations"]}),a.jsxs("button",{onClick:()=>s(!0),className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-sm font-medium",children:[a.jsx(Af,{className:"w-4 h-4"}),"Add Proxy"]})]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(sl,{className:"w-5 h-5 text-blue-600"})}),a.jsx("div",{className:"flex items-center gap-1 text-xs text-gray-500",children:a.jsxs("span",{children:[S,"% pass rate"]})})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Total Proxies"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:w.total})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(_r,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{className:"flex items-center gap-1 text-xs text-green-600",children:[a.jsx(zn,{className:"w-3 h-3"}),a.jsxs("span",{children:[Math.round(w.passed/w.total*100)||0,"%"]})]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Active"}),a.jsx("p",{className:"text-3xl font-semibold text-green-600",children:w.passed}),a.jsx("p",{className:"text-xs text-gray-500",children:"Passing health checks"})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-red-50 rounded-lg",children:a.jsx(Hr,{className:"w-5 h-5 text-red-600"})}),a.jsx("div",{className:"flex items-center gap-1 text-xs text-red-600",children:a.jsxs("span",{children:[Math.round(w.failed/w.total*100)||0,"%"]})})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Inactive"}),a.jsx("p",{className:"text-3xl font-semibold text-red-600",children:w.failed}),a.jsx("p",{className:"text-xs text-gray-500",children:"Failed health checks"})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsx("div",{className:"flex items-center justify-between mb-4",children:a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(zn,{className:"w-5 h-5 text-purple-600"})})}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Success Rate"}),a.jsxs("p",{className:"text-3xl font-semibold text-gray-900",children:[S,"%"]}),a.jsx("div",{className:"w-full bg-gray-200 rounded-full h-2 mt-3",children:a.jsx("div",{className:"bg-green-600 h-2 rounded-full transition-all",style:{width:`${S}%`}})})]})]})]}),c&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex justify-between items-center mb-4",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Xt,{className:`w-5 h-5 text-blue-600 ${c.status==="running"?"animate-spin":""}`})}),a.jsxs("div",{children:[a.jsx("h3",{className:"font-semibold text-gray-900",children:"Proxy Testing Job"}),a.jsx("p",{className:"text-sm text-gray-500",children:c.status.charAt(0).toUpperCase()+c.status.slice(1)})]})]}),a.jsxs("div",{className:"flex gap-2",children:[c.status==="running"&&a.jsx("button",{onClick:v,className:"px-3 py-1.5 bg-red-50 text-red-700 rounded-lg hover:bg-red-100 transition-colors text-sm font-medium",children:"Cancel"}),(c.status==="completed"||c.status==="cancelled"||c.status==="failed")&&a.jsx("button",{onClick:()=>d(null),className:"px-3 py-1.5 text-gray-600 hover:bg-gray-50 rounded-lg transition-colors text-sm font-medium",children:"Dismiss"})]})]}),a.jsxs("div",{className:"mb-4",children:[a.jsxs("div",{className:"text-sm text-gray-600 mb-2",children:["Progress: ",c.tested_proxies||0," / ",c.total_proxies||0," proxies tested"]}),a.jsx("div",{className:"w-full bg-gray-200 rounded-full h-2",children:a.jsx("div",{className:`h-2 rounded-full transition-all ${c.status==="completed"?"bg-green-600":c.status==="cancelled"||c.status==="failed"?"bg-red-600":"bg-blue-600"}`,style:{width:`${(c.tested_proxies||0)/(c.total_proxies||100)*100}%`}})})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm text-gray-600",children:"Passed:"}),a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-green-50 text-green-700 rounded",children:c.passed_proxies||0})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm text-gray-600",children:"Failed:"}),a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-red-50 text-red-700 rounded",children:c.failed_proxies||0})]})]}),c.error&&a.jsxs("div",{className:"mt-4 p-3 bg-red-50 border border-red-200 rounded-lg flex items-start gap-2",children:[a.jsx(Uc,{className:"w-5 h-5 text-red-600 flex-shrink-0 mt-0.5"}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm font-medium text-red-900",children:"Error"}),a.jsx("p",{className:"text-sm text-red-700",children:c.error})]})]})]}),i&&a.jsx(fF,{onClose:()=>s(!1),onSuccess:()=>{s(!1),p()}}),a.jsx("div",{className:"space-y-3",children:e.map(N=>a.jsx("div",{className:"bg-white rounded-xl border border-gray-200 p-4 hover:shadow-lg transition-shadow",children:a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsxs("div",{className:"flex-1",children:[a.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[a.jsxs("h3",{className:"font-semibold text-gray-900",children:[N.protocol,"://",N.host,":",N.port]}),a.jsx("span",{className:`px-2 py-1 text-xs font-medium rounded ${N.active?"bg-green-50 text-green-700":"bg-red-50 text-red-700"}`,children:N.active?"Active":"Inactive"}),N.is_anonymous&&a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-blue-50 text-blue-700 rounded",children:"Anonymous"}),(N.city||N.state||N.country)&&a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-purple-50 text-purple-700 rounded flex items-center gap-1",children:[a.jsx(yi,{className:"w-3 h-3"}),N.city&&`${N.city}/`,N.state&&`${N.state.substring(0,2).toUpperCase()} `,N.country]})]}),a.jsx("div",{className:"text-sm text-gray-600",children:N.last_tested_at?a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(xr,{className:"w-4 h-4 text-gray-400"}),a.jsxs("span",{children:["Last tested: ",new Date(N.last_tested_at).toLocaleString()]})]}),N.test_result==="success"?a.jsxs("span",{className:"flex items-center gap-1 text-green-600",children:[a.jsx(_r,{className:"w-4 h-4"}),"Success (",N.response_time_ms,"ms)"]}):a.jsxs("span",{className:"flex items-center gap-1 text-red-600",children:[a.jsx(Hr,{className:"w-4 h-4"}),"Failed"]})]}):"Not tested yet"})]}),a.jsxs("div",{className:"flex gap-2",children:[N.active?a.jsx("button",{onClick:()=>x(N.id),disabled:o[N.id],className:"inline-flex items-center gap-1 px-3 py-1.5 bg-blue-50 text-blue-700 rounded-lg hover:bg-blue-100 transition-colors text-sm font-medium disabled:opacity-50",children:o[N.id]?a.jsx("div",{className:"w-4 h-4 border-2 border-blue-700 border-t-transparent rounded-full animate-spin"}):a.jsxs(a.Fragment,{children:[a.jsx(Xt,{className:"w-4 h-4"}),"Test"]})}):a.jsx("button",{onClick:()=>g(N.id),disabled:o[N.id],className:"inline-flex items-center gap-1 px-3 py-1.5 bg-yellow-50 text-yellow-700 rounded-lg hover:bg-yellow-100 transition-colors text-sm font-medium disabled:opacity-50",children:o[N.id]?a.jsx("div",{className:"w-4 h-4 border-2 border-yellow-700 border-t-transparent rounded-full animate-spin"}):a.jsxs(a.Fragment,{children:[a.jsx(Xt,{className:"w-4 h-4"}),"Retest"]})}),a.jsxs("button",{onClick:()=>y(N.id),className:"inline-flex items-center gap-1 px-3 py-1.5 bg-red-50 text-red-700 rounded-lg hover:bg-red-100 transition-colors text-sm font-medium",children:[a.jsx(LO,{className:"w-4 h-4"}),"Delete"]})]})]})},N.id))}),e.length===0&&!i&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-12 text-center",children:[a.jsx(sl,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("h3",{className:"text-xl font-semibold text-gray-900 mb-2",children:"No proxies configured"}),a.jsx("p",{className:"text-gray-500 mb-6",children:"Add your first proxy to get started with scraping"}),a.jsxs("button",{onClick:()=>s(!0),className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium",children:[a.jsx(Af,{className:"w-4 h-4"}),"Add Proxy"]})]})]})]})}function fF({onClose:e,onSuccess:t}){const[r,n]=h.useState("single"),[i,s]=h.useState(""),[o,l]=h.useState(""),[c,d]=h.useState("http"),[u,f]=h.useState(""),[p,m]=h.useState(""),[x,g]=h.useState(""),[b,v]=h.useState(!1),[j,y]=h.useState(null),w=_=>{if(_=_.trim(),!_||_.startsWith("#"))return null;let T;return T=_.match(/^(https?|socks5):\/\/([^:]+):([^@]+)@([^:]+):(\d+)$/),T?{protocol:T[1],username:T[2],password:T[3],host:T[4],port:parseInt(T[5])}:(T=_.match(/^(https?|socks5):\/\/([^:]+):(\d+)$/),T?{protocol:T[1],host:T[2],port:parseInt(T[3])}:(T=_.match(/^([^:]+):(\d+):([^:]+):(.+)$/),T?{protocol:"http",host:T[1],port:parseInt(T[2]),username:T[3],password:T[4]}:(T=_.match(/^([^:]+):(\d+)$/),T?{protocol:"http",host:T[1],port:parseInt(T[2])}:null)))},S=async()=>{const T=x.split(` -`).map($=>w($)).filter($=>$!==null);if(T.length===0){y({message:"No valid proxies found. Please check the format.",type:"error"});return}v(!0);try{const $=await B.addProxiesBulk(T),M=`Import complete! - -Added: ${$.added} -Duplicates: ${$.duplicates||0} -Failed: ${$.failed} - -Proxies are inactive by default. Use "Test All Proxies" to verify and activate them.`;y({message:M,type:"success"}),t()}catch($){y({message:"Failed to import proxies: "+$.message,type:"error"})}finally{v(!1)}},N=async _=>{var M;const T=(M=_.target.files)==null?void 0:M[0];if(!T)return;const $=await T.text();g($)},P=async _=>{if(_.preventDefault(),r==="bulk"){await S();return}v(!0);try{await B.addProxy({host:i,port:parseInt(o),protocol:c,username:u||void 0,password:p||void 0}),t()}catch(T){y({message:"Failed to add proxy: "+T.message,type:"error"})}finally{v(!1)}};return a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200",children:[j&&a.jsx(Vn,{message:j.message,type:j.type,onClose:()=>y(null)}),a.jsxs("div",{className:"p-6",children:[a.jsxs("div",{className:"flex justify-between items-center mb-6",children:[a.jsx("h2",{className:"text-xl font-semibold text-gray-900",children:"Add Proxies"}),a.jsxs("div",{className:"flex bg-gray-100 rounded-lg p-1",children:[a.jsx("button",{type:"button",onClick:()=>n("single"),className:`px-4 py-2 rounded-md text-sm font-medium transition-colors ${r==="single"?"bg-white text-gray-900 shadow-sm":"text-gray-600 hover:text-gray-900"}`,children:"Single"}),a.jsx("button",{type:"button",onClick:()=>n("bulk"),className:`px-4 py-2 rounded-md text-sm font-medium transition-colors ${r==="bulk"?"bg-white text-gray-900 shadow-sm":"text-gray-600 hover:text-gray-900"}`,children:"Bulk Import"})]})]}),a.jsxs("form",{onSubmit:P,children:[r==="single"?a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Host *"}),a.jsx("input",{type:"text",value:i,onChange:_=>s(_.target.value),required:!0,placeholder:"proxy.example.com",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Port *"}),a.jsx("input",{type:"number",value:o,onChange:_=>l(_.target.value),required:!0,placeholder:"8080",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Protocol *"}),a.jsxs("select",{value:c,onChange:_=>d(_.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"http",children:"HTTP"}),a.jsx("option",{value:"https",children:"HTTPS"}),a.jsx("option",{value:"socks5",children:"SOCKS5"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Username"}),a.jsx("input",{type:"text",value:u,onChange:_=>f(_.target.value),placeholder:"Optional",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]}),a.jsxs("div",{className:"md:col-span-2",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Password"}),a.jsx("input",{type:"password",value:p,onChange:_=>m(_.target.value),placeholder:"Optional",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]})]}):a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Upload File"}),a.jsxs("label",{className:"flex items-center justify-center w-full px-4 py-6 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-colors",children:[a.jsxs("div",{className:"flex flex-col items-center",children:[a.jsx(UO,{className:"w-8 h-8 text-gray-400 mb-2"}),a.jsx("span",{className:"text-sm text-gray-600",children:"Click to upload or drag and drop"}),a.jsx("span",{className:"text-xs text-gray-500 mt-1",children:".txt or .list files"})]}),a.jsx("input",{type:"file",accept:".txt,.list",onChange:N,className:"hidden"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Or Paste Proxies (one per line)"}),a.jsx("textarea",{value:x,onChange:_=>g(_.target.value),placeholder:`Supported formats: -host:port -protocol://host:port -host:port:username:password -protocol://username:password@host:port - -Example: -192.168.1.1:8080 -http://proxy.example.com:3128 -10.0.0.1:8080:user:pass -socks5://user:pass@proxy.example.com:1080`,rows:12,className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono text-sm"})]}),a.jsxs("div",{className:"p-3 bg-blue-50 border border-blue-200 rounded-lg flex items-start gap-2",children:[a.jsx(Uc,{className:"w-5 h-5 text-blue-600 flex-shrink-0 mt-0.5"}),a.jsx("span",{className:"text-sm text-blue-900",children:"Lines starting with # are treated as comments and ignored."})]})]}),a.jsxs("div",{className:"flex justify-end gap-3 mt-6 pt-6 border-t border-gray-200",children:[a.jsx("button",{type:"button",onClick:e,className:"px-4 py-2 text-gray-700 hover:bg-gray-50 rounded-lg transition-colors font-medium",children:"Cancel"}),a.jsx("button",{type:"submit",disabled:b,className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium disabled:opacity-50 disabled:cursor-not-allowed",children:b?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin"}),a.jsx("span",{children:"Processing..."})]}):a.jsxs(a.Fragment,{children:[a.jsx(Af,{className:"w-4 h-4"}),r==="bulk"?"Import Proxies":"Add Proxy"]})})]})]})]})]})}function pF(){const[e,t]=h.useState([]),[r,n]=h.useState(!0),[i,s]=h.useState(!0),[o,l]=h.useState(""),[c,d]=h.useState(""),[u,f]=h.useState(200),[p,m]=h.useState(null),x=h.useRef(null);h.useEffect(()=>{g()},[o,c,u]),h.useEffect(()=>{if(!i)return;const S=setInterval(()=>{g()},2e3);return()=>clearInterval(S)},[i,o,c,u]);const g=async()=>{try{const S=await B.getLogs(u,o,c);t(S.logs)}catch(S){console.error("Failed to load logs:",S)}finally{n(!1)}},b=async()=>{if(confirm("Are you sure you want to clear all logs?"))try{await B.clearLogs(),t([]),m({message:"Logs cleared successfully",type:"success"})}catch(S){m({message:"Failed to clear logs: "+S.message,type:"error"})}},v=()=>{var S;(S=x.current)==null||S.scrollIntoView({behavior:"smooth"})},j=S=>{switch(S){case"error":return"#dc3545";case"warn":return"#ffc107";case"info":return"#17a2b8";case"debug":return"#6c757d";default:return"#333"}},y=S=>{switch(S){case"error":return"#f8d7da";case"warn":return"#fff3cd";case"info":return"#d1ecf1";case"debug":return"#e2e3e5";default:return"#f8f9fa"}},w=S=>{switch(S){case"scraper":return"🔍";case"images":return"📸";case"categories":return"📂";case"system":return"⚙️";case"api":return"🌐";default:return"📝"}};return r?a.jsx(X,{children:a.jsx("div",{children:"Loading logs..."})}):a.jsxs(X,{children:[p&&a.jsx(Vn,{message:p.message,type:p.type,onClose:()=>m(null)}),a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"20px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"System Logs"}),a.jsxs("div",{style:{display:"flex",gap:"10px",alignItems:"center"},children:[a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"5px"},children:[a.jsx("input",{type:"checkbox",checked:i,onChange:S=>s(S.target.checked)}),"Auto-refresh (2s)"]}),a.jsx("button",{onClick:v,style:{padding:"8px 16px",background:"#6c757d",color:"white",border:"none",borderRadius:"6px",cursor:"pointer"},children:"⬇️ Scroll to Bottom"}),a.jsx("button",{onClick:b,style:{padding:"8px 16px",background:"#dc3545",color:"white",border:"none",borderRadius:"6px",cursor:"pointer"},children:"🗑️ Clear Logs"})]})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"20px",display:"flex",gap:"15px",flexWrap:"wrap"},children:[a.jsxs("select",{value:o,onChange:S=>l(S.target.value),style:{padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"",children:"All Levels"}),a.jsx("option",{value:"info",children:"Info"}),a.jsx("option",{value:"warn",children:"Warning"}),a.jsx("option",{value:"error",children:"Error"}),a.jsx("option",{value:"debug",children:"Debug"})]}),a.jsxs("select",{value:c,onChange:S=>d(S.target.value),style:{padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"",children:"All Categories"}),a.jsx("option",{value:"scraper",children:"🔍 Scraper"}),a.jsx("option",{value:"images",children:"📸 Images"}),a.jsx("option",{value:"categories",children:"📂 Categories"}),a.jsx("option",{value:"system",children:"⚙️ System"}),a.jsx("option",{value:"api",children:"🌐 API"})]}),a.jsxs("select",{value:u,onChange:S=>f(parseInt(S.target.value)),style:{padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"50",children:"Last 50"}),a.jsx("option",{value:"100",children:"Last 100"}),a.jsx("option",{value:"200",children:"Last 200"}),a.jsx("option",{value:"500",children:"Last 500"}),a.jsx("option",{value:"1000",children:"Last 1000"})]}),a.jsx("div",{style:{marginLeft:"auto",display:"flex",alignItems:"center",gap:"10px"},children:a.jsxs("span",{style:{fontSize:"14px",color:"#666"},children:["Showing ",e.length," logs"]})})]}),a.jsxs("div",{style:{background:"#1e1e1e",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",maxHeight:"70vh",overflowY:"auto",fontFamily:"monospace",fontSize:"13px"},children:[e.length===0?a.jsx("div",{style:{color:"#999",textAlign:"center",padding:"40px"},children:"No logs to display"}):e.map((S,N)=>a.jsxs("div",{style:{padding:"8px 12px",marginBottom:"4px",borderRadius:"4px",background:y(S.level),borderLeft:`4px solid ${j(S.level)}`,display:"flex",gap:"10px",alignItems:"flex-start"},children:[a.jsx("span",{style:{color:"#666",fontSize:"11px",whiteSpace:"nowrap"},children:new Date(S.timestamp).toLocaleTimeString()}),a.jsx("span",{style:{fontSize:"14px"},children:w(S.category)}),a.jsx("span",{style:{padding:"2px 6px",borderRadius:"3px",fontSize:"10px",fontWeight:"bold",background:j(S.level),color:"white",textTransform:"uppercase"},children:S.level}),a.jsx("span",{style:{padding:"2px 6px",borderRadius:"3px",fontSize:"10px",background:"#e2e3e5",color:"#333"},children:S.category}),a.jsx("span",{style:{flex:1,color:"#333",wordBreak:"break-word"},children:S.message})]},N)),a.jsx("div",{ref:x})]})]})]})}function hF(){const[e,t]=h.useState([]),[r,n]=h.useState([]),[i,s]=h.useState(null),[o,l]=h.useState([]),[c,d]=h.useState([]),[u,f]=h.useState([]),[p,m]=h.useState(!0),[x,g]=h.useState(!0),[b,v]=h.useState("az-live"),[j,y]=h.useState(null),[w,S]=h.useState(""),[N,P]=h.useState(null),[_,T]=h.useState({scheduledJobs:[],crawlJobs:[],inMemoryScrapers:[],totalActive:0}),[$,M]=h.useState({jobLogs:[],crawlJobs:[]}),[C,R]=h.useState([]);h.useEffect(()=>{if(q(),x){const E=setInterval(q,3e3);return()=>clearInterval(E)}},[x]);const q=async()=>{try{const[E,D,O,k,L,F]=await Promise.all([B.getActiveScrapers(),B.getScraperHistory(),B.getJobStats(),B.getActiveJobs(),B.getWorkerStats(),B.getRecentJobs({limit:50})]);t(E.scrapers||[]),n(D.history||[]),s(O),l(k.jobs||[]),d(L.workers||[]),f(F.jobs||[]);const[H,te,re,we]=await Promise.all([B.getAZMonitorSummary().catch(()=>null),B.getAZMonitorActiveJobs().catch(()=>({scheduledJobs:[],crawlJobs:[],inMemoryScrapers:[],totalActive:0})),B.getAZMonitorRecentJobs(30).catch(()=>({jobLogs:[],crawlJobs:[]})),B.getAZMonitorErrors({limit:10,hours:24}).catch(()=>({errors:[]}))]);P(H),T(te),M(re),R((we==null?void 0:we.errors)||[])}catch(E){console.error("Failed to load scraper data:",E)}finally{m(!1)}},Z=E=>{const D=Math.floor(E/1e3),O=Math.floor(D/60),k=Math.floor(O/60);return k>0?`${k}h ${O%60}m ${D%60}s`:O>0?`${O}m ${D%60}s`:`${D}s`};return a.jsx(X,{children:a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Scraper Monitor"}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:x,onChange:E=>g(E.target.checked),style:{width:"18px",height:"18px",cursor:"pointer"}}),a.jsx("span",{children:"Auto-refresh (3s)"})]})]}),a.jsxs("div",{style:{marginBottom:"30px",display:"flex",gap:"10px",borderBottom:"2px solid #eee"},children:[a.jsxs("button",{onClick:()=>v("az-live"),style:{padding:"12px 24px",background:b==="az-live"?"white":"transparent",border:"none",borderBottom:b==="az-live"?"3px solid #10b981":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:b==="az-live"?"600":"400",color:b==="az-live"?"#10b981":"#666",marginBottom:"-2px"},children:["AZ Live ",_.totalActive>0&&a.jsx("span",{style:{marginLeft:"8px",padding:"2px 8px",background:"#10b981",color:"white",borderRadius:"10px",fontSize:"12px"},children:_.totalActive})]}),a.jsx("button",{onClick:()=>v("jobs"),style:{padding:"12px 24px",background:b==="jobs"?"white":"transparent",border:"none",borderBottom:b==="jobs"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:b==="jobs"?"600":"400",color:b==="jobs"?"#2563eb":"#666",marginBottom:"-2px"},children:"Dispensary Jobs"}),a.jsx("button",{onClick:()=>v("scrapers"),style:{padding:"12px 24px",background:b==="scrapers"?"white":"transparent",border:"none",borderBottom:b==="scrapers"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:b==="scrapers"?"600":"400",color:b==="scrapers"?"#2563eb":"#666",marginBottom:"-2px"},children:"Crawl History"})]}),b==="az-live"&&a.jsxs(a.Fragment,{children:[N&&a.jsx("div",{style:{marginBottom:"30px"},children:a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(180px, 1fr))",gap:"15px"},children:[a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Running Jobs"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:_.totalActive>0?"#10b981":"#666"},children:_.totalActive})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Successful (24h)"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#10b981"},children:(N.successful_jobs_24h||0)+(N.successful_crawls_24h||0)})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Failed (24h)"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:(N.failed_jobs_24h||0)+(N.failed_crawls_24h||0)>0?"#ef4444":"#666"},children:(N.failed_jobs_24h||0)+(N.failed_crawls_24h||0)})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Products (24h)"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#8b5cf6"},children:N.products_found_24h||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Snapshots (24h)"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#06b6d4"},children:N.snapshots_created_24h||0})]})]})}),a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px",display:"flex",alignItems:"center",gap:"10px"},children:["Active Jobs",_.totalActive>0&&a.jsxs("span",{style:{padding:"4px 12px",background:"#d1fae5",color:"#065f46",borderRadius:"12px",fontSize:"14px",fontWeight:"600"},children:[_.totalActive," running"]})]}),_.totalActive===0?a.jsxs("div",{style:{background:"white",padding:"60px 40px",borderRadius:"8px",textAlign:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"48px",marginBottom:"20px"},children:"😴"}),a.jsx("div",{style:{fontSize:"18px",color:"#666"},children:"No jobs currently running"})]}):a.jsxs("div",{style:{display:"grid",gap:"15px"},children:[_.scheduledJobs.map(E=>a.jsx("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:"4px solid #10b981"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsx("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"8px"},children:E.job_name}),a.jsx("div",{style:{fontSize:"14px",color:"#666",marginBottom:"12px"},children:E.job_description||"Scheduled job"}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(120px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Processed"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600"},children:E.items_processed||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Succeeded"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#10b981"},children:E.items_succeeded||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Failed"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:E.items_failed>0?"#ef4444":"#666"},children:E.items_failed||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Duration"}),a.jsxs("div",{style:{fontSize:"16px",fontWeight:"600"},children:[Math.floor((E.duration_seconds||0)/60),"m ",Math.floor((E.duration_seconds||0)%60),"s"]})]})]})]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:"#d1fae5",color:"#065f46"},children:"RUNNING"})]})},`sched-${E.id}`)),_.crawlJobs.map(E=>a.jsx("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:"4px solid #3b82f6"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsx("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"8px"},children:E.dispensary_name||"Unknown Store"}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"12px"},children:[E.city," | ",E.job_type||"crawl"]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(120px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Found"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#8b5cf6"},children:E.products_found||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Snapshots"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#06b6d4"},children:E.snapshots_created||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Duration"}),a.jsxs("div",{style:{fontSize:"16px",fontWeight:"600"},children:[Math.floor((E.duration_seconds||0)/60),"m ",Math.floor((E.duration_seconds||0)%60),"s"]})]})]})]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:"#dbeafe",color:"#1e40af"},children:"CRAWLING"})]})},`crawl-${E.id}`))]})]}),(N==null?void 0:N.nextRuns)&&N.nextRuns.length>0&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsx("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:"Next Scheduled Runs"}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Job"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Next Run"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Last Status"})]})}),a.jsx("tbody",{children:N.nextRuns.map(E=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:E.job_name}),a.jsx("div",{style:{fontSize:"13px",color:"#666"},children:E.description})]}),a.jsx("td",{style:{padding:"15px"},children:a.jsx("div",{style:{fontWeight:"600",color:"#2563eb"},children:E.next_run_at?new Date(E.next_run_at).toLocaleString():"-"})}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",background:E.last_status==="success"?"#d1fae5":E.last_status==="error"?"#fee2e2":"#fef3c7",color:E.last_status==="success"?"#065f46":E.last_status==="error"?"#991b1b":"#92400e"},children:E.last_status||"never"})})]},E.id))})]})})]}),C.length>0&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsx("h2",{style:{fontSize:"24px",marginBottom:"20px",color:"#ef4444"},children:"Recent Errors (24h)"}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:C.map((E,D)=>a.jsxs("div",{style:{padding:"15px",borderBottom:Da.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:E.job_name}),a.jsxs("div",{style:{fontSize:"12px",color:"#999"},children:["Log #",E.id]})]}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",background:E.status==="success"?"#d1fae5":E.status==="running"?"#dbeafe":E.status==="error"?"#fee2e2":"#fef3c7",color:E.status==="success"?"#065f46":E.status==="running"?"#1e40af":E.status==="error"?"#991b1b":"#92400e"},children:E.status})}),a.jsxs("td",{style:{padding:"15px",textAlign:"right"},children:[a.jsx("span",{style:{color:"#10b981"},children:E.items_succeeded||0})," / ",a.jsx("span",{children:E.items_processed||0})]}),a.jsx("td",{style:{padding:"15px",textAlign:"right"},children:E.duration_ms?`${Math.floor(E.duration_ms/6e4)}m ${Math.floor(E.duration_ms%6e4/1e3)}s`:"-"}),a.jsx("td",{style:{padding:"15px",color:"#666"},children:E.completed_at?new Date(E.completed_at).toLocaleString():"-"})]},`log-${E.id}`))})]})})]})]}),b==="jobs"&&a.jsxs(a.Fragment,{children:[i&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsx("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:"Job Statistics"}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(200px, 1fr))",gap:"15px"},children:[a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Pending"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#f59e0b"},children:i.pending||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"In Progress"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#3b82f6"},children:i.in_progress||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Completed"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#10b981"},children:i.completed||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Failed"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#ef4444"},children:i.failed||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Products Found"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#8b5cf6"},children:i.total_products_found||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Products Saved"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#06b6d4"},children:i.total_products_saved||0})]})]})]}),c.length>0&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Active Workers (",c.length,")"]}),a.jsx("div",{style:{display:"grid",gap:"15px"},children:c.map(E=>a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:"4px solid #10b981"},children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"12px"},children:["Worker: ",E.worker_id]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:"#d1fae5",color:"#065f46"},children:"ACTIVE"})]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Active Jobs"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600"},children:E.active_jobs})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Found"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#8b5cf6"},children:E.total_products_found||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Saved"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#10b981"},children:E.total_products_saved||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Running Since"}),a.jsx("div",{style:{fontSize:"14px"},children:new Date(E.earliest_start).toLocaleTimeString()})]})]})]},E.worker_id))})]}),a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Active Jobs (",o.length,")"]}),o.length===0?a.jsxs("div",{style:{background:"white",padding:"60px 40px",borderRadius:"8px",textAlign:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"48px",marginBottom:"20px"},children:"😴"}),a.jsx("div",{style:{fontSize:"18px",color:"#666"},children:"No jobs currently running"})]}):a.jsx("div",{style:{display:"grid",gap:"15px"},children:o.map(E=>a.jsx("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:"4px solid #3b82f6"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsx("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"8px"},children:E.dispensary_name||E.brand_name}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"12px"},children:[E.job_type||"crawl"," | Job #",E.id]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Found"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#8b5cf6"},children:E.products_found||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Saved"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#10b981"},children:E.products_saved||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Duration"}),a.jsxs("div",{style:{fontSize:"16px",fontWeight:"600"},children:[Math.floor(E.duration_seconds/60),"m ",Math.floor(E.duration_seconds%60),"s"]})]})]})]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:"#dbeafe",color:"#1e40af"},children:"IN PROGRESS"})]})},E.id))})]}),a.jsxs("div",{children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Recent Jobs (",u.length,")"]}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Dispensary"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Type"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Found"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Saved"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Duration"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Completed"})]})}),a.jsx("tbody",{children:u.map(E=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsx("td",{style:{padding:"15px"},children:E.dispensary_name||E.brand_name}),a.jsx("td",{style:{padding:"15px",fontSize:"14px",color:"#666"},children:E.job_type||"-"}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",background:E.status==="completed"?"#d1fae5":E.status==="in_progress"?"#dbeafe":E.status==="failed"?"#fee2e2":"#fef3c7",color:E.status==="completed"?"#065f46":E.status==="in_progress"?"#1e40af":E.status==="failed"?"#991b1b":"#92400e"},children:E.status})}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:E.products_found||0}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600",color:"#10b981"},children:E.products_saved||0}),a.jsx("td",{style:{padding:"15px",textAlign:"right"},children:E.duration_seconds?`${Math.floor(E.duration_seconds/60)}m ${Math.floor(E.duration_seconds%60)}s`:"-"}),a.jsx("td",{style:{padding:"15px",color:"#666"},children:E.completed_at?new Date(E.completed_at).toLocaleString():"-"})]},E.id))})]})})]})]}),b==="scrapers"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Active Scrapers (",e.length,")"]}),e.length===0?a.jsxs("div",{style:{background:"white",padding:"60px 40px",borderRadius:"8px",textAlign:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"48px",marginBottom:"20px"},children:"🛌"}),a.jsx("div",{style:{fontSize:"18px",color:"#666"},children:"No scrapers currently running"})]}):a.jsx("div",{style:{display:"grid",gap:"15px"},children:e.map(E=>a.jsx("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:`4px solid ${E.status==="running"?E.isStale?"#ff9800":"#2ecc71":E.status==="error"?"#e74c3c":"#95a5a6"}`},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsxs("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"8px"},children:[E.storeName," - ",E.categoryName]}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"12px"},children:["ID: ",E.id]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Requests"}),a.jsxs("div",{style:{fontSize:"16px",fontWeight:"600"},children:[E.stats.requestsSuccess," / ",E.stats.requestsTotal]})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Items Saved"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#2ecc71"},children:E.stats.itemsSaved})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Items Dropped"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#e74c3c"},children:E.stats.itemsDropped})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Errors"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:E.stats.errorsCount>0?"#ff9800":"#999"},children:E.stats.errorsCount})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Duration"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600"},children:Z(E.duration)})]})]}),E.currentActivity&&a.jsxs("div",{style:{marginTop:"12px",padding:"8px 12px",background:"#f8f8f8",borderRadius:"4px",fontSize:"14px",color:"#666"},children:["📍 ",E.currentActivity]}),E.isStale&&a.jsx("div",{style:{marginTop:"12px",padding:"8px 12px",background:"#fff3cd",borderRadius:"4px",fontSize:"14px",color:"#856404"},children:"⚠️ No update in over 1 minute - scraper may be stuck"})]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:E.status==="running"?"#d4edda":E.status==="error"?"#f8d7da":"#e7e7e7",color:E.status==="running"?"#155724":E.status==="error"?"#721c24":"#666"},children:E.status.toUpperCase()})]})},E.id))})]}),a.jsxs("div",{children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Recent Scrapes (",r.length,")"]}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Dispensary"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Found"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Products"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Last Crawled"})]})}),a.jsx("tbody",{children:r.map((E,D)=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsx("td",{style:{padding:"15px"},children:E.dispensary_name||E.store_name}),a.jsx("td",{style:{padding:"15px"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",background:E.status==="completed"?"#d1fae5":E.status==="failed"?"#fee2e2":"#fef3c7",color:E.status==="completed"?"#065f46":E.status==="failed"?"#991b1b":"#92400e"},children:E.status||"-"})}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:E.products_found||"-"}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:E.product_count}),a.jsx("td",{style:{padding:"15px",color:"#666"},children:E.last_scraped_at?new Date(E.last_scraped_at).toLocaleString():"-"})]},D))})]})})]})]})]})})}function mF(){var we;const[e,t]=h.useState([]),[r,n]=h.useState([]),[i,s]=h.useState([]),[o,l]=h.useState(!0),[c,d]=h.useState(!0),[u,f]=h.useState("dispensaries"),[p,m]=h.useState(null),[x,g]=h.useState(null),[b,v]=h.useState(null),[j,y]=h.useState(null),[w,S]=h.useState(!1),[N,P]=h.useState("all"),[_,T]=h.useState(""),[$,M]=h.useState("");h.useEffect(()=>{const A=setTimeout(()=>{T($)},300);return()=>clearTimeout(A)},[$]),h.useEffect(()=>{if(C(),c){const A=setInterval(C,5e3);return()=>clearInterval(A)}},[c,N,_]);const C=async()=>{try{const A={};N==="AZ"&&(A.state="AZ"),_.trim()&&(A.search=_.trim());const[J,Ot,z]=await Promise.all([B.getGlobalSchedule(),B.getDispensarySchedules(Object.keys(A).length>0?A:void 0),B.getDispensaryCrawlJobs(100)]);t(J.schedules||[]),n(Ot.dispensaries||[]),s(z.jobs||[])}catch(A){console.error("Failed to load schedule data:",A)}finally{l(!1)}},R=async A=>{m(A);try{await B.triggerDispensaryCrawl(A),await C()}catch(J){console.error("Failed to trigger crawl:",J)}finally{m(null)}},q=async()=>{if(confirm("This will create crawl jobs for ALL active stores. Continue?"))try{const A=await B.triggerAllCrawls();alert(`Created ${A.jobs_created} crawl jobs`),await C()}catch(A){console.error("Failed to trigger all crawls:",A)}},Z=async A=>{try{await B.cancelCrawlJob(A),await C()}catch(J){console.error("Failed to cancel job:",J)}},E=async A=>{g(A);try{const J=await B.resolvePlatformId(A);J.success?alert(J.message):alert(`Failed: ${J.error||J.message}`),await C()}catch(J){console.error("Failed to resolve platform ID:",J),alert(`Error: ${J.message}`)}finally{g(null)}},D=async A=>{v(A);try{const J=await B.refreshDetection(A);alert(`Detected: ${J.menu_type}${J.platform_dispensary_id?`, Platform ID: ${J.platform_dispensary_id}`:""}`),await C()}catch(J){console.error("Failed to refresh detection:",J),alert(`Error: ${J.message}`)}finally{v(null)}},O=async(A,J)=>{y(A);try{await B.toggleDispensarySchedule(A,!J),await C()}catch(Ot){console.error("Failed to toggle schedule:",Ot),alert(`Error: ${Ot.message}`)}finally{y(null)}},k=async(A,J)=>{try{await B.updateGlobalSchedule(A,J),await C()}catch(Ot){console.error("Failed to update global schedule:",Ot)}},L=A=>{if(!A)return"Never";const J=new Date(A),z=new Date().getTime()-J.getTime(),Q=Math.floor(z/6e4),ne=Math.floor(Q/60),U=Math.floor(ne/24);return Q<1?"Just now":Q<60?`${Q}m ago`:ne<24?`${ne}h ago`:`${U}d ago`},F=A=>{const J=new Date(A),Ot=new Date,z=J.getTime()-Ot.getTime();if(z<0)return"Overdue";const Q=Math.floor(z/6e4),ne=Math.floor(Q/60);return Q<60?`${Q}m`:`${ne}h ${Q%60}m`},H=A=>{switch(A){case"completed":case"success":return{bg:"#d1fae5",color:"#065f46"};case"running":return{bg:"#dbeafe",color:"#1e40af"};case"failed":case"error":return{bg:"#fee2e2",color:"#991b1b"};case"cancelled":return{bg:"#f3f4f6",color:"#374151"};case"pending":return{bg:"#fef3c7",color:"#92400e"};case"sandbox_only":return{bg:"#e0e7ff",color:"#3730a3"};case"detection_only":return{bg:"#fce7f3",color:"#9d174d"};default:return{bg:"#f3f4f6",color:"#374151"}}},te=e.find(A=>A.schedule_type==="global_interval"),re=e.find(A=>A.schedule_type==="daily_special");return a.jsx(X,{children:a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Crawler Schedule"}),a.jsxs("div",{style:{display:"flex",gap:"15px",alignItems:"center"},children:[a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:c,onChange:A=>d(A.target.checked),style:{width:"18px",height:"18px",cursor:"pointer"}}),a.jsx("span",{children:"Auto-refresh (5s)"})]}),a.jsx("button",{onClick:q,style:{padding:"10px 20px",background:"#2563eb",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600"},children:"Crawl All Stores"})]})]}),a.jsxs("div",{style:{marginBottom:"30px",display:"flex",gap:"10px",borderBottom:"2px solid #eee"},children:[a.jsxs("button",{onClick:()=>f("dispensaries"),style:{padding:"12px 24px",background:u==="dispensaries"?"white":"transparent",border:"none",borderBottom:u==="dispensaries"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:u==="dispensaries"?"600":"400",color:u==="dispensaries"?"#2563eb":"#666",marginBottom:"-2px"},children:["Dispensary Schedules (",r.length,")"]}),a.jsxs("button",{onClick:()=>f("jobs"),style:{padding:"12px 24px",background:u==="jobs"?"white":"transparent",border:"none",borderBottom:u==="jobs"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:u==="jobs"?"600":"400",color:u==="jobs"?"#2563eb":"#666",marginBottom:"-2px"},children:["Job Queue (",i.filter(A=>A.status==="pending"||A.status==="running").length,")"]}),a.jsx("button",{onClick:()=>f("global"),style:{padding:"12px 24px",background:u==="global"?"white":"transparent",border:"none",borderBottom:u==="global"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:u==="global"?"600":"400",color:u==="global"?"#2563eb":"#666",marginBottom:"-2px"},children:"Global Settings"})]}),u==="global"&&a.jsxs("div",{style:{display:"grid",gap:"20px"},children:[a.jsxs("div",{style:{background:"white",padding:"24px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start",marginBottom:"20px"},children:[a.jsxs("div",{children:[a.jsx("h2",{style:{fontSize:"20px",margin:0,marginBottom:"8px"},children:"Interval Crawl Schedule"}),a.jsx("p",{style:{color:"#666",margin:0},children:"Crawl all stores periodically"})]}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("span",{style:{color:"#666"},children:"Enabled"}),a.jsx("input",{type:"checkbox",checked:(te==null?void 0:te.enabled)??!0,onChange:A=>k("global_interval",{enabled:A.target.checked}),style:{width:"20px",height:"20px",cursor:"pointer"}})]})]}),a.jsx("div",{style:{display:"flex",alignItems:"center",gap:"15px"},children:a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[a.jsx("span",{children:"Crawl every"}),a.jsxs("select",{value:(te==null?void 0:te.interval_hours)??4,onChange:A=>k("global_interval",{interval_hours:parseInt(A.target.value)}),style:{padding:"8px 12px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"16px"},children:[a.jsx("option",{value:1,children:"1 hour"}),a.jsx("option",{value:2,children:"2 hours"}),a.jsx("option",{value:4,children:"4 hours"}),a.jsx("option",{value:6,children:"6 hours"}),a.jsx("option",{value:8,children:"8 hours"}),a.jsx("option",{value:12,children:"12 hours"}),a.jsx("option",{value:24,children:"24 hours"})]})]})})]}),a.jsxs("div",{style:{background:"white",padding:"24px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start",marginBottom:"20px"},children:[a.jsxs("div",{children:[a.jsx("h2",{style:{fontSize:"20px",margin:0,marginBottom:"8px"},children:"Daily Special Crawl"}),a.jsx("p",{style:{color:"#666",margin:0},children:"Crawl stores at local midnight to capture daily specials"})]}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("span",{style:{color:"#666"},children:"Enabled"}),a.jsx("input",{type:"checkbox",checked:(re==null?void 0:re.enabled)??!0,onChange:A=>k("daily_special",{enabled:A.target.checked}),style:{width:"20px",height:"20px",cursor:"pointer"}})]})]}),a.jsx("div",{style:{display:"flex",alignItems:"center",gap:"15px"},children:a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[a.jsx("span",{children:"Run at"}),a.jsx("input",{type:"time",value:((we=re==null?void 0:re.run_time)==null?void 0:we.slice(0,5))??"00:01",onChange:A=>k("daily_special",{run_time:A.target.value}),style:{padding:"8px 12px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"16px"}}),a.jsx("span",{style:{color:"#666"},children:"(store local time)"})]})})]})]}),u==="dispensaries"&&a.jsxs("div",{children:[a.jsxs("div",{style:{marginBottom:"15px",display:"flex",gap:"20px",alignItems:"center",flexWrap:"wrap"},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[a.jsx("span",{style:{fontWeight:"500",color:"#374151"},children:"State:"}),a.jsxs("div",{style:{display:"flex",borderRadius:"6px",overflow:"hidden",border:"1px solid #d1d5db"},children:[a.jsx("button",{onClick:()=>P("all"),style:{padding:"6px 14px",background:N==="all"?"#2563eb":"white",color:N==="all"?"white":"#374151",border:"none",cursor:"pointer",fontSize:"14px",fontWeight:"500"},children:"All"}),a.jsx("button",{onClick:()=>P("AZ"),style:{padding:"6px 14px",background:N==="AZ"?"#2563eb":"white",color:N==="AZ"?"white":"#374151",border:"none",borderLeft:"1px solid #d1d5db",cursor:"pointer",fontSize:"14px",fontWeight:"500"},children:"AZ Only"})]})]}),a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[a.jsx("span",{style:{fontWeight:"500",color:"#374151"},children:"Search:"}),a.jsx("input",{type:"text",placeholder:"Store name or slug...",value:$,onChange:A=>M(A.target.value),style:{padding:"6px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px",width:"200px"}}),$&&a.jsx("button",{onClick:()=>{M(""),T("")},style:{padding:"4px 8px",background:"#f3f4f6",border:"1px solid #d1d5db",borderRadius:"4px",cursor:"pointer",fontSize:"12px"},children:"Clear"})]}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"8px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:w,onChange:A=>S(A.target.checked),style:{width:"16px",height:"16px",cursor:"pointer"}}),a.jsx("span",{children:"Dutchie only"})]}),a.jsxs("span",{style:{color:"#666",fontSize:"14px",marginLeft:"auto"},children:["Showing ",(w?r.filter(A=>A.menu_type==="dutchie"):r).length," dispensaries"]})]}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"auto"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",minWidth:"1200px"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"12px",textAlign:"left",fontWeight:"600"},children:"Dispensary"}),a.jsx("th",{style:{padding:"12px",textAlign:"center",fontWeight:"600"},children:"Menu Type"}),a.jsx("th",{style:{padding:"12px",textAlign:"center",fontWeight:"600"},children:"Platform ID"}),a.jsx("th",{style:{padding:"12px",textAlign:"center",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"12px",textAlign:"left",fontWeight:"600"},children:"Last Run"}),a.jsx("th",{style:{padding:"12px",textAlign:"left",fontWeight:"600"},children:"Next Run"}),a.jsx("th",{style:{padding:"12px",textAlign:"left",fontWeight:"600"},children:"Last Result"}),a.jsx("th",{style:{padding:"12px",textAlign:"center",fontWeight:"600",minWidth:"220px"},children:"Actions"})]})}),a.jsx("tbody",{children:(w?r.filter(A=>A.menu_type==="dutchie"):r).map(A=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"12px"},children:[a.jsx("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:A.state&&A.city&&(A.dispensary_slug||A.slug)?a.jsx(K1,{to:`/dispensaries/${A.state}/${A.city.toLowerCase().replace(/\s+/g,"-")}/${A.dispensary_slug||A.slug}`,style:{fontWeight:"600",color:"#2563eb",textDecoration:"none"},children:A.dispensary_name}):a.jsx("span",{style:{fontWeight:"600"},children:A.dispensary_name})}),a.jsx("div",{style:{fontSize:"12px",color:"#666"},children:A.city?`${A.city}, ${A.state}`:A.state})]}),a.jsx("td",{style:{padding:"12px",textAlign:"center"},children:A.menu_type?a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"11px",fontWeight:"600",background:A.menu_type==="dutchie"?"#d1fae5":"#e0e7ff",color:A.menu_type==="dutchie"?"#065f46":"#3730a3"},children:A.menu_type}):a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"11px",fontWeight:"600",background:"#f3f4f6",color:"#666"},children:"unknown"})}),a.jsx("td",{style:{padding:"12px",textAlign:"center"},children:A.platform_dispensary_id?a.jsx("span",{style:{padding:"4px 8px",borderRadius:"4px",fontSize:"10px",fontFamily:"monospace",background:"#d1fae5",color:"#065f46"},title:A.platform_dispensary_id,children:A.platform_dispensary_id.length>12?`${A.platform_dispensary_id.slice(0,6)}...${A.platform_dispensary_id.slice(-4)}`:A.platform_dispensary_id}):a.jsx("span",{style:{padding:"4px 8px",borderRadius:"4px",fontSize:"10px",background:"#fee2e2",color:"#991b1b"},children:"missing"})}),a.jsx("td",{style:{padding:"12px",textAlign:"center"},children:a.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:"4px"},children:[a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"11px",fontWeight:"600",background:A.can_crawl?"#d1fae5":A.is_active!==!1?"#fef3c7":"#fee2e2",color:A.can_crawl?"#065f46":A.is_active!==!1?"#92400e":"#991b1b"},children:A.can_crawl?"Ready":A.is_active!==!1?"Not Ready":"Disabled"}),A.schedule_status_reason&&A.schedule_status_reason!=="ready"&&a.jsx("span",{style:{fontSize:"10px",color:"#666",maxWidth:"100px",textAlign:"center"},children:A.schedule_status_reason}),A.interval_minutes&&a.jsxs("span",{style:{fontSize:"10px",color:"#999"},children:["Every ",Math.round(A.interval_minutes/60),"h"]})]})}),a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{children:L(A.last_run_at)}),A.last_run_at&&a.jsx("div",{style:{fontSize:"12px",color:"#999"},children:new Date(A.last_run_at).toLocaleString()})]}),a.jsx("td",{style:{padding:"15px"},children:a.jsx("div",{style:{fontWeight:"600",color:"#2563eb"},children:A.next_run_at?F(A.next_run_at):"Not scheduled"})}),a.jsx("td",{style:{padding:"15px"},children:A.last_status||A.latest_job_status?a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"4px"},children:[a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",...H(A.last_status||A.latest_job_status||"pending")},children:A.last_status||A.latest_job_status}),A.last_error&&a.jsx("button",{onClick:()=>alert(A.last_error),style:{padding:"2px 6px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"10px"},children:"Error"})]}),A.last_summary?a.jsx("div",{style:{fontSize:"12px",color:"#666",maxWidth:"250px"},children:A.last_summary}):A.latest_products_found!==null?a.jsxs("div",{style:{fontSize:"12px",color:"#666"},children:[A.latest_products_found," products"]}):null]}):a.jsx("span",{style:{color:"#999",fontSize:"13px"},children:"No runs yet"})}),a.jsx("td",{style:{padding:"12px",textAlign:"center"},children:a.jsxs("div",{style:{display:"flex",gap:"6px",justifyContent:"center",flexWrap:"wrap"},children:[a.jsx("button",{onClick:()=>D(A.dispensary_id),disabled:b===A.dispensary_id,style:{padding:"4px 8px",background:b===A.dispensary_id?"#94a3b8":"#f3f4f6",color:"#374151",border:"1px solid #d1d5db",borderRadius:"4px",cursor:b===A.dispensary_id?"wait":"pointer",fontSize:"11px"},title:"Re-detect menu type and resolve platform ID",children:b===A.dispensary_id?"...":"Refresh"}),A.menu_type==="dutchie"&&!A.platform_dispensary_id&&a.jsx("button",{onClick:()=>E(A.dispensary_id),disabled:x===A.dispensary_id,style:{padding:"4px 8px",background:x===A.dispensary_id?"#94a3b8":"#fef3c7",color:"#92400e",border:"1px solid #fcd34d",borderRadius:"4px",cursor:x===A.dispensary_id?"wait":"pointer",fontSize:"11px"},title:"Resolve platform dispensary ID via GraphQL",children:x===A.dispensary_id?"...":"Resolve ID"}),a.jsx("button",{onClick:()=>R(A.dispensary_id),disabled:p===A.dispensary_id||!A.can_crawl,style:{padding:"4px 8px",background:p===A.dispensary_id?"#94a3b8":A.can_crawl?"#2563eb":"#e5e7eb",color:A.can_crawl?"white":"#9ca3af",border:"none",borderRadius:"4px",cursor:p===A.dispensary_id||!A.can_crawl?"not-allowed":"pointer",fontSize:"11px"},title:A.can_crawl?"Trigger immediate crawl":`Cannot crawl: ${A.schedule_status_reason}`,children:p===A.dispensary_id?"...":"Run"}),a.jsx("button",{onClick:()=>O(A.dispensary_id,A.is_active),disabled:j===A.dispensary_id,style:{padding:"4px 8px",background:j===A.dispensary_id?"#94a3b8":A.is_active?"#fee2e2":"#d1fae5",color:A.is_active?"#991b1b":"#065f46",border:"none",borderRadius:"4px",cursor:j===A.dispensary_id?"wait":"pointer",fontSize:"11px"},title:A.is_active?"Disable scheduled crawling":"Enable scheduled crawling",children:j===A.dispensary_id?"...":A.is_active?"Disable":"Enable"})]})})]},A.dispensary_id))})]})})]}),u==="jobs"&&a.jsxs(a.Fragment,{children:[a.jsx("div",{style:{marginBottom:"30px"},children:a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"15px"},children:[a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Pending"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#f59e0b"},children:i.filter(A=>A.status==="pending").length})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Running"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#3b82f6"},children:i.filter(A=>A.status==="running").length})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Completed"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#10b981"},children:i.filter(A=>A.status==="completed").length})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Failed"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#ef4444"},children:i.filter(A=>A.status==="failed").length})]})]})}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Dispensary"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Type"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Trigger"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Products"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Started"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Completed"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Actions"})]})}),a.jsx("tbody",{children:i.length===0?a.jsx("tr",{children:a.jsx("td",{colSpan:8,style:{padding:"40px",textAlign:"center",color:"#666"},children:"No crawl jobs found"})}):i.map(A=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:A.dispensary_name}),a.jsxs("div",{style:{fontSize:"12px",color:"#999"},children:["Job #",A.id]})]}),a.jsx("td",{style:{padding:"15px",textAlign:"center",fontSize:"13px"},children:A.job_type}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"3px 8px",borderRadius:"4px",fontSize:"12px",background:A.trigger_type==="manual"?"#e0e7ff":A.trigger_type==="daily_special"?"#fce7f3":"#f3f4f6",color:A.trigger_type==="manual"?"#3730a3":A.trigger_type==="daily_special"?"#9d174d":"#374151"},children:A.trigger_type})}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",...H(A.status)},children:A.status})}),a.jsx("td",{style:{padding:"15px",textAlign:"right"},children:A.products_found!==null?a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600"},children:A.products_found}),A.products_new!==null&&A.products_updated!==null&&a.jsxs("div",{style:{fontSize:"12px",color:"#666"},children:["+",A.products_new," / ~",A.products_updated]})]}):"-"}),a.jsx("td",{style:{padding:"15px",fontSize:"13px"},children:A.started_at?new Date(A.started_at).toLocaleString():"-"}),a.jsx("td",{style:{padding:"15px",fontSize:"13px"},children:A.completed_at?new Date(A.completed_at).toLocaleString():"-"}),a.jsxs("td",{style:{padding:"15px",textAlign:"center"},children:[A.status==="pending"&&a.jsx("button",{onClick:()=>Z(A.id),style:{padding:"4px 10px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"12px"},children:"Cancel"}),A.error_message&&a.jsx("button",{onClick:()=>alert(A.error_message),style:{padding:"4px 10px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"12px"},children:"View Error"})]})]},A.id))})]})})]})]})})}function gF(){const[e,t]=h.useState([]),[r,n]=h.useState(null),[i,s]=h.useState(3),[o,l]=h.useState("rotate-desktop"),[c,d]=h.useState(!1),[u,f]=h.useState(!1),[p,m]=h.useState(null),[x,g]=h.useState(!0);h.useEffect(()=>{b()},[]);const b=async()=>{g(!0);try{const S=(await B.getDispensaries()).dispensaries.filter(N=>N.menu_url&&N.scrape_enabled);t(S),S.length>0&&n(S[0].id)}catch(w){console.error("Failed to load dispensaries:",w)}finally{g(!1)}},v=async()=>{if(!(!r||c)){d(!0);try{await B.triggerDispensaryCrawl(r),m({message:"Crawl started for dispensary! Check the Scraper Monitor for progress.",type:"success"})}catch(w){m({message:"Failed to start crawl: "+w.message,type:"error"})}finally{d(!1)}}},j=async()=>{if(!(!r||u)){f(!0);try{m({message:"Image download feature coming soon!",type:"info"})}catch(w){m({message:"Failed to start image download: "+w.message,type:"error"})}finally{f(!1)}}},y=e.find(w=>w.id===r);return x?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("span",{className:"loading loading-spinner loading-lg"})})}):a.jsxs(X,{children:[p&&a.jsx(Vn,{message:p.message,type:p.type,onClose:()=>m(null)}),a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-3xl font-bold",children:"Scraper Tools"}),a.jsx("p",{className:"text-gray-500 mt-2",children:"Manage crawling operations for dispensaries"})]}),a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body",children:[a.jsx("h2",{className:"card-title",children:"Select Dispensary"}),a.jsx("select",{className:"select select-bordered w-full max-w-md",value:r||"",onChange:w=>n(parseInt(w.target.value)),children:e.map(w=>a.jsxs("option",{value:w.id,children:[w.dba_name||w.name," - ",w.city,", ",w.state]},w.id))}),y&&a.jsx("div",{className:"mt-4 p-4 bg-base-200 rounded-lg",children:a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-gray-500",children:"Status"}),a.jsx("div",{className:"font-semibold",children:y.scrape_enabled?a.jsx("span",{className:"badge badge-success",children:"Enabled"}):a.jsx("span",{className:"badge badge-error",children:"Disabled"})})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-gray-500",children:"Provider"}),a.jsx("div",{className:"font-semibold",children:y.provider_type||"Unknown"})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-gray-500",children:"Products"}),a.jsx("div",{className:"font-semibold",children:y.product_count||0})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-gray-500",children:"Last Crawled"}),a.jsx("div",{className:"font-semibold",children:y.last_crawl_at?new Date(y.last_crawl_at).toLocaleDateString():"Never"})]})]})})]})}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body",children:[a.jsx("h2",{className:"card-title",children:"Crawl Dispensary"}),a.jsx("p",{className:"text-sm text-gray-500",children:"Start crawling products from the selected dispensary menu"}),a.jsx("div",{className:"card-actions justify-end mt-4",children:a.jsx("button",{onClick:v,disabled:!r||c,className:`btn btn-primary ${c?"loading":""}`,children:c?"Starting...":"Start Crawl"})})]})}),a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body",children:[a.jsx("h2",{className:"card-title",children:"Download Images"}),a.jsx("p",{className:"text-sm text-gray-500",children:"Download missing product images for the selected dispensary"}),a.jsx("div",{className:"card-actions justify-end mt-auto",children:a.jsx("button",{onClick:j,disabled:!r||u,className:`btn btn-secondary ${u?"loading":""}`,children:u?"Downloading...":"Download Missing Images"})})]})})]}),a.jsxs("div",{className:"alert alert-info",children:[a.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",className:"stroke-current shrink-0 w-6 h-6",children:a.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),a.jsxs("span",{children:["After starting scraper operations, check the"," ",a.jsx("a",{href:"/scraper-monitor",className:"link",children:"Scraper Monitor"})," for real-time progress and ",a.jsx("a",{href:"/logs",className:"link",children:"Logs"})," for detailed output."]})]})]})]})}function xF(){const[e,t]=h.useState([]),[r,n]=h.useState(null),[i,s]=h.useState(!0),[o,l]=h.useState("pending"),[c,d]=h.useState(null);h.useEffect(()=>{u()},[o]);const u=async()=>{s(!0);try{const[g,b]=await Promise.all([B.getChanges(o==="all"?void 0:o),B.getChangeStats()]);t(g.changes),n(b)}catch(g){console.error("Failed to load changes:",g)}finally{s(!1)}},f=async g=>{d(g);try{(await B.approveChange(g)).requires_recrawl&&alert("Change approved! This dispensary requires a menu recrawl."),await u()}catch(b){console.error("Failed to approve change:",b),alert("Failed to approve change. Please try again.")}finally{d(null)}},p=async g=>{const b=prompt("Enter rejection reason (optional):");d(g);try{await B.rejectChange(g,b||void 0),await u()}catch(v){console.error("Failed to reject change:",v),alert("Failed to reject change. Please try again.")}finally{d(null)}},m=g=>({dba_name:"DBA Name",website:"Website",phone:"Phone",email:"Email",google_rating:"Google Rating",google_review_count:"Google Review Count",menu_url:"Menu URL"})[g]||g,x=g=>({high:"bg-green-100 text-green-800",medium:"bg-yellow-100 text-yellow-800",low:"bg-red-100 text-red-800"})[g]||"bg-gray-100 text-gray-800";return i?a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading changes..."})]})}):a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Change Approval"}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"Review and approve proposed changes to dispensary data"})]}),a.jsxs("button",{onClick:u,className:"flex items-center gap-2 px-4 py-2 text-sm border border-gray-300 rounded-lg hover:bg-gray-50",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Refresh"]})]}),r&&a.jsxs("div",{className:"grid grid-cols-4 gap-6",children:[a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-yellow-50 rounded-lg",children:a.jsx(xr,{className:"w-5 h-5 text-yellow-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Pending"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:r.pending_count})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-orange-50 rounded-lg",children:a.jsx(nj,{className:"w-5 h-5 text-orange-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Needs Recrawl"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:r.pending_recrawl_count})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(_r,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Approved"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:r.approved_count})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-red-50 rounded-lg",children:a.jsx(Hr,{className:"w-5 h-5 text-red-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Rejected"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:r.rejected_count})]})]})})]}),a.jsx("div",{className:"flex gap-2",children:["all","pending","approved","rejected"].map(g=>a.jsx("button",{onClick:()=>l(g),className:`px-4 py-2 text-sm font-medium rounded-lg ${o===g?"bg-blue-600 text-white":"bg-white text-gray-700 border border-gray-300 hover:bg-gray-50"}`,children:g.charAt(0).toUpperCase()+g.slice(1)},g))}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200",children:e.length===0?a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-600",children:"No changes found"})}):a.jsx("div",{className:"divide-y divide-gray-200",children:e.map(g=>a.jsx("div",{className:"p-6",children:a.jsxs("div",{className:"flex items-start justify-between",children:[a.jsxs("div",{className:"flex-1",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[a.jsx("h3",{className:"text-lg font-semibold text-gray-900",children:g.dispensary_name}),a.jsx("span",{className:`px-2 py-1 text-xs font-medium rounded ${x(g.confidence_score)}`,children:g.confidence_score||"N/A"}),g.requires_recrawl&&a.jsx("span",{className:"px-2 py-1 text-xs font-medium rounded bg-orange-100 text-orange-800",children:"Requires Recrawl"})]}),a.jsxs("p",{className:"text-sm text-gray-600 mb-3",children:[g.city,", ",g.state," • Source: ",g.source]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4 mb-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"text-xs font-medium text-gray-500",children:"Field"}),a.jsx("p",{className:"text-sm text-gray-900",children:m(g.field_name)})]}),a.jsxs("div",{children:[a.jsx("label",{className:"text-xs font-medium text-gray-500",children:"Old Value"}),a.jsx("p",{className:"text-sm text-gray-900",children:g.old_value||a.jsx("em",{className:"text-gray-400",children:"None"})})]}),a.jsxs("div",{className:"col-span-2",children:[a.jsx("label",{className:"text-xs font-medium text-gray-500",children:"New Value"}),a.jsx("p",{className:"text-sm font-medium text-blue-600",children:g.new_value})]}),g.change_notes&&a.jsxs("div",{className:"col-span-2",children:[a.jsx("label",{className:"text-xs font-medium text-gray-500",children:"Notes"}),a.jsx("p",{className:"text-sm text-gray-700",children:g.change_notes})]})]}),a.jsxs("p",{className:"text-xs text-gray-500",children:["Created ",new Date(g.created_at).toLocaleString()]}),g.status==="rejected"&&g.rejection_reason&&a.jsxs("div",{className:"mt-2 p-3 bg-red-50 rounded border border-red-200",children:[a.jsx("p",{className:"text-xs font-medium text-red-800",children:"Rejection Reason:"}),a.jsx("p",{className:"text-sm text-red-700",children:g.rejection_reason})]})]}),a.jsxs("div",{className:"flex items-center gap-2 ml-4",children:[g.status==="pending"&&a.jsxs(a.Fragment,{children:[a.jsxs("button",{onClick:()=>f(g.id),disabled:c===g.id,className:"flex items-center gap-2 px-4 py-2 bg-green-600 text-white text-sm font-medium rounded-lg hover:bg-green-700 disabled:opacity-50",children:[a.jsx(_r,{className:"w-4 h-4"}),"Approve"]}),a.jsxs("button",{onClick:()=>p(g.id),disabled:c===g.id,className:"flex items-center gap-2 px-4 py-2 bg-red-600 text-white text-sm font-medium rounded-lg hover:bg-red-700 disabled:opacity-50",children:[a.jsx(Hr,{className:"w-4 h-4"}),"Reject"]})]}),g.status==="approved"&&a.jsxs("span",{className:"flex items-center gap-2 px-4 py-2 bg-green-100 text-green-800 text-sm font-medium rounded-lg",children:[a.jsx(_r,{className:"w-4 h-4"}),"Approved"]}),g.status==="rejected"&&a.jsxs("span",{className:"flex items-center gap-2 px-4 py-2 bg-red-100 text-red-800 text-sm font-medium rounded-lg",children:[a.jsx(Hr,{className:"w-4 h-4"}),"Rejected"]}),a.jsx("a",{href:`/dispensaries/${g.dispensary_slug}`,target:"_blank",rel:"noopener noreferrer",className:"p-2 text-gray-400 hover:text-gray-600",children:a.jsx(Jr,{className:"w-4 h-4"})})]})]})},g.id))})})]})})}function yF(){const[e,t]=h.useState([]),[r,n]=h.useState([]),[i,s]=h.useState(!0),[o,l]=h.useState(!1),[c,d]=h.useState({user_name:"",store_id:"",allowed_ips:"",allowed_domains:""}),[u,f]=h.useState(null);h.useEffect(()=>{m(),p()},[]);const p=async()=>{try{const y=await B.getApiPermissionDispensaries();n(y.dispensaries)}catch(y){console.error("Failed to load dispensaries:",y)}},m=async()=>{s(!0);try{const y=await B.getApiPermissions();t(y.permissions)}catch(y){f({message:"Failed to load API permissions: "+y.message,type:"error"})}finally{s(!1)}},x=async y=>{if(y.preventDefault(),!c.user_name.trim()){f({message:"User name is required",type:"error"});return}if(!c.store_id){f({message:"Store is required",type:"error"});return}try{const w=await B.createApiPermission({...c,store_id:parseInt(c.store_id)});f({message:w.message,type:"success"}),d({user_name:"",store_id:"",allowed_ips:"",allowed_domains:""}),l(!1),m()}catch(w){f({message:"Failed to create permission: "+w.message,type:"error"})}},g=async y=>{try{await B.toggleApiPermission(y),f({message:"Permission status updated",type:"success"}),m()}catch(w){f({message:"Failed to toggle permission: "+w.message,type:"error"})}},b=async y=>{if(confirm("Are you sure you want to delete this API permission?"))try{await B.deleteApiPermission(y),f({message:"Permission deleted successfully",type:"success"}),m()}catch(w){f({message:"Failed to delete permission: "+w.message,type:"error"})}},v=y=>{navigator.clipboard.writeText(y),f({message:"API key copied to clipboard!",type:"success"})},j=y=>{if(!y)return"Never";const w=new Date(y);return w.toLocaleDateString()+" "+w.toLocaleTimeString()};return i?a.jsx(X,{children:a.jsx("div",{className:"p-6",children:a.jsx("div",{className:"text-center text-gray-600",children:"Loading API permissions..."})})}):a.jsx(X,{children:a.jsxs("div",{className:"p-6",children:[u&&a.jsx(Vn,{message:u.message,type:u.type,onClose:()=>f(null)}),a.jsxs("div",{className:"flex justify-between items-center mb-6",children:[a.jsx("h1",{className:"text-2xl font-bold",children:"API Permissions"}),a.jsx("button",{onClick:()=>l(!o),className:"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700",children:o?"Cancel":"Add New Permission"})]}),a.jsxs("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4 mb-6",children:[a.jsx("h3",{className:"font-semibold text-blue-900 mb-2",children:"How it works:"}),a.jsx("p",{className:"text-blue-800 text-sm",children:"Users with valid permissions can access your API without entering tokens. Access is automatically validated based on their IP address and/or domain name."})]}),o&&a.jsxs("div",{className:"bg-white rounded-lg shadow-md p-6 mb-6",children:[a.jsx("h2",{className:"text-xl font-semibold mb-4",children:"Add New API User"}),a.jsxs("form",{onSubmit:x,children:[a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"User/Client Name *"}),a.jsx("input",{type:"text",value:c.user_name,onChange:y=>d({...c,user_name:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",placeholder:"e.g., My Website",required:!0}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"A friendly name to identify this API user"})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Store *"}),a.jsxs("select",{value:c.store_id,onChange:y=>d({...c,store_id:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",required:!0,children:[a.jsx("option",{value:"",children:"Select a store..."}),r.map(y=>a.jsx("option",{value:y.id,children:y.name},y.id))]}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"The store this API token can access"})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Allowed IP Addresses"}),a.jsx("textarea",{value:c.allowed_ips,onChange:y=>d({...c,allowed_ips:y.target.value}),rows:3,className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm",placeholder:`192.168.1.1 -10.0.0.0/8 -2001:db8::/32`}),a.jsxs("p",{className:"text-sm text-gray-600 mt-1",children:["One IP address or CIDR range per line. Leave empty to allow any IP.",a.jsx("br",{}),"Supports IPv4, IPv6, and CIDR notation (e.g., 192.168.0.0/24)"]})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Allowed Domains"}),a.jsx("textarea",{value:c.allowed_domains,onChange:y=>d({...c,allowed_domains:y.target.value}),rows:3,className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm",placeholder:`example.com -*.example.com -subdomain.example.com`}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"One domain per line. Wildcards supported (e.g., *.example.com). Leave empty to allow any domain."})]}),a.jsx("button",{type:"submit",className:"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700",children:"Create API Permission"})]})]}),a.jsxs("div",{className:"bg-white rounded-lg shadow-md overflow-hidden",children:[a.jsx("div",{className:"px-6 py-4 border-b border-gray-200",children:a.jsx("h2",{className:"text-xl font-semibold",children:"Active API Users"})}),e.length===0?a.jsx("div",{className:"p-6 text-center text-gray-600",children:"No API permissions configured yet. Add your first user above."}):a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full",children:[a.jsx("thead",{className:"bg-gray-50",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"User Name"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Store"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"API Key"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Allowed IPs"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Allowed Domains"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Status"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Last Used"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Actions"})]})}),a.jsx("tbody",{className:"bg-white divide-y divide-gray-200",children:e.map(y=>a.jsxs("tr",{children:[a.jsx("td",{className:"px-6 py-4 whitespace-nowrap",children:a.jsx("div",{className:"font-medium text-gray-900",children:y.user_name})}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap",children:a.jsx("div",{className:"text-sm text-gray-900",children:y.store_name||a.jsx("span",{className:"text-gray-400 italic",children:"No store"})})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center space-x-2",children:[a.jsxs("code",{className:"text-xs bg-gray-100 px-2 py-1 rounded",children:[y.api_key.substring(0,16),"..."]}),a.jsx("button",{onClick:()=>v(y.api_key),className:"text-blue-600 hover:text-blue-800 text-sm",children:"Copy"})]})}),a.jsx("td",{className:"px-6 py-4",children:y.allowed_ips?a.jsxs("div",{className:"text-sm text-gray-600",children:[y.allowed_ips.split(` -`).slice(0,2).join(", "),y.allowed_ips.split(` -`).length>2&&a.jsxs("span",{className:"text-gray-400",children:[" +",y.allowed_ips.split(` -`).length-2," more"]})]}):a.jsx("span",{className:"text-gray-400 italic",children:"Any IP"})}),a.jsx("td",{className:"px-6 py-4",children:y.allowed_domains?a.jsxs("div",{className:"text-sm text-gray-600",children:[y.allowed_domains.split(` -`).slice(0,2).join(", "),y.allowed_domains.split(` -`).length>2&&a.jsxs("span",{className:"text-gray-400",children:[" +",y.allowed_domains.split(` -`).length-2," more"]})]}):a.jsx("span",{className:"text-gray-400 italic",children:"Any domain"})}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap",children:y.is_active?a.jsx("span",{className:"px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800",children:"Active"}):a.jsx("span",{className:"px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800",children:"Disabled"})}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-600",children:j(y.last_used_at)}),a.jsxs("td",{className:"px-6 py-4 whitespace-nowrap text-sm space-x-2",children:[a.jsx("button",{onClick:()=>g(y.id),className:"text-blue-600 hover:text-blue-800",children:y.is_active?"Disable":"Enable"}),a.jsx("button",{onClick:()=>b(y.id),className:"text-red-600 hover:text-red-800",children:"Delete"})]})]},y.id))})]})})]})]})})}function vF(){const[e,t]=h.useState([]),[r,n]=h.useState([]),[i,s]=h.useState(null),[o,l]=h.useState(null),[c,d]=h.useState(!0),[u,f]=h.useState(!0),[p,m]=h.useState("schedules"),[x,g]=h.useState(null),[b,v]=h.useState(!1),[j,y]=h.useState(!1),[w,S]=h.useState(null);h.useEffect(()=>{if(N(),u){const k=setInterval(N,1e4);return()=>clearInterval(k)}},[u]);const N=async()=>{try{const[k,L,F,H]=await Promise.all([B.getDutchieAZSchedules(),B.getDutchieAZRunLogs({limit:50}),B.getDutchieAZSchedulerStatus(),B.getDetectionStats().catch(()=>null)]);t(k.schedules||[]),n(L.logs||[]),s(F),l(H)}catch(k){console.error("Failed to load schedule data:",k)}finally{d(!1)}},P=async()=>{try{i!=null&&i.running?await B.stopDutchieAZScheduler():await B.startDutchieAZScheduler(),await N()}catch(k){console.error("Failed to toggle scheduler:",k)}},_=async()=>{try{await B.initDutchieAZSchedules(),await N()}catch(k){console.error("Failed to initialize schedules:",k)}},T=async k=>{try{await B.triggerDutchieAZSchedule(k),await N()}catch(L){console.error("Failed to trigger schedule:",L)}},$=async k=>{try{await B.updateDutchieAZSchedule(k.id,{enabled:!k.enabled}),await N()}catch(L){console.error("Failed to toggle schedule:",L)}},M=async(k,L)=>{try{const F={description:L.description??void 0,enabled:L.enabled,baseIntervalMinutes:L.baseIntervalMinutes,jitterMinutes:L.jitterMinutes,jobConfig:L.jobConfig??void 0};await B.updateDutchieAZSchedule(k,F),g(null),await N()}catch(F){console.error("Failed to update schedule:",F)}},C=async()=>{if(confirm("Run menu detection on all dispensaries with unknown/missing menu_type?")){y(!0),S(null);try{const k=await B.detectAllDispensaries({state:"AZ",onlyUnknown:!0});S(k),await N()}catch(k){console.error("Failed to run bulk detection:",k)}finally{y(!1)}}},R=async()=>{if(confirm("Resolve platform IDs for all Dutchie dispensaries missing them?")){y(!0),S(null);try{const k=await B.detectAllDispensaries({state:"AZ",onlyMissingPlatformId:!0,onlyUnknown:!1});S(k),await N()}catch(k){console.error("Failed to resolve platform IDs:",k)}finally{y(!1)}}},q=k=>{if(!k)return"Never";const L=new Date(k),H=new Date().getTime()-L.getTime(),te=Math.floor(H/6e4),re=Math.floor(te/60),we=Math.floor(re/24);return te<1?"Just now":te<60?`${te}m ago`:re<24?`${re}h ago`:`${we}d ago`},Z=k=>{if(!k)return"Not scheduled";const L=new Date(k),F=new Date,H=L.getTime()-F.getTime();if(H<0)return"Overdue";const te=Math.floor(H/6e4),re=Math.floor(te/60);return te<60?`${te}m`:`${re}h ${te%60}m`},E=k=>{if(!k)return"-";if(k<1e3)return`${k}ms`;const L=Math.floor(k/1e3),F=Math.floor(L/60);return F<1?`${L}s`:`${F}m ${L%60}s`},D=(k,L)=>{const F=Math.floor(k/60),H=k%60,te=Math.floor(L/60),re=L%60;let we=F>0?`${F}h`:"";H>0&&(we+=`${H}m`);let A=te>0?`${te}h`:"";return re>0&&(A+=`${re}m`),`${we} +/- ${A}`},O=k=>{switch(k){case"success":return{bg:"#d1fae5",color:"#065f46"};case"running":return{bg:"#dbeafe",color:"#1e40af"};case"error":return{bg:"#fee2e2",color:"#991b1b"};case"partial":return{bg:"#fef3c7",color:"#92400e"};default:return{bg:"#f3f4f6",color:"#374151"}}};return a.jsx(X,{children:a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsxs("div",{children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Dutchie AZ Schedule"}),a.jsx("p",{style:{color:"#666",margin:"8px 0 0 0"},children:"Jittered scheduling for Arizona Dutchie product crawls"})]}),a.jsx("div",{style:{display:"flex",gap:"15px",alignItems:"center"},children:a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:u,onChange:k=>f(k.target.checked),style:{width:"18px",height:"18px",cursor:"pointer"}}),a.jsx("span",{children:"Auto-refresh (10s)"})]})})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"30px",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"20px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"14px",color:"#666",marginBottom:"4px"},children:"Scheduler Status"}),a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[a.jsx("span",{style:{width:"12px",height:"12px",borderRadius:"50%",background:i!=null&&i.running?"#10b981":"#ef4444",display:"inline-block"}}),a.jsx("span",{style:{fontWeight:"600",fontSize:"18px"},children:i!=null&&i.running?"Running":"Stopped"})]})]}),a.jsxs("div",{style:{borderLeft:"1px solid #eee",paddingLeft:"20px"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#666",marginBottom:"4px"},children:"Poll Interval"}),a.jsx("div",{style:{fontWeight:"600"},children:i?`${i.pollIntervalMs/1e3}s`:"-"})]}),a.jsxs("div",{style:{borderLeft:"1px solid #eee",paddingLeft:"20px"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#666",marginBottom:"4px"},children:"Active Schedules"}),a.jsxs("div",{style:{fontWeight:"600"},children:[e.filter(k=>k.enabled).length," / ",e.length]})]})]}),a.jsxs("div",{style:{display:"flex",gap:"10px"},children:[a.jsx("button",{onClick:P,style:{padding:"10px 20px",background:i!=null&&i.running?"#ef4444":"#10b981",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600"},children:i!=null&&i.running?"Stop Scheduler":"Start Scheduler"}),e.length===0&&a.jsx("button",{onClick:_,style:{padding:"10px 20px",background:"#2563eb",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600"},children:"Initialize Default Schedules"})]})]}),a.jsxs("div",{style:{marginBottom:"30px",display:"flex",gap:"10px",borderBottom:"2px solid #eee"},children:[a.jsxs("button",{onClick:()=>m("schedules"),style:{padding:"12px 24px",background:p==="schedules"?"white":"transparent",border:"none",borderBottom:p==="schedules"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:p==="schedules"?"600":"400",color:p==="schedules"?"#2563eb":"#666",marginBottom:"-2px"},children:["Schedule Configs (",e.length,")"]}),a.jsxs("button",{onClick:()=>m("logs"),style:{padding:"12px 24px",background:p==="logs"?"white":"transparent",border:"none",borderBottom:p==="logs"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:p==="logs"?"600":"400",color:p==="logs"?"#2563eb":"#666",marginBottom:"-2px"},children:["Run Logs (",r.length,")"]}),a.jsxs("button",{onClick:()=>m("detection"),style:{padding:"12px 24px",background:p==="detection"?"white":"transparent",border:"none",borderBottom:p==="detection"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:p==="detection"?"600":"400",color:p==="detection"?"#2563eb":"#666",marginBottom:"-2px"},children:["Menu Detection ",o!=null&&o.needsDetection?`(${o.needsDetection} pending)`:""]})]}),p==="schedules"&&a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:e.length===0?a.jsx("div",{style:{padding:"40px",textAlign:"center",color:"#666"},children:'No schedules configured. Click "Initialize Default Schedules" to create the default crawl schedule.'}):a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Job Name"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Enabled"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Interval (Jitter)"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Last Run"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Next Run"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Last Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Actions"})]})}),a.jsx("tbody",{children:e.map(k=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:k.jobName}),k.description&&a.jsx("div",{style:{fontSize:"13px",color:"#666",marginTop:"4px"},children:k.description}),k.jobConfig&&a.jsxs("div",{style:{fontSize:"11px",color:"#999",marginTop:"4px"},children:["Config: ",JSON.stringify(k.jobConfig)]})]}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("button",{onClick:()=>$(k),style:{padding:"4px 12px",borderRadius:"12px",border:"none",cursor:"pointer",fontWeight:"600",fontSize:"12px",background:k.enabled?"#d1fae5":"#fee2e2",color:k.enabled?"#065f46":"#991b1b"},children:k.enabled?"ON":"OFF"})}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("div",{style:{fontWeight:"600"},children:D(k.baseIntervalMinutes,k.jitterMinutes)})}),a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{children:q(k.lastRunAt)}),k.lastDurationMs&&a.jsxs("div",{style:{fontSize:"12px",color:"#666"},children:["Duration: ",E(k.lastDurationMs)]})]}),a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600",color:"#2563eb"},children:Z(k.nextRunAt)}),k.nextRunAt&&a.jsx("div",{style:{fontSize:"12px",color:"#999"},children:new Date(k.nextRunAt).toLocaleString()})]}),a.jsx("td",{style:{padding:"15px"},children:k.lastStatus?a.jsxs("div",{children:[a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",...O(k.lastStatus)},children:k.lastStatus}),k.lastErrorMessage&&a.jsx("button",{onClick:()=>alert(k.lastErrorMessage),style:{marginLeft:"8px",padding:"2px 6px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"10px"},children:"Error"})]}):a.jsx("span",{style:{color:"#999"},children:"Never run"})}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsxs("div",{style:{display:"flex",gap:"8px",justifyContent:"center"},children:[a.jsx("button",{onClick:()=>T(k.id),disabled:k.lastStatus==="running",style:{padding:"6px 12px",background:k.lastStatus==="running"?"#94a3b8":"#2563eb",color:"white",border:"none",borderRadius:"4px",cursor:k.lastStatus==="running"?"not-allowed":"pointer",fontSize:"13px"},children:"Run Now"}),a.jsx("button",{onClick:()=>g(k),style:{padding:"6px 12px",background:"#f3f4f6",color:"#374151",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"13px"},children:"Edit"})]})})]},k.id))})]})}),p==="logs"&&a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:r.length===0?a.jsx("div",{style:{padding:"40px",textAlign:"center",color:"#666"},children:"No run logs yet. Logs will appear here after jobs execute."}):a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Job"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Started"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Duration"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Processed"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Succeeded"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Failed"})]})}),a.jsx("tbody",{children:r.map(k=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:k.job_name}),a.jsxs("div",{style:{fontSize:"12px",color:"#999"},children:["Run #",k.id]})]}),a.jsxs("td",{style:{padding:"15px",textAlign:"center"},children:[a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",...O(k.status)},children:k.status}),k.error_message&&a.jsx("button",{onClick:()=>alert(k.error_message),style:{marginLeft:"8px",padding:"2px 6px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"10px"},children:"Error"})]}),a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{children:k.started_at?new Date(k.started_at).toLocaleString():"-"}),a.jsx("div",{style:{fontSize:"12px",color:"#999"},children:q(k.started_at)})]}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:E(k.duration_ms)}),a.jsx("td",{style:{padding:"15px",textAlign:"right"},children:k.items_processed??"-"}),a.jsx("td",{style:{padding:"15px",textAlign:"right",color:"#10b981"},children:k.items_succeeded??"-"}),a.jsx("td",{style:{padding:"15px",textAlign:"right",color:k.items_failed?"#ef4444":"inherit"},children:k.items_failed??"-"})]},k.id))})]})}),p==="detection"&&a.jsxs("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",padding:"30px"},children:[o&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsx("h3",{style:{margin:"0 0 20px 0"},children:"Detection Statistics"}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"20px"},children:[a.jsxs("div",{style:{padding:"20px",background:"#f8f8f8",borderRadius:"8px",textAlign:"center"},children:[a.jsx("div",{style:{fontSize:"32px",fontWeight:"700",color:"#2563eb"},children:o.totalDispensaries}),a.jsx("div",{style:{color:"#666",marginTop:"4px"},children:"Total Dispensaries"})]}),a.jsxs("div",{style:{padding:"20px",background:"#f8f8f8",borderRadius:"8px",textAlign:"center"},children:[a.jsx("div",{style:{fontSize:"32px",fontWeight:"700",color:"#10b981"},children:o.withMenuType}),a.jsx("div",{style:{color:"#666",marginTop:"4px"},children:"With Menu Type"})]}),a.jsxs("div",{style:{padding:"20px",background:"#f8f8f8",borderRadius:"8px",textAlign:"center"},children:[a.jsx("div",{style:{fontSize:"32px",fontWeight:"700",color:"#10b981"},children:o.withPlatformId}),a.jsx("div",{style:{color:"#666",marginTop:"4px"},children:"With Platform ID"})]}),a.jsxs("div",{style:{padding:"20px",background:"#fef3c7",borderRadius:"8px",textAlign:"center"},children:[a.jsx("div",{style:{fontSize:"32px",fontWeight:"700",color:"#92400e"},children:o.needsDetection}),a.jsx("div",{style:{color:"#666",marginTop:"4px"},children:"Needs Detection"})]})]}),Object.keys(o.byProvider).length>0&&a.jsxs("div",{style:{marginTop:"20px"},children:[a.jsx("h4",{style:{margin:"0 0 10px 0"},children:"By Provider"}),a.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"10px"},children:Object.entries(o.byProvider).map(([k,L])=>a.jsxs("span",{style:{padding:"6px 14px",background:k==="dutchie"?"#dbeafe":"#f3f4f6",borderRadius:"16px",fontSize:"14px",fontWeight:"600"},children:[k,": ",L]},k))})]})]}),a.jsxs("div",{style:{marginBottom:"30px",display:"flex",gap:"15px",flexWrap:"wrap"},children:[a.jsx("button",{onClick:C,disabled:j||!(o!=null&&o.needsDetection),style:{padding:"12px 24px",background:j?"#94a3b8":"#2563eb",color:"white",border:"none",borderRadius:"6px",cursor:j?"not-allowed":"pointer",fontWeight:"600",fontSize:"14px"},children:j?"Detecting...":"Detect All Unknown"}),a.jsx("button",{onClick:R,disabled:j,style:{padding:"12px 24px",background:j?"#94a3b8":"#10b981",color:"white",border:"none",borderRadius:"6px",cursor:j?"not-allowed":"pointer",fontWeight:"600",fontSize:"14px"},children:j?"Resolving...":"Resolve Missing Platform IDs"})]}),w&&a.jsxs("div",{style:{marginBottom:"30px",padding:"20px",background:"#f8f8f8",borderRadius:"8px"},children:[a.jsx("h4",{style:{margin:"0 0 15px 0"},children:"Detection Results"}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:"15px",marginBottom:"15px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600",fontSize:"24px"},children:w.totalProcessed}),a.jsx("div",{style:{color:"#666",fontSize:"13px"},children:"Processed"})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600",fontSize:"24px",color:"#10b981"},children:w.totalSucceeded}),a.jsx("div",{style:{color:"#666",fontSize:"13px"},children:"Succeeded"})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600",fontSize:"24px",color:"#ef4444"},children:w.totalFailed}),a.jsx("div",{style:{color:"#666",fontSize:"13px"},children:"Failed"})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600",fontSize:"24px",color:"#666"},children:w.totalSkipped}),a.jsx("div",{style:{color:"#666",fontSize:"13px"},children:"Skipped"})]})]}),w.errors&&w.errors.length>0&&a.jsxs("div",{style:{marginTop:"15px"},children:[a.jsx("div",{style:{fontWeight:"600",marginBottom:"8px",color:"#991b1b"},children:"Errors:"}),a.jsxs("div",{style:{maxHeight:"150px",overflow:"auto",background:"#fee2e2",padding:"10px",borderRadius:"4px",fontSize:"12px"},children:[w.errors.slice(0,10).map((k,L)=>a.jsx("div",{style:{marginBottom:"4px"},children:k},L)),w.errors.length>10&&a.jsxs("div",{style:{fontStyle:"italic",marginTop:"8px"},children:["...and ",w.errors.length-10," more"]})]})]})]}),a.jsxs("div",{style:{padding:"20px",background:"#f0f9ff",borderRadius:"8px",fontSize:"14px"},children:[a.jsx("h4",{style:{margin:"0 0 10px 0",color:"#1e40af"},children:"About Menu Detection"}),a.jsxs("ul",{style:{margin:0,paddingLeft:"20px",color:"#1e40af"},children:[a.jsxs("li",{style:{marginBottom:"8px"},children:[a.jsx("strong",{children:"Detect All Unknown:"})," Scans dispensaries with no menu_type set and detects the provider (dutchie, treez, jane, etc.) from their menu_url."]}),a.jsxs("li",{style:{marginBottom:"8px"},children:[a.jsx("strong",{children:"Resolve Missing Platform IDs:"}),' For dispensaries already detected as "dutchie", extracts the cName from menu_url and resolves the platform_dispensary_id via GraphQL.']}),a.jsxs("li",{children:[a.jsx("strong",{children:"Automatic scheduling:"}),' A "Menu Detection" job runs daily (24h +/- 1h jitter) to detect new dispensaries.']})]})]})]}),x&&a.jsx("div",{style:{position:"fixed",top:0,left:0,right:0,bottom:0,background:"rgba(0,0,0,0.5)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e3},children:a.jsxs("div",{style:{background:"white",padding:"30px",borderRadius:"12px",width:"500px",maxWidth:"90vw"},children:[a.jsxs("h2",{style:{margin:"0 0 20px 0"},children:["Edit Schedule: ",x.jobName]}),a.jsxs("div",{style:{marginBottom:"20px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"600"},children:"Description"}),a.jsx("input",{type:"text",value:x.description||"",onChange:k=>g({...x,description:k.target.value}),style:{width:"100%",padding:"10px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"14px"}})]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"20px",marginBottom:"20px"},children:[a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"600"},children:"Base Interval (minutes)"}),a.jsx("input",{type:"number",value:x.baseIntervalMinutes,onChange:k=>g({...x,baseIntervalMinutes:parseInt(k.target.value)||240}),style:{width:"100%",padding:"10px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"14px"}}),a.jsxs("div",{style:{fontSize:"12px",color:"#666",marginTop:"4px"},children:["= ",Math.floor(x.baseIntervalMinutes/60),"h ",x.baseIntervalMinutes%60,"m"]})]}),a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"600"},children:"Jitter (minutes)"}),a.jsx("input",{type:"number",value:x.jitterMinutes,onChange:k=>g({...x,jitterMinutes:parseInt(k.target.value)||30}),style:{width:"100%",padding:"10px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"14px"}}),a.jsxs("div",{style:{fontSize:"12px",color:"#666",marginTop:"4px"},children:["+/- ",x.jitterMinutes,"m random offset"]})]})]}),a.jsxs("div",{style:{fontSize:"13px",color:"#666",marginBottom:"20px",padding:"15px",background:"#f8f8f8",borderRadius:"6px"},children:[a.jsx("strong",{children:"Effective range:"})," ",Math.floor((x.baseIntervalMinutes-x.jitterMinutes)/60),"h ",(x.baseIntervalMinutes-x.jitterMinutes)%60,"m"," to ",Math.floor((x.baseIntervalMinutes+x.jitterMinutes)/60),"h ",(x.baseIntervalMinutes+x.jitterMinutes)%60,"m"]}),a.jsxs("div",{style:{display:"flex",gap:"10px",justifyContent:"flex-end"},children:[a.jsx("button",{onClick:()=>g(null),style:{padding:"10px 20px",background:"#f3f4f6",color:"#374151",border:"none",borderRadius:"6px",cursor:"pointer"},children:"Cancel"}),a.jsx("button",{onClick:()=>M(x.id,{description:x.description,baseIntervalMinutes:x.baseIntervalMinutes,jitterMinutes:x.jitterMinutes}),style:{padding:"10px 20px",background:"#2563eb",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600"},children:"Save Changes"})]})]})})]})})}function bF(){const e=dt(),[t,r]=h.useState([]),[n,i]=h.useState(0),[s,o]=h.useState(!0),[l,c]=h.useState(null);h.useEffect(()=>{d()},[]);const d=async()=>{o(!0);try{const[u,f]=await Promise.all([B.getDutchieAZStores({limit:200}),B.getDutchieAZDashboard()]);r(u.stores),i(u.total),c(f)}catch(u){console.error("Failed to load data:",u)}finally{o(!1)}};return s?a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading stores..."})]})}):a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Dutchie AZ Stores"}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"Arizona dispensaries using the Dutchie platform - data from the new pipeline"})]}),a.jsxs("button",{onClick:d,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Refresh"]})]}),l&&a.jsxs("div",{className:"grid grid-cols-4 gap-4",children:[a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Ln,{className:"w-5 h-5 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Dispensaries"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:l.dispensaryCount})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(Ct,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Total Products"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:l.productCount.toLocaleString()})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(_r,{className:"w-5 h-5 text-purple-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Brands"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:l.brandCount})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-orange-50 rounded-lg",children:a.jsx(Hr,{className:"w-5 h-5 text-orange-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Failed Jobs (24h)"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:l.failedJobCount})]})]})})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200",children:[a.jsx("div",{className:"p-4 border-b border-gray-200",children:a.jsxs("h2",{className:"text-lg font-semibold text-gray-900",children:["All Stores (",n,")"]})}),a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"table table-zebra w-full",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Name"}),a.jsx("th",{children:"City"}),a.jsx("th",{children:"Platform ID"}),a.jsx("th",{children:"Status"}),a.jsx("th",{children:"Actions"})]})}),a.jsx("tbody",{children:t.map(u=>a.jsxs("tr",{children:[a.jsx("td",{children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Ln,{className:"w-4 h-4 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"font-medium text-gray-900",children:u.dba_name||u.name}),u.company_name&&u.company_name!==u.name&&a.jsx("p",{className:"text-xs text-gray-500",children:u.company_name})]})]})}),a.jsx("td",{children:a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(yi,{className:"w-4 h-4"}),u.city,", ",u.state]})}),a.jsx("td",{children:u.platform_dispensary_id?a.jsx("span",{className:"text-xs font-mono text-gray-600",children:u.platform_dispensary_id}):a.jsx("span",{className:"badge badge-warning badge-sm",children:"Not Resolved"})}),a.jsx("td",{children:u.platform_dispensary_id?a.jsx("span",{className:"badge badge-success badge-sm",children:"Ready"}):a.jsx("span",{className:"badge badge-warning badge-sm",children:"Pending"})}),a.jsx("td",{children:a.jsx("button",{onClick:()=>e(`/az/stores/${u.id}`),className:"btn btn-sm btn-primary",disabled:!u.platform_dispensary_id,children:"View Products"})})]},u.id))})]})})]})]})})}function jF(){const{id:e}=ka(),t=dt(),[r,n]=h.useState(null),[i,s]=h.useState([]),[o,l]=h.useState(!0),[c,d]=h.useState(!1),[u,f]=h.useState("products"),[p,m]=h.useState(!1),[x,g]=h.useState(!1),[b,v]=h.useState(""),[j,y]=h.useState(1),[w,S]=h.useState(0),[N]=h.useState(25),[P,_]=h.useState(""),T=O=>{if(!O)return"Never";const k=new Date(O),F=new Date().getTime()-k.getTime(),H=Math.floor(F/(1e3*60*60*24));return H===0?"Today":H===1?"Yesterday":H<7?`${H} days ago`:k.toLocaleDateString()};h.useEffect(()=>{e&&$()},[e]),h.useEffect(()=>{e&&u==="products"&&M()},[e,j,b,P,u]),h.useEffect(()=>{y(1)},[b,P]);const $=async()=>{l(!0);try{const O=await B.getDutchieAZStoreSummary(parseInt(e,10));n(O)}catch(O){console.error("Failed to load store summary:",O)}finally{l(!1)}},M=async()=>{if(e){d(!0);try{const O=await B.getDutchieAZStoreProducts(parseInt(e,10),{search:b||void 0,stockStatus:P||void 0,limit:N,offset:(j-1)*N});s(O.products),S(O.total)}catch(O){console.error("Failed to load products:",O)}finally{d(!1)}}},C=async()=>{m(!1),g(!0);try{await B.triggerDutchieAZCrawl(parseInt(e,10)),alert("Crawl started! Refresh the page in a few minutes to see updated data.")}catch(O){console.error("Failed to trigger crawl:",O),alert("Failed to start crawl. Please try again.")}finally{g(!1)}},R=Math.ceil(w/N);if(o)return a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading store..."})]})});if(!r)return a.jsx(X,{children:a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-600",children:"Store not found"})})});const{dispensary:q,brands:Z,categories:E,lastCrawl:D}=r;return a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between gap-4",children:[a.jsxs("button",{onClick:()=>t("/az"),className:"flex items-center gap-2 text-sm text-gray-600 hover:text-gray-900",children:[a.jsx(_h,{className:"w-4 h-4"}),"Back to AZ Stores"]}),a.jsxs("div",{className:"relative",children:[a.jsxs("button",{onClick:()=>m(!p),disabled:x,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed",children:[a.jsx(Xt,{className:`w-4 h-4 ${x?"animate-spin":""}`}),x?"Crawling...":"Crawl Now",!x&&a.jsx(ej,{className:"w-4 h-4"})]}),p&&!x&&a.jsx("div",{className:"absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-lg border border-gray-200 z-10",children:a.jsx("button",{onClick:C,className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-lg",children:"Start Full Crawl"})})]})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-start justify-between gap-4 mb-4",children:[a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"p-3 bg-blue-50 rounded-lg",children:a.jsx(Ln,{className:"w-8 h-8 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:q.dba_name||q.name}),q.company_name&&a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:q.company_name}),a.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:["Platform ID: ",q.platform_dispensary_id||"Not resolved"]})]})]}),a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 bg-gray-50 px-4 py-2 rounded-lg",children:[a.jsx(xr,{className:"w-4 h-4"}),a.jsxs("div",{children:[a.jsx("span",{className:"font-medium",children:"Last Crawl:"}),a.jsx("span",{className:"ml-2",children:D!=null&&D.completed_at?new Date(D.completed_at).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"Never"}),(D==null?void 0:D.status)&&a.jsx("span",{className:`ml-2 px-2 py-0.5 rounded text-xs ${D.status==="completed"?"bg-green-100 text-green-800":D.status==="failed"?"bg-red-100 text-red-800":"bg-yellow-100 text-yellow-800"}`,children:D.status})]})]})]}),a.jsxs("div",{className:"flex flex-wrap gap-4",children:[q.address&&a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(yi,{className:"w-4 h-4"}),a.jsxs("span",{children:[q.address,", ",q.city,", ",q.state," ",q.zip]})]}),q.phone&&a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(Ah,{className:"w-4 h-4"}),a.jsx("span",{children:q.phone})]}),q.website&&a.jsxs("a",{href:q.website,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-sm text-blue-600 hover:text-blue-800",children:[a.jsx(Jr,{className:"w-4 h-4"}),"Website"]})]})]}),a.jsxs("div",{className:"grid grid-cols-5 gap-4",children:[a.jsx("button",{onClick:()=>{f("products"),_(""),v("")},className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${u==="products"&&!P?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(Ct,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Total Products"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.totalProducts})]})]})}),a.jsx("button",{onClick:()=>{f("products"),_("in_stock"),v("")},className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${P==="in_stock"?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-emerald-50 rounded-lg",children:a.jsx(_r,{className:"w-5 h-5 text-emerald-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"In Stock"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.inStockCount})]})]})}),a.jsx("button",{onClick:()=>{f("products"),_("out_of_stock"),v("")},className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${P==="out_of_stock"?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-red-50 rounded-lg",children:a.jsx(Hr,{className:"w-5 h-5 text-red-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Out of Stock"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.outOfStockCount})]})]})}),a.jsx("button",{onClick:()=>f("brands"),className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${u==="brands"?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(Cr,{className:"w-5 h-5 text-purple-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Brands"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.brandCount})]})]})}),a.jsx("button",{onClick:()=>f("categories"),className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${u==="categories"?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-orange-50 rounded-lg",children:a.jsx(Uc,{className:"w-5 h-5 text-orange-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Categories"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.categoryCount})]})]})})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200",children:[a.jsx("div",{className:"border-b border-gray-200",children:a.jsxs("div",{className:"flex gap-4 px-6",children:[a.jsxs("button",{onClick:()=>{f("products"),_("")},className:`py-4 px-2 text-sm font-medium border-b-2 ${u==="products"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Products (",r.totalProducts,")"]}),a.jsxs("button",{onClick:()=>f("brands"),className:`py-4 px-2 text-sm font-medium border-b-2 ${u==="brands"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Brands (",r.brandCount,")"]}),a.jsxs("button",{onClick:()=>f("categories"),className:`py-4 px-2 text-sm font-medium border-b-2 ${u==="categories"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Categories (",r.categoryCount,")"]})]})}),a.jsxs("div",{className:"p-6",children:[u==="products"&&a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[a.jsx("input",{type:"text",placeholder:"Search products by name or brand...",value:b,onChange:O=>v(O.target.value),className:"input input-bordered input-sm flex-1"}),a.jsxs("select",{value:P,onChange:O=>_(O.target.value),className:"select select-bordered select-sm",children:[a.jsx("option",{value:"",children:"All Stock"}),a.jsx("option",{value:"in_stock",children:"In Stock"}),a.jsx("option",{value:"out_of_stock",children:"Out of Stock"}),a.jsx("option",{value:"unknown",children:"Unknown"})]}),(b||P)&&a.jsx("button",{onClick:()=>{v(""),_("")},className:"btn btn-sm btn-ghost",children:"Clear"}),a.jsxs("div",{className:"text-sm text-gray-600",children:[w," products"]})]}),c?a.jsxs("div",{className:"text-center py-8",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-6 w-6 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading products..."})]}):i.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No products found"}):a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"overflow-x-auto -mx-6 px-6",children:a.jsxs("table",{className:"table table-xs table-zebra table-pin-rows w-full",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Image"}),a.jsx("th",{children:"Product Name"}),a.jsx("th",{children:"Brand"}),a.jsx("th",{children:"Type"}),a.jsx("th",{className:"text-right",children:"Price"}),a.jsx("th",{className:"text-center",children:"THC %"}),a.jsx("th",{className:"text-center",children:"Stock"}),a.jsx("th",{className:"text-center",children:"Qty"}),a.jsx("th",{children:"Last Updated"})]})}),a.jsx("tbody",{children:i.map(O=>a.jsxs("tr",{children:[a.jsx("td",{className:"whitespace-nowrap",children:O.image_url?a.jsx("img",{src:O.image_url,alt:O.name,className:"w-12 h-12 object-cover rounded",onError:k=>k.currentTarget.style.display="none"}):"-"}),a.jsx("td",{className:"font-medium max-w-[200px]",children:a.jsx("div",{className:"line-clamp-2",title:O.name,children:O.name})}),a.jsx("td",{className:"max-w-[120px]",children:a.jsx("div",{className:"line-clamp-2",title:O.brand||"-",children:O.brand||"-"})}),a.jsxs("td",{className:"whitespace-nowrap",children:[a.jsx("span",{className:"badge badge-ghost badge-sm",children:O.type||"-"}),O.subcategory&&a.jsx("span",{className:"badge badge-ghost badge-sm ml-1",children:O.subcategory})]}),a.jsx("td",{className:"text-right font-semibold whitespace-nowrap",children:O.sale_price?a.jsxs("div",{className:"flex flex-col items-end",children:[a.jsxs("span",{className:"text-error",children:["$",O.sale_price]}),a.jsxs("span",{className:"text-gray-400 line-through text-xs",children:["$",O.regular_price]})]}):O.regular_price?`$${O.regular_price}`:"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:O.thc_percentage?a.jsxs("span",{className:"badge badge-success badge-sm",children:[O.thc_percentage,"%"]}):"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:O.stock_status==="in_stock"?a.jsx("span",{className:"badge badge-success badge-sm",children:"In Stock"}):O.stock_status==="out_of_stock"?a.jsx("span",{className:"badge badge-error badge-sm",children:"Out"}):a.jsx("span",{className:"badge badge-warning badge-sm",children:"Unknown"})}),a.jsx("td",{className:"text-center whitespace-nowrap",children:O.total_quantity!=null?O.total_quantity:"-"}),a.jsx("td",{className:"whitespace-nowrap text-xs text-gray-500",children:O.updated_at?T(O.updated_at):"-"})]},O.id))})]})}),R>1&&a.jsxs("div",{className:"flex justify-center items-center gap-2 mt-4",children:[a.jsx("button",{onClick:()=>y(O=>Math.max(1,O-1)),disabled:j===1,className:"btn btn-sm btn-outline",children:"Previous"}),a.jsx("div",{className:"flex gap-1",children:Array.from({length:Math.min(5,R)},(O,k)=>{let L;return R<=5||j<=3?L=k+1:j>=R-2?L=R-4+k:L=j-2+k,a.jsx("button",{onClick:()=>y(L),className:`btn btn-sm ${j===L?"btn-primary":"btn-outline"}`,children:L},L)})}),a.jsx("button",{onClick:()=>y(O=>Math.min(R,O+1)),disabled:j===R,className:"btn btn-sm btn-outline",children:"Next"})]})]})]}),u==="brands"&&a.jsx("div",{className:"space-y-4",children:Z.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No brands found"}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:Z.map(O=>a.jsxs("button",{onClick:()=>{f("products"),v(O.brand_name),_("")},className:"border border-gray-200 rounded-lg p-4 text-center hover:border-blue-300 hover:shadow-md transition-all cursor-pointer",children:[a.jsx("p",{className:"font-medium text-gray-900 line-clamp-2",children:O.brand_name}),a.jsxs("p",{className:"text-sm text-gray-600 mt-1",children:[O.product_count," product",O.product_count!==1?"s":""]})]},O.brand_name))})}),u==="categories"&&a.jsx("div",{className:"space-y-4",children:E.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No categories found"}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:E.map((O,k)=>a.jsxs("div",{className:"border border-gray-200 rounded-lg p-4 text-center",children:[a.jsx("p",{className:"font-medium text-gray-900",children:O.type}),O.subcategory&&a.jsx("p",{className:"text-sm text-gray-600",children:O.subcategory}),a.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:[O.product_count," product",O.product_count!==1?"s":""]})]},k))})})]})]})]})})}function wF(){const e=dt(),[t,r]=h.useState(null),[n,i]=h.useState([]),[s,o]=h.useState([]),[l,c]=h.useState([]),[d,u]=h.useState(!0),[f,p]=h.useState("overview");h.useEffect(()=>{m()},[]);const m=async()=>{u(!0);try{const[g,b,v,j]=await Promise.all([B.getDutchieAZDashboard(),B.getDutchieAZStores({limit:200}),B.getDutchieAZBrands?B.getDutchieAZBrands({limit:100}):Promise.resolve({brands:[]}),B.getDutchieAZCategories?B.getDutchieAZCategories():Promise.resolve({categories:[]})]);r(g),i(b.stores||[]),o(v.brands||[]),c(j.categories||[])}catch(g){console.error("Failed to load analytics data:",g)}finally{u(!1)}},x=g=>{if(!g)return"Never";const b=new Date(g),j=new Date().getTime()-b.getTime(),y=Math.floor(j/(1e3*60*60)),w=Math.floor(j/(1e3*60*60*24));return y<1?"Just now":y<24?`${y}h ago`:w===1?"Yesterday":w<7?`${w} days ago`:b.toLocaleDateString()};return d?a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading analytics..."})]})}):a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Wholesale & Inventory Analytics"}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"Arizona Dutchie dispensaries data overview"})]}),a.jsxs("button",{onClick:m,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Refresh"]})]}),a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-7 gap-4",children:[a.jsx(Ii,{title:"Dispensaries",value:(t==null?void 0:t.dispensaryCount)||0,icon:a.jsx(Ln,{className:"w-5 h-5 text-blue-600"}),color:"blue"}),a.jsx(Ii,{title:"Total Products",value:(t==null?void 0:t.productCount)||0,icon:a.jsx(Ct,{className:"w-5 h-5 text-green-600"}),color:"green"}),a.jsx(Ii,{title:"Brands",value:(t==null?void 0:t.brandCount)||0,icon:a.jsx(Cr,{className:"w-5 h-5 text-purple-600"}),color:"purple"}),a.jsx(Ii,{title:"Categories",value:(t==null?void 0:t.categoryCount)||0,icon:a.jsx(Tx,{className:"w-5 h-5 text-orange-600"}),color:"orange"}),a.jsx(Ii,{title:"Snapshots (24h)",value:(t==null?void 0:t.snapshotCount24h)||0,icon:a.jsx(zn,{className:"w-5 h-5 text-cyan-600"}),color:"cyan"}),a.jsx(Ii,{title:"Failed Jobs (24h)",value:(t==null?void 0:t.failedJobCount)||0,icon:a.jsx(Uc,{className:"w-5 h-5 text-red-600"}),color:"red"}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:[a.jsxs("div",{className:"flex items-center gap-2 text-gray-600 mb-1",children:[a.jsx(xr,{className:"w-4 h-4"}),a.jsx("span",{className:"text-xs",children:"Last Crawl"})]}),a.jsx("p",{className:"text-sm font-semibold text-gray-900",children:x((t==null?void 0:t.lastCrawlTime)||null)})]})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200",children:[a.jsx("div",{className:"border-b border-gray-200",children:a.jsxs("div",{className:"flex gap-4 px-6",children:[a.jsx(Vo,{active:f==="overview",onClick:()=>p("overview"),icon:a.jsx(HA,{className:"w-4 h-4"}),label:"Overview"}),a.jsx(Vo,{active:f==="stores",onClick:()=>p("stores"),icon:a.jsx(Ln,{className:"w-4 h-4"}),label:`Stores (${n.length})`}),a.jsx(Vo,{active:f==="brands",onClick:()=>p("brands"),icon:a.jsx(Cr,{className:"w-4 h-4"}),label:`Brands (${s.length})`}),a.jsx(Vo,{active:f==="categories",onClick:()=>p("categories"),icon:a.jsx(Tx,{className:"w-4 h-4"}),label:`Categories (${l.length})`})]})}),a.jsxs("div",{className:"p-6",children:[f==="overview"&&a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:"Top Stores by Products"}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:n.slice(0,6).map(g=>a.jsxs("button",{onClick:()=>e(`/az/stores/${g.id}`),className:"flex items-center justify-between p-4 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors text-left",children:[a.jsxs("div",{children:[a.jsx("p",{className:"font-medium text-gray-900",children:g.dba_name||g.name}),a.jsxs("p",{className:"text-sm text-gray-600",children:[g.city,", ",g.state]}),a.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:["Last crawl: ",x(g.last_crawl_at||null)]})]}),a.jsx(Cf,{className:"w-5 h-5 text-gray-400"})]},g.id))})]}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:"Top Brands"}),a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4",children:s.slice(0,12).map(g=>a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg text-center",children:[a.jsx("p",{className:"font-medium text-gray-900 text-sm line-clamp-2",children:g.brand_name}),a.jsx("p",{className:"text-lg font-bold text-purple-600 mt-1",children:g.product_count}),a.jsx("p",{className:"text-xs text-gray-500",children:"products"})]},g.brand_name))})]}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:"Product Categories"}),a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4",children:l.slice(0,12).map((g,b)=>a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg text-center",children:[a.jsx("p",{className:"font-medium text-gray-900",children:g.type}),g.subcategory&&a.jsx("p",{className:"text-xs text-gray-600",children:g.subcategory}),a.jsx("p",{className:"text-lg font-bold text-orange-600 mt-1",children:g.product_count}),a.jsx("p",{className:"text-xs text-gray-500",children:"products"})]},b))})]})]}),f==="stores"&&a.jsx("div",{className:"space-y-4",children:a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"table table-sm w-full",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Store Name"}),a.jsx("th",{children:"City"}),a.jsx("th",{className:"text-center",children:"Platform ID"}),a.jsx("th",{className:"text-center",children:"Last Crawl"}),a.jsx("th",{})]})}),a.jsx("tbody",{children:n.map(g=>a.jsxs("tr",{className:"hover",children:[a.jsx("td",{className:"font-medium",children:g.dba_name||g.name}),a.jsxs("td",{children:[g.city,", ",g.state]}),a.jsx("td",{className:"text-center",children:g.platform_dispensary_id?a.jsx("span",{className:"badge badge-success badge-sm",children:"Resolved"}):a.jsx("span",{className:"badge badge-warning badge-sm",children:"Pending"})}),a.jsx("td",{className:"text-center text-sm text-gray-600",children:x(g.last_crawl_at||null)}),a.jsx("td",{children:a.jsx("button",{onClick:()=>e(`/az/stores/${g.id}`),className:"btn btn-xs btn-ghost",children:"View"})})]},g.id))})]})})}),f==="brands"&&a.jsx("div",{className:"space-y-4",children:s.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No brands found. Run a crawl to populate brand data."}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4",children:s.map(g=>a.jsxs("div",{className:"border border-gray-200 rounded-lg p-4 text-center hover:border-purple-300 hover:shadow-md transition-all",children:[a.jsx("p",{className:"font-medium text-gray-900 text-sm line-clamp-2 h-10",children:g.brand_name}),a.jsxs("div",{className:"mt-2 space-y-1",children:[a.jsxs("div",{className:"flex justify-between text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"Products:"}),a.jsx("span",{className:"font-semibold",children:g.product_count})]}),a.jsxs("div",{className:"flex justify-between text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"Stores:"}),a.jsx("span",{className:"font-semibold",children:g.dispensary_count})]})]})]},g.brand_name))})}),f==="categories"&&a.jsx("div",{className:"space-y-4",children:l.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No categories found. Run a crawl to populate category data."}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:l.map((g,b)=>a.jsxs("div",{className:"border border-gray-200 rounded-lg p-4 hover:border-orange-300 hover:shadow-md transition-all",children:[a.jsx("p",{className:"font-medium text-gray-900",children:g.type}),g.subcategory&&a.jsx("p",{className:"text-sm text-gray-600",children:g.subcategory}),a.jsxs("div",{className:"mt-3 grid grid-cols-2 gap-2 text-xs",children:[a.jsxs("div",{className:"bg-gray-50 rounded p-2 text-center",children:[a.jsx("p",{className:"font-bold text-lg text-orange-600",children:g.product_count}),a.jsx("p",{className:"text-gray-500",children:"products"})]}),a.jsxs("div",{className:"bg-gray-50 rounded p-2 text-center",children:[a.jsx("p",{className:"font-bold text-lg text-blue-600",children:g.brand_count}),a.jsx("p",{className:"text-gray-500",children:"brands"})]})]}),g.avg_thc!=null&&a.jsxs("p",{className:"text-xs text-gray-500 mt-2 text-center",children:["Avg THC: ",g.avg_thc.toFixed(1),"%"]})]},b))})})]})]})]})})}function Ii({title:e,value:t,icon:r,color:n}){const i={blue:"bg-blue-50",green:"bg-green-50",purple:"bg-purple-50",orange:"bg-orange-50",cyan:"bg-cyan-50",red:"bg-red-50"};return a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:`p-2 ${i[n]||"bg-gray-50"} rounded-lg`,children:r}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-gray-600",children:e}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:t.toLocaleString()})]})]})})}function Vo({active:e,onClick:t,icon:r,label:n}){return a.jsxs("button",{onClick:t,className:`flex items-center gap-2 py-4 px-2 text-sm font-medium border-b-2 transition-colors ${e?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:[r,n]})}function ve({children:e}){const{isAuthenticated:t,checkAuth:r}=Ph();return h.useEffect(()=>{r()},[]),t?a.jsx(a.Fragment,{children:e}):a.jsx(H1,{to:"/login",replace:!0})}function SF(){return a.jsx(QC,{children:a.jsxs(HC,{children:[a.jsx(de,{path:"/login",element:a.jsx(DA,{})}),a.jsx(de,{path:"/",element:a.jsx(ve,{children:a.jsx(GB,{})})}),a.jsx(de,{path:"/products",element:a.jsx(ve,{children:a.jsx(ZB,{})})}),a.jsx(de,{path:"/products/:id",element:a.jsx(ve,{children:a.jsx(JB,{})})}),a.jsx(de,{path:"/stores",element:a.jsx(ve,{children:a.jsx(QB,{})})}),a.jsx(de,{path:"/dispensaries",element:a.jsx(ve,{children:a.jsx(eF,{})})}),a.jsx(de,{path:"/dispensaries/:state/:city/:slug",element:a.jsx(ve,{children:a.jsx(tF,{})})}),a.jsx(de,{path:"/stores/:state/:storeName/:slug/brands",element:a.jsx(ve,{children:a.jsx(nF,{})})}),a.jsx(de,{path:"/stores/:state/:storeName/:slug/specials",element:a.jsx(ve,{children:a.jsx(iF,{})})}),a.jsx(de,{path:"/stores/:state/:storeName/:slug",element:a.jsx(ve,{children:a.jsx(rF,{})})}),a.jsx(de,{path:"/categories",element:a.jsx(ve,{children:a.jsx(aF,{})})}),a.jsx(de,{path:"/campaigns",element:a.jsx(ve,{children:a.jsx(sF,{})})}),a.jsx(de,{path:"/analytics",element:a.jsx(ve,{children:a.jsx(lF,{})})}),a.jsx(de,{path:"/settings",element:a.jsx(ve,{children:a.jsx(cF,{})})}),a.jsx(de,{path:"/changes",element:a.jsx(ve,{children:a.jsx(xF,{})})}),a.jsx(de,{path:"/proxies",element:a.jsx(ve,{children:a.jsx(dF,{})})}),a.jsx(de,{path:"/logs",element:a.jsx(ve,{children:a.jsx(pF,{})})}),a.jsx(de,{path:"/scraper-tools",element:a.jsx(ve,{children:a.jsx(gF,{})})}),a.jsx(de,{path:"/scraper-monitor",element:a.jsx(ve,{children:a.jsx(hF,{})})}),a.jsx(de,{path:"/scraper-schedule",element:a.jsx(ve,{children:a.jsx(mF,{})})}),a.jsx(de,{path:"/az-schedule",element:a.jsx(ve,{children:a.jsx(vF,{})})}),a.jsx(de,{path:"/az",element:a.jsx(ve,{children:a.jsx(bF,{})})}),a.jsx(de,{path:"/az/stores/:id",element:a.jsx(ve,{children:a.jsx(jF,{})})}),a.jsx(de,{path:"/api-permissions",element:a.jsx(ve,{children:a.jsx(yF,{})})}),a.jsx(de,{path:"/wholesale-analytics",element:a.jsx(ve,{children:a.jsx(wF,{})})}),a.jsx(de,{path:"*",element:a.jsx(H1,{to:"/",replace:!0})})]})})}Od.createRoot(document.getElementById("root")).render(a.jsx(ps.StrictMode,{children:a.jsx(SF,{})})); diff --git a/frontend/dist/assets/index-DKdvsMWP.css b/frontend/dist/assets/index-DKdvsMWP.css deleted file mode 100644 index 191c0ce7..00000000 --- a/frontend/dist/assets/index-DKdvsMWP.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 89.824% .06192 275.75;--ac: 15.352% .0368 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 49.12% .3096 275.75;--s: 69.71% .329 342.55;--sc: 98.71% .0106 342.55;--a: 76.76% .184 183.61;--n: 32.1785% .02476 255.701624;--nc: 89.4994% .011585 252.096176;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.4169% .00108 197.137559;--bc: 27.8078% .029596 256.847952}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 13.138% .0392 275.75;--sc: 14.96% .052 342.55;--ac: 14.902% .0334 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 65.69% .196 275.75;--s: 74.8% .26 342.55;--a: 74.51% .167 183.61;--n: 31.3815% .021108 254.139175;--nc: 74.6477% .0216 264.435964;--b1: 25.3267% .015896 252.417568;--b2: 23.2607% .013807 253.100675;--b3: 21.1484% .01165 254.087939;--bc: 74.6477% .0216 264.435964}}[data-theme=light]{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 89.824% .06192 275.75;--ac: 15.352% .0368 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 49.12% .3096 275.75;--s: 69.71% .329 342.55;--sc: 98.71% .0106 342.55;--a: 76.76% .184 183.61;--n: 32.1785% .02476 255.701624;--nc: 89.4994% .011585 252.096176;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.4169% .00108 197.137559;--bc: 27.8078% .029596 256.847952}[data-theme=dark]{color-scheme:dark;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 13.138% .0392 275.75;--sc: 14.96% .052 342.55;--ac: 14.902% .0334 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 65.69% .196 275.75;--s: 74.8% .26 342.55;--a: 74.51% .167 183.61;--n: 31.3815% .021108 254.139175;--nc: 74.6477% .0216 264.435964;--b1: 25.3267% .015896 252.417568;--b2: 23.2607% .013807 253.100675;--b3: 21.1484% .01165 254.087939;--bc: 74.6477% .0216 264.435964}[data-theme=cupcake]{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 15.2344% .017892 200.026556;--sc: 15.787% .020249 356.29965;--ac: 15.8762% .029206 78.618794;--nc: 84.7148% .013247 313.189598;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--p: 76.172% .089459 200.026556;--s: 78.9351% .101246 356.29965;--a: 79.3811% .146032 78.618794;--n: 23.5742% .066235 313.189598;--b1: 97.7882% .00418 56.375637;--b2: 93.9822% .007638 61.449292;--b3: 91.5861% .006811 53.440502;--bc: 23.5742% .066235 313.189598;--rounded-btn: 1.9rem;--tab-border: 2px;--tab-radius: .7rem}.alert{display:grid;width:100%;grid-auto-flow:row;align-content:flex-start;align-items:center;justify-items:center;gap:1rem;text-align:center;border-radius:var(--rounded-box, 1rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));padding:1rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));background-color:var(--alert-bg)}@media (min-width: 640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}.badge{display:inline-flex;align-items:center;justify-content:center;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;height:1.25rem;font-size:.875rem;line-height:1.25rem;width:-moz-fit-content;width:fit-content;padding-left:.563rem;padding-right:.563rem;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}@media (hover:hover){.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.table tr.hover:hover,.table tr.hover:nth-child(2n):hover{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.hover:hover,.table-zebra tr.hover:nth-child(2n):hover{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card-body{display:flex;flex:1 1 auto;flex-direction:column;padding:var(--padding-card, 2rem);gap:.5rem}.card-body :where(p){flex-grow:1}.card-actions{display:flex;flex-wrap:wrap;align-items:flex-start;gap:.5rem}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.carousel{display:inline-flex;overflow-x:scroll;scroll-snap-type:x mandatory;scroll-behavior:smooth;-ms-overflow-style:none;scrollbar-width:none}.checkbox{flex-shrink:0;--chkbg: var(--fallback-bc,oklch(var(--bc)/1));--chkfg: var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.collapse:not(td):not(tr):not(colgroup){visibility:visible}.collapse{position:relative;display:grid;overflow:hidden;grid-template-rows:max-content 0fr;transition:grid-template-rows .2s;width:100%;border-radius:var(--rounded-box, 1rem)}.collapse-title,.collapse>input[type=checkbox],.collapse>input[type=radio],.collapse-content{grid-column-start:1;grid-row-start:1}.collapse>input[type=checkbox],.collapse>input[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){height:100%;width:100%;z-index:1}.collapse[open],.collapse-open,.collapse:focus:not(.collapse-close){grid-template-rows:max-content 1fr}.collapse:not(.collapse-close):has(>input[type=checkbox]:checked),.collapse:not(.collapse-close):has(>input[type=radio]:checked){grid-template-rows:max-content 1fr}.collapse[open]>.collapse-content,.collapse-open>.collapse-content,.collapse:focus:not(.collapse-close)>.collapse-content,.collapse:not(.collapse-close)>input[type=checkbox]:checked~.collapse-content,.collapse:not(.collapse-close)>input[type=radio]:checked~.collapse-content{visibility:visible;min-height:-moz-fit-content;min-height:fit-content}.dropdown{position:relative;display:inline-block}.dropdown>*:not(summary):focus{outline:2px solid transparent;outline-offset:2px}.dropdown .dropdown-content{position:absolute}.dropdown:is(:not(details)) .dropdown-content{visibility:hidden;opacity:0;transform-origin:top;--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s}.dropdown.dropdown-open .dropdown-content,.dropdown:not(.dropdown-hover):focus .dropdown-content,.dropdown:focus-within .dropdown-content{visibility:visible;opacity:1}@media (hover: hover){.dropdown.dropdown-hover:hover .dropdown-content{visibility:visible;opacity:1}.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost:hover{border-color:transparent}@supports (color: oklch(0% 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-outline:hover{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary:hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.btn-outline.btn-secondary:hover{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}}.btn-outline.btn-accent:hover{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn-outline.btn-success:hover{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}}.btn-outline.btn-info:hover{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-info:hover{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}}.btn-outline.btn-warning:hover{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}}.btn-outline.btn-error:hover{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-error:hover{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.dropdown.dropdown-hover:hover .dropdown-content{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{cursor:pointer;outline:2px solid transparent;outline-offset:2px}@supports (color: oklch(0% 0 0)){:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{background-color:var(--fallback-bc,oklch(var(--bc)/.1))}}}.dropdown:is(details) summary::-webkit-details-marker{display:none}.label{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.input-sm[type=number]::-webkit-inner-spin-button{margin-top:0;margin-bottom:0;margin-inline-end:-0px}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.menu{display:flex;flex-direction:column;flex-wrap:wrap;font-size:.875rem;line-height:1.25rem;padding:.5rem}.menu :where(li ul){position:relative;white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem}.menu :where(li:not(.menu-title)>*:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){display:grid;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;grid-auto-columns:minmax(auto,max-content) auto max-content;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}:where(.menu li){position:relative;display:flex;flex-shrink:0;flex-direction:column;flex-wrap:wrap;align-items:stretch}:where(.menu li) .badge{justify-self:end}.progress{position:relative;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:hidden;height:.5rem;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.range{height:1.5rem;width:100%;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;--range-shdw: var(--fallback-bc,oklch(var(--bc)/1));overflow:hidden;border-radius:var(--rounded-box, 1rem);background-color:transparent}.range:focus{outline:none}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.stats{display:inline-grid;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}:where(.stats){grid-auto-flow:column;overflow-x:auto}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.table{position:relative;width:100%;border-radius:var(--rounded-box, 1rem);text-align:left;font-size:.875rem;line-height:1.25rem}.table :where(.table-pin-rows thead tr){position:sticky;top:0;z-index:1;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-rows tfoot tr){position:sticky;bottom:0;z-index:1;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-cols tr th){position:sticky;left:0;right:0;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table-zebra tbody tr:nth-child(2n) :where(.table-pin-cols tr th){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.textarea{min-height:3rem;flex-shrink:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.toggle{flex-shrink:0;--tglbg: var(--fallback-b1,oklch(var(--b1)/1));--handleoffset: 1.5rem;--handleoffsetcalculator: calc(var(--handleoffset) * -1);--togglehandleborder: 0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input, .2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.alert-info{border-color:var(--fallback-in,oklch(var(--in)/.2));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-in,oklch(var(--in)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1))}.badge-info{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.badge-success{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.badge-warning{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.badge-error{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.badge-ghost{--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.badge-outline.badge-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.btn-primary{--btn-color: var(--fallback-p)}.btn-secondary{--btn-color: var(--fallback-s)}}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}.btn-outline.btn-info.btn-active{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}.btn-outline.btn-error.btn-active{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color: oklch(0% 0 0)){.btn-primary{--btn-color: var(--p)}.btn-secondary{--btn-color: var(--s)}}.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));outline-color:var(--fallback-s,oklch(var(--s)/1))}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost{border-width:1px;border-color:transparent;background-color:transparent;color:currentColor;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-ghost.btn-active{border-color:transparent;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.btn-outline{border-color:currentColor;background-color:transparent;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-outline.btn-active{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.btn-outline.btn-info.btn-active{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn-outline.btn-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btn-outline.btn-error.btn-active{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-title{display:flex;align-items:center;gap:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.carousel::-webkit-scrollbar{display:none}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0px;cursor:not-allowed;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}details.collapse{width:100%}details.collapse summary{position:relative;display:block;outline:2px solid transparent;outline-offset:2px}details.collapse summary::-webkit-details-marker{display:none}.collapse:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse:has(.collapse-title:focus-visible),.collapse:has(>input[type=checkbox]:focus-visible),.collapse:has(>input[type=radio]:focus-visible){outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse:not(.collapse-open):not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-open):not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-open):not(.collapse-close)>.collapse-title{cursor:pointer}.collapse:focus:not(.collapse-open):not(.collapse-close):not(.collapse[open])>.collapse-title{cursor:unset}.collapse-title,:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){padding:1rem;padding-inline-end:3rem;min-height:3.75rem;transition:background-color .2s ease-out}.collapse[open]>:where(.collapse-content),.collapse-open>:where(.collapse-content),.collapse:focus:not(.collapse-close)>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input[type=checkbox]:checked~.collapse-content),.collapse:not(.collapse-close)>:where(input[type=radio]:checked~.collapse-content){padding-bottom:1rem;transition:padding .2s ease-out,background-color .2s ease-out}.collapse[open].collapse-arrow>.collapse-title:after,.collapse-open.collapse-arrow>.collapse-title:after,.collapse-arrow:focus:not(.collapse-close)>.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after{--tw-translate-y: -50%;--tw-rotate: 225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.collapse[open].collapse-plus>.collapse-title:after,.collapse-open.collapse-plus>.collapse-title:after,.collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after{content:"−"}.dropdown.dropdown-open .dropdown-content,.dropdown:focus .dropdown-content,.dropdown:focus-within .dropdown-content{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::-moz-placeholder,.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.link-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){@media (hover:hover){.link-primary:hover{color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 80%,black)}}}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-lg{width:2.5rem}:where(.menu li:empty){--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;margin:.5rem 1rem;height:1px}.menu :where(li ul):before{position:absolute;bottom:.75rem;inset-inline-start:0px;top:.75rem;width:1px;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;content:""}.menu :where(li:not(.menu-title)>*:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--rounded-btn, .5rem);padding:.5rem 1rem;text-align:start;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;text-wrap:balance}:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):is(summary):not(.active,.btn):focus-visible{cursor:pointer;background-color:var(--fallback-bc,oklch(var(--bc)/.1));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));outline:2px solid transparent;outline-offset:2px}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.menu :where(li>details>summary)::-webkit-details-marker{display:none}.menu :where(li>details>summary):after,.menu :where(li>.menu-dropdown-toggle):after{justify-self:end;display:block;margin-top:-.5rem;height:.5rem;width:.5rem;transform:rotate(45deg);transition-property:transform,margin-top;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);content:"";transform-origin:75% 75%;box-shadow:2px 2px;pointer-events:none}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{transform:rotate(225deg);margin-top:0}.mockup-phone .display{overflow:hidden;border-radius:40px;margin-top:-25px}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate{--progress-color: var(--fallback-bc,oklch(var(--bc)/1));background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}.progress::-webkit-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:transparent}.progress::-webkit-progress-value{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate::-moz-progress-bar{background-color:transparent;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}@keyframes progress-loading{50%{background-position-x:-115%}}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.range:focus-visible::-webkit-slider-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range:focus-visible::-moz-range-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range::-webkit-slider-runnable-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-moz-range-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-webkit-slider-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));-moz-appearance:none;appearance:none;-webkit-appearance:none;top:50%;color:var(--range-shdw);transform:translateY(-50%);--filler-size: 100rem;--filler-offset: .6rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}.range::-moz-range-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));top:50%;color:var(--range-shdw);--filler-size: 100rem;--filler-offset: .5rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::-moz-placeholder,.select:disabled::-moz-placeholder,.select[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:calc(0% + 12px) calc(1px + 50%),calc(0% + 16px) calc(1px + 50%)}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}:where(.stats)>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}[dir=rtl] .stats>*:not([hidden])~*:not([hidden]){--tw-divide-x-reverse: 1}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .step:first-child:before{content:none}.steps .step[data-content]:after{content:attr(data-content)}.table:where([dir=rtl],[dir=rtl] *){text-align:right}.table :where(th,td){padding:.75rem 1rem;vertical-align:middle}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.table :where(thead tr,tbody tr:not(:last-child),tbody tr:first-child:last-child){border-bottom-width:1px;--tw-border-opacity: 1;border-bottom-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.table :where(thead,tfoot){white-space:nowrap;font-size:.75rem;line-height:1rem;font-weight:700;color:var(--fallback-bc,oklch(var(--bc)/.6))}.table :where(tfoot){border-top-width:1px;--tw-border-opacity: 1;border-top-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.textarea:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.textarea-disabled,.textarea:disabled,.textarea[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.textarea-disabled::-moz-placeholder,.textarea:disabled::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.textarea-disabled::placeholder,.textarea:disabled::placeholder,.textarea[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator: calc(var(--handleoffset) * 1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator: var(--handleoffset);--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator: calc(var(--handleoffset) * -1)}.toggle:indeterminate{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle:disabled{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.artboard.phone{width:320px}.badge-sm{height:1rem;font-size:.75rem;line-height:1rem;padding-left:.438rem;padding-right:.438rem}.badge-lg{height:1.5rem;font-size:1rem;line-height:1.5rem;padding-left:.688rem;padding-right:.688rem}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}.input-sm{height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;line-height:2rem}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.select-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:2rem;font-size:.875rem;line-height:2rem}[dir=rtl] .select-sm{padding-left:2rem;padding-right:.75rem}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.card-compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-compact .card-title{margin-bottom:.25rem}.card-normal .card-body{padding:var(--padding-card, 2rem);font-size:1rem;line-height:1.5rem}.card-normal .card-title{margin-bottom:.75rem}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.table-xs :not(thead):not(tfoot) tr{font-size:.75rem;line-height:1rem}.table-xs :where(th,td){padding:.25rem .5rem}.table-sm :not(thead):not(tfoot) tr{font-size:.875rem;line-height:1.25rem}.table-sm :where(th,td){padding:.5rem .75rem}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.left-3{left:.75rem}.right-0{right:0}.right-2{right:.5rem}.top-1\/2{top:50%}.top-2{top:.5rem}.z-10{z-index:10}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.min-h-screen{min-height:100vh}.w-12{width:3rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[120px\]{width:120px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.max-w-2xl{max-width:42rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[200px\]{max-width:200px}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-blue-700{--tw-border-opacity: 1;border-color:rgb(29 78 216 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-yellow-400{--tw-border-opacity: 1;border-color:rgb(250 204 21 / var(--tw-border-opacity, 1))}.border-yellow-700{--tw-border-opacity: 1;border-color:rgb(161 98 7 / var(--tw-border-opacity, 1))}.border-t-blue-600{--tw-border-opacity: 1;border-top-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-200{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-cyan-50{--tw-bg-opacity: 1;background-color:rgb(236 254 255 / var(--tw-bg-opacity, 1))}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-indigo-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-indigo-50{--tw-bg-opacity: 1;background-color:rgb(238 242 255 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-pink-100{--tw-bg-opacity: 1;background-color:rgb(252 231 243 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.stroke-current{stroke:currentColor}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pl-10{padding-left:2.5rem}.pl-12{padding-left:3rem}.pl-16{padding-left:4rem}.pr-3{padding-right:.75rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity, 1))}.text-indigo-700{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.text-indigo-900{--tw-text-opacity: 1;color:rgb(49 46 129 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-pink-700{--tw-text-opacity: 1;color:rgb(190 24 93 / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity, 1)))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.opacity-60{opacity:.6}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.hover\:border-blue-300:hover{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.hover\:border-blue-500:hover{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.hover\:border-orange-300:hover{--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1))}.hover\:border-purple-300:hover{--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1))}.hover\:bg-amber-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-700:hover{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-yellow-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.hover\:bg-yellow-700:hover{--tw-bg-opacity: 1;background-color:rgb(161 98 7 / var(--tw-bg-opacity, 1))}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-indigo-700:hover{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.hover\:text-red-800:hover{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.hover\:text-yellow-800:hover{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.hover\:shadow-2xl:hover{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width: 768px){.md\:col-span-2{grid-column:span 2 / span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}}@media (min-width: 1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}} diff --git a/frontend/dist/assets/index-Db0w17d2.css b/frontend/dist/assets/index-Db0w17d2.css new file mode 100644 index 00000000..4ab27046 --- /dev/null +++ b/frontend/dist/assets/index-Db0w17d2.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 89.824% .06192 275.75;--ac: 15.352% .0368 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 49.12% .3096 275.75;--s: 69.71% .329 342.55;--sc: 98.71% .0106 342.55;--a: 76.76% .184 183.61;--n: 32.1785% .02476 255.701624;--nc: 89.4994% .011585 252.096176;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.4169% .00108 197.137559;--bc: 27.8078% .029596 256.847952}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 13.138% .0392 275.75;--sc: 14.96% .052 342.55;--ac: 14.902% .0334 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 65.69% .196 275.75;--s: 74.8% .26 342.55;--a: 74.51% .167 183.61;--n: 31.3815% .021108 254.139175;--nc: 74.6477% .0216 264.435964;--b1: 25.3267% .015896 252.417568;--b2: 23.2607% .013807 253.100675;--b3: 21.1484% .01165 254.087939;--bc: 74.6477% .0216 264.435964}}[data-theme=light]{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 89.824% .06192 275.75;--ac: 15.352% .0368 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 49.12% .3096 275.75;--s: 69.71% .329 342.55;--sc: 98.71% .0106 342.55;--a: 76.76% .184 183.61;--n: 32.1785% .02476 255.701624;--nc: 89.4994% .011585 252.096176;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.4169% .00108 197.137559;--bc: 27.8078% .029596 256.847952}[data-theme=dark]{color-scheme:dark;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 13.138% .0392 275.75;--sc: 14.96% .052 342.55;--ac: 14.902% .0334 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 65.69% .196 275.75;--s: 74.8% .26 342.55;--a: 74.51% .167 183.61;--n: 31.3815% .021108 254.139175;--nc: 74.6477% .0216 264.435964;--b1: 25.3267% .015896 252.417568;--b2: 23.2607% .013807 253.100675;--b3: 21.1484% .01165 254.087939;--bc: 74.6477% .0216 264.435964}[data-theme=cupcake]{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 15.2344% .017892 200.026556;--sc: 15.787% .020249 356.29965;--ac: 15.8762% .029206 78.618794;--nc: 84.7148% .013247 313.189598;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--p: 76.172% .089459 200.026556;--s: 78.9351% .101246 356.29965;--a: 79.3811% .146032 78.618794;--n: 23.5742% .066235 313.189598;--b1: 97.7882% .00418 56.375637;--b2: 93.9822% .007638 61.449292;--b3: 91.5861% .006811 53.440502;--bc: 23.5742% .066235 313.189598;--rounded-btn: 1.9rem;--tab-border: 2px;--tab-radius: .7rem}.alert{display:grid;width:100%;grid-auto-flow:row;align-content:flex-start;align-items:center;justify-items:center;gap:1rem;text-align:center;border-radius:var(--rounded-box, 1rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));padding:1rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));background-color:var(--alert-bg)}@media (min-width: 640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}.badge{display:inline-flex;align-items:center;justify-content:center;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;height:1.25rem;font-size:.875rem;line-height:1.25rem;width:-moz-fit-content;width:fit-content;padding-left:.563rem;padding-right:.563rem;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}@media (hover:hover){.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.tab:hover{--tw-text-opacity: 1}.table tr.hover:hover,.table tr.hover:nth-child(2n):hover{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.hover:hover,.table-zebra tr.hover:nth-child(2n):hover{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card-body{display:flex;flex:1 1 auto;flex-direction:column;padding:var(--padding-card, 2rem);gap:.5rem}.card-body :where(p){flex-grow:1}.card-actions{display:flex;flex-wrap:wrap;align-items:flex-start;gap:.5rem}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.carousel{display:inline-flex;overflow-x:scroll;scroll-snap-type:x mandatory;scroll-behavior:smooth;-ms-overflow-style:none;scrollbar-width:none}.checkbox{flex-shrink:0;--chkbg: var(--fallback-bc,oklch(var(--bc)/1));--chkfg: var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.collapse:not(td):not(tr):not(colgroup){visibility:visible}.collapse{position:relative;display:grid;overflow:hidden;grid-template-rows:max-content 0fr;transition:grid-template-rows .2s;width:100%;border-radius:var(--rounded-box, 1rem)}.collapse-title,.collapse>input[type=checkbox],.collapse>input[type=radio],.collapse-content{grid-column-start:1;grid-row-start:1}.collapse>input[type=checkbox],.collapse>input[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){height:100%;width:100%;z-index:1}.collapse[open],.collapse-open,.collapse:focus:not(.collapse-close){grid-template-rows:max-content 1fr}.collapse:not(.collapse-close):has(>input[type=checkbox]:checked),.collapse:not(.collapse-close):has(>input[type=radio]:checked){grid-template-rows:max-content 1fr}.collapse[open]>.collapse-content,.collapse-open>.collapse-content,.collapse:focus:not(.collapse-close)>.collapse-content,.collapse:not(.collapse-close)>input[type=checkbox]:checked~.collapse-content,.collapse:not(.collapse-close)>input[type=radio]:checked~.collapse-content{visibility:visible;min-height:-moz-fit-content;min-height:fit-content}.dropdown{position:relative;display:inline-block}.dropdown>*:not(summary):focus{outline:2px solid transparent;outline-offset:2px}.dropdown .dropdown-content{position:absolute}.dropdown:is(:not(details)) .dropdown-content{visibility:hidden;opacity:0;transform-origin:top;--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s}.dropdown.dropdown-open .dropdown-content,.dropdown:not(.dropdown-hover):focus .dropdown-content,.dropdown:focus-within .dropdown-content{visibility:visible;opacity:1}@media (hover: hover){.dropdown.dropdown-hover:hover .dropdown-content{visibility:visible;opacity:1}.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost:hover{border-color:transparent}@supports (color: oklch(0% 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-outline:hover{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary:hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.btn-outline.btn-secondary:hover{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}}.btn-outline.btn-accent:hover{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn-outline.btn-success:hover{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}}.btn-outline.btn-info:hover{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-info:hover{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}}.btn-outline.btn-warning:hover{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}}.btn-outline.btn-error:hover{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-error:hover{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.dropdown.dropdown-hover:hover .dropdown-content{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{cursor:pointer;outline:2px solid transparent;outline-offset:2px}@supports (color: oklch(0% 0 0)){:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{background-color:var(--fallback-bc,oklch(var(--bc)/.1))}}.tab[disabled],.tab[disabled]:hover{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}}.dropdown:is(details) summary::-webkit-details-marker{display:none}.footer{display:grid;width:100%;grid-auto-flow:row;place-items:start;-moz-column-gap:1rem;column-gap:1rem;row-gap:2.5rem;font-size:.875rem;line-height:1.25rem}.footer>*{display:grid;place-items:start;gap:.5rem}.footer-center{place-items:center;text-align:center}.footer-center>*{place-items:center}@media (min-width: 48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.label{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.hero{display:grid;width:100%;place-items:center;background-size:cover;background-position:center}.hero>*{grid-column-start:1;grid-row-start:1}.hero-content{z-index:0;display:flex;align-items:center;justify-content:center;max-width:80rem;gap:1rem;padding:1rem}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.input-sm[type=number]::-webkit-inner-spin-button{margin-top:0;margin-bottom:0;margin-inline-end:-0px}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.menu{display:flex;flex-direction:column;flex-wrap:wrap;font-size:.875rem;line-height:1.25rem;padding:.5rem}.menu :where(li ul){position:relative;white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem}.menu :where(li:not(.menu-title)>*:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){display:grid;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;grid-auto-columns:minmax(auto,max-content) auto max-content;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}:where(.menu li){position:relative;display:flex;flex-shrink:0;flex-direction:column;flex-wrap:wrap;align-items:stretch}:where(.menu li) .badge{justify-self:end}.mockup-code{position:relative;overflow:hidden;overflow-x:auto;min-width:18rem;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));padding-top:1.25rem;padding-bottom:1.25rem;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));direction:ltr}.mockup-code pre[data-prefix]:before{content:attr(data-prefix);display:inline-block;text-align:right;width:2rem;opacity:.5}.progress{position:relative;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:hidden;height:.5rem;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.range{height:1.5rem;width:100%;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;--range-shdw: var(--fallback-bc,oklch(var(--bc)/1));overflow:hidden;border-radius:var(--rounded-box, 1rem);background-color:transparent}.range:focus{outline:none}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.stats{display:inline-grid;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}:where(.stats){grid-auto-flow:column;overflow-x:auto}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.tabs-lifted:has(.tab-content[class^=rounded-]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])),.tabs-lifted:has(.tab-content[class*=" rounded-"]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])){border-bottom-color:transparent}.tab{position:relative;grid-row-start:1;display:inline-flex;height:2rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;flex-wrap:wrap;align-items:center;justify-content:center;text-align:center;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem;--tw-text-opacity: .5;--tab-color: var(--fallback-bc,oklch(var(--bc)/1));--tab-bg: var(--fallback-b1,oklch(var(--b1)/1));--tab-border-color: var(--fallback-b3,oklch(var(--b3)/1));color:var(--tab-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem)}.tab:is(input[type=radio]){width:auto;border-bottom-right-radius:0;border-bottom-left-radius:0}.tab:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.tab:not(input):empty{cursor:default;grid-column-start:span 9999}input.tab:checked+.tab-content,:is(.tab-active,[aria-selected=true])+.tab-content{display:block}.table{position:relative;width:100%;border-radius:var(--rounded-box, 1rem);text-align:left;font-size:.875rem;line-height:1.25rem}.table :where(.table-pin-rows thead tr){position:sticky;top:0;z-index:1;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-rows tfoot tr){position:sticky;bottom:0;z-index:1;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-cols tr th){position:sticky;left:0;right:0;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table-zebra tbody tr:nth-child(2n) :where(.table-pin-cols tr th){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.textarea{min-height:3rem;flex-shrink:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.toggle{flex-shrink:0;--tglbg: var(--fallback-b1,oklch(var(--b1)/1));--handleoffset: 1.5rem;--handleoffsetcalculator: calc(var(--handleoffset) * -1);--togglehandleborder: 0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input, .2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.alert-info{border-color:var(--fallback-in,oklch(var(--in)/.2));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-in,oklch(var(--in)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1))}.badge-primary{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.badge-secondary{--tw-border-opacity: 1;border-color:var(--fallback-s,oklch(var(--s)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.badge-accent{--tw-border-opacity: 1;border-color:var(--fallback-a,oklch(var(--a)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-a,oklch(var(--a)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.badge-info{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.badge-success{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.badge-warning{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.badge-error{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.badge-ghost{--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.badge-outline.badge-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.badge-outline.badge-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.badge-outline.badge-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.badge-outline.badge-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.btn-primary{--btn-color: var(--fallback-p)}.btn-secondary{--btn-color: var(--fallback-s)}}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}.btn-outline.btn-info.btn-active{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}.btn-outline.btn-error.btn-active{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color: oklch(0% 0 0)){.btn-primary{--btn-color: var(--p)}.btn-secondary{--btn-color: var(--s)}}.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));outline-color:var(--fallback-s,oklch(var(--s)/1))}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost{border-width:1px;border-color:transparent;background-color:transparent;color:currentColor;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-ghost.btn-active{border-color:transparent;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.btn-outline{border-color:currentColor;background-color:transparent;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-outline.btn-active{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.btn-outline.btn-info.btn-active{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn-outline.btn-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btn-outline.btn-error.btn-active{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-title{display:flex;align-items:center;gap:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.carousel::-webkit-scrollbar{display:none}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0px;cursor:not-allowed;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}details.collapse{width:100%}details.collapse summary{position:relative;display:block;outline:2px solid transparent;outline-offset:2px}details.collapse summary::-webkit-details-marker{display:none}.collapse:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse:has(.collapse-title:focus-visible),.collapse:has(>input[type=checkbox]:focus-visible),.collapse:has(>input[type=radio]:focus-visible){outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse:not(.collapse-open):not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-open):not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-open):not(.collapse-close)>.collapse-title{cursor:pointer}.collapse:focus:not(.collapse-open):not(.collapse-close):not(.collapse[open])>.collapse-title{cursor:unset}.collapse-title,:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){padding:1rem;padding-inline-end:3rem;min-height:3.75rem;transition:background-color .2s ease-out}.collapse[open]>:where(.collapse-content),.collapse-open>:where(.collapse-content),.collapse:focus:not(.collapse-close)>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input[type=checkbox]:checked~.collapse-content),.collapse:not(.collapse-close)>:where(input[type=radio]:checked~.collapse-content){padding-bottom:1rem;transition:padding .2s ease-out,background-color .2s ease-out}.collapse[open].collapse-arrow>.collapse-title:after,.collapse-open.collapse-arrow>.collapse-title:after,.collapse-arrow:focus:not(.collapse-close)>.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after{--tw-translate-y: -50%;--tw-rotate: 225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.collapse[open].collapse-plus>.collapse-title:after,.collapse-open.collapse-plus>.collapse-title:after,.collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after{content:"−"}.dropdown.dropdown-open .dropdown-content,.dropdown:focus .dropdown-content,.dropdown:focus-within .dropdown-content{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::-moz-placeholder,.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.link-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){@media (hover:hover){.link-primary:hover{color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 80%,black)}}}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-lg{width:2.5rem}:where(.menu li:empty){--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;margin:.5rem 1rem;height:1px}.menu :where(li ul):before{position:absolute;bottom:.75rem;inset-inline-start:0px;top:.75rem;width:1px;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;content:""}.menu :where(li:not(.menu-title)>*:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--rounded-btn, .5rem);padding:.5rem 1rem;text-align:start;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;text-wrap:balance}:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>*:not(ul,details,.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):is(summary):not(.active,.btn):focus-visible{cursor:pointer;background-color:var(--fallback-bc,oklch(var(--bc)/.1));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));outline:2px solid transparent;outline-offset:2px}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.menu :where(li>details>summary)::-webkit-details-marker{display:none}.menu :where(li>details>summary):after,.menu :where(li>.menu-dropdown-toggle):after{justify-self:end;display:block;margin-top:-.5rem;height:.5rem;width:.5rem;transform:rotate(45deg);transition-property:transform,margin-top;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);content:"";transform-origin:75% 75%;box-shadow:2px 2px;pointer-events:none}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{transform:rotate(225deg);margin-top:0}.mockup-code:before{content:"";margin-bottom:1rem;display:block;height:.75rem;width:.75rem;border-radius:9999px;opacity:.3;box-shadow:1.4em 0,2.8em 0,4.2em 0}.mockup-code pre{padding-right:1.25rem}.mockup-code pre:before{content:"";margin-right:2ch}.mockup-phone .display{overflow:hidden;border-radius:40px;margin-top:-25px}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate{--progress-color: var(--fallback-bc,oklch(var(--bc)/1));background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}.progress::-webkit-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:transparent}.progress::-webkit-progress-value{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate::-moz-progress-bar{background-color:transparent;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}@keyframes progress-loading{50%{background-position-x:-115%}}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.range:focus-visible::-webkit-slider-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range:focus-visible::-moz-range-thumb{--focus-shadow: 0 0 0 6px var(--fallback-b1,oklch(var(--b1)/1)) inset, 0 0 0 2rem var(--range-shdw) inset}.range::-webkit-slider-runnable-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-moz-range-track{height:.5rem;width:100%;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.range::-webkit-slider-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));-moz-appearance:none;appearance:none;-webkit-appearance:none;top:50%;color:var(--range-shdw);transform:translateY(-50%);--filler-size: 100rem;--filler-offset: .6rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}.range::-moz-range-thumb{position:relative;height:1.5rem;width:1.5rem;border-radius:var(--rounded-box, 1rem);border-style:none;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));top:50%;color:var(--range-shdw);--filler-size: 100rem;--filler-offset: .5rem;box-shadow:0 0 0 3px var(--range-shdw) inset,var(--focus-shadow, 0 0),calc(var(--filler-size) * -1 - var(--filler-offset)) 0 0 var(--filler-size)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::-moz-placeholder,.select:disabled::-moz-placeholder,.select[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:calc(0% + 12px) calc(1px + 50%),calc(0% + 16px) calc(1px + 50%)}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}:where(.stats)>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)));--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}[dir=rtl] .stats>*:not([hidden])~*:not([hidden]){--tw-divide-x-reverse: 1}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .step:first-child:before{content:none}.steps .step[data-content]:after{content:attr(data-content)}.tabs-lifted>.tab:focus-visible{border-end-end-radius:0;border-end-start-radius:0}.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tab:is(input:checked){border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: 1;--tw-text-opacity: 1}.tab:focus{outline:2px solid transparent;outline-offset:2px}.tab:focus-visible{outline:2px solid currentColor;outline-offset:-5px}.tab-disabled,.tab[disabled]{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.tabs-bordered>.tab{border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2;border-style:solid;border-bottom-width:calc(var(--tab-border, 1px) + 1px)}.tabs-lifted>.tab{border:var(--tab-border, 1px) solid transparent;border-width:0 0 var(--tab-border, 1px) 0;border-start-start-radius:var(--tab-radius, .5rem);border-start-end-radius:var(--tab-radius, .5rem);border-bottom-color:var(--tab-border-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem);padding-top:var(--tab-border, 1px)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tabs-lifted>.tab:is(input:checked){background-color:var(--tab-bg);border-width:var(--tab-border, 1px) var(--tab-border, 1px) 0 var(--tab-border, 1px);border-inline-start-color:var(--tab-border-color);border-inline-end-color:var(--tab-border-color);border-top-color:var(--tab-border-color);padding-inline-start:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-inline-end:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-bottom:var(--tab-border, 1px);padding-top:0}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked):before{z-index:1;content:"";display:block;position:absolute;width:calc(100% + var(--tab-radius, .5rem) * 2);height:var(--tab-radius, .5rem);bottom:0;background-size:var(--tab-radius, .5rem);background-position:top left,top right;background-repeat:no-repeat;--tab-grad: calc(69% - var(--tab-border, 1px));--radius-start: radial-gradient( circle at top left, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );--radius-end: radial-gradient( circle at top right, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );background-image:var(--radius-start),var(--radius-end)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,.tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-end);background-position:top right}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-start);background-position:top left}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,.tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-start);background-position:top left}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-end);background-position:top right}.tabs-lifted>:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled])+.tabs-lifted :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked)+.tabs-lifted .tab:is(input:checked):before{background-image:var(--radius-end);background-position:top right}.tabs-boxed .tab{border-radius:var(--rounded-btn, .5rem)}.table:where([dir=rtl],[dir=rtl] *){text-align:right}.table :where(th,td){padding:.75rem 1rem;vertical-align:middle}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.table :where(thead tr,tbody tr:not(:last-child),tbody tr:first-child:last-child){border-bottom-width:1px;--tw-border-opacity: 1;border-bottom-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.table :where(thead,tfoot){white-space:nowrap;font-size:.75rem;line-height:1rem;font-weight:700;color:var(--fallback-bc,oklch(var(--bc)/.6))}.table :where(tfoot){border-top-width:1px;--tw-border-opacity: 1;border-top-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.textarea:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.textarea-disabled,.textarea:disabled,.textarea[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.textarea-disabled::-moz-placeholder,.textarea:disabled::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.textarea-disabled::placeholder,.textarea:disabled::placeholder,.textarea[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator: calc(var(--handleoffset) * 1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator: var(--handleoffset);--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator: calc(var(--handleoffset) * -1)}.toggle:indeterminate{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle:disabled{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.artboard.phone{width:320px}.badge-sm{height:1rem;font-size:.75rem;line-height:1rem;padding-left:.438rem;padding-right:.438rem}.badge-lg{height:1.5rem;font-size:1rem;line-height:1.5rem;padding-left:.688rem;padding-right:.688rem}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-lg{height:4rem;min-height:4rem;padding-left:1.5rem;padding-right:1.5rem;font-size:1.125rem}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-square:where(.btn-lg){height:4rem;width:4rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-lg){height:4rem;width:4rem;border-radius:9999px;padding:0}.input-sm{height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;line-height:2rem}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.select-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:2rem;font-size:.875rem;line-height:2rem}[dir=rtl] .select-sm{padding-left:2rem;padding-right:.75rem}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.tabs-md :where(.tab){height:2rem;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem}.tabs-lg :where(.tab){height:3rem;font-size:1.125rem;line-height:1.75rem;line-height:2;--tab-padding: 1.25rem}.tabs-sm :where(.tab){height:1.5rem;font-size:.875rem;line-height:.75rem;--tab-padding: .75rem}.tabs-xs :where(.tab){height:1.25rem;font-size:.75rem;line-height:.75rem;--tab-padding: .5rem}.card-compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-compact .card-title{margin-bottom:.25rem}.card-normal .card-body{padding:var(--padding-card, 2rem);font-size:1rem;line-height:1.5rem}.card-normal .card-title{margin-bottom:.75rem}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.table-xs :not(thead):not(tfoot) tr{font-size:.75rem;line-height:1rem}.table-xs :where(th,td){padding:.25rem .5rem}.table-sm :not(thead):not(tfoot) tr{font-size:.875rem;line-height:1.25rem}.table-sm :where(th,td){padding:.5rem .75rem}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.left-3{left:.75rem}.right-0{right:0}.right-2{right:.5rem}.top-1\/2{top:50%}.top-2{top:.5rem}.z-10{z-index:10}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.min-h-\[70vh\]{min-height:70vh}.min-h-screen{min-height:100vh}.w-12{width:3rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[120px\]{width:120px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[200px\]{max-width:200px}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-amber-500{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-blue-700{--tw-border-opacity: 1;border-color:rgb(29 78 216 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-yellow-400{--tw-border-opacity: 1;border-color:rgb(250 204 21 / var(--tw-border-opacity, 1))}.border-yellow-700{--tw-border-opacity: 1;border-color:rgb(161 98 7 / var(--tw-border-opacity, 1))}.border-t-blue-600{--tw-border-opacity: 1;border-top-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-200{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)))}.bg-base-300{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-cyan-50{--tw-bg-opacity: 1;background-color:rgb(236 254 255 / var(--tw-bg-opacity, 1))}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-indigo-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-indigo-50{--tw-bg-opacity: 1;background-color:rgb(238 242 255 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-pink-100{--tw-bg-opacity: 1;background-color:rgb(252 231 243 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-primary{--tw-gradient-from: var(--fallback-p,oklch(var(--p)/1)) var(--tw-gradient-from-position);--tw-gradient-to: var(--fallback-p,oklch(var(--p)/0)) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-secondary{--tw-gradient-to: var(--fallback-s,oklch(var(--s)/1)) var(--tw-gradient-to-position)}.stroke-current{stroke:currentColor}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pl-10{padding-left:2.5rem}.pl-12{padding-left:3rem}.pl-16{padding-left:4rem}.pr-3{padding-right:.75rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-base-content{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity, 1))}.text-indigo-700{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.text-indigo-900{--tw-text-opacity: 1;color:rgb(49 46 129 / var(--tw-text-opacity, 1))}.text-neutral-content{--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity, 1)))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-pink-700{--tw-text-opacity: 1;color:rgb(190 24 93 / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity, 1)))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/90{color:#ffffffe6}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.opacity-60{opacity:.6}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.hover\:border-blue-300:hover{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.hover\:border-blue-500:hover{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.hover\:border-orange-300:hover{--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1))}.hover\:border-purple-300:hover{--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1))}.hover\:bg-amber-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-700:hover{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-yellow-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.hover\:bg-yellow-700:hover{--tw-bg-opacity: 1;background-color:rgb(161 98 7 / var(--tw-bg-opacity, 1))}.hover\:text-blue-600:hover{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-indigo-700:hover{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.hover\:text-primary:hover{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-800:hover{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.hover\:text-yellow-800:hover{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.hover\:shadow-2xl:hover{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width: 768px){.md\:col-span-2{grid-column:span 2 / span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}}@media (min-width: 1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}} diff --git a/frontend/dist/assets/index-floXOwYs.js b/frontend/dist/assets/index-floXOwYs.js new file mode 100644 index 00000000..355e234c --- /dev/null +++ b/frontend/dist/assets/index-floXOwYs.js @@ -0,0 +1,421 @@ +var Ak=Object.defineProperty;var Ok=(e,t,r)=>t in e?Ak(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var mo=(e,t,r)=>Ok(e,typeof t!="symbol"?t+"":t,r);function Ek(e,t){for(var r=0;rn[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function r(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(i){if(i.ep)return;i.ep=!0;const s=r(i);fetch(i.href,s)}})();function Tr(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var kv={exports:{}},Cc={},_v={exports:{}},ie={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Vs=Symbol.for("react.element"),Dk=Symbol.for("react.portal"),Tk=Symbol.for("react.fragment"),Mk=Symbol.for("react.strict_mode"),Ik=Symbol.for("react.profiler"),$k=Symbol.for("react.provider"),Lk=Symbol.for("react.context"),zk=Symbol.for("react.forward_ref"),Rk=Symbol.for("react.suspense"),Bk=Symbol.for("react.memo"),Wk=Symbol.for("react.lazy"),pg=Symbol.iterator;function Fk(e){return e===null||typeof e!="object"?null:(e=pg&&e[pg]||e["@@iterator"],typeof e=="function"?e:null)}var Pv={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Cv=Object.assign,Av={};function ja(e,t,r){this.props=e,this.context=t,this.refs=Av,this.updater=r||Pv}ja.prototype.isReactComponent={};ja.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};ja.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ov(){}Ov.prototype=ja.prototype;function Cp(e,t,r){this.props=e,this.context=t,this.refs=Av,this.updater=r||Pv}var Ap=Cp.prototype=new Ov;Ap.constructor=Cp;Cv(Ap,ja.prototype);Ap.isPureReactComponent=!0;var hg=Array.isArray,Ev=Object.prototype.hasOwnProperty,Op={current:null},Dv={key:!0,ref:!0,__self:!0,__source:!0};function Tv(e,t,r){var n,i={},s=null,o=null;if(t!=null)for(n in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(s=""+t.key),t)Ev.call(t,n)&&!Dv.hasOwnProperty(n)&&(i[n]=t[n]);var l=arguments.length-2;if(l===1)i.children=r;else if(1>>1,H=O[W];if(0>>1;Wi(Me,L))Ei(J,Me)?(O[W]=J,O[E]=L,W=E):(O[W]=Me,O[re]=L,W=re);else if(Ei(J,L))O[W]=J,O[E]=L,W=E;else break e}}return k}function i(O,k){var L=O.sortIndex-k.sortIndex;return L!==0?L:O.id-k.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();e.unstable_now=function(){return o.now()-l}}var c=[],d=[],u=1,f=null,p=3,m=!1,x=!1,g=!1,b=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,j=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function y(O){for(var k=r(d);k!==null;){if(k.callback===null)n(d);else if(k.startTime<=O)n(d),k.sortIndex=k.expirationTime,t(c,k);else break;k=r(d)}}function w(O){if(g=!1,y(O),!x)if(r(c)!==null)x=!0,A(S);else{var k=r(d);k!==null&&T(w,k.startTime-O)}}function S(O,k){x=!1,g&&(g=!1,v(P),P=-1),m=!0;var L=p;try{for(y(k),f=r(c);f!==null&&(!(f.expirationTime>k)||O&&!I());){var W=f.callback;if(typeof W=="function"){f.callback=null,p=f.priorityLevel;var H=W(f.expirationTime<=k);k=e.unstable_now(),typeof H=="function"?f.callback=H:f===r(c)&&n(c),y(k)}else n(c);f=r(c)}if(f!==null)var ee=!0;else{var re=r(d);re!==null&&T(w,re.startTime-k),ee=!1}return ee}finally{f=null,p=L,m=!1}}var N=!1,_=null,P=-1,D=5,M=-1;function I(){return!(e.unstable_now()-MO||125W?(O.sortIndex=L,t(d,O),r(c)===null&&O===r(d)&&(g?(v(P),P=-1):g=!0,T(w,L-W))):(O.sortIndex=H,t(c,O),x||m||(x=!0,A(S))),O},e.unstable_shouldYield=I,e.unstable_wrapCallback=function(O){var k=p;return function(){var L=p;p=k;try{return O.apply(this,arguments)}finally{p=L}}}})(Rv);zv.exports=Rv;var Qk=zv.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var e_=h,Wt=Qk;function F(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Md=Object.prototype.hasOwnProperty,t_=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,gg={},xg={};function r_(e){return Md.call(xg,e)?!0:Md.call(gg,e)?!1:t_.test(e)?xg[e]=!0:(gg[e]=!0,!1)}function n_(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function i_(e,t,r,n){if(t===null||typeof t>"u"||n_(e,t,r,n))return!0;if(n)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function yt(e,t,r,n,i,s,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=i,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=s,this.removeEmptyString=o}var tt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){tt[e]=new yt(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];tt[t]=new yt(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){tt[e]=new yt(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){tt[e]=new yt(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){tt[e]=new yt(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){tt[e]=new yt(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){tt[e]=new yt(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){tt[e]=new yt(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){tt[e]=new yt(e,5,!1,e.toLowerCase(),null,!1,!1)});var Dp=/[\-:]([a-z])/g;function Tp(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Dp,Tp);tt[t]=new yt(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Dp,Tp);tt[t]=new yt(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Dp,Tp);tt[t]=new yt(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){tt[e]=new yt(e,1,!1,e.toLowerCase(),null,!1,!1)});tt.xlinkHref=new yt("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){tt[e]=new yt(e,1,!1,e.toLowerCase(),null,!0,!0)});function Mp(e,t,r,n){var i=tt.hasOwnProperty(t)?tt[t]:null;(i!==null?i.type!==0:n||!(2l||i[o]!==s[l]){var c=` +`+i[o].replace(" at new "," at ");return e.displayName&&c.includes("")&&(c=c.replace("",e.displayName)),c}while(1<=o&&0<=l);break}}}finally{Bu=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Xa(e):""}function a_(e){switch(e.tag){case 5:return Xa(e.type);case 16:return Xa("Lazy");case 13:return Xa("Suspense");case 19:return Xa("SuspenseList");case 0:case 2:case 15:return e=Wu(e.type,!1),e;case 11:return e=Wu(e.type.render,!1),e;case 1:return e=Wu(e.type,!0),e;default:return""}}function zd(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Li:return"Fragment";case $i:return"Portal";case Id:return"Profiler";case Ip:return"StrictMode";case $d:return"Suspense";case Ld:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Fv:return(e.displayName||"Context")+".Consumer";case Wv:return(e._context.displayName||"Context")+".Provider";case $p:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Lp:return t=e.displayName||null,t!==null?t:zd(e.type)||"Memo";case mn:t=e._payload,e=e._init;try{return zd(e(t))}catch{}}return null}function s_(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return zd(t);case 8:return t===Ip?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function In(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function qv(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function o_(e){var t=qv(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var i=r.get,s=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(o){n=""+o,s.call(this,o)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(o){n=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function yo(e){e._valueTracker||(e._valueTracker=o_(e))}function Hv(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=qv(e)?e.checked?"true":"false":e.value),e=n,e!==r?(t.setValue(e),!0):!1}function dl(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Rd(e,t){var r=t.checked;return Ne({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function vg(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;r=In(t.value!=null?t.value:r),e._wrapperState={initialChecked:n,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Kv(e,t){t=t.checked,t!=null&&Mp(e,"checked",t,!1)}function Bd(e,t){Kv(e,t);var r=In(t.value),n=t.type;if(r!=null)n==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Wd(e,t.type,r):t.hasOwnProperty("defaultValue")&&Wd(e,t.type,In(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function bg(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function Wd(e,t,r){(t!=="number"||dl(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Ja=Array.isArray;function Xi(e,t,r,n){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=vo.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function gs(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var ns={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},l_=["Webkit","ms","Moz","O"];Object.keys(ns).forEach(function(e){l_.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ns[t]=ns[e]})});function Zv(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||ns.hasOwnProperty(e)&&ns[e]?(""+t).trim():t+"px"}function Xv(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=r.indexOf("--")===0,i=Zv(r,t[r],n);r==="float"&&(r="cssFloat"),n?e.setProperty(r,i):e[r]=i}}var c_=Ne({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function qd(e,t){if(t){if(c_[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(F(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(F(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(F(61))}if(t.style!=null&&typeof t.style!="object")throw Error(F(62))}}function Hd(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Kd=null;function zp(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Vd=null,Ji=null,Qi=null;function Sg(e){if(e=Zs(e)){if(typeof Vd!="function")throw Error(F(280));var t=e.stateNode;t&&(t=Tc(t),Vd(e.stateNode,e.type,t))}}function Jv(e){Ji?Qi?Qi.push(e):Qi=[e]:Ji=e}function Qv(){if(Ji){var e=Ji,t=Qi;if(Qi=Ji=null,Sg(e),t)for(e=0;e>>=0,e===0?32:31-(b_(e)/j_|0)|0}var bo=64,jo=4194304;function Qa(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ml(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,i=e.suspendedLanes,s=e.pingedLanes,o=r&268435455;if(o!==0){var l=o&~i;l!==0?n=Qa(l):(s&=o,s!==0&&(n=Qa(s)))}else o=r&~i,o!==0?n=Qa(o):s!==0&&(n=Qa(s));if(n===0)return 0;if(t!==0&&t!==n&&!(t&i)&&(i=n&-n,s=t&-t,i>=s||i===16&&(s&4194240)!==0))return t;if(n&4&&(n|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0r;r++)t.push(e);return t}function Ys(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-hr(t),e[t]=r}function k_(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0=as),Dg=" ",Tg=!1;function vb(e,t){switch(e){case"keyup":return Q_.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function bb(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var zi=!1;function tP(e,t){switch(e){case"compositionend":return bb(t);case"keypress":return t.which!==32?null:(Tg=!0,Dg);case"textInput":return e=t.data,e===Dg&&Tg?null:e;default:return null}}function rP(e,t){if(zi)return e==="compositionend"||!Kp&&vb(e,t)?(e=xb(),Jo=Up=wn=null,zi=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Lg(r)}}function Nb(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Nb(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function kb(){for(var e=window,t=dl();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=dl(e.document)}return t}function Vp(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function dP(e){var t=kb(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&Nb(r.ownerDocument.documentElement,r)){if(n!==null&&Vp(r)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=r.textContent.length,s=Math.min(n.start,i);n=n.end===void 0?s:Math.min(n.end,i),!e.extend&&s>n&&(i=n,n=s,s=i),i=zg(r,s);var o=zg(r,n);i&&o&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),s>n?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,Ri=null,Qd=null,os=null,ef=!1;function Rg(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;ef||Ri==null||Ri!==dl(n)||(n=Ri,"selectionStart"in n&&Vp(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),os&&ws(os,n)||(os=n,n=yl(Qd,"onSelect"),0Fi||(e.current=of[Fi],of[Fi]=null,Fi--)}function me(e,t){Fi++,of[Fi]=e.current,e.current=t}var $n={},ct=Wn($n),kt=Wn(!1),pi=$n;function oa(e,t){var r=e.type.contextTypes;if(!r)return $n;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var i={},s;for(s in r)i[s]=t[s];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function _t(e){return e=e.childContextTypes,e!=null}function bl(){ve(kt),ve(ct)}function Kg(e,t,r){if(ct.current!==$n)throw Error(F(168));me(ct,t),me(kt,r)}function Mb(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return r;n=n.getChildContext();for(var i in n)if(!(i in t))throw Error(F(108,s_(e)||"Unknown",i));return Ne({},r,n)}function jl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||$n,pi=ct.current,me(ct,e),me(kt,kt.current),!0}function Vg(e,t,r){var n=e.stateNode;if(!n)throw Error(F(169));r?(e=Mb(e,t,pi),n.__reactInternalMemoizedMergedChildContext=e,ve(kt),ve(ct),me(ct,e)):ve(kt),me(kt,r)}var Lr=null,Mc=!1,td=!1;function Ib(e){Lr===null?Lr=[e]:Lr.push(e)}function SP(e){Mc=!0,Ib(e)}function Fn(){if(!td&&Lr!==null){td=!0;var e=0,t=ce;try{var r=Lr;for(ce=1;e>=o,i-=o,Br=1<<32-hr(t)+i|r<P?(D=_,_=null):D=_.sibling;var M=p(v,_,y[P],w);if(M===null){_===null&&(_=D);break}e&&_&&M.alternate===null&&t(v,_),j=s(M,j,P),N===null?S=M:N.sibling=M,N=M,_=D}if(P===y.length)return r(v,_),be&&Gn(v,P),S;if(_===null){for(;PP?(D=_,_=null):D=_.sibling;var I=p(v,_,M.value,w);if(I===null){_===null&&(_=D);break}e&&_&&I.alternate===null&&t(v,_),j=s(I,j,P),N===null?S=I:N.sibling=I,N=I,_=D}if(M.done)return r(v,_),be&&Gn(v,P),S;if(_===null){for(;!M.done;P++,M=y.next())M=f(v,M.value,w),M!==null&&(j=s(M,j,P),N===null?S=M:N.sibling=M,N=M);return be&&Gn(v,P),S}for(_=n(v,_);!M.done;P++,M=y.next())M=m(_,v,P,M.value,w),M!==null&&(e&&M.alternate!==null&&_.delete(M.key===null?P:M.key),j=s(M,j,P),N===null?S=M:N.sibling=M,N=M);return e&&_.forEach(function(C){return t(v,C)}),be&&Gn(v,P),S}function b(v,j,y,w){if(typeof y=="object"&&y!==null&&y.type===Li&&y.key===null&&(y=y.props.children),typeof y=="object"&&y!==null){switch(y.$$typeof){case xo:e:{for(var S=y.key,N=j;N!==null;){if(N.key===S){if(S=y.type,S===Li){if(N.tag===7){r(v,N.sibling),j=i(N,y.props.children),j.return=v,v=j;break e}}else if(N.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===mn&&Zg(S)===N.type){r(v,N.sibling),j=i(N,y.props),j.ref=Wa(v,N,y),j.return=v,v=j;break e}r(v,N);break}else t(v,N);N=N.sibling}y.type===Li?(j=oi(y.props.children,v.mode,w,y.key),j.return=v,v=j):(w=sl(y.type,y.key,y.props,null,v.mode,w),w.ref=Wa(v,j,y),w.return=v,v=w)}return o(v);case $i:e:{for(N=y.key;j!==null;){if(j.key===N)if(j.tag===4&&j.stateNode.containerInfo===y.containerInfo&&j.stateNode.implementation===y.implementation){r(v,j.sibling),j=i(j,y.children||[]),j.return=v,v=j;break e}else{r(v,j);break}else t(v,j);j=j.sibling}j=cd(y,v.mode,w),j.return=v,v=j}return o(v);case mn:return N=y._init,b(v,j,N(y._payload),w)}if(Ja(y))return x(v,j,y,w);if($a(y))return g(v,j,y,w);Co(v,y)}return typeof y=="string"&&y!==""||typeof y=="number"?(y=""+y,j!==null&&j.tag===6?(r(v,j.sibling),j=i(j,y),j.return=v,v=j):(r(v,j),j=ld(y,v.mode,w),j.return=v,v=j),o(v)):r(v,j)}return b}var ca=Rb(!0),Bb=Rb(!1),Nl=Wn(null),kl=null,Hi=null,Xp=null;function Jp(){Xp=Hi=kl=null}function Qp(e){var t=Nl.current;ve(Nl),e._currentValue=t}function uf(e,t,r){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,n!==null&&(n.childLanes|=t)):n!==null&&(n.childLanes&t)!==t&&(n.childLanes|=t),e===r)break;e=e.return}}function ta(e,t){kl=e,Xp=Hi=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(St=!0),e.firstContext=null)}function tr(e){var t=e._currentValue;if(Xp!==e)if(e={context:e,memoizedValue:t,next:null},Hi===null){if(kl===null)throw Error(F(308));Hi=e,kl.dependencies={lanes:0,firstContext:e}}else Hi=Hi.next=e;return t}var ti=null;function eh(e){ti===null?ti=[e]:ti.push(e)}function Wb(e,t,r,n){var i=t.interleaved;return i===null?(r.next=r,eh(t)):(r.next=i.next,i.next=r),t.interleaved=r,Zr(e,n)}function Zr(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t),r=e,e=e.return;e!==null;)e.childLanes|=t,r=e.alternate,r!==null&&(r.childLanes|=t),r=e,e=e.return;return r.tag===3?r.stateNode:null}var gn=!1;function th(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fb(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function qr(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function An(e,t,r){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,ae&2){var i=n.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),n.pending=t,Zr(e,r)}return i=n.interleaved,i===null?(t.next=t,eh(n)):(t.next=i.next,i.next=t),n.interleaved=t,Zr(e,r)}function el(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!==0)){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,Bp(e,r)}}function Xg(e,t){var r=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,r===n)){var i=null,s=null;if(r=r.firstBaseUpdate,r!==null){do{var o={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};s===null?i=s=o:s=s.next=o,r=r.next}while(r!==null);s===null?i=s=t:s=s.next=t}else i=s=t;r={baseState:n.baseState,firstBaseUpdate:i,lastBaseUpdate:s,shared:n.shared,effects:n.effects},e.updateQueue=r;return}e=r.lastBaseUpdate,e===null?r.firstBaseUpdate=t:e.next=t,r.lastBaseUpdate=t}function _l(e,t,r,n){var i=e.updateQueue;gn=!1;var s=i.firstBaseUpdate,o=i.lastBaseUpdate,l=i.shared.pending;if(l!==null){i.shared.pending=null;var c=l,d=c.next;c.next=null,o===null?s=d:o.next=d,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,l=u.lastBaseUpdate,l!==o&&(l===null?u.firstBaseUpdate=d:l.next=d,u.lastBaseUpdate=c))}if(s!==null){var f=i.baseState;o=0,u=d=c=null,l=s;do{var p=l.lane,m=l.eventTime;if((n&p)===p){u!==null&&(u=u.next={eventTime:m,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var x=e,g=l;switch(p=t,m=r,g.tag){case 1:if(x=g.payload,typeof x=="function"){f=x.call(m,f,p);break e}f=x;break e;case 3:x.flags=x.flags&-65537|128;case 0:if(x=g.payload,p=typeof x=="function"?x.call(m,f,p):x,p==null)break e;f=Ne({},f,p);break e;case 2:gn=!0}}l.callback!==null&&l.lane!==0&&(e.flags|=64,p=i.effects,p===null?i.effects=[l]:p.push(l))}else m={eventTime:m,lane:p,tag:l.tag,payload:l.payload,callback:l.callback,next:null},u===null?(d=u=m,c=f):u=u.next=m,o|=p;if(l=l.next,l===null){if(l=i.shared.pending,l===null)break;p=l,l=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(!0);if(u===null&&(c=f),i.baseState=c,i.firstBaseUpdate=d,i.lastBaseUpdate=u,t=i.shared.interleaved,t!==null){i=t;do o|=i.lane,i=i.next;while(i!==t)}else s===null&&(i.shared.lanes=0);gi|=o,e.lanes=o,e.memoizedState=f}}function Jg(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;tr?r:4,e(!0);var n=nd.transition;nd.transition={};try{e(!1),t()}finally{ce=r,nd.transition=n}}function a1(){return rr().memoizedState}function PP(e,t,r){var n=En(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},s1(e))o1(t,r);else if(r=Wb(e,t,r,n),r!==null){var i=gt();mr(r,e,n,i),l1(r,t,n)}}function CP(e,t,r){var n=En(e),i={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(s1(e))o1(t,i);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var o=t.lastRenderedState,l=s(o,r);if(i.hasEagerState=!0,i.eagerState=l,gr(l,o)){var c=t.interleaved;c===null?(i.next=i,eh(t)):(i.next=c.next,c.next=i),t.interleaved=i;return}}catch{}finally{}r=Wb(e,t,i,n),r!==null&&(i=gt(),mr(r,e,n,i),l1(r,t,n))}}function s1(e){var t=e.alternate;return e===Se||t!==null&&t===Se}function o1(e,t){ls=Cl=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function l1(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,Bp(e,r)}}var Al={readContext:tr,useCallback:nt,useContext:nt,useEffect:nt,useImperativeHandle:nt,useInsertionEffect:nt,useLayoutEffect:nt,useMemo:nt,useReducer:nt,useRef:nt,useState:nt,useDebugValue:nt,useDeferredValue:nt,useTransition:nt,useMutableSource:nt,useSyncExternalStore:nt,useId:nt,unstable_isNewReconciler:!1},AP={readContext:tr,useCallback:function(e,t){return jr().memoizedState=[e,t===void 0?null:t],e},useContext:tr,useEffect:ex,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,rl(4194308,4,e1.bind(null,t,e),r)},useLayoutEffect:function(e,t){return rl(4194308,4,e,t)},useInsertionEffect:function(e,t){return rl(4,2,e,t)},useMemo:function(e,t){var r=jr();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var n=jr();return t=r!==void 0?r(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=PP.bind(null,Se,e),[n.memoizedState,e]},useRef:function(e){var t=jr();return e={current:e},t.memoizedState=e},useState:Qg,useDebugValue:ch,useDeferredValue:function(e){return jr().memoizedState=e},useTransition:function(){var e=Qg(!1),t=e[0];return e=_P.bind(null,e[1]),jr().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var n=Se,i=jr();if(be){if(r===void 0)throw Error(F(407));r=r()}else{if(r=t(),Ve===null)throw Error(F(349));mi&30||Kb(n,t,r)}i.memoizedState=r;var s={value:r,getSnapshot:t};return i.queue=s,ex(Yb.bind(null,n,s,e),[e]),n.flags|=2048,Os(9,Vb.bind(null,n,s,r,t),void 0,null),r},useId:function(){var e=jr(),t=Ve.identifierPrefix;if(be){var r=Wr,n=Br;r=(n&~(1<<32-hr(n)-1)).toString(32)+r,t=":"+t+"R"+r,r=Cs++,0<\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=o.createElement(r,{is:n.is}):(e=o.createElement(r),r==="select"&&(o=e,n.multiple?o.multiple=!0:n.size&&(o.size=n.size))):e=o.createElementNS(e,r),e[Sr]=t,e[ks]=n,y1(e,t,!1,!1),t.stateNode=e;e:{switch(o=Hd(r,n),r){case"dialog":xe("cancel",e),xe("close",e),i=n;break;case"iframe":case"object":case"embed":xe("load",e),i=n;break;case"video":case"audio":for(i=0;ifa&&(t.flags|=128,n=!0,Fa(s,!1),t.lanes=4194304)}else{if(!n)if(e=Pl(o),e!==null){if(t.flags|=128,n=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),Fa(s,!0),s.tail===null&&s.tailMode==="hidden"&&!o.alternate&&!be)return it(t),null}else 2*Ce()-s.renderingStartTime>fa&&r!==1073741824&&(t.flags|=128,n=!0,Fa(s,!1),t.lanes=4194304);s.isBackwards?(o.sibling=t.child,t.child=o):(r=s.last,r!==null?r.sibling=o:t.child=o,s.last=o)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=Ce(),t.sibling=null,r=we.current,me(we,n?r&1|2:r&1),t):(it(t),null);case 22:case 23:return mh(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?It&1073741824&&(it(t),t.subtreeFlags&6&&(t.flags|=8192)):it(t),null;case 24:return null;case 25:return null}throw Error(F(156,t.tag))}function LP(e,t){switch(Gp(t),t.tag){case 1:return _t(t.type)&&bl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ua(),ve(kt),ve(ct),ih(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return nh(t),null;case 13:if(ve(we),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(F(340));la()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ve(we),null;case 4:return ua(),null;case 10:return Qp(t.type._context),null;case 22:case 23:return mh(),null;case 24:return null;default:return null}}var Oo=!1,st=!1,zP=typeof WeakSet=="function"?WeakSet:Set,K=null;function Ki(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(n){ke(e,t,n)}else r.current=null}function vf(e,t,r){try{r()}catch(n){ke(e,t,n)}}var dx=!1;function RP(e,t){if(tf=gl,e=kb(),Vp(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var n=r.getSelection&&r.getSelection();if(n&&n.rangeCount!==0){r=n.anchorNode;var i=n.anchorOffset,s=n.focusNode;n=n.focusOffset;try{r.nodeType,s.nodeType}catch{r=null;break e}var o=0,l=-1,c=-1,d=0,u=0,f=e,p=null;t:for(;;){for(var m;f!==r||i!==0&&f.nodeType!==3||(l=o+i),f!==s||n!==0&&f.nodeType!==3||(c=o+n),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break t;if(p===r&&++d===i&&(l=o),p===s&&++u===n&&(c=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}r=l===-1||c===-1?null:{start:l,end:c}}else r=null}r=r||{start:0,end:0}}else r=null;for(rf={focusedElem:e,selectionRange:r},gl=!1,K=t;K!==null;)if(t=K,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,K=e;else for(;K!==null;){t=K;try{var x=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(x!==null){var g=x.memoizedProps,b=x.memoizedState,v=t.stateNode,j=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:cr(t.type,g),b);v.__reactInternalSnapshotBeforeUpdate=j}break;case 3:var y=t.stateNode.containerInfo;y.nodeType===1?y.textContent="":y.nodeType===9&&y.documentElement&&y.removeChild(y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(F(163))}}catch(w){ke(t,t.return,w)}if(e=t.sibling,e!==null){e.return=t.return,K=e;break}K=t.return}return x=dx,dx=!1,x}function cs(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var s=i.destroy;i.destroy=void 0,s!==void 0&&vf(t,r,s)}i=i.next}while(i!==n)}}function Lc(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var n=r.create;r.destroy=n()}r=r.next}while(r!==t)}}function bf(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function j1(e){var t=e.alternate;t!==null&&(e.alternate=null,j1(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Sr],delete t[ks],delete t[sf],delete t[jP],delete t[wP])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function w1(e){return e.tag===5||e.tag===3||e.tag===4}function fx(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||w1(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function jf(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=vl));else if(n!==4&&(e=e.child,e!==null))for(jf(e,t,r),e=e.sibling;e!==null;)jf(e,t,r),e=e.sibling}function wf(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(wf(e,t,r),e=e.sibling;e!==null;)wf(e,t,r),e=e.sibling}var Xe=null,ur=!1;function hn(e,t,r){for(r=r.child;r!==null;)S1(e,t,r),r=r.sibling}function S1(e,t,r){if(kr&&typeof kr.onCommitFiberUnmount=="function")try{kr.onCommitFiberUnmount(Ac,r)}catch{}switch(r.tag){case 5:st||Ki(r,t);case 6:var n=Xe,i=ur;Xe=null,hn(e,t,r),Xe=n,ur=i,Xe!==null&&(ur?(e=Xe,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Xe.removeChild(r.stateNode));break;case 18:Xe!==null&&(ur?(e=Xe,r=r.stateNode,e.nodeType===8?ed(e.parentNode,r):e.nodeType===1&&ed(e,r),bs(e)):ed(Xe,r.stateNode));break;case 4:n=Xe,i=ur,Xe=r.stateNode.containerInfo,ur=!0,hn(e,t,r),Xe=n,ur=i;break;case 0:case 11:case 14:case 15:if(!st&&(n=r.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){i=n=n.next;do{var s=i,o=s.destroy;s=s.tag,o!==void 0&&(s&2||s&4)&&vf(r,t,o),i=i.next}while(i!==n)}hn(e,t,r);break;case 1:if(!st&&(Ki(r,t),n=r.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=r.memoizedProps,n.state=r.memoizedState,n.componentWillUnmount()}catch(l){ke(r,t,l)}hn(e,t,r);break;case 21:hn(e,t,r);break;case 22:r.mode&1?(st=(n=st)||r.memoizedState!==null,hn(e,t,r),st=n):hn(e,t,r);break;default:hn(e,t,r)}}function px(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new zP),t.forEach(function(n){var i=YP.bind(null,e,n);r.has(n)||(r.add(n),n.then(i,i))})}}function lr(e,t){var r=t.deletions;if(r!==null)for(var n=0;ni&&(i=o),n&=~s}if(n=i,n=Ce()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*WP(n/1960))-n,10e?16:e,Sn===null)var n=!1;else{if(e=Sn,Sn=null,Dl=0,ae&6)throw Error(F(331));var i=ae;for(ae|=4,K=e.current;K!==null;){var s=K,o=s.child;if(K.flags&16){var l=s.deletions;if(l!==null){for(var c=0;cCe()-ph?si(e,0):fh|=r),Pt(e,t)}function E1(e,t){t===0&&(e.mode&1?(t=jo,jo<<=1,!(jo&130023424)&&(jo=4194304)):t=1);var r=gt();e=Zr(e,t),e!==null&&(Ys(e,t,r),Pt(e,r))}function VP(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),E1(e,r)}function YP(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,i=e.memoizedState;i!==null&&(r=i.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(F(314))}n!==null&&n.delete(t),E1(e,r)}var D1;D1=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||kt.current)St=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return St=!1,IP(e,t,r);St=!!(e.flags&131072)}else St=!1,be&&t.flags&1048576&&$b(t,Sl,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;nl(e,t),e=t.pendingProps;var i=oa(t,ct.current);ta(t,r),i=sh(null,t,n,e,i,r);var s=oh();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,_t(n)?(s=!0,jl(t)):s=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,th(t),i.updater=$c,t.stateNode=i,i._reactInternals=t,ff(t,n,e,r),t=mf(null,t,n,!0,s,r)):(t.tag=0,be&&s&&Yp(t),ht(null,t,i,r),t=t.child),t;case 16:n=t.elementType;e:{switch(nl(e,t),e=t.pendingProps,i=n._init,n=i(n._payload),t.type=n,i=t.tag=ZP(n),e=cr(n,e),i){case 0:t=hf(null,t,n,e,r);break e;case 1:t=lx(null,t,n,e,r);break e;case 11:t=sx(null,t,n,e,r);break e;case 14:t=ox(null,t,n,cr(n.type,e),r);break e}throw Error(F(306,n,""))}return t;case 0:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:cr(n,i),hf(e,t,n,i,r);case 1:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:cr(n,i),lx(e,t,n,i,r);case 3:e:{if(m1(t),e===null)throw Error(F(387));n=t.pendingProps,s=t.memoizedState,i=s.element,Fb(e,t),_l(t,n,null,r);var o=t.memoizedState;if(n=o.element,s.isDehydrated)if(s={element:n,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=s,t.memoizedState=s,t.flags&256){i=da(Error(F(423)),t),t=cx(e,t,n,r,i);break e}else if(n!==i){i=da(Error(F(424)),t),t=cx(e,t,n,r,i);break e}else for(zt=Cn(t.stateNode.containerInfo.firstChild),Rt=t,be=!0,dr=null,r=Bb(t,null,n,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(la(),n===i){t=Xr(e,t,r);break e}ht(e,t,n,r)}t=t.child}return t;case 5:return Ub(t),e===null&&cf(t),n=t.type,i=t.pendingProps,s=e!==null?e.memoizedProps:null,o=i.children,nf(n,i)?o=null:s!==null&&nf(n,s)&&(t.flags|=32),h1(e,t),ht(e,t,o,r),t.child;case 6:return e===null&&cf(t),null;case 13:return g1(e,t,r);case 4:return rh(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=ca(t,null,n,r):ht(e,t,n,r),t.child;case 11:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:cr(n,i),sx(e,t,n,i,r);case 7:return ht(e,t,t.pendingProps,r),t.child;case 8:return ht(e,t,t.pendingProps.children,r),t.child;case 12:return ht(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(n=t.type._context,i=t.pendingProps,s=t.memoizedProps,o=i.value,me(Nl,n._currentValue),n._currentValue=o,s!==null)if(gr(s.value,o)){if(s.children===i.children&&!kt.current){t=Xr(e,t,r);break e}}else for(s=t.child,s!==null&&(s.return=t);s!==null;){var l=s.dependencies;if(l!==null){o=s.child;for(var c=l.firstContext;c!==null;){if(c.context===n){if(s.tag===1){c=qr(-1,r&-r),c.tag=2;var d=s.updateQueue;if(d!==null){d=d.shared;var u=d.pending;u===null?c.next=c:(c.next=u.next,u.next=c),d.pending=c}}s.lanes|=r,c=s.alternate,c!==null&&(c.lanes|=r),uf(s.return,r,t),l.lanes|=r;break}c=c.next}}else if(s.tag===10)o=s.type===t.type?null:s.child;else if(s.tag===18){if(o=s.return,o===null)throw Error(F(341));o.lanes|=r,l=o.alternate,l!==null&&(l.lanes|=r),uf(o,r,t),o=s.sibling}else o=s.child;if(o!==null)o.return=s;else for(o=s;o!==null;){if(o===t){o=null;break}if(s=o.sibling,s!==null){s.return=o.return,o=s;break}o=o.return}s=o}ht(e,t,i.children,r),t=t.child}return t;case 9:return i=t.type,n=t.pendingProps.children,ta(t,r),i=tr(i),n=n(i),t.flags|=1,ht(e,t,n,r),t.child;case 14:return n=t.type,i=cr(n,t.pendingProps),i=cr(n.type,i),ox(e,t,n,i,r);case 15:return f1(e,t,t.type,t.pendingProps,r);case 17:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:cr(n,i),nl(e,t),t.tag=1,_t(n)?(e=!0,jl(t)):e=!1,ta(t,r),c1(t,n,i),ff(t,n,i,r),mf(null,t,n,!0,e,r);case 19:return x1(e,t,r);case 22:return p1(e,t,r)}throw Error(F(156,t.tag))};function T1(e,t){return sb(e,t)}function GP(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Zt(e,t,r,n){return new GP(e,t,r,n)}function xh(e){return e=e.prototype,!(!e||!e.isReactComponent)}function ZP(e){if(typeof e=="function")return xh(e)?1:0;if(e!=null){if(e=e.$$typeof,e===$p)return 11;if(e===Lp)return 14}return 2}function Dn(e,t){var r=e.alternate;return r===null?(r=Zt(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function sl(e,t,r,n,i,s){var o=2;if(n=e,typeof e=="function")xh(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Li:return oi(r.children,i,s,t);case Ip:o=8,i|=8;break;case Id:return e=Zt(12,r,t,i|2),e.elementType=Id,e.lanes=s,e;case $d:return e=Zt(13,r,t,i),e.elementType=$d,e.lanes=s,e;case Ld:return e=Zt(19,r,t,i),e.elementType=Ld,e.lanes=s,e;case Uv:return Rc(r,i,s,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Wv:o=10;break e;case Fv:o=9;break e;case $p:o=11;break e;case Lp:o=14;break e;case mn:o=16,n=null;break e}throw Error(F(130,e==null?e:typeof e,""))}return t=Zt(o,r,t,i),t.elementType=e,t.type=n,t.lanes=s,t}function oi(e,t,r,n){return e=Zt(7,e,n,t),e.lanes=r,e}function Rc(e,t,r,n){return e=Zt(22,e,n,t),e.elementType=Uv,e.lanes=r,e.stateNode={isHidden:!1},e}function ld(e,t,r){return e=Zt(6,e,null,t),e.lanes=r,e}function cd(e,t,r){return t=Zt(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function XP(e,t,r,n,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Uu(0),this.expirationTimes=Uu(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Uu(0),this.identifierPrefix=n,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function yh(e,t,r,n,i,s,o,l,c){return e=new XP(e,t,r,l,c),t===1?(t=1,s===!0&&(t|=8)):t=0,s=Zt(3,null,null,t),e.current=s,s.stateNode=e,s.memoizedState={element:n,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},th(s),e}function JP(e,t,r){var n=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(L1)}catch(e){console.error(e)}}L1(),Lv.exports=Ut;var wh=Lv.exports,jx=wh;Td.createRoot=jx.createRoot,Td.hydrateRoot=jx.hydrateRoot;/** + * @remix-run/router v1.23.1 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Ds(){return Ds=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function Sh(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function iC(){return Math.random().toString(36).substr(2,8)}function Sx(e,t){return{usr:e.state,key:e.key,idx:t}}function Pf(e,t,r,n){return r===void 0&&(r=null),Ds({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Na(t):t,{state:r,key:t&&t.key||n||iC()})}function Il(e){let{pathname:t="/",search:r="",hash:n=""}=e;return r&&r!=="?"&&(t+=r.charAt(0)==="?"?r:"?"+r),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function Na(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function aC(e,t,r,n){n===void 0&&(n={});let{window:i=document.defaultView,v5Compat:s=!1}=n,o=i.history,l=Nn.Pop,c=null,d=u();d==null&&(d=0,o.replaceState(Ds({},o.state,{idx:d}),""));function u(){return(o.state||{idx:null}).idx}function f(){l=Nn.Pop;let b=u(),v=b==null?null:b-d;d=b,c&&c({action:l,location:g.location,delta:v})}function p(b,v){l=Nn.Push;let j=Pf(g.location,b,v);d=u()+1;let y=Sx(j,d),w=g.createHref(j);try{o.pushState(y,"",w)}catch(S){if(S instanceof DOMException&&S.name==="DataCloneError")throw S;i.location.assign(w)}s&&c&&c({action:l,location:g.location,delta:1})}function m(b,v){l=Nn.Replace;let j=Pf(g.location,b,v);d=u();let y=Sx(j,d),w=g.createHref(j);o.replaceState(y,"",w),s&&c&&c({action:l,location:g.location,delta:0})}function x(b){let v=i.location.origin!=="null"?i.location.origin:i.location.href,j=typeof b=="string"?b:Il(b);return j=j.replace(/ $/,"%20"),Ae(v,"No window.location.(origin|href) available to create URL for href: "+j),new URL(j,v)}let g={get action(){return l},get location(){return e(i,o)},listen(b){if(c)throw new Error("A history only accepts one active listener");return i.addEventListener(wx,f),c=b,()=>{i.removeEventListener(wx,f),c=null}},createHref(b){return t(i,b)},createURL:x,encodeLocation(b){let v=x(b);return{pathname:v.pathname,search:v.search,hash:v.hash}},push:p,replace:m,go(b){return o.go(b)}};return g}var Nx;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Nx||(Nx={}));function sC(e,t,r){return r===void 0&&(r="/"),oC(e,t,r)}function oC(e,t,r,n){let i=typeof t=="string"?Na(t):t,s=Nh(i.pathname||"/",r);if(s==null)return null;let o=z1(e);lC(o);let l=null;for(let c=0;l==null&&c{let c={relativePath:l===void 0?s.path||"":l,caseSensitive:s.caseSensitive===!0,childrenIndex:o,route:s};c.relativePath.startsWith("/")&&(Ae(c.relativePath.startsWith(n),'Absolute route path "'+c.relativePath+'" nested under path '+('"'+n+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),c.relativePath=c.relativePath.slice(n.length));let d=Tn([n,c.relativePath]),u=r.concat(c);s.children&&s.children.length>0&&(Ae(s.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+d+'".')),z1(s.children,t,u,d)),!(s.path==null&&!s.index)&&t.push({path:d,score:mC(d,s.index),routesMeta:u})};return e.forEach((s,o)=>{var l;if(s.path===""||!((l=s.path)!=null&&l.includes("?")))i(s,o);else for(let c of R1(s.path))i(s,o,c)}),t}function R1(e){let t=e.split("/");if(t.length===0)return[];let[r,...n]=t,i=r.endsWith("?"),s=r.replace(/\?$/,"");if(n.length===0)return i?[s,""]:[s];let o=R1(n.join("/")),l=[];return l.push(...o.map(c=>c===""?s:[s,c].join("/"))),i&&l.push(...o),l.map(c=>e.startsWith("/")&&c===""?"/":c)}function lC(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:gC(t.routesMeta.map(n=>n.childrenIndex),r.routesMeta.map(n=>n.childrenIndex)))}const cC=/^:[\w-]+$/,uC=3,dC=2,fC=1,pC=10,hC=-2,kx=e=>e==="*";function mC(e,t){let r=e.split("/"),n=r.length;return r.some(kx)&&(n+=hC),t&&(n+=dC),r.filter(i=>!kx(i)).reduce((i,s)=>i+(cC.test(s)?uC:s===""?fC:pC),n)}function gC(e,t){return e.length===t.length&&e.slice(0,-1).every((n,i)=>n===t[i])?e[e.length-1]-t[t.length-1]:0}function xC(e,t,r){let{routesMeta:n}=e,i={},s="/",o=[];for(let l=0;l{let{paramName:p,isOptional:m}=u;if(p==="*"){let g=l[f]||"";o=s.slice(0,s.length-g.length).replace(/(.)\/+$/,"$1")}const x=l[f];return m&&!x?d[p]=void 0:d[p]=(x||"").replace(/%2F/g,"/"),d},{}),pathname:s,pathnameBase:o,pattern:e}}function vC(e,t,r){t===void 0&&(t=!1),r===void 0&&(r=!0),Sh(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let n=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(o,l,c)=>(n.push({paramName:l,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(n.push({paramName:"*"}),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),n]}function bC(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return Sh(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function Nh(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,n=e.charAt(r);return n&&n!=="/"?null:e.slice(r)||"/"}const jC=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,wC=e=>jC.test(e);function SC(e,t){t===void 0&&(t="/");let{pathname:r,search:n="",hash:i=""}=typeof e=="string"?Na(e):e,s;if(r)if(wC(r))s=r;else{if(r.includes("//")){let o=r;r=r.replace(/\/\/+/g,"/"),Sh(!1,"Pathnames cannot have embedded double slashes - normalizing "+(o+" -> "+r))}r.startsWith("/")?s=_x(r.substring(1),"/"):s=_x(r,t)}else s=t;return{pathname:s,search:_C(n),hash:PC(i)}}function _x(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?r.length>1&&r.pop():i!=="."&&r.push(i)}),r.length>1?r.join("/"):"/"}function ud(e,t,r,n){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(n)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function NC(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function kh(e,t){let r=NC(e);return t?r.map((n,i)=>i===r.length-1?n.pathname:n.pathnameBase):r.map(n=>n.pathnameBase)}function _h(e,t,r,n){n===void 0&&(n=!1);let i;typeof e=="string"?i=Na(e):(i=Ds({},e),Ae(!i.pathname||!i.pathname.includes("?"),ud("?","pathname","search",i)),Ae(!i.pathname||!i.pathname.includes("#"),ud("#","pathname","hash",i)),Ae(!i.search||!i.search.includes("#"),ud("#","search","hash",i)));let s=e===""||i.pathname==="",o=s?"/":i.pathname,l;if(o==null)l=r;else{let f=t.length-1;if(!n&&o.startsWith("..")){let p=o.split("/");for(;p[0]==="..";)p.shift(),f-=1;i.pathname=p.join("/")}l=f>=0?t[f]:"/"}let c=SC(i,l),d=o&&o!=="/"&&o.endsWith("/"),u=(s||o===".")&&r.endsWith("/");return!c.pathname.endsWith("/")&&(d||u)&&(c.pathname+="/"),c}const Tn=e=>e.join("/").replace(/\/\/+/g,"/"),kC=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),_C=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,PC=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function CC(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const B1=["post","put","patch","delete"];new Set(B1);const AC=["get",...B1];new Set(AC);/** + * React Router v6.30.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Ts(){return Ts=Object.assign?Object.assign.bind():function(e){for(var t=1;t{l.current=!0}),h.useCallback(function(d,u){if(u===void 0&&(u={}),!l.current)return;if(typeof d=="number"){n.go(d);return}let f=_h(d,JSON.parse(o),s,u.relative==="path");e==null&&t!=="/"&&(f.pathname=f.pathname==="/"?t:Tn([t,f.pathname])),(u.replace?n.replace:n.push)(f,u.state,u)},[t,n,o,s,e])}function _a(){let{matches:e}=h.useContext(on),t=e[e.length-1];return t?t.params:{}}function U1(e,t){let{relative:r}=t===void 0?{}:t,{future:n}=h.useContext(Un),{matches:i}=h.useContext(on),{pathname:s}=Pi(),o=JSON.stringify(kh(i,n.v7_relativeSplatPath));return h.useMemo(()=>_h(e,JSON.parse(o),s,r==="path"),[e,o,s,r])}function TC(e,t){return MC(e,t)}function MC(e,t,r,n){ka()||Ae(!1);let{navigator:i}=h.useContext(Un),{matches:s}=h.useContext(on),o=s[s.length-1],l=o?o.params:{};o&&o.pathname;let c=o?o.pathnameBase:"/";o&&o.route;let d=Pi(),u;if(t){var f;let b=typeof t=="string"?Na(t):t;c==="/"||(f=b.pathname)!=null&&f.startsWith(c)||Ae(!1),u=b}else u=d;let p=u.pathname||"/",m=p;if(c!=="/"){let b=c.replace(/^\//,"").split("/");m="/"+p.replace(/^\//,"").split("/").slice(b.length).join("/")}let x=sC(e,{pathname:m}),g=RC(x&&x.map(b=>Object.assign({},b,{params:Object.assign({},l,b.params),pathname:Tn([c,i.encodeLocation?i.encodeLocation(b.pathname).pathname:b.pathname]),pathnameBase:b.pathnameBase==="/"?c:Tn([c,i.encodeLocation?i.encodeLocation(b.pathnameBase).pathname:b.pathnameBase])})),s,r,n);return t&&g?h.createElement(qc.Provider,{value:{location:Ts({pathname:"/",search:"",hash:"",state:null,key:"default"},u),navigationType:Nn.Pop}},g):g}function IC(){let e=UC(),t=CC(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,i={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return h.createElement(h.Fragment,null,h.createElement("h2",null,"Unexpected Application Error!"),h.createElement("h3",{style:{fontStyle:"italic"}},t),r?h.createElement("pre",{style:i},r):null,null)}const $C=h.createElement(IC,null);class LC extends h.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error!==void 0?h.createElement(on.Provider,{value:this.props.routeContext},h.createElement(W1.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function zC(e){let{routeContext:t,match:r,children:n}=e,i=h.useContext(Ph);return i&&i.static&&i.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=r.route.id),h.createElement(on.Provider,{value:t},n)}function RC(e,t,r,n){var i;if(t===void 0&&(t=[]),r===void 0&&(r=null),n===void 0&&(n=null),e==null){var s;if(!r)return null;if(r.errors)e=r.matches;else if((s=n)!=null&&s.v7_partialHydration&&t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let o=e,l=(i=r)==null?void 0:i.errors;if(l!=null){let u=o.findIndex(f=>f.route.id&&(l==null?void 0:l[f.route.id])!==void 0);u>=0||Ae(!1),o=o.slice(0,Math.min(o.length,u+1))}let c=!1,d=-1;if(r&&n&&n.v7_partialHydration)for(let u=0;u=0?o=o.slice(0,d+1):o=[o[0]];break}}}return o.reduceRight((u,f,p)=>{let m,x=!1,g=null,b=null;r&&(m=l&&f.route.id?l[f.route.id]:void 0,g=f.route.errorElement||$C,c&&(d<0&&p===0?(HC("route-fallback"),x=!0,b=null):d===p&&(x=!0,b=f.route.hydrateFallbackElement||null)));let v=t.concat(o.slice(0,p+1)),j=()=>{let y;return m?y=g:x?y=b:f.route.Component?y=h.createElement(f.route.Component,null):f.route.element?y=f.route.element:y=u,h.createElement(zC,{match:f,routeContext:{outlet:u,matches:v,isDataRoute:r!=null},children:y})};return r&&(f.route.ErrorBoundary||f.route.errorElement||p===0)?h.createElement(LC,{location:r.location,revalidation:r.revalidation,component:g,error:m,children:j(),routeContext:{outlet:null,matches:v,isDataRoute:!0}}):j()},null)}var q1=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(q1||{}),H1=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(H1||{});function BC(e){let t=h.useContext(Ph);return t||Ae(!1),t}function WC(e){let t=h.useContext(OC);return t||Ae(!1),t}function FC(e){let t=h.useContext(on);return t||Ae(!1),t}function K1(e){let t=FC(),r=t.matches[t.matches.length-1];return r.route.id||Ae(!1),r.route.id}function UC(){var e;let t=h.useContext(W1),r=WC(),n=K1();return t!==void 0?t:(e=r.errors)==null?void 0:e[n]}function qC(){let{router:e}=BC(q1.UseNavigateStable),t=K1(H1.UseNavigateStable),r=h.useRef(!1);return F1(()=>{r.current=!0}),h.useCallback(function(i,s){s===void 0&&(s={}),r.current&&(typeof i=="number"?e.navigate(i):e.navigate(i,Ts({fromRouteId:t},s)))},[e,t])}const Px={};function HC(e,t,r){Px[e]||(Px[e]=!0)}function KC(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function V1(e){let{to:t,replace:r,state:n,relative:i}=e;ka()||Ae(!1);let{future:s,static:o}=h.useContext(Un),{matches:l}=h.useContext(on),{pathname:c}=Pi(),d=dt(),u=_h(t,kh(l,s.v7_relativeSplatPath),c,i==="path"),f=JSON.stringify(u);return h.useEffect(()=>d(JSON.parse(f),{replace:r,state:n,relative:i}),[d,f,i,r,n]),null}function oe(e){Ae(!1)}function VC(e){let{basename:t="/",children:r=null,location:n,navigationType:i=Nn.Pop,navigator:s,static:o=!1,future:l}=e;ka()&&Ae(!1);let c=t.replace(/^\/*/,"/"),d=h.useMemo(()=>({basename:c,navigator:s,static:o,future:Ts({v7_relativeSplatPath:!1},l)}),[c,l,s,o]);typeof n=="string"&&(n=Na(n));let{pathname:u="/",search:f="",hash:p="",state:m=null,key:x="default"}=n,g=h.useMemo(()=>{let b=Nh(u,c);return b==null?null:{location:{pathname:b,search:f,hash:p,state:m,key:x},navigationType:i}},[c,u,f,p,m,x,i]);return g==null?null:h.createElement(Un.Provider,{value:d},h.createElement(qc.Provider,{children:r,value:g}))}function YC(e){let{children:t,location:r}=e;return TC(Cf(t),r)}new Promise(()=>{});function Cf(e,t){t===void 0&&(t=[]);let r=[];return h.Children.forEach(e,(n,i)=>{if(!h.isValidElement(n))return;let s=[...t,i];if(n.type===h.Fragment){r.push.apply(r,Cf(n.props.children,s));return}n.type!==oe&&Ae(!1),!n.props.index||!n.props.children||Ae(!1);let o={id:n.props.id||s.join("-"),caseSensitive:n.props.caseSensitive,element:n.props.element,Component:n.props.Component,index:n.props.index,path:n.props.path,loader:n.props.loader,action:n.props.action,errorElement:n.props.errorElement,ErrorBoundary:n.props.ErrorBoundary,hasErrorBoundary:n.props.ErrorBoundary!=null||n.props.errorElement!=null,shouldRevalidate:n.props.shouldRevalidate,handle:n.props.handle,lazy:n.props.lazy};n.props.children&&(o.children=Cf(n.props.children,s)),r.push(o)}),r}/** + * React Router DOM v6.30.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Af(){return Af=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(r[i]=e[i]);return r}function ZC(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function XC(e,t){return e.button===0&&(!t||t==="_self")&&!ZC(e)}function Of(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,r)=>{let n=e[r];return t.concat(Array.isArray(n)?n.map(i=>[r,i]):[[r,n]])},[]))}function JC(e,t){let r=Of(e);return t&&t.forEach((n,i)=>{r.has(i)||t.getAll(i).forEach(s=>{r.append(i,s)})}),r}const QC=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],eA="6";try{window.__reactRouterVersion=eA}catch{}const tA="startTransition",Cx=Iv[tA];function rA(e){let{basename:t,children:r,future:n,window:i}=e,s=h.useRef();s.current==null&&(s.current=nC({window:i,v5Compat:!0}));let o=s.current,[l,c]=h.useState({action:o.action,location:o.location}),{v7_startTransition:d}=n||{},u=h.useCallback(f=>{d&&Cx?Cx(()=>c(f)):c(f)},[c,d]);return h.useLayoutEffect(()=>o.listen(u),[o,u]),h.useEffect(()=>KC(n),[n]),h.createElement(VC,{basename:t,children:r,location:l.location,navigationType:l.action,navigator:o,future:n})}const nA=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",iA=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,$l=h.forwardRef(function(t,r){let{onClick:n,relative:i,reloadDocument:s,replace:o,state:l,target:c,to:d,preventScrollReset:u,viewTransition:f}=t,p=GC(t,QC),{basename:m}=h.useContext(Un),x,g=!1;if(typeof d=="string"&&iA.test(d)&&(x=d,nA))try{let y=new URL(window.location.href),w=d.startsWith("//")?new URL(y.protocol+d):new URL(d),S=Nh(w.pathname,m);w.origin===y.origin&&S!=null?d=S+w.search+w.hash:g=!0}catch{}let b=EC(d,{relative:i}),v=aA(d,{replace:o,state:l,target:c,preventScrollReset:u,relative:i,viewTransition:f});function j(y){n&&n(y),y.defaultPrevented||v(y)}return h.createElement("a",Af({},p,{href:x||b,onClick:g||s?n:j,ref:r,target:c}))});var Ax;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Ax||(Ax={}));var Ox;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ox||(Ox={}));function aA(e,t){let{target:r,replace:n,state:i,preventScrollReset:s,relative:o,viewTransition:l}=t===void 0?{}:t,c=dt(),d=Pi(),u=U1(e,{relative:o});return h.useCallback(f=>{if(XC(f,r)){f.preventDefault();let p=n!==void 0?n:Il(d)===Il(u);c(e,{replace:p,state:i,preventScrollReset:s,relative:o,viewTransition:l})}},[d,c,u,n,i,r,e,s,o,l])}function sA(e){let t=h.useRef(Of(e)),r=h.useRef(!1),n=Pi(),i=h.useMemo(()=>JC(n.search,r.current?null:t.current),[n.search]),s=dt(),o=h.useCallback((l,c)=>{const d=Of(typeof l=="function"?l(i):l);r.current=!0,s("?"+d,c)},[s,i]);return[i,o]}const oA={},Ex=e=>{let t;const r=new Set,n=(u,f)=>{const p=typeof u=="function"?u(t):u;if(!Object.is(p,t)){const m=t;t=f??(typeof p!="object"||p===null)?p:Object.assign({},t,p),r.forEach(x=>x(t,m))}},i=()=>t,c={setState:n,getState:i,getInitialState:()=>d,subscribe:u=>(r.add(u),()=>r.delete(u)),destroy:()=>{(oA?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),r.clear()}},d=t=e(n,i,c);return c},lA=e=>e?Ex(e):Ex;var Y1={exports:{}},G1={},Z1={exports:{}},X1={};/** + * @license React + * use-sync-external-store-shim.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var pa=h;function cA(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var uA=typeof Object.is=="function"?Object.is:cA,dA=pa.useState,fA=pa.useEffect,pA=pa.useLayoutEffect,hA=pa.useDebugValue;function mA(e,t){var r=t(),n=dA({inst:{value:r,getSnapshot:t}}),i=n[0].inst,s=n[1];return pA(function(){i.value=r,i.getSnapshot=t,dd(i)&&s({inst:i})},[e,r,t]),fA(function(){return dd(i)&&s({inst:i}),e(function(){dd(i)&&s({inst:i})})},[e]),hA(r),r}function dd(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!uA(e,r)}catch{return!0}}function gA(e,t){return t()}var xA=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?gA:mA;X1.useSyncExternalStore=pa.useSyncExternalStore!==void 0?pa.useSyncExternalStore:xA;Z1.exports=X1;var yA=Z1.exports;/** + * @license React + * use-sync-external-store-shim/with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Hc=h,vA=yA;function bA(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var jA=typeof Object.is=="function"?Object.is:bA,wA=vA.useSyncExternalStore,SA=Hc.useRef,NA=Hc.useEffect,kA=Hc.useMemo,_A=Hc.useDebugValue;G1.useSyncExternalStoreWithSelector=function(e,t,r,n,i){var s=SA(null);if(s.current===null){var o={hasValue:!1,value:null};s.current=o}else o=s.current;s=kA(function(){function c(m){if(!d){if(d=!0,u=m,m=n(m),i!==void 0&&o.hasValue){var x=o.value;if(i(x,m))return f=x}return f=m}if(x=f,jA(u,m))return x;var g=n(m);return i!==void 0&&i(x,g)?(u=m,x):(u=m,f=g)}var d=!1,u,f,p=r===void 0?null:r;return[function(){return c(t())},p===null?void 0:function(){return c(p())}]},[t,r,n,i]);var l=wA(e,s[0],s[1]);return NA(function(){o.hasValue=!0,o.value=l},[l]),_A(l),l};Y1.exports=G1;var J1=Y1.exports;const PA=Tr(J1),Q1={},{useDebugValue:CA}=hs,{useSyncExternalStoreWithSelector:AA}=PA;let Dx=!1;const OA=e=>e;function EA(e,t=OA,r){(Q1?"production":void 0)!=="production"&&r&&!Dx&&(console.warn("[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937"),Dx=!0);const n=AA(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,r);return CA(n),n}const Tx=e=>{(Q1?"production":void 0)!=="production"&&typeof e!="function"&&console.warn("[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.");const t=typeof e=="function"?lA(e):e,r=(n,i)=>EA(t,n,i);return Object.assign(r,t),r},DA=e=>e?Tx(e):Tx,TA="http://localhost:3010";class MA{constructor(t){mo(this,"baseUrl");this.baseUrl=t}getHeaders(){const t=localStorage.getItem("token");return{"Content-Type":"application/json",...t?{Authorization:`Bearer ${t}`}:{}}}async request(t,r){const n=`${this.baseUrl}${t}`,i=await fetch(n,{...r,headers:{...this.getHeaders(),...r==null?void 0:r.headers}});if(!i.ok){const s=await i.json().catch(()=>({error:"Request failed"}));throw new Error(s.error||`HTTP ${i.status}`)}return i.json()}async login(t,r){return this.request("/api/auth/login",{method:"POST",body:JSON.stringify({email:t,password:r})})}async getMe(){return this.request("/api/auth/me")}async getDashboardStats(){return this.request("/api/dashboard/stats")}async getDashboardActivity(){return this.request("/api/dashboard/activity")}async getStores(){return this.request("/api/stores")}async getStore(t){return this.request(`/api/stores/${t}`)}async createStore(t){return this.request("/api/stores",{method:"POST",body:JSON.stringify(t)})}async updateStore(t,r){return this.request(`/api/stores/${t}`,{method:"PUT",body:JSON.stringify(r)})}async getDispensaries(){return this.request("/api/dispensaries")}async getDispensary(t){return this.request(`/api/dispensaries/${t}`)}async updateDispensary(t,r){return this.request(`/api/dispensaries/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteStore(t){return this.request(`/api/stores/${t}`,{method:"DELETE"})}async scrapeStore(t,r,n){return this.request(`/api/stores/${t}/scrape`,{method:"POST",body:JSON.stringify({parallel:r,userAgent:n})})}async downloadStoreImages(t){return this.request(`/api/stores/${t}/download-images`,{method:"POST"})}async discoverStoreCategories(t){return this.request(`/api/stores/${t}/discover-categories`,{method:"POST"})}async debugScrapeStore(t){return this.request(`/api/stores/${t}/debug-scrape`,{method:"POST"})}async getStoreBrands(t){return this.request(`/api/stores/${t}/brands`)}async getStoreSpecials(t,r){const n=r?`?date=${r}`:"";return this.request(`/api/stores/${t}/specials${n}`)}async getCategories(t){const r=t?`?store_id=${t}`:"";return this.request(`/api/categories${r}`)}async getCategoryTree(t){return this.request(`/api/categories/tree?store_id=${t}`)}async getProducts(t){const r=new URLSearchParams(t).toString();return this.request(`/api/products${r?`?${r}`:""}`)}async getProduct(t){return this.request(`/api/products/${t}`)}async getCampaigns(){return this.request("/api/campaigns")}async getCampaign(t){return this.request(`/api/campaigns/${t}`)}async createCampaign(t){return this.request("/api/campaigns",{method:"POST",body:JSON.stringify(t)})}async updateCampaign(t,r){return this.request(`/api/campaigns/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteCampaign(t){return this.request(`/api/campaigns/${t}`,{method:"DELETE"})}async addProductToCampaign(t,r,n){return this.request(`/api/campaigns/${t}/products`,{method:"POST",body:JSON.stringify({product_id:r,display_order:n})})}async removeProductFromCampaign(t,r){return this.request(`/api/campaigns/${t}/products/${r}`,{method:"DELETE"})}async getAnalyticsOverview(t){return this.request(`/api/analytics/overview${t?`?days=${t}`:""}`)}async getProductAnalytics(t,r){return this.request(`/api/analytics/products/${t}${r?`?days=${r}`:""}`)}async getCampaignAnalytics(t,r){return this.request(`/api/analytics/campaigns/${t}${r?`?days=${r}`:""}`)}async getSettings(){return this.request("/api/settings")}async updateSetting(t,r){return this.request(`/api/settings/${t}`,{method:"PUT",body:JSON.stringify({value:r})})}async updateSettings(t){return this.request("/api/settings",{method:"PUT",body:JSON.stringify({settings:t})})}async getProxies(){return this.request("/api/proxies")}async getProxy(t){return this.request(`/api/proxies/${t}`)}async addProxy(t){return this.request("/api/proxies",{method:"POST",body:JSON.stringify(t)})}async addProxiesBulk(t){return this.request("/api/proxies/bulk",{method:"POST",body:JSON.stringify({proxies:t})})}async testProxy(t){return this.request(`/api/proxies/${t}/test`,{method:"POST"})}async testAllProxies(){return this.request("/api/proxies/test-all",{method:"POST"})}async getProxyTestJob(t){return this.request(`/api/proxies/test-job/${t}`)}async getActiveProxyTestJob(){return this.request("/api/proxies/test-job")}async cancelProxyTestJob(t){return this.request(`/api/proxies/test-job/${t}/cancel`,{method:"POST"})}async updateProxy(t,r){return this.request(`/api/proxies/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteProxy(t){return this.request(`/api/proxies/${t}`,{method:"DELETE"})}async updateProxyLocations(){return this.request("/api/proxies/update-locations",{method:"POST"})}async getLogs(t,r,n){const i=new URLSearchParams;return t&&i.append("limit",t.toString()),r&&i.append("level",r),n&&i.append("category",n),this.request(`/api/logs?${i.toString()}`)}async clearLogs(){return this.request("/api/logs",{method:"DELETE"})}async getActiveScrapers(){return this.request("/api/scraper-monitor/active")}async getScraperHistory(t){const r=t?`?store_id=${t}`:"";return this.request(`/api/scraper-monitor/history${r}`)}async getJobStats(t){const r=t?`?dispensary_id=${t}`:"";return this.request(`/api/scraper-monitor/jobs/stats${r}`)}async getActiveJobs(t){const r=t?`?dispensary_id=${t}`:"";return this.request(`/api/scraper-monitor/jobs/active${r}`)}async getRecentJobs(t){const r=new URLSearchParams;t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.dispensaryId&&r.append("dispensary_id",t.dispensaryId.toString()),t!=null&&t.status&&r.append("status",t.status);const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/scraper-monitor/jobs/recent${n}`)}async getWorkerStats(t){const r=t?`?dispensary_id=${t}`:"";return this.request(`/api/scraper-monitor/jobs/workers${r}`)}async getAZMonitorActiveJobs(){return this.request("/api/az/monitor/active-jobs")}async getAZMonitorRecentJobs(t){const r=t?`?limit=${t}`:"";return this.request(`/api/az/monitor/recent-jobs${r}`)}async getAZMonitorErrors(t){const r=new URLSearchParams;t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.hours&&r.append("hours",t.hours.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/monitor/errors${n}`)}async getAZMonitorSummary(){return this.request("/api/az/monitor/summary")}async getChanges(t){const r=t?`?status=${t}`:"";return this.request(`/api/changes${r}`)}async getChangeStats(){return this.request("/api/changes/stats")}async approveChange(t){return this.request(`/api/changes/${t}/approve`,{method:"POST"})}async rejectChange(t,r){return this.request(`/api/changes/${t}/reject`,{method:"POST",body:JSON.stringify({reason:r})})}async getDispensaryProducts(t,r){const n=r?`?category=${r}`:"";return this.request(`/api/dispensaries/${t}/products${n}`)}async getDispensaryBrands(t){return this.request(`/api/dispensaries/${t}/brands`)}async getDispensarySpecials(t){return this.request(`/api/dispensaries/${t}/specials`)}async getApiPermissions(){return this.request("/api/api-permissions")}async getApiPermissionDispensaries(){return this.request("/api/api-permissions/dispensaries")}async createApiPermission(t){return this.request("/api/api-permissions",{method:"POST",body:JSON.stringify(t)})}async updateApiPermission(t,r){return this.request(`/api/api-permissions/${t}`,{method:"PUT",body:JSON.stringify(r)})}async toggleApiPermission(t){return this.request(`/api/api-permissions/${t}/toggle`,{method:"PATCH"})}async deleteApiPermission(t){return this.request(`/api/api-permissions/${t}`,{method:"DELETE"})}async getGlobalSchedule(){return this.request("/api/schedule/global")}async updateGlobalSchedule(t,r){return this.request(`/api/schedule/global/${t}`,{method:"PUT",body:JSON.stringify(r)})}async getStoreSchedules(){return this.request("/api/schedule/stores")}async getStoreSchedule(t){return this.request(`/api/schedule/stores/${t}`)}async updateStoreSchedule(t,r){return this.request(`/api/schedule/stores/${t}`,{method:"PUT",body:JSON.stringify(r)})}async getDispensarySchedules(t){const r=new URLSearchParams;t!=null&&t.state&&r.append("state",t.state),t!=null&&t.search&&r.append("search",t.search);const n=r.toString();return this.request(`/api/schedule/dispensaries${n?`?${n}`:""}`)}async getDispensarySchedule(t){return this.request(`/api/schedule/dispensaries/${t}`)}async updateDispensarySchedule(t,r){return this.request(`/api/schedule/dispensaries/${t}`,{method:"PUT",body:JSON.stringify(r)})}async getDispensaryCrawlJobs(t){const r=t?`?limit=${t}`:"";return this.request(`/api/schedule/dispensary-jobs${r}`)}async triggerDispensaryCrawl(t){return this.request(`/api/schedule/trigger/dispensary/${t}`,{method:"POST"})}async resolvePlatformId(t){return this.request(`/api/schedule/dispensaries/${t}/resolve-platform-id`,{method:"POST"})}async detectMenuType(t){return this.request(`/api/schedule/dispensaries/${t}/detect-menu-type`,{method:"POST"})}async refreshDetection(t){return this.request(`/api/schedule/dispensaries/${t}/refresh-detection`,{method:"POST"})}async toggleDispensarySchedule(t,r){return this.request(`/api/schedule/dispensaries/${t}/toggle-active`,{method:"PUT",body:JSON.stringify({is_active:r})})}async deleteDispensarySchedule(t){return this.request(`/api/schedule/dispensaries/${t}/schedule`,{method:"DELETE"})}async getCrawlJobs(t){const r=t?`?limit=${t}`:"";return this.request(`/api/schedule/jobs${r}`)}async getStoreCrawlJobs(t,r){const n=r?`?limit=${r}`:"";return this.request(`/api/schedule/jobs/store/${t}${n}`)}async cancelCrawlJob(t){return this.request(`/api/schedule/jobs/${t}/cancel`,{method:"POST"})}async triggerStoreCrawl(t){return this.request(`/api/schedule/trigger/store/${t}`,{method:"POST"})}async triggerAllCrawls(){return this.request("/api/schedule/trigger/all",{method:"POST"})}async restartScheduler(){return this.request("/api/schedule/restart",{method:"POST"})}async getVersion(){return this.request("/api/version")}async getDutchieAZDashboard(){return this.request("/api/az/dashboard")}async getDutchieAZSchedules(){return this.request("/api/az/admin/schedules")}async getDutchieAZSchedule(t){return this.request(`/api/az/admin/schedules/${t}`)}async createDutchieAZSchedule(t){return this.request("/api/az/admin/schedules",{method:"POST",body:JSON.stringify(t)})}async updateDutchieAZSchedule(t,r){return this.request(`/api/az/admin/schedules/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteDutchieAZSchedule(t){return this.request(`/api/az/admin/schedules/${t}`,{method:"DELETE"})}async triggerDutchieAZSchedule(t){return this.request(`/api/az/admin/schedules/${t}/trigger`,{method:"POST"})}async initDutchieAZSchedules(){return this.request("/api/az/admin/schedules/init",{method:"POST"})}async getDutchieAZScheduleLogs(t,r,n){const i=new URLSearchParams;r&&i.append("limit",r.toString()),n&&i.append("offset",n.toString());const s=i.toString()?`?${i.toString()}`:"";return this.request(`/api/az/admin/schedules/${t}/logs${s}`)}async getDutchieAZRunLogs(t){const r=new URLSearchParams;t!=null&&t.scheduleId&&r.append("scheduleId",t.scheduleId.toString()),t!=null&&t.jobName&&r.append("jobName",t.jobName),t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.offset&&r.append("offset",t.offset.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/admin/run-logs${n}`)}async getDutchieAZSchedulerStatus(){return this.request("/api/az/admin/scheduler/status")}async startDutchieAZScheduler(){return this.request("/api/az/admin/scheduler/start",{method:"POST"})}async stopDutchieAZScheduler(){return this.request("/api/az/admin/scheduler/stop",{method:"POST"})}async triggerDutchieAZImmediateCrawl(){return this.request("/api/az/admin/scheduler/trigger",{method:"POST"})}async getDutchieAZStores(t){const r=new URLSearchParams;t!=null&&t.city&&r.append("city",t.city),(t==null?void 0:t.hasPlatformId)!==void 0&&r.append("hasPlatformId",String(t.hasPlatformId)),t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.offset&&r.append("offset",t.offset.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/stores${n}`)}async getDutchieAZStore(t){return this.request(`/api/az/stores/${t}`)}async getDutchieAZStoreSummary(t){return this.request(`/api/az/stores/${t}/summary`)}async getDutchieAZStoreProducts(t,r){const n=new URLSearchParams;r!=null&&r.stockStatus&&n.append("stockStatus",r.stockStatus),r!=null&&r.type&&n.append("type",r.type),r!=null&&r.subcategory&&n.append("subcategory",r.subcategory),r!=null&&r.brandName&&n.append("brandName",r.brandName),r!=null&&r.search&&n.append("search",r.search),r!=null&&r.limit&&n.append("limit",r.limit.toString()),r!=null&&r.offset&&n.append("offset",r.offset.toString());const i=n.toString()?`?${n.toString()}`:"";return this.request(`/api/az/stores/${t}/products${i}`)}async getDutchieAZStoreBrands(t){return this.request(`/api/az/stores/${t}/brands`)}async getDutchieAZStoreCategories(t){return this.request(`/api/az/stores/${t}/categories`)}async getDutchieAZBrands(t){const r=new URLSearchParams;t!=null&&t.limit&&r.append("limit",t.limit.toString()),t!=null&&t.offset&&r.append("offset",t.offset.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/brands${n}`)}async getDutchieAZCategories(){return this.request("/api/az/categories")}async getDutchieAZDebugSummary(){return this.request("/api/az/debug/summary")}async getDutchieAZDebugStore(t){return this.request(`/api/az/debug/store/${t}`)}async triggerDutchieAZCrawl(t,r){return this.request(`/api/az/admin/crawl/${t}`,{method:"POST",body:JSON.stringify(r||{})})}async getDetectionStats(){return this.request("/api/az/admin/detection/stats")}async getDispensariesNeedingDetection(t){const r=new URLSearchParams;t!=null&&t.state&&r.append("state",t.state),t!=null&&t.limit&&r.append("limit",t.limit.toString());const n=r.toString()?`?${r.toString()}`:"";return this.request(`/api/az/admin/detection/pending${n}`)}async detectDispensary(t){return this.request(`/api/az/admin/detection/detect/${t}`,{method:"POST"})}async detectAllDispensaries(t){return this.request("/api/az/admin/detection/detect-all",{method:"POST",body:JSON.stringify(t||{})})}async triggerMenuDetectionJob(){return this.request("/api/az/admin/detection/trigger",{method:"POST"})}async getUsers(){return this.request("/api/users")}async getUser(t){return this.request(`/api/users/${t}`)}async createUser(t){return this.request("/api/users",{method:"POST",body:JSON.stringify(t)})}async updateUser(t,r){return this.request(`/api/users/${t}`,{method:"PUT",body:JSON.stringify(r)})}async deleteUser(t){return this.request(`/api/users/${t}`,{method:"DELETE"})}}const z=new MA(TA),Kc=DA(e=>({user:null,token:localStorage.getItem("token"),isAuthenticated:!!localStorage.getItem("token"),login:async(t,r)=>{const n=await z.login(t,r);localStorage.setItem("token",n.token),e({user:n.user,token:n.token,isAuthenticated:!0})},logout:()=>{localStorage.removeItem("token"),e({user:null,token:null,isAuthenticated:!1})},checkAuth:async()=>{try{const t=await z.getMe();e({user:t.user,isAuthenticated:!0})}catch{localStorage.removeItem("token"),e({user:null,token:null,isAuthenticated:!1})}}}));function IA(){const[e,t]=h.useState("admin@example.com"),[r,n]=h.useState("password"),[i,s]=h.useState(""),[o,l]=h.useState(!1),c=dt(),d=Kc(f=>f.login),u=async f=>{f.preventDefault(),s(""),l(!0);try{await d(e,r),c("/dashboard")}catch(p){s(p.message||"Login failed")}finally{l(!1)}};return a.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",minHeight:"100vh",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)"},children:a.jsxs("div",{style:{background:"white",padding:"40px",borderRadius:"12px",boxShadow:"0 10px 40px rgba(0,0,0,0.2)",width:"100%",maxWidth:"400px"},children:[a.jsx("h1",{style:{marginBottom:"10px",fontSize:"28px"},children:"Cannabrands Menus"}),a.jsx("p",{style:{color:"#666",marginBottom:"30px"},children:"Admin Dashboard"}),i&&a.jsx("div",{style:{background:"#fee",color:"#c33",padding:"12px",borderRadius:"6px",marginBottom:"20px",fontSize:"14px"},children:i}),a.jsxs("form",{onSubmit:u,children:[a.jsxs("div",{style:{marginBottom:"20px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"500"},children:"Email"}),a.jsx("input",{type:"email",value:e,onChange:f=>t(f.target.value),required:!0,style:{width:"100%",padding:"12px",border:"1px solid #ddd",borderRadius:"6px",fontSize:"14px"}})]}),a.jsxs("div",{style:{marginBottom:"25px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"500"},children:"Password"}),a.jsx("input",{type:"password",value:r,onChange:f=>n(f.target.value),required:!0,style:{width:"100%",padding:"12px",border:"1px solid #ddd",borderRadius:"6px",fontSize:"14px"}})]}),a.jsx("button",{type:"submit",disabled:o,style:{width:"100%",padding:"14px",background:o?"#999":"#667eea",color:"white",border:"none",borderRadius:"6px",cursor:o?"not-allowed":"pointer",fontSize:"16px",fontWeight:"500",transition:"background 0.2s"},children:o?"Logging in...":"Login"})]})]})})}/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $A=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),LA=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,r,n)=>n?n.toUpperCase():r.toLowerCase()),Mx=e=>{const t=LA(e);return t.charAt(0).toUpperCase()+t.slice(1)},ej=(...e)=>e.filter((t,r,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===r).join(" ").trim(),zA=e=>{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0};/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var RA={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const BA=h.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:n,className:i="",children:s,iconNode:o,...l},c)=>h.createElement("svg",{ref:c,...RA,width:t,height:t,stroke:e,strokeWidth:n?Number(r)*24/Number(t):r,className:ej("lucide",i),...!s&&!zA(l)&&{"aria-hidden":"true"},...l},[...o.map(([d,u])=>h.createElement(d,u)),...Array.isArray(s)?s:[s]]));/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Q=(e,t)=>{const r=h.forwardRef(({className:n,...i},s)=>h.createElement(BA,{ref:s,iconNode:t,className:ej(`lucide-${$A(Mx(e))}`,`lucide-${e}`,n),...i}));return r.displayName=Mx(e),r};/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const WA=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],na=Q("activity",WA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const FA=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],Ch=Q("arrow-left",FA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const UA=[["path",{d:"M10 12h4",key:"a56b0p"}],["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M14 21v-3a2 2 0 0 0-4 0v3",key:"1rgiei"}],["path",{d:"M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2",key:"secmi2"}],["path",{d:"M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16",key:"16ra0t"}]],Ln=Q("building-2",UA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const qA=[["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M12 6h.01",key:"1vi96p"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M16 14h.01",key:"1gbofw"}],["path",{d:"M16 6h.01",key:"1x0f13"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M8 6h.01",key:"1dz90k"}],["path",{d:"M9 22v-3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v3",key:"cabbwy"}],["rect",{x:"4",y:"2",width:"16",height:"20",rx:"2",key:"1uxh74"}]],HA=Q("building",qA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const KA=[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]],Ah=Q("calendar",KA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const VA=[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]],YA=Q("chart-column",VA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const GA=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],ZA=Q("check",GA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const XA=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],tj=Q("chevron-down",XA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const JA=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],Ef=Q("chevron-right",JA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const QA=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],ha=Q("circle-alert",QA);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const e6=[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]],Pr=Q("circle-check-big",e6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const t6=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],Hr=Q("circle-x",t6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const r6=[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],xr=Q("clock",r6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const n6=[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]],i6=Q("dollar-sign",n6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const a6=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],Jr=Q("external-link",a6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const s6=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],o6=Q("eye",s6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const l6=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]],c6=Q("file-text",l6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const u6=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]],d6=Q("folder-open",u6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const f6=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],p6=Q("image",f6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const h6=[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]],m6=Q("key",h6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const g6=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],Ix=Q("layers",g6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const x6=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],y6=Q("layout-dashboard",x6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const v6=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],b6=Q("log-out",v6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const j6=[["path",{d:"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7",key:"132q7q"}],["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",key:"izxlao"}]],rj=Q("mail",j6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const w6=[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]],yi=Q("map-pin",w6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const S6=[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]],Ct=Q("package",S6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const N6=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],nj=Q("pencil",N6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const k6=[["path",{d:"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384",key:"9njp5v"}]],Oh=Q("phone",k6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _6=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],Ll=Q("plus",_6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const P6=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Xt=Q("refresh-cw",P6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const C6=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],A6=Q("save",C6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const O6=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],E6=Q("search",O6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const D6=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],T6=Q("settings",D6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const M6=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],ol=Q("shield",M6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const I6=[["path",{d:"M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5",key:"slp6dd"}],["path",{d:"M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244",key:"o0xfot"}],["path",{d:"M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05",key:"wn3emo"}]],zl=Q("store",I6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $6=[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]],Cr=Q("tag",$6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const L6=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]],ij=Q("target",L6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const z6=[["circle",{cx:"9",cy:"12",r:"3",key:"u3jwor"}],["rect",{width:"20",height:"14",x:"2",y:"5",rx:"7",key:"g7kal2"}]],$x=Q("toggle-left",z6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const R6=[["circle",{cx:"15",cy:"12",r:"3",key:"1afu0r"}],["rect",{width:"20",height:"14",x:"2",y:"5",rx:"7",key:"g7kal2"}]],Lx=Q("toggle-right",R6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const B6=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],aj=Q("trash-2",B6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const W6=[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]],F6=Q("trending-down",W6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const U6=[["path",{d:"M16 7h6v6",key:"box55l"}],["path",{d:"m22 7-8.5 8.5-5-5L2 17",key:"1t1m79"}]],zn=Q("trending-up",U6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const q6=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],sj=Q("triangle-alert",q6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const H6=[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]],K6=Q("upload",H6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const V6=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],oj=Q("users",V6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Y6=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]],G6=Q("wrench",Y6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Z6=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Eh=Q("x",Z6);/** + * @license lucide-react v0.553.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const X6=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],zx=Q("zap",X6);function qe({to:e,icon:t,label:r,isActive:n}){return a.jsxs("a",{href:e,className:`flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${n?"bg-blue-50 text-blue-600":"text-gray-700 hover:bg-gray-50"}`,children:[a.jsx("span",{className:"flex-shrink-0",children:t}),a.jsx("span",{children:r})]})}function To({title:e,children:t}){return a.jsxs("div",{className:"space-y-1",children:[a.jsx("div",{className:"px-3 mb-2",children:a.jsx("h3",{className:"text-xs font-semibold text-gray-400 uppercase tracking-wider",children:e})}),t]})}function X({children:e}){const t=dt(),r=Pi(),{user:n,logout:i}=Kc(),[s,o]=h.useState(null);h.useEffect(()=>{(async()=>{try{const u=await z.getVersion();o(u)}catch(u){console.error("Failed to fetch version info:",u)}})()},[]);const l=()=>{i(),t("/login")},c=(d,u=!0)=>u?r.pathname===d:r.pathname.startsWith(d);return a.jsxs("div",{className:"flex min-h-screen bg-gray-50",children:[a.jsxs("div",{className:"w-64 bg-white border-r border-gray-200 flex flex-col",style:{position:"sticky",top:0,height:"100vh",overflowY:"auto"},children:[a.jsxs("div",{className:"px-6 py-5 border-b border-gray-200",children:[a.jsx("h1",{className:"text-lg font-semibold text-gray-900",children:"Dutchie Analytics"}),a.jsx("p",{className:"text-xs text-gray-500 mt-0.5",children:n==null?void 0:n.email})]}),a.jsxs("nav",{className:"flex-1 px-3 py-4 space-y-6",children:[a.jsxs(To,{title:"Main",children:[a.jsx(qe,{to:"/dashboard",icon:a.jsx(y6,{className:"w-4 h-4"}),label:"Dashboard",isActive:c("/dashboard",!0)}),a.jsx(qe,{to:"/dispensaries",icon:a.jsx(Ln,{className:"w-4 h-4"}),label:"Dispensaries",isActive:c("/dispensaries")}),a.jsx(qe,{to:"/categories",icon:a.jsx(d6,{className:"w-4 h-4"}),label:"Categories",isActive:c("/categories")}),a.jsx(qe,{to:"/products",icon:a.jsx(Ct,{className:"w-4 h-4"}),label:"Products",isActive:c("/products")}),a.jsx(qe,{to:"/campaigns",icon:a.jsx(ij,{className:"w-4 h-4"}),label:"Campaigns",isActive:c("/campaigns")}),a.jsx(qe,{to:"/analytics",icon:a.jsx(zn,{className:"w-4 h-4"}),label:"Analytics",isActive:c("/analytics")})]}),a.jsxs(To,{title:"AZ Data",children:[a.jsx(qe,{to:"/wholesale-analytics",icon:a.jsx(zn,{className:"w-4 h-4"}),label:"Wholesale Analytics",isActive:c("/wholesale-analytics")}),a.jsx(qe,{to:"/az",icon:a.jsx(zl,{className:"w-4 h-4"}),label:"AZ Stores",isActive:c("/az",!1)}),a.jsx(qe,{to:"/az-schedule",icon:a.jsx(Ah,{className:"w-4 h-4"}),label:"AZ Schedule",isActive:c("/az-schedule")})]}),a.jsxs(To,{title:"Scraper",children:[a.jsx(qe,{to:"/scraper-tools",icon:a.jsx(G6,{className:"w-4 h-4"}),label:"Tools",isActive:c("/scraper-tools")}),a.jsx(qe,{to:"/scraper-schedule",icon:a.jsx(xr,{className:"w-4 h-4"}),label:"Schedule",isActive:c("/scraper-schedule")}),a.jsx(qe,{to:"/scraper-monitor",icon:a.jsx(na,{className:"w-4 h-4"}),label:"Monitor",isActive:c("/scraper-monitor")})]}),a.jsxs(To,{title:"System",children:[a.jsx(qe,{to:"/changes",icon:a.jsx(Pr,{className:"w-4 h-4"}),label:"Change Approval",isActive:c("/changes")}),a.jsx(qe,{to:"/api-permissions",icon:a.jsx(m6,{className:"w-4 h-4"}),label:"API Permissions",isActive:c("/api-permissions")}),a.jsx(qe,{to:"/proxies",icon:a.jsx(ol,{className:"w-4 h-4"}),label:"Proxies",isActive:c("/proxies")}),a.jsx(qe,{to:"/logs",icon:a.jsx(c6,{className:"w-4 h-4"}),label:"Logs",isActive:c("/logs")}),a.jsx(qe,{to:"/settings",icon:a.jsx(T6,{className:"w-4 h-4"}),label:"Settings",isActive:c("/settings")}),a.jsx(qe,{to:"/users",icon:a.jsx(oj,{className:"w-4 h-4"}),label:"Users",isActive:c("/users")})]})]}),a.jsx("div",{className:"px-3 py-4 border-t border-gray-200",children:a.jsxs("button",{onClick:l,className:"w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium text-red-600 hover:bg-red-50 transition-colors",children:[a.jsx(b6,{className:"w-4 h-4"}),a.jsx("span",{children:"Logout"})]})}),s&&a.jsxs("div",{className:"px-3 py-2 border-t border-gray-200 bg-gray-50",children:[a.jsxs("p",{className:"text-xs text-gray-500 text-center",children:[s.build_version," (",s.git_sha.slice(0,7),")"]}),a.jsx("p",{className:"text-xs text-gray-400 text-center mt-0.5",children:s.image_tag})]})]}),a.jsx("div",{className:"flex-1 overflow-y-auto",children:a.jsx("div",{className:"max-w-7xl mx-auto px-8 py-8",children:e})})]})}function lj(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t{var[n]=r;return cj(n)||uj(n)});return Object.fromEntries(t)}function Vc(e){if(e==null)return null;if(h.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return nr(t)}return typeof e=="object"&&!Array.isArray(e)?nr(e):null}function ut(e){var t=Object.entries(e).filter(r=>{var[n]=r;return cj(n)||uj(n)||Dh(n)});return Object.fromEntries(t)}function eO(e){return e==null?null:h.isValidElement(e)?ut(e.props):typeof e=="object"&&!Array.isArray(e)?ut(e):null}var tO=["children","width","height","viewBox","className","style","title","desc"];function Df(){return Df=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{children:r,width:n,height:i,viewBox:s,className:o,style:l,title:c,desc:d}=e,u=rO(e,tO),f=s||{width:n,height:i,x:0,y:0},p=ue("recharts-surface",o);return h.createElement("svg",Df({},ut(u),{className:p,width:n,height:i,style:l,viewBox:"".concat(f.x," ").concat(f.y," ").concat(f.width," ").concat(f.height),ref:t}),h.createElement("title",null,c),h.createElement("desc",null,d),r)}),iO=["children","className"];function Tf(){return Tf=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{children:r,className:n}=e,i=aO(e,iO),s=ue("recharts-layer",n);return h.createElement("g",Tf({className:s},ut(i),{ref:t}),r)}),oO=h.createContext(null);function he(e){return function(){return e}}const fj=Math.cos,Rl=Math.sin,vr=Math.sqrt,Bl=Math.PI,Yc=2*Bl,Mf=Math.PI,If=2*Mf,Xn=1e-6,lO=If-Xn;function pj(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return pj;const r=10**t;return function(n){this._+=n[0];for(let i=1,s=n.length;iXn)if(!(Math.abs(f*c-d*u)>Xn)||!s)this._append`L${this._x1=t},${this._y1=r}`;else{let m=n-o,x=i-l,g=c*c+d*d,b=m*m+x*x,v=Math.sqrt(g),j=Math.sqrt(p),y=s*Math.tan((Mf-Math.acos((g+p-b)/(2*v*j)))/2),w=y/j,S=y/v;Math.abs(w-1)>Xn&&this._append`L${t+w*u},${r+w*f}`,this._append`A${s},${s},0,0,${+(f*m>u*x)},${this._x1=t+S*c},${this._y1=r+S*d}`}}arc(t,r,n,i,s,o){if(t=+t,r=+r,n=+n,o=!!o,n<0)throw new Error(`negative radius: ${n}`);let l=n*Math.cos(i),c=n*Math.sin(i),d=t+l,u=r+c,f=1^o,p=o?i-s:s-i;this._x1===null?this._append`M${d},${u}`:(Math.abs(this._x1-d)>Xn||Math.abs(this._y1-u)>Xn)&&this._append`L${d},${u}`,n&&(p<0&&(p=p%If+If),p>lO?this._append`A${n},${n},0,1,${f},${t-l},${r-c}A${n},${n},0,1,${f},${this._x1=d},${this._y1=u}`:p>Xn&&this._append`A${n},${n},0,${+(p>=Mf)},${f},${this._x1=t+n*Math.cos(s)},${this._y1=r+n*Math.sin(s)}`)}rect(t,r,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function Th(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new uO(t)}function Mh(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function hj(e){this._context=e}hj.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function Gc(e){return new hj(e)}function mj(e){return e[0]}function gj(e){return e[1]}function xj(e,t){var r=he(!0),n=null,i=Gc,s=null,o=Th(l);e=typeof e=="function"?e:e===void 0?mj:he(e),t=typeof t=="function"?t:t===void 0?gj:he(t);function l(c){var d,u=(c=Mh(c)).length,f,p=!1,m;for(n==null&&(s=i(m=o())),d=0;d<=u;++d)!(d=m;--x)l.point(y[x],w[x]);l.lineEnd(),l.areaEnd()}v&&(y[p]=+e(b,p,f),w[p]=+t(b,p,f),l.point(n?+n(b,p,f):y[p],r?+r(b,p,f):w[p]))}if(j)return l=null,j+""||null}function u(){return xj().defined(i).curve(o).context(s)}return d.x=function(f){return arguments.length?(e=typeof f=="function"?f:he(+f),n=null,d):e},d.x0=function(f){return arguments.length?(e=typeof f=="function"?f:he(+f),d):e},d.x1=function(f){return arguments.length?(n=f==null?null:typeof f=="function"?f:he(+f),d):n},d.y=function(f){return arguments.length?(t=typeof f=="function"?f:he(+f),r=null,d):t},d.y0=function(f){return arguments.length?(t=typeof f=="function"?f:he(+f),d):t},d.y1=function(f){return arguments.length?(r=f==null?null:typeof f=="function"?f:he(+f),d):r},d.lineX0=d.lineY0=function(){return u().x(e).y(t)},d.lineY1=function(){return u().x(e).y(r)},d.lineX1=function(){return u().x(n).y(t)},d.defined=function(f){return arguments.length?(i=typeof f=="function"?f:he(!!f),d):i},d.curve=function(f){return arguments.length?(o=f,s!=null&&(l=o(s)),d):o},d.context=function(f){return arguments.length?(f==null?s=l=null:l=o(s=f),d):s},d}class yj{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function dO(e){return new yj(e,!0)}function fO(e){return new yj(e,!1)}const Ih={draw(e,t){const r=vr(t/Bl);e.moveTo(r,0),e.arc(0,0,r,0,Yc)}},pO={draw(e,t){const r=vr(t/5)/2;e.moveTo(-3*r,-r),e.lineTo(-r,-r),e.lineTo(-r,-3*r),e.lineTo(r,-3*r),e.lineTo(r,-r),e.lineTo(3*r,-r),e.lineTo(3*r,r),e.lineTo(r,r),e.lineTo(r,3*r),e.lineTo(-r,3*r),e.lineTo(-r,r),e.lineTo(-3*r,r),e.closePath()}},vj=vr(1/3),hO=vj*2,mO={draw(e,t){const r=vr(t/hO),n=r*vj;e.moveTo(0,-r),e.lineTo(n,0),e.lineTo(0,r),e.lineTo(-n,0),e.closePath()}},gO={draw(e,t){const r=vr(t),n=-r/2;e.rect(n,n,r,r)}},xO=.8908130915292852,bj=Rl(Bl/10)/Rl(7*Bl/10),yO=Rl(Yc/10)*bj,vO=-fj(Yc/10)*bj,bO={draw(e,t){const r=vr(t*xO),n=yO*r,i=vO*r;e.moveTo(0,-r),e.lineTo(n,i);for(let s=1;s<5;++s){const o=Yc*s/5,l=fj(o),c=Rl(o);e.lineTo(c*r,-l*r),e.lineTo(l*n-c*i,c*n+l*i)}e.closePath()}},fd=vr(3),jO={draw(e,t){const r=-vr(t/(fd*3));e.moveTo(0,r*2),e.lineTo(-fd*r,-r),e.lineTo(fd*r,-r),e.closePath()}},Ht=-.5,Kt=vr(3)/2,$f=1/vr(12),wO=($f/2+1)*3,SO={draw(e,t){const r=vr(t/wO),n=r/2,i=r*$f,s=n,o=r*$f+r,l=-s,c=o;e.moveTo(n,i),e.lineTo(s,o),e.lineTo(l,c),e.lineTo(Ht*n-Kt*i,Kt*n+Ht*i),e.lineTo(Ht*s-Kt*o,Kt*s+Ht*o),e.lineTo(Ht*l-Kt*c,Kt*l+Ht*c),e.lineTo(Ht*n+Kt*i,Ht*i-Kt*n),e.lineTo(Ht*s+Kt*o,Ht*o-Kt*s),e.lineTo(Ht*l+Kt*c,Ht*c-Kt*l),e.closePath()}};function NO(e,t){let r=null,n=Th(i);e=typeof e=="function"?e:he(e||Ih),t=typeof t=="function"?t:he(t===void 0?64:+t);function i(){let s;if(r||(r=s=n()),e.apply(this,arguments).draw(r,+t.apply(this,arguments)),s)return r=null,s+""||null}return i.type=function(s){return arguments.length?(e=typeof s=="function"?s:he(s),i):e},i.size=function(s){return arguments.length?(t=typeof s=="function"?s:he(+s),i):t},i.context=function(s){return arguments.length?(r=s??null,i):r},i}function Wl(){}function Fl(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function jj(e){this._context=e}jj.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Fl(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Fl(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function kO(e){return new jj(e)}function wj(e){this._context=e}wj.prototype={areaStart:Wl,areaEnd:Wl,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:Fl(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function _O(e){return new wj(e)}function Sj(e){this._context=e}Sj.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Fl(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function PO(e){return new Sj(e)}function Nj(e){this._context=e}Nj.prototype={areaStart:Wl,areaEnd:Wl,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function CO(e){return new Nj(e)}function Rx(e){return e<0?-1:1}function Bx(e,t,r){var n=e._x1-e._x0,i=t-e._x1,s=(e._y1-e._y0)/(n||i<0&&-0),o=(r-e._y1)/(i||n<0&&-0),l=(s*i+o*n)/(n+i);return(Rx(s)+Rx(o))*Math.min(Math.abs(s),Math.abs(o),.5*Math.abs(l))||0}function Wx(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function pd(e,t,r){var n=e._x0,i=e._y0,s=e._x1,o=e._y1,l=(s-n)/3;e._context.bezierCurveTo(n+l,i+l*t,s-l,o-l*r,s,o)}function Ul(e){this._context=e}Ul.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:pd(this,this._t0,Wx(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,pd(this,Wx(this,r=Bx(this,e,t)),r);break;default:pd(this,this._t0,r=Bx(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function kj(e){this._context=new _j(e)}(kj.prototype=Object.create(Ul.prototype)).point=function(e,t){Ul.prototype.point.call(this,t,e)};function _j(e){this._context=e}_j.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,i,s){this._context.bezierCurveTo(t,e,n,r,s,i)}};function AO(e){return new Ul(e)}function OO(e){return new kj(e)}function Pj(e){this._context=e}Pj.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=Fx(e),i=Fx(t),s=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/s[t];for(s[r-1]=(e[r]+i[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function DO(e){return new Zc(e,.5)}function TO(e){return new Zc(e,0)}function MO(e){return new Zc(e,1)}function ma(e,t){if((o=e.length)>1)for(var r=1,n,i,s=e[t[0]],o,l=s.length;r=0;)r[t]=t;return r}function IO(e,t){return e[t]}function $O(e){const t=[];return t.key=e,t}function LO(){var e=he([]),t=Lf,r=ma,n=IO;function i(s){var o=Array.from(e.apply(this,arguments),$O),l,c=o.length,d=-1,u;for(const f of s)for(l=0,++d;l0){for(var r,n,i=0,s=e[0].length,o;i0){for(var r=0,n=e[t[0]],i,s=n.length;r0)||!((s=(i=e[t[0]]).length)>0))){for(var r=0,n=1,i,s,o;ne===0?0:e>0?1:-1,yr=e=>typeof e=="number"&&e!=+e,Qr=e=>typeof e=="string"&&e.indexOf("%")===e.length-1,Y=e=>(typeof e=="number"||e instanceof Number)&&!yr(e),Or=e=>Y(e)||typeof e=="string",FO=0,Ms=e=>{var t=++FO;return"".concat(e||"").concat(t)},Rn=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!Y(t)&&typeof t!="string")return n;var s;if(Qr(t)){if(r==null)return n;var o=t.indexOf("%");s=r*parseFloat(t.slice(0,o))/100}else s=+t;return yr(s)&&(s=n),i&&r!=null&&s>r&&(s=r),s},Oj=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):eu(n,t))===r)}var Re=e=>e===null||typeof e>"u",Js=e=>Re(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function UO(e){return e!=null}function Pa(){}var qO=["type","size","sizeType"];function zf(){return zf=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t="symbol".concat(Js(e));return Dj[t]||Ih},JO=(e,t,r)=>{if(t==="area")return e;switch(r){case"cross":return 5*e*e/9;case"diamond":return .5*e*e/Math.sqrt(3);case"square":return e*e;case"star":{var n=18*ZO;return 1.25*e*e*(Math.tan(n)-Math.tan(n*2)*Math.tan(n)**2)}case"triangle":return Math.sqrt(3)*e*e/4;case"wye":return(21-10*Math.sqrt(3))*e*e/8;default:return Math.PI*e*e/4}},QO=(e,t)=>{Dj["symbol".concat(Js(e))]=t},Tj=e=>{var{type:t="circle",size:r=64,sizeType:n="area"}=e,i=YO(e,qO),s=qx(qx({},i),{},{type:t,size:r,sizeType:n}),o="circle";typeof t=="string"&&(o=t);var l=()=>{var p=XO(o),m=NO().type(p).size(JO(r,n,o)),x=m();if(x!==null)return x},{className:c,cx:d,cy:u}=s,f=ut(s);return Y(d)&&Y(u)&&Y(r)?h.createElement("path",zf({},f,{className:ue("recharts-symbols",c),transform:"translate(".concat(d,", ").concat(u,")"),d:l()})):null};Tj.registerSymbol=QO;var Mj=e=>"radius"in e&&"startAngle"in e&&"endAngle"in e,Lh=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(h.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(i=>{Dh(i)&&(n[i]=s=>r[i](r,s))}),n},e4=(e,t,r)=>n=>(e(t,r,n),null),t4=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(i=>{var s=e[i];Dh(i)&&typeof s=="function"&&(n||(n={}),n[i]=e4(s,t,r))}),n};function Hx(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function r4(e){for(var t=1;t(o[l]===void 0&&n[l]!==void 0&&(o[l]=n[l]),o),r);return s}var Ij={},$j={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r,n){const i=new Map;for(let s=0;s=0}e.isLength=t})(zj);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=zj;function r(n){return n!=null&&typeof n!="function"&&t.isLength(n.length)}e.isArrayLike=r})(tu);var Rj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return typeof r=="object"&&r!==null}e.isObjectLike=t})(Rj);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=tu,r=Rj;function n(i){return r.isObjectLike(i)&&t.isArrayLike(i)}e.isArrayLikeObject=n})(Lj);var Bj={},Wj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Xc;function r(n){return function(i){return t.get(i,n)}}e.property=r})(Wj);var Fj={},Rh={},Uj={},Bh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r!==null&&(typeof r=="object"||typeof r=="function")}e.isObject=t})(Bh);var Wh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r==null||typeof r!="object"&&typeof r!="function"}e.isPrimitive=t})(Wh);var Fh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r,n){return r===n||Number.isNaN(r)&&Number.isNaN(n)}e.eq=t})(Fh);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Bh,r=Wh,n=Fh;function i(u,f,p){return typeof p!="function"?i(u,f,()=>{}):s(u,f,function m(x,g,b,v,j,y){const w=p(x,g,b,v,j,y);return w!==void 0?!!w:s(x,g,m,y)},new Map)}function s(u,f,p,m){if(f===u)return!0;switch(typeof f){case"object":return o(u,f,p,m);case"function":return Object.keys(f).length>0?s(u,{...f},p,m):n.eq(u,f);default:return t.isObject(u)?typeof f=="string"?f==="":!0:n.eq(u,f)}}function o(u,f,p,m){if(f==null)return!0;if(Array.isArray(f))return c(u,f,p,m);if(f instanceof Map)return l(u,f,p,m);if(f instanceof Set)return d(u,f,p,m);const x=Object.keys(f);if(u==null)return x.length===0;if(x.length===0)return!0;if(m!=null&&m.has(f))return m.get(f)===u;m==null||m.set(f,u);try{for(let g=0;g{})}e.isMatch=r})(Rh);var qj={},Uh={},Hj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return Object.getOwnPropertySymbols(r).filter(n=>Object.prototype.propertyIsEnumerable.call(r,n))}e.getSymbols=t})(Hj);var qh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r==null?r===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(r)}e.getTag=t})(qh);var Hh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t="[object RegExp]",r="[object String]",n="[object Number]",i="[object Boolean]",s="[object Arguments]",o="[object Symbol]",l="[object Date]",c="[object Map]",d="[object Set]",u="[object Array]",f="[object Function]",p="[object ArrayBuffer]",m="[object Object]",x="[object Error]",g="[object DataView]",b="[object Uint8Array]",v="[object Uint8ClampedArray]",j="[object Uint16Array]",y="[object Uint32Array]",w="[object BigUint64Array]",S="[object Int8Array]",N="[object Int16Array]",_="[object Int32Array]",P="[object BigInt64Array]",D="[object Float32Array]",M="[object Float64Array]";e.argumentsTag=s,e.arrayBufferTag=p,e.arrayTag=u,e.bigInt64ArrayTag=P,e.bigUint64ArrayTag=w,e.booleanTag=i,e.dataViewTag=g,e.dateTag=l,e.errorTag=x,e.float32ArrayTag=D,e.float64ArrayTag=M,e.functionTag=f,e.int16ArrayTag=N,e.int32ArrayTag=_,e.int8ArrayTag=S,e.mapTag=c,e.numberTag=n,e.objectTag=m,e.regexpTag=t,e.setTag=d,e.stringTag=r,e.symbolTag=o,e.uint16ArrayTag=j,e.uint32ArrayTag=y,e.uint8ArrayTag=b,e.uint8ClampedArrayTag=v})(Hh);var Kj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return ArrayBuffer.isView(r)&&!(r instanceof DataView)}e.isTypedArray=t})(Kj);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Hj,r=qh,n=Hh,i=Wh,s=Kj;function o(u,f){return l(u,void 0,u,new Map,f)}function l(u,f,p,m=new Map,x=void 0){const g=x==null?void 0:x(u,f,p,m);if(g!==void 0)return g;if(i.isPrimitive(u))return u;if(m.has(u))return m.get(u);if(Array.isArray(u)){const b=new Array(u.length);m.set(u,b);for(let v=0;vt.isMatch(s,i)}e.matches=n})(Fj);var Vj={},Yj={},Gj={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Uh,r=Hh;function n(i,s){return t.cloneDeepWith(i,(o,l,c,d)=>{const u=s==null?void 0:s(o,l,c,d);if(u!==void 0)return u;if(typeof i=="object")switch(Object.prototype.toString.call(i)){case r.numberTag:case r.stringTag:case r.booleanTag:{const f=new i.constructor(i==null?void 0:i.valueOf());return t.copyProperties(f,i),f}case r.argumentsTag:{const f={};return t.copyProperties(f,i),f.length=i.length,f[Symbol.iterator]=i[Symbol.iterator],f}default:return}})}e.cloneDeepWith=n})(Gj);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Gj;function r(n){return t.cloneDeepWith(n)}e.cloneDeep=r})(Yj);var Zj={},Kh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=/^(?:0|[1-9]\d*)$/;function r(n,i=Number.MAX_SAFE_INTEGER){switch(typeof n){case"number":return Number.isInteger(n)&&n>=0&&ne,Ye=()=>{var e=h.useContext(Vh);return e?e.store.dispatch:l4},ll=()=>{},c4=()=>ll,u4=(e,t)=>e===t;function G(e){var t=h.useContext(Vh);return J1.useSyncExternalStoreWithSelector(t?t.subscription.addNestedSub:c4,t?t.store.getState:ll,t?t.store.getState:ll,t?e:ll,u4)}function d4(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function f4(e,t=`expected an object, instead received ${typeof e}`){if(typeof e!="object")throw new TypeError(t)}function p4(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(r=>typeof r=="function")){const r=e.map(n=>typeof n=="function"?`function ${n.name||"unnamed"}()`:typeof n).join(", ");throw new TypeError(`${t}[${r}]`)}}var Vx=e=>Array.isArray(e)?e:[e];function h4(e){const t=Array.isArray(e[0])?e[0]:e;return p4(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function m4(e,t){const r=[],{length:n}=e;for(let i=0;i{r=Io(),o.resetResultsCount()},o.resultsCount=()=>s,o.resetResultsCount=()=>{s=0},o}function v4(e,...t){const r=typeof e=="function"?{memoize:e,memoizeOptions:t}:e,n=(...i)=>{let s=0,o=0,l,c={},d=i.pop();typeof d=="object"&&(c=d,d=i.pop()),d4(d,`createSelector expects an output function after the inputs, but received: [${typeof d}]`);const u={...r,...c},{memoize:f,memoizeOptions:p=[],argsMemoize:m=Jj,argsMemoizeOptions:x=[]}=u,g=Vx(p),b=Vx(x),v=h4(i),j=f(function(){return s++,d.apply(null,arguments)},...g),y=m(function(){o++;const S=m4(v,arguments);return l=j.apply(null,S),l},...b);return Object.assign(y,{resultFunc:d,memoizedResultFunc:j,dependencies:v,dependencyRecomputations:()=>o,resetDependencyRecomputations:()=>{o=0},lastResult:()=>l,recomputations:()=>s,resetRecomputations:()=>{s=0},memoize:f,argsMemoize:m})};return Object.assign(n,{withTypes:()=>n}),n}var $=v4(Jj),b4=Object.assign((e,t=$)=>{f4(e,`createStructuredSelector expects first argument to be an object where each property is a selector, instead received a ${typeof e}`);const r=Object.keys(e),n=r.map(s=>e[s]);return t(n,(...s)=>s.reduce((o,l,c)=>(o[r[c]]=l,o),{}))},{withTypes:()=>b4}),Qj={},ew={},tw={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(n){return typeof n=="symbol"?1:n===null?2:n===void 0?3:n!==n?4:0}const r=(n,i,s)=>{if(n!==i){const o=t(n),l=t(i);if(o===l&&o===0){if(ni)return s==="desc"?-1:1}return s==="desc"?l-o:o-l}return 0};e.compareValues=r})(tw);var rw={},Yh={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return typeof r=="symbol"||r instanceof Symbol}e.isSymbol=t})(Yh);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Yh,r=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,n=/^\w*$/;function i(s,o){return Array.isArray(s)?!1:typeof s=="number"||typeof s=="boolean"||s==null||t.isSymbol(s)?!0:typeof s=="string"&&(n.test(s)||!r.test(s))||o!=null&&Object.hasOwn(o,s)}e.isKey=i})(rw);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=tw,r=rw,n=Qc;function i(s,o,l,c){if(s==null)return[];l=c?void 0:l,Array.isArray(s)||(s=Object.values(s)),Array.isArray(o)||(o=o==null?[null]:[o]),o.length===0&&(o=[null]),Array.isArray(l)||(l=l==null?[]:[l]),l=l.map(m=>String(m));const d=(m,x)=>{let g=m;for(let b=0;bx==null||m==null?x:typeof m=="object"&&"key"in m?Object.hasOwn(x,m.key)?x[m.key]:d(x,m.path):typeof m=="function"?m(x):Array.isArray(m)?d(x,m):typeof x=="object"?x[m]:x,f=o.map(m=>(Array.isArray(m)&&m.length===1&&(m=m[0]),m==null||typeof m=="function"||Array.isArray(m)||r.isKey(m)?m:{key:m,path:n.toPath(m)}));return s.map(m=>({original:m,criteria:f.map(x=>u(x,m))})).slice().sort((m,x)=>{for(let g=0;gm.original)}e.orderBy=i})(ew);var nw={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r,n=1){const i=[],s=Math.floor(n),o=(l,c)=>{for(let d=0;d1&&n.isIterateeCall(s,o[0],o[1])?o=[]:l>2&&n.isIterateeCall(o[0],o[1],o[2])&&(o=[o[0]]),t.orderBy(s,r.flatten(o),["asc"])}e.sortBy=i})(Qj);var j4=Qj.sortBy;const ru=Tr(j4);var iw=e=>e.legend.settings,w4=e=>e.legend.size,S4=e=>e.legend.payload;$([S4,iw],(e,t)=>{var{itemSorter:r}=t,n=e.flat(1);return r?ru(n,r):n});var $o=1;function N4(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],[t,r]=h.useState({height:0,left:0,top:0,width:0}),n=h.useCallback(i=>{if(i!=null){var s=i.getBoundingClientRect(),o={height:s.height,left:s.left,top:s.top,width:s.width};(Math.abs(o.height-t.height)>$o||Math.abs(o.left-t.left)>$o||Math.abs(o.top-t.top)>$o||Math.abs(o.width-t.width)>$o)&&r({height:o.height,left:o.left,top:o.top,width:o.width})}},[t.width,t.height,t.top,t.left,...e]);return[t,n]}function Ze(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var k4=typeof Symbol=="function"&&Symbol.observable||"@@observable",Gx=k4,hd=()=>Math.random().toString(36).substring(7).split("").join("."),_4={INIT:`@@redux/INIT${hd()}`,REPLACE:`@@redux/REPLACE${hd()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${hd()}`},ql=_4;function Zh(e){if(typeof e!="object"||e===null)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function aw(e,t,r){if(typeof e!="function")throw new Error(Ze(2));if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(Ze(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Ze(1));return r(aw)(e,t)}let n=e,i=t,s=new Map,o=s,l=0,c=!1;function d(){o===s&&(o=new Map,s.forEach((b,v)=>{o.set(v,b)}))}function u(){if(c)throw new Error(Ze(3));return i}function f(b){if(typeof b!="function")throw new Error(Ze(4));if(c)throw new Error(Ze(5));let v=!0;d();const j=l++;return o.set(j,b),function(){if(v){if(c)throw new Error(Ze(6));v=!1,d(),o.delete(j),s=null}}}function p(b){if(!Zh(b))throw new Error(Ze(7));if(typeof b.type>"u")throw new Error(Ze(8));if(typeof b.type!="string")throw new Error(Ze(17));if(c)throw new Error(Ze(9));try{c=!0,i=n(i,b)}finally{c=!1}return(s=o).forEach(j=>{j()}),b}function m(b){if(typeof b!="function")throw new Error(Ze(10));n=b,p({type:ql.REPLACE})}function x(){const b=f;return{subscribe(v){if(typeof v!="object"||v===null)throw new Error(Ze(11));function j(){const w=v;w.next&&w.next(u())}return j(),{unsubscribe:b(j)}},[Gx](){return this}}}return p({type:ql.INIT}),{dispatch:p,subscribe:f,getState:u,replaceReducer:m,[Gx]:x}}function P4(e){Object.keys(e).forEach(t=>{const r=e[t];if(typeof r(void 0,{type:ql.INIT})>"u")throw new Error(Ze(12));if(typeof r(void 0,{type:ql.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Ze(13))})}function sw(e){const t=Object.keys(e),r={};for(let s=0;s"u")throw l&&l.type,new Error(Ze(14));d[f]=x,c=c||x!==m}return c=c||n.length!==Object.keys(o).length,c?d:o}}function Hl(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,r)=>(...n)=>t(r(...n)))}function C4(...e){return t=>(r,n)=>{const i=t(r,n);let s=()=>{throw new Error(Ze(15))};const o={getState:i.getState,dispatch:(c,...d)=>s(c,...d)},l=e.map(c=>c(o));return s=Hl(...l)(i.dispatch),{...i,dispatch:s}}}function ow(e){return Zh(e)&&"type"in e&&typeof e.type=="string"}var lw=Symbol.for("immer-nothing"),Zx=Symbol.for("immer-draftable"),Ft=Symbol.for("immer-state");function fr(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var Is=Object.getPrototypeOf;function vi(e){return!!e&&!!e[Ft]}function en(e){var t;return e?cw(e)||Array.isArray(e)||!!e[Zx]||!!((t=e.constructor)!=null&&t[Zx])||Qs(e)||iu(e):!1}var A4=Object.prototype.constructor.toString(),Xx=new WeakMap;function cw(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);if(t===null||t===Object.prototype)return!0;const r=Object.hasOwnProperty.call(t,"constructor")&&t.constructor;if(r===Object)return!0;if(typeof r!="function")return!1;let n=Xx.get(r);return n===void 0&&(n=Function.toString.call(r),Xx.set(r,n)),n===A4}function Kl(e,t,r=!0){nu(e)===0?(r?Reflect.ownKeys(e):Object.keys(e)).forEach(i=>{t(i,e[i],e)}):e.forEach((n,i)=>t(i,n,e))}function nu(e){const t=e[Ft];return t?t.type_:Array.isArray(e)?1:Qs(e)?2:iu(e)?3:0}function Rf(e,t){return nu(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function uw(e,t,r){const n=nu(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function O4(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function Qs(e){return e instanceof Map}function iu(e){return e instanceof Set}function Jn(e){return e.copy_||e.base_}function Bf(e,t){if(Qs(e))return new Map(e);if(iu(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);const r=cw(e);if(t===!0||t==="class_only"&&!r){const n=Object.getOwnPropertyDescriptors(e);delete n[Ft];let i=Reflect.ownKeys(n);for(let s=0;s1&&Object.defineProperties(e,{set:Lo,add:Lo,clear:Lo,delete:Lo}),Object.freeze(e),t&&Object.values(e).forEach(r=>Xh(r,!0))),e}function E4(){fr(2)}var Lo={value:E4};function au(e){return e===null||typeof e!="object"?!0:Object.isFrozen(e)}var D4={};function bi(e){const t=D4[e];return t||fr(0,e),t}var $s;function dw(){return $s}function T4(e,t){return{drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Jx(e,t){t&&(bi("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Wf(e){Ff(e),e.drafts_.forEach(M4),e.drafts_=null}function Ff(e){e===$s&&($s=e.parent_)}function Qx(e){return $s=T4($s,e)}function M4(e){const t=e[Ft];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function e0(e,t){t.unfinalizedDrafts_=t.drafts_.length;const r=t.drafts_[0];return e!==void 0&&e!==r?(r[Ft].modified_&&(Wf(t),fr(4)),en(e)&&(e=Vl(t,e),t.parent_||Yl(t,e)),t.patches_&&bi("Patches").generateReplacementPatches_(r[Ft].base_,e,t.patches_,t.inversePatches_)):e=Vl(t,r,[]),Wf(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e!==lw?e:void 0}function Vl(e,t,r){if(au(t))return t;const n=e.immer_.shouldUseStrictIteration(),i=t[Ft];if(!i)return Kl(t,(s,o)=>t0(e,i,t,s,o,r),n),t;if(i.scope_!==e)return t;if(!i.modified_)return Yl(e,i.base_,!0),i.base_;if(!i.finalized_){i.finalized_=!0,i.scope_.unfinalizedDrafts_--;const s=i.copy_;let o=s,l=!1;i.type_===3&&(o=new Set(s),s.clear(),l=!0),Kl(o,(c,d)=>t0(e,i,s,c,d,r,l),n),Yl(e,s,!1),r&&e.patches_&&bi("Patches").generatePatches_(i,r,e.patches_,e.inversePatches_)}return i.copy_}function t0(e,t,r,n,i,s,o){if(i==null||typeof i!="object"&&!o)return;const l=au(i);if(!(l&&!o)){if(vi(i)){const c=s&&t&&t.type_!==3&&!Rf(t.assigned_,n)?s.concat(n):void 0,d=Vl(e,i,c);if(uw(r,n,d),vi(d))e.canAutoFreeze_=!1;else return}else o&&r.add(i);if(en(i)&&!l){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1||t&&t.base_&&t.base_[n]===i&&l)return;Vl(e,i),(!t||!t.scope_.parent_)&&typeof n!="symbol"&&(Qs(r)?r.has(n):Object.prototype.propertyIsEnumerable.call(r,n))&&Yl(e,i)}}}function Yl(e,t,r=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Xh(t,r)}function I4(e,t){const r=Array.isArray(e),n={type_:r?1:0,scope_:t?t.scope_:dw(),modified_:!1,finalized_:!1,assigned_:{},parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1};let i=n,s=Jh;r&&(i=[n],s=Ls);const{revoke:o,proxy:l}=Proxy.revocable(i,s);return n.draft_=l,n.revoke_=o,l}var Jh={get(e,t){if(t===Ft)return e;const r=Jn(e);if(!Rf(r,t))return $4(e,r,t);const n=r[t];return e.finalized_||!en(n)?n:n===md(e.base_,t)?(gd(e),e.copy_[t]=qf(n,e)):n},has(e,t){return t in Jn(e)},ownKeys(e){return Reflect.ownKeys(Jn(e))},set(e,t,r){const n=fw(Jn(e),t);if(n!=null&&n.set)return n.set.call(e.draft_,r),!0;if(!e.modified_){const i=md(Jn(e),t),s=i==null?void 0:i[Ft];if(s&&s.base_===r)return e.copy_[t]=r,e.assigned_[t]=!1,!0;if(O4(r,i)&&(r!==void 0||Rf(e.base_,t)))return!0;gd(e),Uf(e)}return e.copy_[t]===r&&(r!==void 0||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_[t]=!0),!0},deleteProperty(e,t){return md(e.base_,t)!==void 0||t in e.base_?(e.assigned_[t]=!1,gd(e),Uf(e)):delete e.assigned_[t],e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){const r=Jn(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.type_!==1||t!=="length",enumerable:n.enumerable,value:r[t]}},defineProperty(){fr(11)},getPrototypeOf(e){return Is(e.base_)},setPrototypeOf(){fr(12)}},Ls={};Kl(Jh,(e,t)=>{Ls[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});Ls.deleteProperty=function(e,t){return Ls.set.call(this,e,t,void 0)};Ls.set=function(e,t,r){return Jh.set.call(this,e[0],t,r,e[0])};function md(e,t){const r=e[Ft];return(r?Jn(r):e)[t]}function $4(e,t,r){var i;const n=fw(t,r);return n?"value"in n?n.value:(i=n.get)==null?void 0:i.call(e.draft_):void 0}function fw(e,t){if(!(t in e))return;let r=Is(e);for(;r;){const n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Is(r)}}function Uf(e){e.modified_||(e.modified_=!0,e.parent_&&Uf(e.parent_))}function gd(e){e.copy_||(e.copy_=Bf(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var L4=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!0,this.produce=(t,r,n)=>{if(typeof t=="function"&&typeof r!="function"){const s=r;r=t;const o=this;return function(c=s,...d){return o.produce(c,u=>r.call(this,u,...d))}}typeof r!="function"&&fr(6),n!==void 0&&typeof n!="function"&&fr(7);let i;if(en(t)){const s=Qx(this),o=qf(t,void 0);let l=!0;try{i=r(o),l=!1}finally{l?Wf(s):Ff(s)}return Jx(s,n),e0(i,s)}else if(!t||typeof t!="object"){if(i=r(t),i===void 0&&(i=t),i===lw&&(i=void 0),this.autoFreeze_&&Xh(i,!0),n){const s=[],o=[];bi("Patches").generateReplacementPatches_(t,i,s,o),n(s,o)}return i}else fr(1,t)},this.produceWithPatches=(t,r)=>{if(typeof t=="function")return(o,...l)=>this.produceWithPatches(o,c=>t(c,...l));let n,i;return[this.produce(t,r,(o,l)=>{n=o,i=l}),n,i]},typeof(e==null?void 0:e.autoFreeze)=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof(e==null?void 0:e.useStrictShallowCopy)=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),typeof(e==null?void 0:e.useStrictIteration)=="boolean"&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){en(e)||fr(8),vi(e)&&(e=Kr(e));const t=Qx(this),r=qf(e,void 0);return r[Ft].isManual_=!0,Ff(t),r}finishDraft(e,t){const r=e&&e[Ft];(!r||!r.isManual_)&&fr(9);const{scope_:n}=r;return Jx(n,t),e0(void 0,n)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let r;for(r=t.length-1;r>=0;r--){const i=t[r];if(i.path.length===0&&i.op==="replace"){e=i.value;break}}r>-1&&(t=t.slice(r+1));const n=bi("Patches").applyPatches_;return vi(e)?n(e,t):this.produce(e,i=>n(i,t))}};function qf(e,t){const r=Qs(e)?bi("MapSet").proxyMap_(e,t):iu(e)?bi("MapSet").proxySet_(e,t):I4(e,t);return(t?t.scope_:dw()).drafts_.push(r),r}function Kr(e){return vi(e)||fr(10,e),pw(e)}function pw(e){if(!en(e)||au(e))return e;const t=e[Ft];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Bf(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Bf(e,!0);return Kl(r,(i,s)=>{uw(r,i,pw(s))},n),t&&(t.finalized_=!1),r}var Hf=new L4,hw=Hf.produce,z4=Hf.setUseStrictIteration.bind(Hf);function mw(e){return({dispatch:r,getState:n})=>i=>s=>typeof s=="function"?s(r,n,e):i(s)}var R4=mw(),B4=mw,W4=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?Hl:Hl.apply(null,arguments)};function ar(e,t){function r(...n){if(t){let i=t(...n);if(!i)throw new Error(Bt(0));return{type:e,payload:i.payload,..."meta"in i&&{meta:i.meta},..."error"in i&&{error:i.error}}}return{type:e,payload:n[0]}}return r.toString=()=>`${e}`,r.type=e,r.match=n=>ow(n)&&n.type===e,r}var gw=class ts extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,ts.prototype)}static get[Symbol.species](){return ts}concat(...t){return super.concat.apply(this,t)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new ts(...t[0].concat(this)):new ts(...t.concat(this))}};function r0(e){return en(e)?hw(e,()=>{}):e}function zo(e,t,r){return e.has(t)?e.get(t):e.set(t,r(t)).get(t)}function F4(e){return typeof e=="boolean"}var U4=()=>function(t){const{thunk:r=!0,immutableCheck:n=!0,serializableCheck:i=!0,actionCreatorCheck:s=!0}=t??{};let o=new gw;return r&&(F4(r)?o.push(R4):o.push(B4(r.extraArgument))),o},xw="RTK_autoBatch",Le=()=>e=>({payload:e,meta:{[xw]:!0}}),n0=e=>t=>{setTimeout(t,e)},yw=(e={type:"raf"})=>t=>(...r)=>{const n=t(...r);let i=!0,s=!1,o=!1;const l=new Set,c=e.type==="tick"?queueMicrotask:e.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?window.requestAnimationFrame:n0(10):e.type==="callback"?e.queueNotification:n0(e.timeout),d=()=>{o=!1,s&&(s=!1,l.forEach(u=>u()))};return Object.assign({},n,{subscribe(u){const f=()=>i&&u(),p=n.subscribe(f);return l.add(u),()=>{p(),l.delete(u)}},dispatch(u){var f;try{return i=!((f=u==null?void 0:u.meta)!=null&&f[xw]),s=!i,s&&(o||(o=!0,c(d))),n.dispatch(u)}finally{i=!0}}})},q4=e=>function(r){const{autoBatch:n=!0}=r??{};let i=new gw(e);return n&&i.push(yw(typeof n=="object"?n:void 0)),i};function H4(e){const t=U4(),{reducer:r=void 0,middleware:n,devTools:i=!0,preloadedState:s=void 0,enhancers:o=void 0}=e||{};let l;if(typeof r=="function")l=r;else if(Zh(r))l=sw(r);else throw new Error(Bt(1));let c;typeof n=="function"?c=n(t):c=t();let d=Hl;i&&(d=W4({trace:!1,...typeof i=="object"&&i}));const u=C4(...c),f=q4(u);let p=typeof o=="function"?o(f):f();const m=d(...p);return aw(l,s,m)}function vw(e){const t={},r=[];let n;const i={addCase(s,o){const l=typeof s=="string"?s:s.type;if(!l)throw new Error(Bt(28));if(l in t)throw new Error(Bt(29));return t[l]=o,i},addAsyncThunk(s,o){return o.pending&&(t[s.pending.type]=o.pending),o.rejected&&(t[s.rejected.type]=o.rejected),o.fulfilled&&(t[s.fulfilled.type]=o.fulfilled),o.settled&&r.push({matcher:s.settled,reducer:o.settled}),i},addMatcher(s,o){return r.push({matcher:s,reducer:o}),i},addDefaultCase(s){return n=s,i}};return e(i),[t,r,n]}z4(!1);function K4(e){return typeof e=="function"}function V4(e,t){let[r,n,i]=vw(t),s;if(K4(e))s=()=>r0(e());else{const l=r0(e);s=()=>l}function o(l=s(),c){let d=[r[c.type],...n.filter(({matcher:u})=>u(c)).map(({reducer:u})=>u)];return d.filter(u=>!!u).length===0&&(d=[i]),d.reduce((u,f)=>{if(f)if(vi(u)){const m=f(u,c);return m===void 0?u:m}else{if(en(u))return hw(u,p=>f(p,c));{const p=f(u,c);if(p===void 0){if(u===null)return u;throw Error("A case reducer on a non-draftable value must not return undefined")}return p}}return u},l)}return o.getInitialState=s,o}var Y4="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",G4=(e=21)=>{let t="",r=e;for(;r--;)t+=Y4[Math.random()*64|0];return t},Z4=Symbol.for("rtk-slice-createasyncthunk");function X4(e,t){return`${e}/${t}`}function J4({creators:e}={}){var r;const t=(r=e==null?void 0:e.asyncThunk)==null?void 0:r[Z4];return function(i){const{name:s,reducerPath:o=s}=i;if(!s)throw new Error(Bt(11));const l=(typeof i.reducers=="function"?i.reducers(eE()):i.reducers)||{},c=Object.keys(l),d={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},u={addCase(w,S){const N=typeof w=="string"?w:w.type;if(!N)throw new Error(Bt(12));if(N in d.sliceCaseReducersByType)throw new Error(Bt(13));return d.sliceCaseReducersByType[N]=S,u},addMatcher(w,S){return d.sliceMatchers.push({matcher:w,reducer:S}),u},exposeAction(w,S){return d.actionCreators[w]=S,u},exposeCaseReducer(w,S){return d.sliceCaseReducersByName[w]=S,u}};c.forEach(w=>{const S=l[w],N={reducerName:w,type:X4(s,w),createNotation:typeof i.reducers=="function"};rE(S)?iE(N,S,u,t):tE(N,S,u)});function f(){const[w={},S=[],N=void 0]=typeof i.extraReducers=="function"?vw(i.extraReducers):[i.extraReducers],_={...w,...d.sliceCaseReducersByType};return V4(i.initialState,P=>{for(let D in _)P.addCase(D,_[D]);for(let D of d.sliceMatchers)P.addMatcher(D.matcher,D.reducer);for(let D of S)P.addMatcher(D.matcher,D.reducer);N&&P.addDefaultCase(N)})}const p=w=>w,m=new Map,x=new WeakMap;let g;function b(w,S){return g||(g=f()),g(w,S)}function v(){return g||(g=f()),g.getInitialState()}function j(w,S=!1){function N(P){let D=P[w];return typeof D>"u"&&S&&(D=zo(x,N,v)),D}function _(P=p){const D=zo(m,S,()=>new WeakMap);return zo(D,P,()=>{const M={};for(const[I,C]of Object.entries(i.selectors??{}))M[I]=Q4(C,P,()=>zo(x,P,v),S);return M})}return{reducerPath:w,getSelectors:_,get selectors(){return _(N)},selectSlice:N}}const y={name:s,reducer:b,actions:d.actionCreators,caseReducers:d.sliceCaseReducersByName,getInitialState:v,...j(o),injectInto(w,{reducerPath:S,...N}={}){const _=S??o;return w.inject({reducerPath:_,reducer:b},N),{...y,...j(_,!0)}}};return y}}function Q4(e,t,r,n){function i(s,...o){let l=t(s);return typeof l>"u"&&n&&(l=r()),e(l,...o)}return i.unwrapped=e,i}var At=J4();function eE(){function e(t,r){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...r}}return e.withTypes=()=>e,{reducer(t){return Object.assign({[t.name](...r){return t(...r)}}[t.name],{_reducerDefinitionType:"reducer"})},preparedReducer(t,r){return{_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:r}},asyncThunk:e}}function tE({type:e,reducerName:t,createNotation:r},n,i){let s,o;if("reducer"in n){if(r&&!nE(n))throw new Error(Bt(17));s=n.reducer,o=n.prepare}else s=n;i.addCase(e,s).exposeCaseReducer(t,s).exposeAction(t,o?ar(e,o):ar(e))}function rE(e){return e._reducerDefinitionType==="asyncThunk"}function nE(e){return e._reducerDefinitionType==="reducerWithPrepare"}function iE({type:e,reducerName:t},r,n,i){if(!i)throw new Error(Bt(18));const{payloadCreator:s,fulfilled:o,pending:l,rejected:c,settled:d,options:u}=r,f=i(e,s,u);n.exposeAction(t,f),o&&n.addCase(f.fulfilled,o),l&&n.addCase(f.pending,l),c&&n.addCase(f.rejected,c),d&&n.addMatcher(f.settled,d),n.exposeCaseReducer(t,{fulfilled:o||Ro,pending:l||Ro,rejected:c||Ro,settled:d||Ro})}function Ro(){}var aE="task",bw="listener",jw="completed",Qh="cancelled",sE=`task-${Qh}`,oE=`task-${jw}`,Kf=`${bw}-${Qh}`,lE=`${bw}-${jw}`,su=class{constructor(e){mo(this,"name","TaskAbortError");mo(this,"message");this.code=e,this.message=`${aE} ${Qh} (reason: ${e})`}},em=(e,t)=>{if(typeof e!="function")throw new TypeError(Bt(32))},Gl=()=>{},ww=(e,t=Gl)=>(e.catch(t),e),Sw=(e,t)=>(e.addEventListener("abort",t,{once:!0}),()=>e.removeEventListener("abort",t)),li=(e,t)=>{const r=e.signal;r.aborted||("reason"in r||Object.defineProperty(r,"reason",{enumerable:!0,value:t,configurable:!0,writable:!0}),e.abort(t))},ci=e=>{if(e.aborted){const{reason:t}=e;throw new su(t)}};function Nw(e,t){let r=Gl;return new Promise((n,i)=>{const s=()=>i(new su(e.reason));if(e.aborted){s();return}r=Sw(e,s),t.finally(()=>r()).then(n,i)}).finally(()=>{r=Gl})}var cE=async(e,t)=>{try{return await Promise.resolve(),{status:"ok",value:await e()}}catch(r){return{status:r instanceof su?"cancelled":"rejected",error:r}}finally{t==null||t()}},Zl=e=>t=>ww(Nw(e,t).then(r=>(ci(e),r))),kw=e=>{const t=Zl(e);return r=>t(new Promise(n=>setTimeout(n,r)))},{assign:ia}=Object,i0={},ou="listenerMiddleware",uE=(e,t)=>{const r=n=>Sw(e,()=>li(n,e.reason));return(n,i)=>{em(n);const s=new AbortController;r(s);const o=cE(async()=>{ci(e),ci(s.signal);const l=await n({pause:Zl(s.signal),delay:kw(s.signal),signal:s.signal});return ci(s.signal),l},()=>li(s,oE));return i!=null&&i.autoJoin&&t.push(o.catch(Gl)),{result:Zl(e)(o),cancel(){li(s,sE)}}}},dE=(e,t)=>{const r=async(n,i)=>{ci(t);let s=()=>{};const l=[new Promise((c,d)=>{let u=e({predicate:n,effect:(f,p)=>{p.unsubscribe(),c([f,p.getState(),p.getOriginalState()])}});s=()=>{u(),d()}})];i!=null&&l.push(new Promise(c=>setTimeout(c,i,null)));try{const c=await Nw(t,Promise.race(l));return ci(t),c}finally{s()}};return(n,i)=>ww(r(n,i))},_w=e=>{let{type:t,actionCreator:r,matcher:n,predicate:i,effect:s}=e;if(t)i=ar(t).match;else if(r)t=r.type,i=r.match;else if(n)i=n;else if(!i)throw new Error(Bt(21));return em(s),{predicate:i,type:t,effect:s}},Pw=ia(e=>{const{type:t,predicate:r,effect:n}=_w(e);return{id:G4(),effect:n,type:t,predicate:r,pending:new Set,unsubscribe:()=>{throw new Error(Bt(22))}}},{withTypes:()=>Pw}),a0=(e,t)=>{const{type:r,effect:n,predicate:i}=_w(t);return Array.from(e.values()).find(s=>(typeof r=="string"?s.type===r:s.predicate===i)&&s.effect===n)},Vf=e=>{e.pending.forEach(t=>{li(t,Kf)})},fE=(e,t)=>()=>{for(const r of t.keys())Vf(r);e.clear()},s0=(e,t,r)=>{try{e(t,r)}catch(n){setTimeout(()=>{throw n},0)}},Cw=ia(ar(`${ou}/add`),{withTypes:()=>Cw}),pE=ar(`${ou}/removeAll`),Aw=ia(ar(`${ou}/remove`),{withTypes:()=>Aw}),hE=(...e)=>{console.error(`${ou}/error`,...e)},eo=(e={})=>{const t=new Map,r=new Map,n=m=>{const x=r.get(m)??0;r.set(m,x+1)},i=m=>{const x=r.get(m)??1;x===1?r.delete(m):r.set(m,x-1)},{extra:s,onError:o=hE}=e;em(o);const l=m=>(m.unsubscribe=()=>t.delete(m.id),t.set(m.id,m),x=>{m.unsubscribe(),x!=null&&x.cancelActive&&Vf(m)}),c=m=>{const x=a0(t,m)??Pw(m);return l(x)};ia(c,{withTypes:()=>c});const d=m=>{const x=a0(t,m);return x&&(x.unsubscribe(),m.cancelActive&&Vf(x)),!!x};ia(d,{withTypes:()=>d});const u=async(m,x,g,b)=>{const v=new AbortController,j=dE(c,v.signal),y=[];try{m.pending.add(v),n(m),await Promise.resolve(m.effect(x,ia({},g,{getOriginalState:b,condition:(w,S)=>j(w,S).then(Boolean),take:j,delay:kw(v.signal),pause:Zl(v.signal),extra:s,signal:v.signal,fork:uE(v.signal,y),unsubscribe:m.unsubscribe,subscribe:()=>{t.set(m.id,m)},cancelActiveListeners:()=>{m.pending.forEach((w,S,N)=>{w!==v&&(li(w,Kf),N.delete(w))})},cancel:()=>{li(v,Kf),m.pending.delete(v)},throwIfCancelled:()=>{ci(v.signal)}})))}catch(w){w instanceof su||s0(o,w,{raisedBy:"effect"})}finally{await Promise.all(y),li(v,lE),i(m),m.pending.delete(v)}},f=fE(t,r);return{middleware:m=>x=>g=>{if(!ow(g))return x(g);if(Cw.match(g))return c(g.payload);if(pE.match(g)){f();return}if(Aw.match(g))return d(g.payload);let b=m.getState();const v=()=>{if(b===i0)throw new Error(Bt(23));return b};let j;try{if(j=x(g),t.size>0){const y=m.getState(),w=Array.from(t.values());for(const S of w){let N=!1;try{N=S.predicate(g,y,b)}catch(_){N=!1,s0(o,_,{raisedBy:"predicate"})}N&&u(S,g,m,v)}}}finally{b=i0}return j},startListening:c,stopListening:d,clearListeners:f}};function Bt(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var mE={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},Ow=At({name:"chartLayout",initialState:mE,reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){var r,n,i,s;e.margin.top=(r=t.payload.top)!==null&&r!==void 0?r:0,e.margin.right=(n=t.payload.right)!==null&&n!==void 0?n:0,e.margin.bottom=(i=t.payload.bottom)!==null&&i!==void 0?i:0,e.margin.left=(s=t.payload.left)!==null&&s!==void 0?s:0},setScale(e,t){e.scale=t.payload}}}),{setMargin:gE,setLayout:xE,setChartSize:yE,setScale:vE}=Ow.actions,bE=Ow.reducer;function Ew(e,t,r){return Array.isArray(e)&&e&&t+r!==0?e.slice(t,r+1):e}function o0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Yi(e){for(var t=1;t{if(t&&r){var{width:n,height:i}=r,{align:s,verticalAlign:o,layout:l}=t;if((l==="vertical"||l==="horizontal"&&o==="middle")&&s!=="center"&&Y(e[s]))return Yi(Yi({},e),{},{[s]:e[s]+(n||0)});if((l==="horizontal"||l==="vertical"&&s==="center")&&o!=="middle"&&Y(e[o]))return Yi(Yi({},e),{},{[o]:e[o]+(i||0)})}return e},Mr=(e,t)=>e==="horizontal"&&t==="xAxis"||e==="vertical"&&t==="yAxis"||e==="centric"&&t==="angleAxis"||e==="radial"&&t==="radiusAxis",Dw=(e,t,r,n)=>{if(n)return e.map(l=>l.coordinate);var i,s,o=e.map(l=>(l.coordinate===t&&(i=!0),l.coordinate===r&&(s=!0),l.coordinate));return i||o.push(t),s||o.push(r),o},Tw=(e,t,r)=>{if(!e)return null;var{duplicateDomain:n,type:i,range:s,scale:o,realScaleType:l,isCategorical:c,categoricalDomain:d,tickCount:u,ticks:f,niceTicks:p,axisType:m}=e;if(!o)return null;var x=l==="scaleBand"&&o.bandwidth?o.bandwidth()/2:2,g=i==="category"&&o.bandwidth?o.bandwidth()/x:0;if(g=m==="angleAxis"&&s&&s.length>=2?Jt(s[0]-s[1])*2*g:g,f||p){var b=(f||p||[]).map((v,j)=>{var y=n?n.indexOf(v):v;return{coordinate:o(y)+g,value:v,offset:g,index:j}});return b.filter(v=>!yr(v.coordinate))}return c&&d?d.map((v,j)=>({coordinate:o(v)+g,value:v,index:j,offset:g})):o.ticks&&u!=null?o.ticks(u).map((v,j)=>({coordinate:o(v)+g,value:v,offset:g,index:j})):o.domain().map((v,j)=>({coordinate:o(v)+g,value:n?n[v]:v,index:j,offset:g}))},l0=1e-4,kE=e=>{var t=e.domain();if(!(!t||t.length<=2)){var r=t.length,n=e.range(),i=Math.min(n[0],n[1])-l0,s=Math.max(n[0],n[1])+l0,o=e(t[0]),l=e(t[r-1]);(os||ls)&&e.domain([t[0],t[r-1]])}},_E=e=>{var t=e.length;if(!(t<=0))for(var r=0,n=e[0].length;r=0?(e[o][r][0]=i,e[o][r][1]=i+l,i=e[o][r][1]):(e[o][r][0]=s,e[o][r][1]=s+l,s=e[o][r][1])}},PE=e=>{var t=e.length;if(!(t<=0))for(var r=0,n=e[0].length;r=0?(e[s][r][0]=i,e[s][r][1]=i+o,i=e[s][r][1]):(e[s][r][0]=0,e[s][r][1]=0)}},CE={sign:_E,expand:zO,none:ma,silhouette:RO,wiggle:BO,positive:PE},AE=(e,t,r)=>{var n=CE[r],i=LO().keys(t).value((s,o)=>Number(et(s,o,0))).order(Lf).offset(n);return i(e)};function OE(e){return e==null?void 0:String(e)}function Xl(e){var{axis:t,ticks:r,bandSize:n,entry:i,index:s,dataKey:o}=e;if(t.type==="category"){if(!t.allowDuplicatedCategory&&t.dataKey&&!Re(i[t.dataKey])){var l=Ej(r,"value",i[t.dataKey]);if(l)return l.coordinate+n/2}return r[s]?r[s].coordinate+n/2:null}var c=et(i,Re(o)?t.dataKey:o);return Re(c)?null:t.scale(c)}var EE=e=>{var t=e.flat(2).filter(Y);return[Math.min(...t),Math.max(...t)]},DE=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],TE=(e,t,r)=>{if(e!=null)return DE(Object.keys(e).reduce((n,i)=>{var s=e[i],{stackedData:o}=s,l=o.reduce((c,d)=>{var u=Ew(d,t,r),f=EE(u);return[Math.min(c[0],f[0]),Math.max(c[1],f[1])]},[1/0,-1/0]);return[Math.min(l[0],n[0]),Math.max(l[1],n[1])]},[1/0,-1/0]))},c0=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,u0=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,ga=(e,t,r)=>{if(e&&e.scale&&e.scale.bandwidth){var n=e.scale.bandwidth();if(!r||n>0)return n}if(e&&t&&t.length>=2){for(var i=ru(t,u=>u.coordinate),s=1/0,o=1,l=i.length;o{if(t==="horizontal")return e.chartX;if(t==="vertical")return e.chartY},IE=(e,t)=>t==="centric"?e.angle:e.radius,ln=e=>e.layout.width,cn=e=>e.layout.height,$E=e=>e.layout.scale,Mw=e=>e.layout.margin,cu=$(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),uu=$(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),LE="data-recharts-item-index",zE="data-recharts-item-data-key",to=60;function f0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Bo(e){for(var t=1;te.brush.height;function UE(e){var t=uu(e);return t.reduce((r,n)=>{if(n.orientation==="left"&&!n.mirror&&!n.hide){var i=typeof n.width=="number"?n.width:to;return r+i}return r},0)}function qE(e){var t=uu(e);return t.reduce((r,n)=>{if(n.orientation==="right"&&!n.mirror&&!n.hide){var i=typeof n.width=="number"?n.width:to;return r+i}return r},0)}function HE(e){var t=cu(e);return t.reduce((r,n)=>n.orientation==="top"&&!n.mirror&&!n.hide?r+n.height:r,0)}function KE(e){var t=cu(e);return t.reduce((r,n)=>n.orientation==="bottom"&&!n.mirror&&!n.hide?r+n.height:r,0)}var rt=$([ln,cn,Mw,FE,UE,qE,HE,KE,iw,w4],(e,t,r,n,i,s,o,l,c,d)=>{var u={left:(r.left||0)+i,right:(r.right||0)+s},f={top:(r.top||0)+o,bottom:(r.bottom||0)+l},p=Bo(Bo({},f),u),m=p.bottom;p.bottom+=n,p=NE(p,c,d);var x=e-p.left-p.right,g=t-p.top-p.bottom;return Bo(Bo({brushBottom:m},p),{},{width:Math.max(x,0),height:Math.max(g,0)})}),VE=$(rt,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),Iw=$(ln,cn,(e,t)=>({x:0,y:0,width:e,height:t})),YE=h.createContext(null),pt=()=>h.useContext(YE)!=null,du=e=>e.brush,fu=$([du,rt,Mw],(e,t,r)=>({height:e.height,x:Y(e.x)?e.x:t.left,y:Y(e.y)?e.y:t.top+t.height+t.brushBottom-((r==null?void 0:r.bottom)||0),width:Y(e.width)?e.width:t.width})),$w={},Lw={},zw={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r,n,{signal:i,edges:s}={}){let o,l=null;const c=s!=null&&s.includes("leading"),d=s==null||s.includes("trailing"),u=()=>{l!==null&&(r.apply(o,l),o=void 0,l=null)},f=()=>{d&&u(),g()};let p=null;const m=()=>{p!=null&&clearTimeout(p),p=setTimeout(()=>{p=null,f()},n)},x=()=>{p!==null&&(clearTimeout(p),p=null)},g=()=>{x(),o=void 0,l=null},b=()=>{u()},v=function(...j){if(i!=null&&i.aborted)return;o=this,l=j;const y=p==null;m(),c&&y&&u()};return v.schedule=m,v.cancel=g,v.flush=b,i==null||i.addEventListener("abort",g,{once:!0}),v}e.debounce=t})(zw);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=zw;function r(n,i=0,s={}){typeof s!="object"&&(s={});const{leading:o=!1,trailing:l=!0,maxWait:c}=s,d=Array(2);o&&(d[0]="leading"),l&&(d[1]="trailing");let u,f=null;const p=t.debounce(function(...g){u=n.apply(this,g),f=null},i,{edges:d}),m=function(...g){return c!=null&&(f===null&&(f=Date.now()),Date.now()-f>=c)?(u=n.apply(this,g),f=Date.now(),p.cancel(),p.schedule(),u):(p.apply(this,g),u)},x=()=>(p.flush(),u);return m.cancel=p.cancel,m.flush=x,m}e.debounce=r})(Lw);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Lw;function r(n,i=0,s={}){const{leading:o=!0,trailing:l=!0}=s;return t.debounce(n,i,{leading:o,maxWait:i,trailing:l})}e.throttle=r})($w);var GE=$w.throttle;const ZE=Tr(GE);var Jl=function(t,r){for(var n=arguments.length,i=new Array(n>2?n-2:0),s=2;s{var{width:n="100%",height:i="100%",aspect:s,maxHeight:o}=r,l=Qr(n)?e:Number(n),c=Qr(i)?t:Number(i);return s&&s>0&&(l?c=l/s:c&&(l=c*s),o&&c!=null&&c>o&&(c=o)),{calculatedWidth:l,calculatedHeight:c}},XE={width:0,height:0,overflow:"visible"},JE={width:0,overflowX:"visible"},QE={height:0,overflowY:"visible"},e3={},t3=e=>{var{width:t,height:r}=e,n=Qr(t),i=Qr(r);return n&&i?XE:n?JE:i?QE:e3};function r3(e){var{width:t,height:r,aspect:n}=e,i=t,s=r;return i===void 0&&s===void 0?(i="100%",s="100%"):i===void 0?i=n&&n>0?void 0:"100%":s===void 0&&(s=n&&n>0?void 0:"100%"),{width:i,height:s}}function _e(e){return Number.isFinite(e)}function Er(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function Yf(){return Yf=Object.assign?Object.assign.bind():function(e){for(var t=1;t({width:r,height:n}),[r,n]);return s3(i)?h.createElement(Bw.Provider,{value:i},t):null}var tm=()=>h.useContext(Bw),o3=h.forwardRef((e,t)=>{var{aspect:r,initialDimension:n={width:-1,height:-1},width:i,height:s,minWidth:o=0,minHeight:l,maxHeight:c,children:d,debounce:u=0,id:f,className:p,onResize:m,style:x={}}=e,g=h.useRef(null),b=h.useRef();b.current=m,h.useImperativeHandle(t,()=>g.current);var[v,j]=h.useState({containerWidth:n.width,containerHeight:n.height}),y=h.useCallback((P,D)=>{j(M=>{var I=Math.round(P),C=Math.round(D);return M.containerWidth===I&&M.containerHeight===C?M:{containerWidth:I,containerHeight:C}})},[]);h.useEffect(()=>{if(g.current==null||typeof ResizeObserver>"u")return Pa;var P=C=>{var B,{width:q,height:Z}=C[0].contentRect;y(q,Z),(B=b.current)===null||B===void 0||B.call(b,q,Z)};u>0&&(P=ZE(P,u,{trailing:!0,leading:!1}));var D=new ResizeObserver(P),{width:M,height:I}=g.current.getBoundingClientRect();return y(M,I),D.observe(g.current),()=>{D.disconnect()}},[y,u]);var{containerWidth:w,containerHeight:S}=v;Jl(!r||r>0,"The aspect(%s) must be greater than zero.",r);var{calculatedWidth:N,calculatedHeight:_}=Rw(w,S,{width:i,height:s,aspect:r,maxHeight:c});return Jl(N!=null&&N>0||_!=null&&_>0,`The width(%s) and height(%s) of chart should be greater than 0, + please check the style of container, or the props width(%s) and height(%s), + or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the + height and width.`,N,_,i,s,o,l,r),h.createElement("div",{id:f?"".concat(f):void 0,className:ue("recharts-responsive-container",p),style:h0(h0({},x),{},{width:i,height:s,minWidth:o,minHeight:l,maxHeight:c}),ref:g},h.createElement("div",{style:t3({width:i,height:s})},h.createElement(Ww,{width:N,height:_},d)))}),m0=h.forwardRef((e,t)=>{var r=tm();if(Er(r.width)&&Er(r.height))return e.children;var{width:n,height:i}=r3({width:e.width,height:e.height,aspect:e.aspect}),{calculatedWidth:s,calculatedHeight:o}=Rw(void 0,void 0,{width:n,height:i,aspect:e.aspect,maxHeight:e.maxHeight});return Y(s)&&Y(o)?h.createElement(Ww,{width:s,height:o},e.children):h.createElement(o3,Yf({},e,{width:n,height:i,ref:t}))});function Fw(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}var pu=()=>{var e,t=pt(),r=G(VE),n=G(fu),i=(e=G(du))===null||e===void 0?void 0:e.padding;return!t||!n||!i?r:{width:n.width-i.left-i.right,height:n.height-i.top-i.bottom,x:i.left,y:i.top}},l3={top:0,bottom:0,left:0,right:0,width:0,height:0,brushBottom:0},Uw=()=>{var e;return(e=G(rt))!==null&&e!==void 0?e:l3},qw=()=>G(ln),Hw=()=>G(cn),de=e=>e.layout.layoutType,ro=()=>G(de),c3=()=>{var e=ro();return e!==void 0},hu=e=>{var t=Ye(),r=pt(),{width:n,height:i}=e,s=tm(),o=n,l=i;return s&&(o=s.width>0?s.width:n,l=s.height>0?s.height:i),h.useEffect(()=>{!r&&Er(o)&&Er(l)&&t(yE({width:o,height:l}))},[t,r,o,l]),null},u3={settings:{layout:"horizontal",align:"center",verticalAlign:"middle",itemSorter:"value"},size:{width:0,height:0},payload:[]},Kw=At({name:"legend",initialState:u3,reducers:{setLegendSize(e,t){e.size.width=t.payload.width,e.size.height=t.payload.height},setLegendSettings(e,t){e.settings.align=t.payload.align,e.settings.layout=t.payload.layout,e.settings.verticalAlign=t.payload.verticalAlign,e.settings.itemSorter=t.payload.itemSorter},addLegendPayload:{reducer(e,t){e.payload.push(t.payload)},prepare:Le()},removeLegendPayload:{reducer(e,t){var r=Kr(e).payload.indexOf(t.payload);r>-1&&e.payload.splice(r,1)},prepare:Le()}}}),{setLegendSize:EW,setLegendSettings:DW,addLegendPayload:d3,removeLegendPayload:f3}=Kw.actions,p3=Kw.reducer;function Gf(){return Gf=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{separator:t=" : ",contentStyle:r={},itemStyle:n={},labelStyle:i={},payload:s,formatter:o,itemSorter:l,wrapperClassName:c,labelClassName:d,label:u,labelFormatter:f,accessibilityLayer:p=!1}=e,m=()=>{if(s&&s.length){var S={padding:0,margin:0},N=(l?ru(s,l):s).map((_,P)=>{if(_.type==="none")return null;var D=_.formatter||o||x3,{value:M,name:I}=_,C=M,B=I;if(D){var q=D(M,I,_,P,s);if(Array.isArray(q))[C,B]=q;else if(q!=null)C=q;else return null}var Z=xd({display:"block",paddingTop:4,paddingBottom:4,color:_.color||"#000"},n);return h.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(P),style:Z},Or(B)?h.createElement("span",{className:"recharts-tooltip-item-name"},B):null,Or(B)?h.createElement("span",{className:"recharts-tooltip-item-separator"},t):null,h.createElement("span",{className:"recharts-tooltip-item-value"},C),h.createElement("span",{className:"recharts-tooltip-item-unit"},_.unit||""))});return h.createElement("ul",{className:"recharts-tooltip-item-list",style:S},N)}return null},x=xd({margin:0,padding:10,backgroundColor:"#fff",border:"1px solid #ccc",whiteSpace:"nowrap"},r),g=xd({margin:0},i),b=!Re(u),v=b?u:"",j=ue("recharts-default-tooltip",c),y=ue("recharts-tooltip-label",d);b&&f&&s!==void 0&&s!==null&&(v=f(u,s));var w=p?{role:"status","aria-live":"assertive"}:{};return h.createElement("div",Gf({className:j,style:x},w),h.createElement("p",{className:y,style:g},h.isValidElement(v)?v:"".concat(v)),m())},qa="recharts-tooltip-wrapper",v3={visibility:"hidden"};function b3(e){var{coordinate:t,translateX:r,translateY:n}=e;return ue(qa,{["".concat(qa,"-right")]:Y(r)&&t&&Y(t.x)&&r>=t.x,["".concat(qa,"-left")]:Y(r)&&t&&Y(t.x)&&r=t.y,["".concat(qa,"-top")]:Y(n)&&t&&Y(t.y)&&n0?i:0),f=r[n]+i;if(t[n])return o[n]?u:f;var p=c[n];if(p==null)return 0;if(o[n]){var m=u,x=p;return mb?Math.max(u,p):Math.max(f,p)}function j3(e){var{translateX:t,translateY:r,useTranslate3d:n}=e;return{transform:n?"translate3d(".concat(t,"px, ").concat(r,"px, 0)"):"translate(".concat(t,"px, ").concat(r,"px)")}}function w3(e){var{allowEscapeViewBox:t,coordinate:r,offsetTopLeft:n,position:i,reverseDirection:s,tooltipBox:o,useTranslate3d:l,viewBox:c}=e,d,u,f;return o.height>0&&o.width>0&&r?(u=x0({allowEscapeViewBox:t,coordinate:r,key:"x",offsetTopLeft:n,position:i,reverseDirection:s,tooltipDimension:o.width,viewBox:c,viewBoxDimension:c.width}),f=x0({allowEscapeViewBox:t,coordinate:r,key:"y",offsetTopLeft:n,position:i,reverseDirection:s,tooltipDimension:o.height,viewBox:c,viewBoxDimension:c.height}),d=j3({translateX:u,translateY:f,useTranslate3d:l})):d=v3,{cssProperties:d,cssClasses:b3({translateX:u,translateY:f,coordinate:r})}}function y0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Wo(e){for(var t=1;t{if(t.key==="Escape"){var r,n,i,s;this.setState({dismissed:!0,dismissedAtCoordinate:{x:(r=(n=this.props.coordinate)===null||n===void 0?void 0:n.x)!==null&&r!==void 0?r:0,y:(i=(s=this.props.coordinate)===null||s===void 0?void 0:s.y)!==null&&i!==void 0?i:0}})}})}componentDidMount(){document.addEventListener("keydown",this.handleKeyDown)}componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyDown)}componentDidUpdate(){var t,r;this.state.dismissed&&(((t=this.props.coordinate)===null||t===void 0?void 0:t.x)!==this.state.dismissedAtCoordinate.x||((r=this.props.coordinate)===null||r===void 0?void 0:r.y)!==this.state.dismissedAtCoordinate.y)&&(this.state.dismissed=!1)}render(){var{active:t,allowEscapeViewBox:r,animationDuration:n,animationEasing:i,children:s,coordinate:o,hasPayload:l,isAnimationActive:c,offset:d,position:u,reverseDirection:f,useTranslate3d:p,viewBox:m,wrapperStyle:x,lastBoundingBox:g,innerRef:b,hasPortalFromProps:v}=this.props,{cssClasses:j,cssProperties:y}=w3({allowEscapeViewBox:r,coordinate:o,offsetTopLeft:d,position:u,reverseDirection:f,tooltipBox:{height:g.height,width:g.width},useTranslate3d:p,viewBox:m}),w=v?{}:Wo(Wo({transition:c&&t?"transform ".concat(n,"ms ").concat(i):void 0},y),{},{pointerEvents:"none",visibility:!this.state.dismissed&&t&&l?"visible":"hidden",position:"absolute",top:0,left:0}),S=Wo(Wo({},w),{},{visibility:!this.state.dismissed&&t&&l?"visible":"hidden"},x);return h.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:j,style:S,ref:b},s)}}var _3=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),Ci={devToolsEnabled:!1,isSsr:_3()},Vw=()=>{var e;return(e=G(t=>t.rootProps.accessibilityLayer))!==null&&e!==void 0?e:!0};function Xf(){return Xf=Object.assign?Object.assign.bind():function(e){for(var t=1;t_e(e.x)&&_e(e.y),w0=e=>e.base!=null&&Ql(e.base)&&Ql(e),Ha=e=>e.x,Ka=e=>e.y,O3=(e,t)=>{if(typeof e=="function")return e;var r="curve".concat(Js(e));return(r==="curveMonotone"||r==="curveBump")&&t?j0["".concat(r).concat(t==="vertical"?"Y":"X")]:j0[r]||Gc},E3=e=>{var{type:t="linear",points:r=[],baseLine:n,layout:i,connectNulls:s=!1}=e,o=O3(t,i),l=s?r.filter(Ql):r,c;if(Array.isArray(n)){var d=r.map((m,x)=>b0(b0({},m),{},{base:n[x]}));i==="vertical"?c=Mo().y(Ka).x1(Ha).x0(m=>m.base.x):c=Mo().x(Ha).y1(Ka).y0(m=>m.base.y);var u=c.defined(w0).curve(o),f=s?d.filter(w0):d;return u(f)}i==="vertical"&&Y(n)?c=Mo().y(Ka).x1(Ha).x0(n):Y(n)?c=Mo().x(Ha).y1(Ka).y0(n):c=xj().x(Ha).y(Ka);var p=c.defined(Ql).curve(o);return p(l)},fs=e=>{var{className:t,points:r,path:n,pathRef:i}=e;if((!r||!r.length)&&!n)return null;var s=r&&r.length?E3(e):n;return h.createElement("path",Xf({},nr(e),Lh(e),{className:ue("recharts-curve",t),d:s===null?void 0:s,ref:i}))},D3=["x","y","top","left","width","height","className"];function Jf(){return Jf=Object.assign?Object.assign.bind():function(e){for(var t=1;t"M".concat(e,",").concat(i,"v").concat(n,"M").concat(s,",").concat(t,"h").concat(r),B3=e=>{var{x:t=0,y:r=0,top:n=0,left:i=0,width:s=0,height:o=0,className:l}=e,c=L3(e,D3),d=T3({x:t,y:r,top:n,left:i,width:s,height:o},c);return!Y(t)||!Y(r)||!Y(s)||!Y(o)||!Y(n)||!Y(i)?null:h.createElement("path",Jf({},ut(d),{className:ue("recharts-cross",l),d:R3(t,r,s,o,n,i)}))};function W3(e,t,r,n){var i=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-i:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-i,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}function N0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function k0(e){for(var t=1;te.replace(/([A-Z])/g,t=>"-".concat(t.toLowerCase())),Yw=(e,t,r)=>e.map(n=>"".concat(H3(n)," ").concat(t,"ms ").concat(r)).join(","),K3=(e,t)=>[Object.keys(e),Object.keys(t)].reduce((r,n)=>r.filter(i=>n.includes(i))),zs=(e,t)=>Object.keys(t).reduce((r,n)=>k0(k0({},r),{},{[n]:e(n,t[n])}),{});function _0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function $e(e){for(var t=1;te+(t-e)*r,Qf=e=>{var{from:t,to:r}=e;return t!==r},Gw=(e,t,r)=>{var n=zs((i,s)=>{if(Qf(s)){var[o,l]=e(s.from,s.to,s.velocity);return $e($e({},s),{},{from:o,velocity:l})}return s},t);return r<1?zs((i,s)=>Qf(s)?$e($e({},s),{},{velocity:ec(s.velocity,n[i].velocity,r),from:ec(s.from,n[i].from,r)}):s,t):Gw(e,n,r-1)};function Z3(e,t,r,n,i,s){var o,l=n.reduce((p,m)=>$e($e({},p),{},{[m]:{from:e[m],velocity:0,to:t[m]}}),{}),c=()=>zs((p,m)=>m.from,l),d=()=>!Object.values(l).filter(Qf).length,u=null,f=p=>{o||(o=p);var m=p-o,x=m/r.dt;l=Gw(r,l,x),i($e($e($e({},e),t),c())),o=p,d()||(u=s.setTimeout(f))};return()=>(u=s.setTimeout(f),()=>{var p;(p=u)===null||p===void 0||p()})}function X3(e,t,r,n,i,s,o){var l=null,c=i.reduce((f,p)=>$e($e({},f),{},{[p]:[e[p],t[p]]}),{}),d,u=f=>{d||(d=f);var p=(f-d)/n,m=zs((g,b)=>ec(...b,r(p)),c);if(s($e($e($e({},e),t),m)),p<1)l=o.setTimeout(u);else{var x=zs((g,b)=>ec(...b,r(1)),c);s($e($e($e({},e),t),x))}};return()=>(l=o.setTimeout(u),()=>{var f;(f=l)===null||f===void 0||f()})}const J3=(e,t,r,n,i,s)=>{var o=K3(e,t);return r==null?()=>(i($e($e({},e),t)),()=>{}):r.isStepper===!0?Z3(e,t,r,o,i,s):X3(e,t,r,n,o,i,s)};var tc=1e-4,Zw=(e,t)=>[0,3*e,3*t-6*e,3*e-3*t+1],Xw=(e,t)=>e.map((r,n)=>r*t**n).reduce((r,n)=>r+n),P0=(e,t)=>r=>{var n=Zw(e,t);return Xw(n,r)},Q3=(e,t)=>r=>{var n=Zw(e,t),i=[...n.map((s,o)=>s*o).slice(1),0];return Xw(i,r)},e5=function(){for(var t=arguments.length,r=new Array(t),n=0;nparseFloat(l));return[o[0],o[1],o[2],o[3]]}}}return r.length===4?r:[0,0,1,1]},t5=(e,t,r,n)=>{var i=P0(e,r),s=P0(t,n),o=Q3(e,r),l=d=>d>1?1:d<0?0:d,c=d=>{for(var u=d>1?1:d,f=u,p=0;p<8;++p){var m=i(f)-u,x=o(f);if(Math.abs(m-u)0&&arguments[0]!==void 0?arguments[0]:{},{stiff:r=100,damping:n=8,dt:i=17}=t,s=(o,l,c)=>{var d=-(o-l)*r,u=c*n,f=c+(d-u)*i/1e3,p=c*i/1e3+o;return Math.abs(p-l){if(typeof e=="string")switch(e){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return C0(e);case"spring":return r5();default:if(e.split("(")[0]==="cubic-bezier")return C0(e)}return typeof e=="function"?e:null};function i5(e){var t,r=()=>null,n=!1,i=null,s=o=>{if(!n){if(Array.isArray(o)){if(!o.length)return;var l=o,[c,...d]=l;if(typeof c=="number"){i=e.setTimeout(s.bind(null,d),c);return}s(c),i=e.setTimeout(s.bind(null,d));return}typeof o=="string"&&(t=o,r(t)),typeof o=="object"&&(t=o,r(t)),typeof o=="function"&&o()}};return{stop:()=>{n=!0},start:o=>{n=!1,i&&(i(),i=null),s(o)},subscribe:o=>(r=o,()=>{r=()=>null}),getTimeoutController:()=>e}}class a5{setTimeout(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=performance.now(),i=null,s=o=>{o-n>=r?t(o):typeof requestAnimationFrame=="function"&&(i=requestAnimationFrame(s))};return i=requestAnimationFrame(s),()=>{i!=null&&cancelAnimationFrame(i)}}}function s5(){return i5(new a5)}var o5=h.createContext(s5);function l5(e,t){var r=h.useContext(o5);return h.useMemo(()=>t??r(e),[e,t,r])}var c5={begin:0,duration:1e3,easing:"ease",isActive:!0,canBegin:!0,onAnimationEnd:()=>{},onAnimationStart:()=>{}},A0={t:0},yd={t:1};function mu(e){var t=ft(e,c5),{isActive:r,canBegin:n,duration:i,easing:s,begin:o,onAnimationEnd:l,onAnimationStart:c,children:d}=t,u=l5(t.animationId,t.animationManager),[f,p]=h.useState(r?A0:yd),m=h.useRef(null);return h.useEffect(()=>{r||p(yd)},[r]),h.useEffect(()=>{if(!r||!n)return Pa;var x=J3(A0,yd,n5(s),i,p,u.getTimeoutController()),g=()=>{m.current=x()};return u.start([c,o,g,i,l]),()=>{u.stop(),m.current&&m.current(),l()}},[r,n,i,s,o,c,l,u]),d(f.t)}function gu(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",r=h.useRef(Ms(t)),n=h.useRef(e);return n.current!==e&&(r.current=Ms(t),n.current=e),r.current}var u5=["radius"],d5=["radius"];function O0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function E0(e){for(var t=1;t{var s=Math.min(Math.abs(r)/2,Math.abs(n)/2),o=n>=0?1:-1,l=r>=0?1:-1,c=n>=0&&r>=0||n<0&&r<0?1:0,d;if(s>0&&i instanceof Array){for(var u=[0,0,0,0],f=0,p=4;fs?s:i[f];d="M".concat(e,",").concat(t+o*u[0]),u[0]>0&&(d+="A ".concat(u[0],",").concat(u[0],",0,0,").concat(c,",").concat(e+l*u[0],",").concat(t)),d+="L ".concat(e+r-l*u[1],",").concat(t),u[1]>0&&(d+="A ".concat(u[1],",").concat(u[1],",0,0,").concat(c,`, + `).concat(e+r,",").concat(t+o*u[1])),d+="L ".concat(e+r,",").concat(t+n-o*u[2]),u[2]>0&&(d+="A ".concat(u[2],",").concat(u[2],",0,0,").concat(c,`, + `).concat(e+r-l*u[2],",").concat(t+n)),d+="L ".concat(e+l*u[3],",").concat(t+n),u[3]>0&&(d+="A ".concat(u[3],",").concat(u[3],",0,0,").concat(c,`, + `).concat(e,",").concat(t+n-o*u[3])),d+="Z"}else if(s>0&&i===+i&&i>0){var m=Math.min(s,i);d="M ".concat(e,",").concat(t+o*m,` + A `).concat(m,",").concat(m,",0,0,").concat(c,",").concat(e+l*m,",").concat(t,` + L `).concat(e+r-l*m,",").concat(t,` + A `).concat(m,",").concat(m,",0,0,").concat(c,",").concat(e+r,",").concat(t+o*m,` + L `).concat(e+r,",").concat(t+n-o*m,` + A `).concat(m,",").concat(m,",0,0,").concat(c,",").concat(e+r-l*m,",").concat(t+n,` + L `).concat(e+l*m,",").concat(t+n,` + A `).concat(m,",").concat(m,",0,0,").concat(c,",").concat(e,",").concat(t+n-o*m," Z")}else d="M ".concat(e,",").concat(t," h ").concat(r," v ").concat(n," h ").concat(-r," Z");return d},M0={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},Jw=e=>{var t=ft(e,M0),r=h.useRef(null),[n,i]=h.useState(-1);h.useEffect(()=>{if(r.current&&r.current.getTotalLength)try{var T=r.current.getTotalLength();T&&i(T)}catch{}},[]);var{x:s,y:o,width:l,height:c,radius:d,className:u}=t,{animationEasing:f,animationDuration:p,animationBegin:m,isAnimationActive:x,isUpdateAnimationActive:g}=t,b=h.useRef(l),v=h.useRef(c),j=h.useRef(s),y=h.useRef(o),w=h.useMemo(()=>({x:s,y:o,width:l,height:c,radius:d}),[s,o,l,c,d]),S=gu(w,"rectangle-");if(s!==+s||o!==+o||l!==+l||c!==+c||l===0||c===0)return null;var N=ue("recharts-rectangle",u);if(!g){var _=ut(t),{radius:P}=_,D=D0(_,u5);return h.createElement("path",rc({},D,{radius:typeof d=="number"?d:void 0,className:N,d:T0(s,o,l,c,d)}))}var M=b.current,I=v.current,C=j.current,B=y.current,q="0px ".concat(n===-1?1:n,"px"),Z="".concat(n,"px 0px"),A=Yw(["strokeDasharray"],p,typeof f=="string"?f:M0.animationEasing);return h.createElement(mu,{animationId:S,key:S,canBegin:n>0,duration:p,easing:f,isActive:g,begin:m},T=>{var O=Ee(M,l,T),k=Ee(I,c,T),L=Ee(C,s,T),W=Ee(B,o,T);r.current&&(b.current=O,v.current=k,j.current=L,y.current=W);var H;x?T>0?H={transition:A,strokeDasharray:Z}:H={strokeDasharray:q}:H={strokeDasharray:Z};var ee=ut(t),{radius:re}=ee,Me=D0(ee,d5);return h.createElement("path",rc({},Me,{radius:typeof d=="number"?d:void 0,className:N,d:T0(L,W,O,k,d),ref:r,style:E0(E0({},H),t.style)}))})};function I0(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function $0(e){for(var t=1;te*180/Math.PI,Je=(e,t,r,n)=>({x:e+Math.cos(-nc*n)*r,y:t+Math.sin(-nc*n)*r}),b5=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{top:0,right:0,bottom:0,left:0};return Math.min(Math.abs(t-(n.left||0)-(n.right||0)),Math.abs(r-(n.top||0)-(n.bottom||0)))/2},j5=(e,t)=>{var{x:r,y:n}=e,{x:i,y:s}=t;return Math.sqrt((r-i)**2+(n-s)**2)},w5=(e,t)=>{var{x:r,y:n}=e,{cx:i,cy:s}=t,o=j5({x:r,y:n},{x:i,y:s});if(o<=0)return{radius:o,angle:0};var l=(r-i)/o,c=Math.acos(l);return n>s&&(c=2*Math.PI-c),{radius:o,angle:v5(c),angleInRadian:c}},S5=e=>{var{startAngle:t,endAngle:r}=e,n=Math.floor(t/360),i=Math.floor(r/360),s=Math.min(n,i);return{startAngle:t-s*360,endAngle:r-s*360}},N5=(e,t)=>{var{startAngle:r,endAngle:n}=t,i=Math.floor(r/360),s=Math.floor(n/360),o=Math.min(i,s);return e+o*360},k5=(e,t)=>{var{chartX:r,chartY:n}=e,{radius:i,angle:s}=w5({x:r,y:n},t),{innerRadius:o,outerRadius:l}=t;if(il||i===0)return null;var{startAngle:c,endAngle:d}=S5(t),u=s,f;if(c<=d){for(;u>d;)u-=360;for(;u=c&&u<=d}else{for(;u>c;)u-=360;for(;u=d&&u<=c}return f?$0($0({},t),{},{radius:i,angle:N5(u,t)}):null};function Qw(e){var{cx:t,cy:r,radius:n,startAngle:i,endAngle:s}=e,o=Je(t,r,n,i),l=Je(t,r,n,s);return{points:[o,l],cx:t,cy:r,radius:n,startAngle:i,endAngle:s}}function ep(){return ep=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=Jt(t-e),n=Math.min(Math.abs(t-e),359.999);return r*n},Fo=e=>{var{cx:t,cy:r,radius:n,angle:i,sign:s,isExternal:o,cornerRadius:l,cornerIsExternal:c}=e,d=l*(o?1:-1)+n,u=Math.asin(l/d)/nc,f=c?i:i+s*u,p=Je(t,r,d,f),m=Je(t,r,n,f),x=c?i-s*u:i,g=Je(t,r,d*Math.cos(u*nc),x);return{center:p,circleTangency:m,lineTangency:g,theta:u}},eS=e=>{var{cx:t,cy:r,innerRadius:n,outerRadius:i,startAngle:s,endAngle:o}=e,l=_5(s,o),c=s+l,d=Je(t,r,i,s),u=Je(t,r,i,c),f="M ".concat(d.x,",").concat(d.y,` + A `).concat(i,",").concat(i,`,0, + `).concat(+(Math.abs(l)>180),",").concat(+(s>c),`, + `).concat(u.x,",").concat(u.y,` + `);if(n>0){var p=Je(t,r,n,s),m=Je(t,r,n,c);f+="L ".concat(m.x,",").concat(m.y,` + A `).concat(n,",").concat(n,`,0, + `).concat(+(Math.abs(l)>180),",").concat(+(s<=c),`, + `).concat(p.x,",").concat(p.y," Z")}else f+="L ".concat(t,",").concat(r," Z");return f},P5=e=>{var{cx:t,cy:r,innerRadius:n,outerRadius:i,cornerRadius:s,forceCornerRadius:o,cornerIsExternal:l,startAngle:c,endAngle:d}=e,u=Jt(d-c),{circleTangency:f,lineTangency:p,theta:m}=Fo({cx:t,cy:r,radius:i,angle:c,sign:u,cornerRadius:s,cornerIsExternal:l}),{circleTangency:x,lineTangency:g,theta:b}=Fo({cx:t,cy:r,radius:i,angle:d,sign:-u,cornerRadius:s,cornerIsExternal:l}),v=l?Math.abs(c-d):Math.abs(c-d)-m-b;if(v<0)return o?"M ".concat(p.x,",").concat(p.y,` + a`).concat(s,",").concat(s,",0,0,1,").concat(s*2,`,0 + a`).concat(s,",").concat(s,",0,0,1,").concat(-s*2,`,0 + `):eS({cx:t,cy:r,innerRadius:n,outerRadius:i,startAngle:c,endAngle:d});var j="M ".concat(p.x,",").concat(p.y,` + A`).concat(s,",").concat(s,",0,0,").concat(+(u<0),",").concat(f.x,",").concat(f.y,` + A`).concat(i,",").concat(i,",0,").concat(+(v>180),",").concat(+(u<0),",").concat(x.x,",").concat(x.y,` + A`).concat(s,",").concat(s,",0,0,").concat(+(u<0),",").concat(g.x,",").concat(g.y,` + `);if(n>0){var{circleTangency:y,lineTangency:w,theta:S}=Fo({cx:t,cy:r,radius:n,angle:c,sign:u,isExternal:!0,cornerRadius:s,cornerIsExternal:l}),{circleTangency:N,lineTangency:_,theta:P}=Fo({cx:t,cy:r,radius:n,angle:d,sign:-u,isExternal:!0,cornerRadius:s,cornerIsExternal:l}),D=l?Math.abs(c-d):Math.abs(c-d)-S-P;if(D<0&&s===0)return"".concat(j,"L").concat(t,",").concat(r,"Z");j+="L".concat(_.x,",").concat(_.y,` + A`).concat(s,",").concat(s,",0,0,").concat(+(u<0),",").concat(N.x,",").concat(N.y,` + A`).concat(n,",").concat(n,",0,").concat(+(D>180),",").concat(+(u>0),",").concat(y.x,",").concat(y.y,` + A`).concat(s,",").concat(s,",0,0,").concat(+(u<0),",").concat(w.x,",").concat(w.y,"Z")}else j+="L".concat(t,",").concat(r,"Z");return j},C5={cx:0,cy:0,innerRadius:0,outerRadius:0,startAngle:0,endAngle:0,cornerRadius:0,forceCornerRadius:!1,cornerIsExternal:!1},tS=e=>{var t=ft(e,C5),{cx:r,cy:n,innerRadius:i,outerRadius:s,cornerRadius:o,forceCornerRadius:l,cornerIsExternal:c,startAngle:d,endAngle:u,className:f}=t;if(s0&&Math.abs(d-u)<360?g=P5({cx:r,cy:n,innerRadius:i,outerRadius:s,cornerRadius:Math.min(x,m/2),forceCornerRadius:l,cornerIsExternal:c,startAngle:d,endAngle:u}):g=eS({cx:r,cy:n,innerRadius:i,outerRadius:s,startAngle:d,endAngle:u}),h.createElement("path",ep({},ut(t),{className:p,d:g}))};function A5(e,t,r){if(e==="horizontal")return[{x:t.x,y:r.top},{x:t.x,y:r.top+r.height}];if(e==="vertical")return[{x:r.left,y:t.y},{x:r.left+r.width,y:t.y}];if(Mj(t)){if(e==="centric"){var{cx:n,cy:i,innerRadius:s,outerRadius:o,angle:l}=t,c=Je(n,i,s,l),d=Je(n,i,o,l);return[{x:c.x,y:c.y},{x:d.x,y:d.y}]}return Qw(t)}}var rS={},nS={},iS={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Yh;function r(n){return t.isSymbol(n)?NaN:Number(n)}e.toNumber=r})(iS);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=iS;function r(n){return n?(n=t.toNumber(n),n===1/0||n===-1/0?(n<0?-1:1)*Number.MAX_VALUE:n===n?n:0):n===0?n:0}e.toFinite=r})(nS);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=Gh,r=nS;function n(i,s,o){o&&typeof o!="number"&&t.isIterateeCall(i,s,o)&&(s=o=void 0),i=r.toFinite(i),s===void 0?(s=i,i=0):s=r.toFinite(s),o=o===void 0?it?1:e>=t?0:NaN}function E5(e,t){return e==null||t==null?NaN:te?1:t>=e?0:NaN}function rm(e){let t,r,n;e.length!==2?(t=Mn,r=(l,c)=>Mn(e(l),c),n=(l,c)=>e(l)-c):(t=e===Mn||e===E5?e:D5,r=e,n=e);function i(l,c,d=0,u=l.length){if(d>>1;r(l[f],c)<0?d=f+1:u=f}while(d>>1;r(l[f],c)<=0?d=f+1:u=f}while(dd&&n(l[f-1],c)>-n(l[f],c)?f-1:f}return{left:i,center:o,right:s}}function D5(){return 0}function sS(e){return e===null?NaN:+e}function*T5(e,t){for(let r of e)r!=null&&(r=+r)>=r&&(yield r)}const M5=rm(Mn),no=M5.right;rm(sS).center;class L0 extends Map{constructor(t,r=L5){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),t!=null)for(const[n,i]of t)this.set(n,i)}get(t){return super.get(z0(this,t))}has(t){return super.has(z0(this,t))}set(t,r){return super.set(I5(this,t),r)}delete(t){return super.delete($5(this,t))}}function z0({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):r}function I5({_intern:e,_key:t},r){const n=t(r);return e.has(n)?e.get(n):(e.set(n,r),r)}function $5({_intern:e,_key:t},r){const n=t(r);return e.has(n)&&(r=e.get(n),e.delete(n)),r}function L5(e){return e!==null&&typeof e=="object"?e.valueOf():e}function z5(e=Mn){if(e===Mn)return oS;if(typeof e!="function")throw new TypeError("compare is not a function");return(t,r)=>{const n=e(t,r);return n||n===0?n:(e(r,r)===0)-(e(t,t)===0)}}function oS(e,t){return(e==null||!(e>=e))-(t==null||!(t>=t))||(et?1:0)}const R5=Math.sqrt(50),B5=Math.sqrt(10),W5=Math.sqrt(2);function ic(e,t,r){const n=(t-e)/Math.max(0,r),i=Math.floor(Math.log10(n)),s=n/Math.pow(10,i),o=s>=R5?10:s>=B5?5:s>=W5?2:1;let l,c,d;return i<0?(d=Math.pow(10,-i)/o,l=Math.round(e*d),c=Math.round(t*d),l/dt&&--c,d=-d):(d=Math.pow(10,i)*o,l=Math.round(e/d),c=Math.round(t/d),l*dt&&--c),c0))return[];if(e===t)return[e];const n=t=i))return[];const l=s-i+1,c=new Array(l);if(n)if(o<0)for(let d=0;d=n)&&(r=n);return r}function B0(e,t){let r;for(const n of e)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);return r}function lS(e,t,r=0,n=1/0,i){if(t=Math.floor(t),r=Math.floor(Math.max(0,r)),n=Math.floor(Math.min(e.length-1,n)),!(r<=t&&t<=n))return e;for(i=i===void 0?oS:z5(i);n>r;){if(n-r>600){const c=n-r+1,d=t-r+1,u=Math.log(c),f=.5*Math.exp(2*u/3),p=.5*Math.sqrt(u*f*(c-f)/c)*(d-c/2<0?-1:1),m=Math.max(r,Math.floor(t-d*f/c+p)),x=Math.min(n,Math.floor(t+(c-d)*f/c+p));lS(e,t,m,x,i)}const s=e[t];let o=r,l=n;for(Va(e,r,t),i(e[n],s)>0&&Va(e,r,n);o0;)--l}i(e[r],s)===0?Va(e,r,l):(++l,Va(e,l,n)),l<=t&&(r=l+1),t<=l&&(n=l-1)}return e}function Va(e,t,r){const n=e[t];e[t]=e[r],e[r]=n}function F5(e,t,r){if(e=Float64Array.from(T5(e)),!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return B0(e);if(t>=1)return R0(e);var n,i=(n-1)*t,s=Math.floor(i),o=R0(lS(e,s).subarray(0,s+1)),l=B0(e.subarray(s+1));return o+(l-o)*(i-s)}}function U5(e,t,r=sS){if(!(!(n=e.length)||isNaN(t=+t))){if(t<=0||n<2)return+r(e[0],0,e);if(t>=1)return+r(e[n-1],n-1,e);var n,i=(n-1)*t,s=Math.floor(i),o=+r(e[s],s,e),l=+r(e[s+1],s+1,e);return o+(l-o)*(i-s)}}function q5(e,t,r){e=+e,t=+t,r=(i=arguments.length)<2?(t=e,e=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((t-e)/r))|0,s=new Array(i);++n>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):r===8?Uo(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):r===4?Uo(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=V5.exec(e))?new Nt(t[1],t[2],t[3],1):(t=Y5.exec(e))?new Nt(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=G5.exec(e))?Uo(t[1],t[2],t[3],t[4]):(t=Z5.exec(e))?Uo(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=X5.exec(e))?V0(t[1],t[2]/100,t[3]/100,1):(t=J5.exec(e))?V0(t[1],t[2]/100,t[3]/100,t[4]):W0.hasOwnProperty(e)?q0(W0[e]):e==="transparent"?new Nt(NaN,NaN,NaN,0):null}function q0(e){return new Nt(e>>16&255,e>>8&255,e&255,1)}function Uo(e,t,r,n){return n<=0&&(e=t=r=NaN),new Nt(e,t,r,n)}function tD(e){return e instanceof io||(e=Ws(e)),e?(e=e.rgb(),new Nt(e.r,e.g,e.b,e.opacity)):new Nt}function ap(e,t,r,n){return arguments.length===1?tD(e):new Nt(e,t,r,n??1)}function Nt(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}am(Nt,ap,uS(io,{brighter(e){return e=e==null?ac:Math.pow(ac,e),new Nt(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?Rs:Math.pow(Rs,e),new Nt(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Nt(ui(this.r),ui(this.g),ui(this.b),sc(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:H0,formatHex:H0,formatHex8:rD,formatRgb:K0,toString:K0}));function H0(){return`#${ni(this.r)}${ni(this.g)}${ni(this.b)}`}function rD(){return`#${ni(this.r)}${ni(this.g)}${ni(this.b)}${ni((isNaN(this.opacity)?1:this.opacity)*255)}`}function K0(){const e=sc(this.opacity);return`${e===1?"rgb(":"rgba("}${ui(this.r)}, ${ui(this.g)}, ${ui(this.b)}${e===1?")":`, ${e})`}`}function sc(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function ui(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function ni(e){return e=ui(e),(e<16?"0":"")+e.toString(16)}function V0(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new pr(e,t,r,n)}function dS(e){if(e instanceof pr)return new pr(e.h,e.s,e.l,e.opacity);if(e instanceof io||(e=Ws(e)),!e)return new pr;if(e instanceof pr)return e;e=e.rgb();var t=e.r/255,r=e.g/255,n=e.b/255,i=Math.min(t,r,n),s=Math.max(t,r,n),o=NaN,l=s-i,c=(s+i)/2;return l?(t===s?o=(r-n)/l+(r0&&c<1?0:o,new pr(o,l,c,e.opacity)}function nD(e,t,r,n){return arguments.length===1?dS(e):new pr(e,t,r,n??1)}function pr(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}am(pr,nD,uS(io,{brighter(e){return e=e==null?ac:Math.pow(ac,e),new pr(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?Rs:Math.pow(Rs,e),new pr(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,i=2*r-n;return new Nt(vd(e>=240?e-240:e+120,i,n),vd(e,i,n),vd(e<120?e+240:e-120,i,n),this.opacity)},clamp(){return new pr(Y0(this.h),qo(this.s),qo(this.l),sc(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=sc(this.opacity);return`${e===1?"hsl(":"hsla("}${Y0(this.h)}, ${qo(this.s)*100}%, ${qo(this.l)*100}%${e===1?")":`, ${e})`}`}}));function Y0(e){return e=(e||0)%360,e<0?e+360:e}function qo(e){return Math.max(0,Math.min(1,e||0))}function vd(e,t,r){return(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)*255}const sm=e=>()=>e;function iD(e,t){return function(r){return e+r*t}}function aD(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}function sD(e){return(e=+e)==1?fS:function(t,r){return r-t?aD(t,r,e):sm(isNaN(t)?r:t)}}function fS(e,t){var r=t-e;return r?iD(e,r):sm(isNaN(e)?t:e)}const G0=function e(t){var r=sD(t);function n(i,s){var o=r((i=ap(i)).r,(s=ap(s)).r),l=r(i.g,s.g),c=r(i.b,s.b),d=fS(i.opacity,s.opacity);return function(u){return i.r=o(u),i.g=l(u),i.b=c(u),i.opacity=d(u),i+""}}return n.gamma=e,n}(1);function oD(e,t){t||(t=[]);var r=e?Math.min(t.length,e.length):0,n=t.slice(),i;return function(s){for(i=0;ir&&(s=t.slice(r,s),l[o]?l[o]+=s:l[++o]=s),(n=n[0])===(i=i[0])?l[o]?l[o]+=i:l[++o]=i:(l[++o]=null,c.push({i:o,x:oc(n,i)})),r=bd.lastIndex;return rt&&(r=e,e=t,t=r),function(n){return Math.max(e,Math.min(t,n))}}function yD(e,t,r){var n=e[0],i=e[1],s=t[0],o=t[1];return i2?vD:yD,c=d=null,f}function f(p){return p==null||isNaN(p=+p)?s:(c||(c=l(e.map(n),t,r)))(n(o(p)))}return f.invert=function(p){return o(i((d||(d=l(t,e.map(n),oc)))(p)))},f.domain=function(p){return arguments.length?(e=Array.from(p,lc),u()):e.slice()},f.range=function(p){return arguments.length?(t=Array.from(p),u()):t.slice()},f.rangeRound=function(p){return t=Array.from(p),r=om,u()},f.clamp=function(p){return arguments.length?(o=p?!0:mt,u()):o!==mt},f.interpolate=function(p){return arguments.length?(r=p,u()):r},f.unknown=function(p){return arguments.length?(s=p,f):s},function(p,m){return n=p,i=m,u()}}function lm(){return xu()(mt,mt)}function bD(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)}function cc(e,t){if((r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"))<0)return null;var r,n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function xa(e){return e=cc(Math.abs(e)),e?e[1]:NaN}function jD(e,t){return function(r,n){for(var i=r.length,s=[],o=0,l=e[0],c=0;i>0&&l>0&&(c+l+1>n&&(l=Math.max(1,n-c)),s.push(r.substring(i-=l,i+l)),!((c+=l+1)>n));)l=e[o=(o+1)%e.length];return s.reverse().join(t)}}function wD(e){return function(t){return t.replace(/[0-9]/g,function(r){return e[+r]})}}var SD=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Fs(e){if(!(t=SD.exec(e)))throw new Error("invalid format: "+e);var t;return new cm({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}Fs.prototype=cm.prototype;function cm(e){this.fill=e.fill===void 0?" ":e.fill+"",this.align=e.align===void 0?">":e.align+"",this.sign=e.sign===void 0?"-":e.sign+"",this.symbol=e.symbol===void 0?"":e.symbol+"",this.zero=!!e.zero,this.width=e.width===void 0?void 0:+e.width,this.comma=!!e.comma,this.precision=e.precision===void 0?void 0:+e.precision,this.trim=!!e.trim,this.type=e.type===void 0?"":e.type+""}cm.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function ND(e){e:for(var t=e.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?e.slice(0,n)+e.slice(i+1):e}var pS;function kD(e,t){var r=cc(e,t);if(!r)return e+"";var n=r[0],i=r[1],s=i-(pS=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,o=n.length;return s===o?n:s>o?n+new Array(s-o+1).join("0"):s>0?n.slice(0,s)+"."+n.slice(s):"0."+new Array(1-s).join("0")+cc(e,Math.max(0,t+s-1))[0]}function X0(e,t){var r=cc(e,t);if(!r)return e+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}const J0={"%":(e,t)=>(e*100).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:bD,e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>X0(e*100,t),r:X0,s:kD,X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function Q0(e){return e}var ey=Array.prototype.map,ty=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function _D(e){var t=e.grouping===void 0||e.thousands===void 0?Q0:jD(ey.call(e.grouping,Number),e.thousands+""),r=e.currency===void 0?"":e.currency[0]+"",n=e.currency===void 0?"":e.currency[1]+"",i=e.decimal===void 0?".":e.decimal+"",s=e.numerals===void 0?Q0:wD(ey.call(e.numerals,String)),o=e.percent===void 0?"%":e.percent+"",l=e.minus===void 0?"−":e.minus+"",c=e.nan===void 0?"NaN":e.nan+"";function d(f){f=Fs(f);var p=f.fill,m=f.align,x=f.sign,g=f.symbol,b=f.zero,v=f.width,j=f.comma,y=f.precision,w=f.trim,S=f.type;S==="n"?(j=!0,S="g"):J0[S]||(y===void 0&&(y=12),w=!0,S="g"),(b||p==="0"&&m==="=")&&(b=!0,p="0",m="=");var N=g==="$"?r:g==="#"&&/[boxX]/.test(S)?"0"+S.toLowerCase():"",_=g==="$"?n:/[%p]/.test(S)?o:"",P=J0[S],D=/[defgprs%]/.test(S);y=y===void 0?6:/[gprs]/.test(S)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y));function M(I){var C=N,B=_,q,Z,A;if(S==="c")B=P(I)+B,I="";else{I=+I;var T=I<0||1/I<0;if(I=isNaN(I)?c:P(Math.abs(I),y),w&&(I=ND(I)),T&&+I==0&&x!=="+"&&(T=!1),C=(T?x==="("?x:l:x==="-"||x==="("?"":x)+C,B=(S==="s"?ty[8+pS/3]:"")+B+(T&&x==="("?")":""),D){for(q=-1,Z=I.length;++qA||A>57){B=(A===46?i+I.slice(q+1):I.slice(q))+B,I=I.slice(0,q);break}}}j&&!b&&(I=t(I,1/0));var O=C.length+I.length+B.length,k=O>1)+C+I+B+k.slice(O);break;default:I=k+C+I+B;break}return s(I)}return M.toString=function(){return f+""},M}function u(f,p){var m=d((f=Fs(f),f.type="f",f)),x=Math.max(-8,Math.min(8,Math.floor(xa(p)/3)))*3,g=Math.pow(10,-x),b=ty[8+x/3];return function(v){return m(g*v)+b}}return{format:d,formatPrefix:u}}var Ho,um,hS;PD({thousands:",",grouping:[3],currency:["$",""]});function PD(e){return Ho=_D(e),um=Ho.format,hS=Ho.formatPrefix,Ho}function CD(e){return Math.max(0,-xa(Math.abs(e)))}function AD(e,t){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(xa(t)/3)))*3-xa(Math.abs(e)))}function OD(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,xa(t)-xa(e))+1}function mS(e,t,r,n){var i=np(e,t,r),s;switch(n=Fs(n??",f"),n.type){case"s":{var o=Math.max(Math.abs(e),Math.abs(t));return n.precision==null&&!isNaN(s=AD(i,o))&&(n.precision=s),hS(n,o)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(s=OD(i,Math.max(Math.abs(e),Math.abs(t))))&&(n.precision=s-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(s=CD(i))&&(n.precision=s-(n.type==="%")*2);break}}return um(n)}function qn(e){var t=e.domain;return e.ticks=function(r){var n=t();return tp(n[0],n[n.length-1],r??10)},e.tickFormat=function(r,n){var i=t();return mS(i[0],i[i.length-1],r??10,n)},e.nice=function(r){r==null&&(r=10);var n=t(),i=0,s=n.length-1,o=n[i],l=n[s],c,d,u=10;for(l0;){if(d=rp(o,l,r),d===c)return n[i]=o,n[s]=l,t(n);if(d>0)o=Math.floor(o/d)*d,l=Math.ceil(l/d)*d;else if(d<0)o=Math.ceil(o*d)/d,l=Math.floor(l*d)/d;else break;c=d}return e},e}function gS(){var e=lm();return e.copy=function(){return ao(e,gS())},or.apply(e,arguments),qn(e)}function xS(e){var t;function r(n){return n==null||isNaN(n=+n)?t:n}return r.invert=r,r.domain=r.range=function(n){return arguments.length?(e=Array.from(n,lc),r):e.slice()},r.unknown=function(n){return arguments.length?(t=n,r):t},r.copy=function(){return xS(e).unknown(t)},e=arguments.length?Array.from(e,lc):[0,1],qn(r)}function yS(e,t){e=e.slice();var r=0,n=e.length-1,i=e[r],s=e[n],o;return sMath.pow(e,t)}function ID(e){return e===Math.E?Math.log:e===10&&Math.log10||e===2&&Math.log2||(e=Math.log(e),t=>Math.log(t)/e)}function iy(e){return(t,r)=>-e(-t,r)}function dm(e){const t=e(ry,ny),r=t.domain;let n=10,i,s;function o(){return i=ID(n),s=MD(n),r()[0]<0?(i=iy(i),s=iy(s),e(ED,DD)):e(ry,ny),t}return t.base=function(l){return arguments.length?(n=+l,o()):n},t.domain=function(l){return arguments.length?(r(l),o()):r()},t.ticks=l=>{const c=r();let d=c[0],u=c[c.length-1];const f=u0){for(;p<=m;++p)for(x=1;xu)break;v.push(g)}}else for(;p<=m;++p)for(x=n-1;x>=1;--x)if(g=p>0?x/s(-p):x*s(p),!(gu)break;v.push(g)}v.length*2{if(l==null&&(l=10),c==null&&(c=n===10?"s":","),typeof c!="function"&&(!(n%1)&&(c=Fs(c)).precision==null&&(c.trim=!0),c=um(c)),l===1/0)return c;const d=Math.max(1,n*l/t.ticks().length);return u=>{let f=u/s(Math.round(i(u)));return f*nr(yS(r(),{floor:l=>s(Math.floor(i(l))),ceil:l=>s(Math.ceil(i(l)))})),t}function vS(){const e=dm(xu()).domain([1,10]);return e.copy=()=>ao(e,vS()).base(e.base()),or.apply(e,arguments),e}function ay(e){return function(t){return Math.sign(t)*Math.log1p(Math.abs(t/e))}}function sy(e){return function(t){return Math.sign(t)*Math.expm1(Math.abs(t))*e}}function fm(e){var t=1,r=e(ay(t),sy(t));return r.constant=function(n){return arguments.length?e(ay(t=+n),sy(t)):t},qn(r)}function bS(){var e=fm(xu());return e.copy=function(){return ao(e,bS()).constant(e.constant())},or.apply(e,arguments)}function oy(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function $D(e){return e<0?-Math.sqrt(-e):Math.sqrt(e)}function LD(e){return e<0?-e*e:e*e}function pm(e){var t=e(mt,mt),r=1;function n(){return r===1?e(mt,mt):r===.5?e($D,LD):e(oy(r),oy(1/r))}return t.exponent=function(i){return arguments.length?(r=+i,n()):r},qn(t)}function hm(){var e=pm(xu());return e.copy=function(){return ao(e,hm()).exponent(e.exponent())},or.apply(e,arguments),e}function zD(){return hm.apply(null,arguments).exponent(.5)}function ly(e){return Math.sign(e)*e*e}function RD(e){return Math.sign(e)*Math.sqrt(Math.abs(e))}function jS(){var e=lm(),t=[0,1],r=!1,n;function i(s){var o=RD(e(s));return isNaN(o)?n:r?Math.round(o):o}return i.invert=function(s){return e.invert(ly(s))},i.domain=function(s){return arguments.length?(e.domain(s),i):e.domain()},i.range=function(s){return arguments.length?(e.range((t=Array.from(s,lc)).map(ly)),i):t.slice()},i.rangeRound=function(s){return i.range(s).round(!0)},i.round=function(s){return arguments.length?(r=!!s,i):r},i.clamp=function(s){return arguments.length?(e.clamp(s),i):e.clamp()},i.unknown=function(s){return arguments.length?(n=s,i):n},i.copy=function(){return jS(e.domain(),t).round(r).clamp(e.clamp()).unknown(n)},or.apply(i,arguments),qn(i)}function wS(){var e=[],t=[],r=[],n;function i(){var o=0,l=Math.max(1,t.length);for(r=new Array(l-1);++o0?r[l-1]:e[0],l=r?[n[r-1],t]:[n[d-1],n[d]]},o.unknown=function(c){return arguments.length&&(s=c),o},o.thresholds=function(){return n.slice()},o.copy=function(){return SS().domain([e,t]).range(i).unknown(s)},or.apply(qn(o),arguments)}function NS(){var e=[.5],t=[0,1],r,n=1;function i(s){return s!=null&&s<=s?t[no(e,s,0,n)]:r}return i.domain=function(s){return arguments.length?(e=Array.from(s),n=Math.min(e.length,t.length-1),i):e.slice()},i.range=function(s){return arguments.length?(t=Array.from(s),n=Math.min(e.length,t.length-1),i):t.slice()},i.invertExtent=function(s){var o=t.indexOf(s);return[e[o-1],e[o]]},i.unknown=function(s){return arguments.length?(r=s,i):r},i.copy=function(){return NS().domain(e).range(t).unknown(r)},or.apply(i,arguments)}const jd=new Date,wd=new Date;function Be(e,t,r,n){function i(s){return e(s=arguments.length===0?new Date:new Date(+s)),s}return i.floor=s=>(e(s=new Date(+s)),s),i.ceil=s=>(e(s=new Date(s-1)),t(s,1),e(s),s),i.round=s=>{const o=i(s),l=i.ceil(s);return s-o(t(s=new Date(+s),o==null?1:Math.floor(o)),s),i.range=(s,o,l)=>{const c=[];if(s=i.ceil(s),l=l==null?1:Math.floor(l),!(s0))return c;let d;do c.push(d=new Date(+s)),t(s,l),e(s);while(dBe(o=>{if(o>=o)for(;e(o),!s(o);)o.setTime(o-1)},(o,l)=>{if(o>=o)if(l<0)for(;++l<=0;)for(;t(o,-1),!s(o););else for(;--l>=0;)for(;t(o,1),!s(o););}),r&&(i.count=(s,o)=>(jd.setTime(+s),wd.setTime(+o),e(jd),e(wd),Math.floor(r(jd,wd))),i.every=s=>(s=Math.floor(s),!isFinite(s)||!(s>0)?null:s>1?i.filter(n?o=>n(o)%s===0:o=>i.count(0,o)%s===0):i)),i}const uc=Be(()=>{},(e,t)=>{e.setTime(+e+t)},(e,t)=>t-e);uc.every=e=>(e=Math.floor(e),!isFinite(e)||!(e>0)?null:e>1?Be(t=>{t.setTime(Math.floor(t/e)*e)},(t,r)=>{t.setTime(+t+r*e)},(t,r)=>(r-t)/e):uc);uc.range;const Fr=1e3,Qt=Fr*60,Ur=Qt*60,tn=Ur*24,mm=tn*7,cy=tn*30,Sd=tn*365,ii=Be(e=>{e.setTime(e-e.getMilliseconds())},(e,t)=>{e.setTime(+e+t*Fr)},(e,t)=>(t-e)/Fr,e=>e.getUTCSeconds());ii.range;const gm=Be(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*Fr)},(e,t)=>{e.setTime(+e+t*Qt)},(e,t)=>(t-e)/Qt,e=>e.getMinutes());gm.range;const xm=Be(e=>{e.setUTCSeconds(0,0)},(e,t)=>{e.setTime(+e+t*Qt)},(e,t)=>(t-e)/Qt,e=>e.getUTCMinutes());xm.range;const ym=Be(e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*Fr-e.getMinutes()*Qt)},(e,t)=>{e.setTime(+e+t*Ur)},(e,t)=>(t-e)/Ur,e=>e.getHours());ym.range;const vm=Be(e=>{e.setUTCMinutes(0,0,0)},(e,t)=>{e.setTime(+e+t*Ur)},(e,t)=>(t-e)/Ur,e=>e.getUTCHours());vm.range;const so=Be(e=>e.setHours(0,0,0,0),(e,t)=>e.setDate(e.getDate()+t),(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*Qt)/tn,e=>e.getDate()-1);so.range;const yu=Be(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/tn,e=>e.getUTCDate()-1);yu.range;const kS=Be(e=>{e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t)},(e,t)=>(t-e)/tn,e=>Math.floor(e/tn));kS.range;function Ai(e){return Be(t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)},(t,r)=>{t.setDate(t.getDate()+r*7)},(t,r)=>(r-t-(r.getTimezoneOffset()-t.getTimezoneOffset())*Qt)/mm)}const vu=Ai(0),dc=Ai(1),BD=Ai(2),WD=Ai(3),ya=Ai(4),FD=Ai(5),UD=Ai(6);vu.range;dc.range;BD.range;WD.range;ya.range;FD.range;UD.range;function Oi(e){return Be(t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCDate(t.getUTCDate()+r*7)},(t,r)=>(r-t)/mm)}const bu=Oi(0),fc=Oi(1),qD=Oi(2),HD=Oi(3),va=Oi(4),KD=Oi(5),VD=Oi(6);bu.range;fc.range;qD.range;HD.range;va.range;KD.range;VD.range;const bm=Be(e=>{e.setDate(1),e.setHours(0,0,0,0)},(e,t)=>{e.setMonth(e.getMonth()+t)},(e,t)=>t.getMonth()-e.getMonth()+(t.getFullYear()-e.getFullYear())*12,e=>e.getMonth());bm.range;const jm=Be(e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)},(e,t)=>t.getUTCMonth()-e.getUTCMonth()+(t.getUTCFullYear()-e.getUTCFullYear())*12,e=>e.getUTCMonth());jm.range;const rn=Be(e=>{e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t)},(e,t)=>t.getFullYear()-e.getFullYear(),e=>e.getFullYear());rn.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Be(t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)},(t,r)=>{t.setFullYear(t.getFullYear()+r*e)});rn.range;const nn=Be(e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)},(e,t)=>t.getUTCFullYear()-e.getUTCFullYear(),e=>e.getUTCFullYear());nn.every=e=>!isFinite(e=Math.floor(e))||!(e>0)?null:Be(t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)});nn.range;function _S(e,t,r,n,i,s){const o=[[ii,1,Fr],[ii,5,5*Fr],[ii,15,15*Fr],[ii,30,30*Fr],[s,1,Qt],[s,5,5*Qt],[s,15,15*Qt],[s,30,30*Qt],[i,1,Ur],[i,3,3*Ur],[i,6,6*Ur],[i,12,12*Ur],[n,1,tn],[n,2,2*tn],[r,1,mm],[t,1,cy],[t,3,3*cy],[e,1,Sd]];function l(d,u,f){const p=ub).right(o,p);if(m===o.length)return e.every(np(d/Sd,u/Sd,f));if(m===0)return uc.every(Math.max(np(d,u,f),1));const[x,g]=o[p/o[m-1][2]53)return null;"w"in U||(U.w=1),"Z"in U?(pe=kd(Ya(U.y,0,1)),Et=pe.getUTCDay(),pe=Et>4||Et===0?fc.ceil(pe):fc(pe),pe=yu.offset(pe,(U.V-1)*7),U.y=pe.getUTCFullYear(),U.m=pe.getUTCMonth(),U.d=pe.getUTCDate()+(U.w+6)%7):(pe=Nd(Ya(U.y,0,1)),Et=pe.getDay(),pe=Et>4||Et===0?dc.ceil(pe):dc(pe),pe=so.offset(pe,(U.V-1)*7),U.y=pe.getFullYear(),U.m=pe.getMonth(),U.d=pe.getDate()+(U.w+6)%7)}else("W"in U||"U"in U)&&("w"in U||(U.w="u"in U?U.u%7:"W"in U?1:0),Et="Z"in U?kd(Ya(U.y,0,1)).getUTCDay():Nd(Ya(U.y,0,1)).getDay(),U.m=0,U.d="W"in U?(U.w+6)%7+U.W*7-(Et+5)%7:U.w+U.U*7-(Et+6)%7);return"Z"in U?(U.H+=U.Z/100|0,U.M+=U.Z%100,kd(U)):Nd(U)}}function P(R,te,ne,U){for(var bt=0,pe=te.length,Et=ne.length,Dt,Yn;bt=Et)return-1;if(Dt=te.charCodeAt(bt++),Dt===37){if(Dt=te.charAt(bt++),Yn=S[Dt in uy?te.charAt(bt++):Dt],!Yn||(U=Yn(R,ne,U))<0)return-1}else if(Dt!=ne.charCodeAt(U++))return-1}return U}function D(R,te,ne){var U=d.exec(te.slice(ne));return U?(R.p=u.get(U[0].toLowerCase()),ne+U[0].length):-1}function M(R,te,ne){var U=m.exec(te.slice(ne));return U?(R.w=x.get(U[0].toLowerCase()),ne+U[0].length):-1}function I(R,te,ne){var U=f.exec(te.slice(ne));return U?(R.w=p.get(U[0].toLowerCase()),ne+U[0].length):-1}function C(R,te,ne){var U=v.exec(te.slice(ne));return U?(R.m=j.get(U[0].toLowerCase()),ne+U[0].length):-1}function B(R,te,ne){var U=g.exec(te.slice(ne));return U?(R.m=b.get(U[0].toLowerCase()),ne+U[0].length):-1}function q(R,te,ne){return P(R,t,te,ne)}function Z(R,te,ne){return P(R,r,te,ne)}function A(R,te,ne){return P(R,n,te,ne)}function T(R){return o[R.getDay()]}function O(R){return s[R.getDay()]}function k(R){return c[R.getMonth()]}function L(R){return l[R.getMonth()]}function W(R){return i[+(R.getHours()>=12)]}function H(R){return 1+~~(R.getMonth()/3)}function ee(R){return o[R.getUTCDay()]}function re(R){return s[R.getUTCDay()]}function Me(R){return c[R.getUTCMonth()]}function E(R){return l[R.getUTCMonth()]}function J(R){return i[+(R.getUTCHours()>=12)]}function Ot(R){return 1+~~(R.getUTCMonth()/3)}return{format:function(R){var te=N(R+="",y);return te.toString=function(){return R},te},parse:function(R){var te=_(R+="",!1);return te.toString=function(){return R},te},utcFormat:function(R){var te=N(R+="",w);return te.toString=function(){return R},te},utcParse:function(R){var te=_(R+="",!0);return te.toString=function(){return R},te}}}var uy={"-":"",_:" ",0:"0"},Ge=/^\s*\d+/,QD=/^%/,eT=/[\\^$*+?|[\]().{}]/g;function se(e,t,r){var n=e<0?"-":"",i=(n?-e:e)+"",s=i.length;return n+(s[t.toLowerCase(),r]))}function rT(e,t,r){var n=Ge.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function nT(e,t,r){var n=Ge.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function iT(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function aT(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function sT(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function dy(e,t,r){var n=Ge.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function fy(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function oT(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function lT(e,t,r){var n=Ge.exec(t.slice(r,r+1));return n?(e.q=n[0]*3-3,r+n[0].length):-1}function cT(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function py(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function uT(e,t,r){var n=Ge.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function hy(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function dT(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function fT(e,t,r){var n=Ge.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function pT(e,t,r){var n=Ge.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function hT(e,t,r){var n=Ge.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function mT(e,t,r){var n=QD.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function gT(e,t,r){var n=Ge.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function xT(e,t,r){var n=Ge.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function my(e,t){return se(e.getDate(),t,2)}function yT(e,t){return se(e.getHours(),t,2)}function vT(e,t){return se(e.getHours()%12||12,t,2)}function bT(e,t){return se(1+so.count(rn(e),e),t,3)}function PS(e,t){return se(e.getMilliseconds(),t,3)}function jT(e,t){return PS(e,t)+"000"}function wT(e,t){return se(e.getMonth()+1,t,2)}function ST(e,t){return se(e.getMinutes(),t,2)}function NT(e,t){return se(e.getSeconds(),t,2)}function kT(e){var t=e.getDay();return t===0?7:t}function _T(e,t){return se(vu.count(rn(e)-1,e),t,2)}function CS(e){var t=e.getDay();return t>=4||t===0?ya(e):ya.ceil(e)}function PT(e,t){return e=CS(e),se(ya.count(rn(e),e)+(rn(e).getDay()===4),t,2)}function CT(e){return e.getDay()}function AT(e,t){return se(dc.count(rn(e)-1,e),t,2)}function OT(e,t){return se(e.getFullYear()%100,t,2)}function ET(e,t){return e=CS(e),se(e.getFullYear()%100,t,2)}function DT(e,t){return se(e.getFullYear()%1e4,t,4)}function TT(e,t){var r=e.getDay();return e=r>=4||r===0?ya(e):ya.ceil(e),se(e.getFullYear()%1e4,t,4)}function MT(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+se(t/60|0,"0",2)+se(t%60,"0",2)}function gy(e,t){return se(e.getUTCDate(),t,2)}function IT(e,t){return se(e.getUTCHours(),t,2)}function $T(e,t){return se(e.getUTCHours()%12||12,t,2)}function LT(e,t){return se(1+yu.count(nn(e),e),t,3)}function AS(e,t){return se(e.getUTCMilliseconds(),t,3)}function zT(e,t){return AS(e,t)+"000"}function RT(e,t){return se(e.getUTCMonth()+1,t,2)}function BT(e,t){return se(e.getUTCMinutes(),t,2)}function WT(e,t){return se(e.getUTCSeconds(),t,2)}function FT(e){var t=e.getUTCDay();return t===0?7:t}function UT(e,t){return se(bu.count(nn(e)-1,e),t,2)}function OS(e){var t=e.getUTCDay();return t>=4||t===0?va(e):va.ceil(e)}function qT(e,t){return e=OS(e),se(va.count(nn(e),e)+(nn(e).getUTCDay()===4),t,2)}function HT(e){return e.getUTCDay()}function KT(e,t){return se(fc.count(nn(e)-1,e),t,2)}function VT(e,t){return se(e.getUTCFullYear()%100,t,2)}function YT(e,t){return e=OS(e),se(e.getUTCFullYear()%100,t,2)}function GT(e,t){return se(e.getUTCFullYear()%1e4,t,4)}function ZT(e,t){var r=e.getUTCDay();return e=r>=4||r===0?va(e):va.ceil(e),se(e.getUTCFullYear()%1e4,t,4)}function XT(){return"+0000"}function xy(){return"%"}function yy(e){return+e}function vy(e){return Math.floor(+e/1e3)}var Di,ES,DS;JT({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function JT(e){return Di=JD(e),ES=Di.format,Di.parse,DS=Di.utcFormat,Di.utcParse,Di}function QT(e){return new Date(e)}function eM(e){return e instanceof Date?+e:+new Date(+e)}function wm(e,t,r,n,i,s,o,l,c,d){var u=lm(),f=u.invert,p=u.domain,m=d(".%L"),x=d(":%S"),g=d("%I:%M"),b=d("%I %p"),v=d("%a %d"),j=d("%b %d"),y=d("%B"),w=d("%Y");function S(N){return(c(N)t(i/(e.length-1)))},r.quantiles=function(n){return Array.from({length:n+1},(i,s)=>F5(e,s/n))},r.copy=function(){return $S(t).domain(e)},un.apply(r,arguments)}function wu(){var e=0,t=.5,r=1,n=1,i,s,o,l,c,d=mt,u,f=!1,p;function m(g){return isNaN(g=+g)?p:(g=.5+((g=+u(g))-s)*(n*ge.chartData,aM=$([Kn],e=>{var t=e.chartData!=null?e.chartData.length-1:0;return{chartData:e.chartData,computedData:e.computedData,dataEndIndex:t,dataStartIndex:0}}),Su=(e,t,r,n)=>n?aM(e):Kn(e);function ji(e){if(Array.isArray(e)&&e.length===2){var[t,r]=e;if(_e(t)&&_e(r))return!0}return!1}function by(e,t,r){return r?e:[Math.min(e[0],t[0]),Math.max(e[1],t[1])]}function BS(e,t){if(t&&typeof e!="function"&&Array.isArray(e)&&e.length===2){var[r,n]=e,i,s;if(_e(r))i=r;else if(typeof r=="function")return;if(_e(n))s=n;else if(typeof n=="function")return;var o=[i,s];if(ji(o))return o}}function sM(e,t,r){if(!(!r&&t==null)){if(typeof e=="function"&&t!=null)try{var n=e(t,r);if(ji(n))return by(n,t,r)}catch{}if(Array.isArray(e)&&e.length===2){var[i,s]=e,o,l;if(i==="auto")t!=null&&(o=Math.min(...t));else if(Y(i))o=i;else if(typeof i=="function")try{t!=null&&(o=i(t==null?void 0:t[0]))}catch{}else if(typeof i=="string"&&c0.test(i)){var c=c0.exec(i);if(c==null||t==null)o=void 0;else{var d=+c[1];o=t[0]-d}}else o=t==null?void 0:t[0];if(s==="auto")t!=null&&(l=Math.max(...t));else if(Y(s))l=s;else if(typeof s=="function")try{t!=null&&(l=s(t==null?void 0:t[1]))}catch{}else if(typeof s=="string"&&u0.test(s)){var u=u0.exec(s);if(u==null||t==null)l=void 0;else{var f=+u[1];l=t[1]+f}}else l=t==null?void 0:t[1];var p=[o,l];if(ji(p))return t==null?p:by(p,t,r)}}}var Aa=1e9,oM={precision:20,rounding:4,toExpNeg:-7,toExpPos:21,LN10:"2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286"},_m,je=!0,sr="[DecimalError] ",di=sr+"Invalid argument: ",km=sr+"Exponent out of range: ",Oa=Math.floor,Qn=Math.pow,lM=/^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,Lt,He=1e7,ye=7,WS=9007199254740991,pc=Oa(WS/ye),V={};V.absoluteValue=V.abs=function(){var e=new this.constructor(this);return e.s&&(e.s=1),e};V.comparedTo=V.cmp=function(e){var t,r,n,i,s=this;if(e=new s.constructor(e),s.s!==e.s)return s.s||-e.s;if(s.e!==e.e)return s.e>e.e^s.s<0?1:-1;for(n=s.d.length,i=e.d.length,t=0,r=ne.d[t]^s.s<0?1:-1;return n===i?0:n>i^s.s<0?1:-1};V.decimalPlaces=V.dp=function(){var e=this,t=e.d.length-1,r=(t-e.e)*ye;if(t=e.d[t],t)for(;t%10==0;t/=10)r--;return r<0?0:r};V.dividedBy=V.div=function(e){return Vr(this,new this.constructor(e))};V.dividedToIntegerBy=V.idiv=function(e){var t=this,r=t.constructor;return fe(Vr(t,new r(e),0,1),r.precision)};V.equals=V.eq=function(e){return!this.cmp(e)};V.exponent=function(){return Te(this)};V.greaterThan=V.gt=function(e){return this.cmp(e)>0};V.greaterThanOrEqualTo=V.gte=function(e){return this.cmp(e)>=0};V.isInteger=V.isint=function(){return this.e>this.d.length-2};V.isNegative=V.isneg=function(){return this.s<0};V.isPositive=V.ispos=function(){return this.s>0};V.isZero=function(){return this.s===0};V.lessThan=V.lt=function(e){return this.cmp(e)<0};V.lessThanOrEqualTo=V.lte=function(e){return this.cmp(e)<1};V.logarithm=V.log=function(e){var t,r=this,n=r.constructor,i=n.precision,s=i+5;if(e===void 0)e=new n(10);else if(e=new n(e),e.s<1||e.eq(Lt))throw Error(sr+"NaN");if(r.s<1)throw Error(sr+(r.s?"NaN":"-Infinity"));return r.eq(Lt)?new n(0):(je=!1,t=Vr(Us(r,s),Us(e,s),s),je=!0,fe(t,i))};V.minus=V.sub=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?qS(t,e):FS(t,(e.s=-e.s,e))};V.modulo=V.mod=function(e){var t,r=this,n=r.constructor,i=n.precision;if(e=new n(e),!e.s)throw Error(sr+"NaN");return r.s?(je=!1,t=Vr(r,e,0,1).times(e),je=!0,r.minus(t)):fe(new n(r),i)};V.naturalExponential=V.exp=function(){return US(this)};V.naturalLogarithm=V.ln=function(){return Us(this)};V.negated=V.neg=function(){var e=new this.constructor(this);return e.s=-e.s||0,e};V.plus=V.add=function(e){var t=this;return e=new t.constructor(e),t.s==e.s?FS(t,e):qS(t,(e.s=-e.s,e))};V.precision=V.sd=function(e){var t,r,n,i=this;if(e!==void 0&&e!==!!e&&e!==1&&e!==0)throw Error(di+e);if(t=Te(i)+1,n=i.d.length-1,r=n*ye+1,n=i.d[n],n){for(;n%10==0;n/=10)r--;for(n=i.d[0];n>=10;n/=10)r++}return e&&t>r?t:r};V.squareRoot=V.sqrt=function(){var e,t,r,n,i,s,o,l=this,c=l.constructor;if(l.s<1){if(!l.s)return new c(0);throw Error(sr+"NaN")}for(e=Te(l),je=!1,i=Math.sqrt(+l),i==0||i==1/0?(t=Nr(l.d),(t.length+e)%2==0&&(t+="0"),i=Math.sqrt(t),e=Oa((e+1)/2)-(e<0||e%2),i==1/0?t="5e"+e:(t=i.toExponential(),t=t.slice(0,t.indexOf("e")+1)+e),n=new c(t)):n=new c(i.toString()),r=c.precision,i=o=r+3;;)if(s=n,n=s.plus(Vr(l,s,o+2)).times(.5),Nr(s.d).slice(0,o)===(t=Nr(n.d)).slice(0,o)){if(t=t.slice(o-3,o+1),i==o&&t=="4999"){if(fe(s,r+1,0),s.times(s).eq(l)){n=s;break}}else if(t!="9999")break;o+=4}return je=!0,fe(n,r)};V.times=V.mul=function(e){var t,r,n,i,s,o,l,c,d,u=this,f=u.constructor,p=u.d,m=(e=new f(e)).d;if(!u.s||!e.s)return new f(0);for(e.s*=u.s,r=u.e+e.e,c=p.length,d=m.length,c=0;){for(t=0,i=c+n;i>n;)l=s[i]+m[n]*p[i-n-1]+t,s[i--]=l%He|0,t=l/He|0;s[i]=(s[i]+t)%He|0}for(;!s[--o];)s.pop();return t?++r:s.shift(),e.d=s,e.e=r,je?fe(e,f.precision):e};V.toDecimalPlaces=V.todp=function(e,t){var r=this,n=r.constructor;return r=new n(r),e===void 0?r:(Dr(e,0,Aa),t===void 0?t=n.rounding:Dr(t,0,8),fe(r,e+Te(r)+1,t))};V.toExponential=function(e,t){var r,n=this,i=n.constructor;return e===void 0?r=wi(n,!0):(Dr(e,0,Aa),t===void 0?t=i.rounding:Dr(t,0,8),n=fe(new i(n),e+1,t),r=wi(n,!0,e+1)),r};V.toFixed=function(e,t){var r,n,i=this,s=i.constructor;return e===void 0?wi(i):(Dr(e,0,Aa),t===void 0?t=s.rounding:Dr(t,0,8),n=fe(new s(i),e+Te(i)+1,t),r=wi(n.abs(),!1,e+Te(n)+1),i.isneg()&&!i.isZero()?"-"+r:r)};V.toInteger=V.toint=function(){var e=this,t=e.constructor;return fe(new t(e),Te(e)+1,t.rounding)};V.toNumber=function(){return+this};V.toPower=V.pow=function(e){var t,r,n,i,s,o,l=this,c=l.constructor,d=12,u=+(e=new c(e));if(!e.s)return new c(Lt);if(l=new c(l),!l.s){if(e.s<1)throw Error(sr+"Infinity");return l}if(l.eq(Lt))return l;if(n=c.precision,e.eq(Lt))return fe(l,n);if(t=e.e,r=e.d.length-1,o=t>=r,s=l.s,o){if((r=u<0?-u:u)<=WS){for(i=new c(Lt),t=Math.ceil(n/ye+4),je=!1;r%2&&(i=i.times(l),wy(i.d,t)),r=Oa(r/2),r!==0;)l=l.times(l),wy(l.d,t);return je=!0,e.s<0?new c(Lt).div(i):fe(i,n)}}else if(s<0)throw Error(sr+"NaN");return s=s<0&&e.d[Math.max(t,r)]&1?-1:1,l.s=1,je=!1,i=e.times(Us(l,n+d)),je=!0,i=US(i),i.s=s,i};V.toPrecision=function(e,t){var r,n,i=this,s=i.constructor;return e===void 0?(r=Te(i),n=wi(i,r<=s.toExpNeg||r>=s.toExpPos)):(Dr(e,1,Aa),t===void 0?t=s.rounding:Dr(t,0,8),i=fe(new s(i),e,t),r=Te(i),n=wi(i,e<=r||r<=s.toExpNeg,e)),n};V.toSignificantDigits=V.tosd=function(e,t){var r=this,n=r.constructor;return e===void 0?(e=n.precision,t=n.rounding):(Dr(e,1,Aa),t===void 0?t=n.rounding:Dr(t,0,8)),fe(new n(r),e,t)};V.toString=V.valueOf=V.val=V.toJSON=V[Symbol.for("nodejs.util.inspect.custom")]=function(){var e=this,t=Te(e),r=e.constructor;return wi(e,t<=r.toExpNeg||t>=r.toExpPos)};function FS(e,t){var r,n,i,s,o,l,c,d,u=e.constructor,f=u.precision;if(!e.s||!t.s)return t.s||(t=new u(e)),je?fe(t,f):t;if(c=e.d,d=t.d,o=e.e,i=t.e,c=c.slice(),s=o-i,s){for(s<0?(n=c,s=-s,l=d.length):(n=d,i=o,l=c.length),o=Math.ceil(f/ye),l=o>l?o+1:l+1,s>l&&(s=l,n.length=1),n.reverse();s--;)n.push(0);n.reverse()}for(l=c.length,s=d.length,l-s<0&&(s=l,n=d,d=c,c=n),r=0;s;)r=(c[--s]=c[s]+d[s]+r)/He|0,c[s]%=He;for(r&&(c.unshift(r),++i),l=c.length;c[--l]==0;)c.pop();return t.d=c,t.e=i,je?fe(t,f):t}function Dr(e,t,r){if(e!==~~e||er)throw Error(di+e)}function Nr(e){var t,r,n,i=e.length-1,s="",o=e[0];if(i>0){for(s+=o,t=1;to?1:-1;else for(l=c=0;li[l]?1:-1;break}return c}function r(n,i,s){for(var o=0;s--;)n[s]-=o,o=n[s]1;)n.shift()}return function(n,i,s,o){var l,c,d,u,f,p,m,x,g,b,v,j,y,w,S,N,_,P,D=n.constructor,M=n.s==i.s?1:-1,I=n.d,C=i.d;if(!n.s)return new D(n);if(!i.s)throw Error(sr+"Division by zero");for(c=n.e-i.e,_=C.length,S=I.length,m=new D(M),x=m.d=[],d=0;C[d]==(I[d]||0);)++d;if(C[d]>(I[d]||0)&&--c,s==null?j=s=D.precision:o?j=s+(Te(n)-Te(i))+1:j=s,j<0)return new D(0);if(j=j/ye+2|0,d=0,_==1)for(u=0,C=C[0],j++;(d1&&(C=e(C,u),I=e(I,u),_=C.length,S=I.length),w=_,g=I.slice(0,_),b=g.length;b<_;)g[b++]=0;P=C.slice(),P.unshift(0),N=C[0],C[1]>=He/2&&++N;do u=0,l=t(C,g,_,b),l<0?(v=g[0],_!=b&&(v=v*He+(g[1]||0)),u=v/N|0,u>1?(u>=He&&(u=He-1),f=e(C,u),p=f.length,b=g.length,l=t(f,g,p,b),l==1&&(u--,r(f,_16)throw Error(km+Te(e));if(!e.s)return new u(Lt);for(je=!1,l=f,o=new u(.03125);e.abs().gte(.1);)e=e.times(o),d+=5;for(n=Math.log(Qn(2,d))/Math.LN10*2+5|0,l+=n,r=i=s=new u(Lt),u.precision=l;;){if(i=fe(i.times(e),l),r=r.times(++c),o=s.plus(Vr(i,r,l)),Nr(o.d).slice(0,l)===Nr(s.d).slice(0,l)){for(;d--;)s=fe(s.times(s),l);return u.precision=f,t==null?(je=!0,fe(s,f)):s}s=o}}function Te(e){for(var t=e.e*ye,r=e.d[0];r>=10;r/=10)t++;return t}function _d(e,t,r){if(t>e.LN10.sd())throw je=!0,r&&(e.precision=r),Error(sr+"LN10 precision limit exceeded");return fe(new e(e.LN10),t)}function xn(e){for(var t="";e--;)t+="0";return t}function Us(e,t){var r,n,i,s,o,l,c,d,u,f=1,p=10,m=e,x=m.d,g=m.constructor,b=g.precision;if(m.s<1)throw Error(sr+(m.s?"NaN":"-Infinity"));if(m.eq(Lt))return new g(0);if(t==null?(je=!1,d=b):d=t,m.eq(10))return t==null&&(je=!0),_d(g,d);if(d+=p,g.precision=d,r=Nr(x),n=r.charAt(0),s=Te(m),Math.abs(s)<15e14){for(;n<7&&n!=1||n==1&&r.charAt(1)>3;)m=m.times(e),r=Nr(m.d),n=r.charAt(0),f++;s=Te(m),n>1?(m=new g("0."+r),s++):m=new g(n+"."+r.slice(1))}else return c=_d(g,d+2,b).times(s+""),m=Us(new g(n+"."+r.slice(1)),d-p).plus(c),g.precision=b,t==null?(je=!0,fe(m,b)):m;for(l=o=m=Vr(m.minus(Lt),m.plus(Lt),d),u=fe(m.times(m),d),i=3;;){if(o=fe(o.times(u),d),c=l.plus(Vr(o,new g(i),d)),Nr(c.d).slice(0,d)===Nr(l.d).slice(0,d))return l=l.times(2),s!==0&&(l=l.plus(_d(g,d+2,b).times(s+""))),l=Vr(l,new g(f),d),g.precision=b,t==null?(je=!0,fe(l,b)):l;l=c,i+=2}}function jy(e,t){var r,n,i;for((r=t.indexOf("."))>-1&&(t=t.replace(".","")),(n=t.search(/e/i))>0?(r<0&&(r=n),r+=+t.slice(n+1),t=t.substring(0,n)):r<0&&(r=t.length),n=0;t.charCodeAt(n)===48;)++n;for(i=t.length;t.charCodeAt(i-1)===48;)--i;if(t=t.slice(n,i),t){if(i-=n,r=r-n-1,e.e=Oa(r/ye),e.d=[],n=(r+1)%ye,r<0&&(n+=ye),npc||e.e<-pc))throw Error(km+r)}else e.s=0,e.e=0,e.d=[0];return e}function fe(e,t,r){var n,i,s,o,l,c,d,u,f=e.d;for(o=1,s=f[0];s>=10;s/=10)o++;if(n=t-o,n<0)n+=ye,i=t,d=f[u=0];else{if(u=Math.ceil((n+1)/ye),s=f.length,u>=s)return e;for(d=s=f[u],o=1;s>=10;s/=10)o++;n%=ye,i=n-ye+o}if(r!==void 0&&(s=Qn(10,o-i-1),l=d/s%10|0,c=t<0||f[u+1]!==void 0||d%s,c=r<4?(l||c)&&(r==0||r==(e.s<0?3:2)):l>5||l==5&&(r==4||c||r==6&&(n>0?i>0?d/Qn(10,o-i):0:f[u-1])%10&1||r==(e.s<0?8:7))),t<1||!f[0])return c?(s=Te(e),f.length=1,t=t-s-1,f[0]=Qn(10,(ye-t%ye)%ye),e.e=Oa(-t/ye)||0):(f.length=1,f[0]=e.e=e.s=0),e;if(n==0?(f.length=u,s=1,u--):(f.length=u+1,s=Qn(10,ye-n),f[u]=i>0?(d/Qn(10,o-i)%Qn(10,i)|0)*s:0),c)for(;;)if(u==0){(f[0]+=s)==He&&(f[0]=1,++e.e);break}else{if(f[u]+=s,f[u]!=He)break;f[u--]=0,s=1}for(n=f.length;f[--n]===0;)f.pop();if(je&&(e.e>pc||e.e<-pc))throw Error(km+Te(e));return e}function qS(e,t){var r,n,i,s,o,l,c,d,u,f,p=e.constructor,m=p.precision;if(!e.s||!t.s)return t.s?t.s=-t.s:t=new p(e),je?fe(t,m):t;if(c=e.d,f=t.d,n=t.e,d=e.e,c=c.slice(),o=d-n,o){for(u=o<0,u?(r=c,o=-o,l=f.length):(r=f,n=d,l=c.length),i=Math.max(Math.ceil(m/ye),l)+2,o>i&&(o=i,r.length=1),r.reverse(),i=o;i--;)r.push(0);r.reverse()}else{for(i=c.length,l=f.length,u=i0;--i)c[l++]=0;for(i=f.length;i>o;){if(c[--i]0?s=s.charAt(0)+"."+s.slice(1)+xn(n):o>1&&(s=s.charAt(0)+"."+s.slice(1)),s=s+(i<0?"e":"e+")+i):i<0?(s="0."+xn(-i-1)+s,r&&(n=r-o)>0&&(s+=xn(n))):i>=o?(s+=xn(i+1-o),r&&(n=r-i-1)>0&&(s=s+"."+xn(n))):((n=i+1)0&&(i+1===o&&(s+="."),s+=xn(n))),e.s<0?"-"+s:s}function wy(e,t){if(e.length>t)return e.length=t,!0}function HS(e){var t,r,n;function i(s){var o=this;if(!(o instanceof i))return new i(s);if(o.constructor=i,s instanceof i){o.s=s.s,o.e=s.e,o.d=(s=s.d)?s.slice():s;return}if(typeof s=="number"){if(s*0!==0)throw Error(di+s);if(s>0)o.s=1;else if(s<0)s=-s,o.s=-1;else{o.s=0,o.e=0,o.d=[0];return}if(s===~~s&&s<1e7){o.e=0,o.d=[s];return}return jy(o,s.toString())}else if(typeof s!="string")throw Error(di+s);if(s.charCodeAt(0)===45?(s=s.slice(1),o.s=-1):o.s=1,lM.test(s))jy(o,s);else throw Error(di+s)}if(i.prototype=V,i.ROUND_UP=0,i.ROUND_DOWN=1,i.ROUND_CEIL=2,i.ROUND_FLOOR=3,i.ROUND_HALF_UP=4,i.ROUND_HALF_DOWN=5,i.ROUND_HALF_EVEN=6,i.ROUND_HALF_CEIL=7,i.ROUND_HALF_FLOOR=8,i.clone=HS,i.config=i.set=cM,e===void 0&&(e={}),e)for(n=["precision","rounding","toExpNeg","toExpPos","LN10"],t=0;t=i[t+1]&&n<=i[t+2])this[r]=n;else throw Error(di+r+": "+n);if((n=e[r="LN10"])!==void 0)if(n==Math.LN10)this[r]=new this(n);else throw Error(di+r+": "+n);return this}var _m=HS(oM);Lt=new _m(1);const le=_m;var uM=e=>e,KS={},VS=e=>e===KS,Sy=e=>function t(){return arguments.length===0||arguments.length===1&&VS(arguments.length<=0?void 0:arguments[0])?t:e(...arguments)},YS=(e,t)=>e===1?t:Sy(function(){for(var r=arguments.length,n=new Array(r),i=0;io!==KS).length;return s>=e?t(...n):YS(e-s,Sy(function(){for(var o=arguments.length,l=new Array(o),c=0;cVS(u)?l.shift():u);return t(...d,...l)}))}),Nu=e=>YS(e.length,e),lp=(e,t)=>{for(var r=[],n=e;nArray.isArray(t)?t.map(e):Object.keys(t).map(r=>t[r]).map(e)),fM=function(){for(var t=arguments.length,r=new Array(t),n=0;nc(l),s(...arguments))}},cp=e=>Array.isArray(e)?e.reverse():e.split("").reverse().join(""),GS=e=>{var t=null,r=null;return function(){for(var n=arguments.length,i=new Array(n),s=0;s{var c;return o===((c=t)===null||c===void 0?void 0:c[l])})||(t=i,r=e(...i)),r}};function ZS(e){var t;return e===0?t=1:t=Math.floor(new le(e).abs().log(10).toNumber())+1,t}function XS(e,t,r){for(var n=new le(e),i=0,s=[];n.lt(t)&&i<1e5;)s.push(n.toNumber()),n=n.add(r),i++;return s}Nu((e,t,r)=>{var n=+e,i=+t;return n+r*(i-n)});Nu((e,t,r)=>{var n=t-+e;return n=n||1/0,(r-e)/n});Nu((e,t,r)=>{var n=t-+e;return n=n||1/0,Math.max(0,Math.min(1,(r-e)/n))});var JS=e=>{var[t,r]=e,[n,i]=[t,r];return t>r&&([n,i]=[r,t]),[n,i]},QS=(e,t,r)=>{if(e.lte(0))return new le(0);var n=ZS(e.toNumber()),i=new le(10).pow(n),s=e.div(i),o=n!==1?.05:.1,l=new le(Math.ceil(s.div(o).toNumber())).add(r).mul(o),c=l.mul(i);return t?new le(c.toNumber()):new le(Math.ceil(c.toNumber()))},pM=(e,t,r)=>{var n=new le(1),i=new le(e);if(!i.isint()&&r){var s=Math.abs(e);s<1?(n=new le(10).pow(ZS(e)-1),i=new le(Math.floor(i.div(n).toNumber())).mul(n)):s>1&&(i=new le(Math.floor(e)))}else e===0?i=new le(Math.floor((t-1)/2)):r||(i=new le(Math.floor(e)));var o=Math.floor((t-1)/2),l=fM(dM(c=>i.add(new le(c-o).mul(n)).toNumber()),lp);return l(0,t)},e2=function(t,r,n,i){var s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:0;if(!Number.isFinite((r-t)/(n-1)))return{step:new le(0),tickMin:new le(0),tickMax:new le(0)};var o=QS(new le(r).sub(t).div(n-1),i,s),l;t<=0&&r>=0?l=new le(0):(l=new le(t).add(r).div(2),l=l.sub(new le(l).mod(o)));var c=Math.ceil(l.sub(t).div(o).toNumber()),d=Math.ceil(new le(r).sub(l).div(o).toNumber()),u=c+d+1;return u>n?e2(t,r,n,i,s+1):(u0?d+(n-u):d,c=r>0?c:c+(n-u)),{step:o,tickMin:l.sub(new le(c).mul(o)),tickMax:l.add(new le(d).mul(o))})};function hM(e){var[t,r]=e,n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:6,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=Math.max(n,2),[o,l]=JS([t,r]);if(o===-1/0||l===1/0){var c=l===1/0?[o,...lp(0,n-1).map(()=>1/0)]:[...lp(0,n-1).map(()=>-1/0),l];return t>r?cp(c):c}if(o===l)return pM(o,n,i);var{step:d,tickMin:u,tickMax:f}=e2(o,l,s,i,0),p=XS(u,f.add(new le(.1).mul(d)),d);return t>r?cp(p):p}function mM(e,t){var[r,n]=e,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,[s,o]=JS([r,n]);if(s===-1/0||o===1/0)return[r,n];if(s===o)return[s];var l=Math.max(t,2),c=QS(new le(o).sub(s).div(l-1),i,0),d=[...XS(new le(s),new le(o),c),o];return i===!1&&(d=d.map(u=>Math.round(u))),r>n?cp(d):d}var gM=GS(hM),xM=GS(mM),yM=e=>e.rootProps.barCategoryGap,ku=e=>e.rootProps.stackOffset,Pm=e=>e.options.chartName,Cm=e=>e.rootProps.syncId,t2=e=>e.rootProps.syncMethod,Am=e=>e.options.eventEmitter,vM=e=>e.rootProps.baseValue,lt={grid:-100,barBackground:-50,area:100,cursorRectangle:200,bar:300,line:400,axis:500,scatter:600,activeBar:1e3,cursorLine:1100,activeDot:1200,label:2e3},zr={allowDuplicatedCategory:!0,angleAxisId:0,reversed:!1,scale:"auto",tick:!0,type:"category"},$t={allowDataOverflow:!1,allowDuplicatedCategory:!0,radiusAxisId:0,scale:"auto",tick:!0,tickCount:5,type:"number"},_u=(e,t)=>{if(!(!e||!t))return e!=null&&e.reversed?[t[1],t[0]]:t},bM={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:!1,dataKey:void 0,domain:void 0,id:zr.angleAxisId,includeHidden:!1,name:void 0,reversed:zr.reversed,scale:zr.scale,tick:zr.tick,tickCount:void 0,ticks:void 0,type:zr.type,unit:void 0},jM={allowDataOverflow:$t.allowDataOverflow,allowDecimals:!1,allowDuplicatedCategory:$t.allowDuplicatedCategory,dataKey:void 0,domain:void 0,id:$t.radiusAxisId,includeHidden:!1,name:void 0,reversed:!1,scale:$t.scale,tick:$t.tick,tickCount:$t.tickCount,ticks:void 0,type:$t.type,unit:void 0},wM={allowDataOverflow:!1,allowDecimals:!1,allowDuplicatedCategory:zr.allowDuplicatedCategory,dataKey:void 0,domain:void 0,id:zr.angleAxisId,includeHidden:!1,name:void 0,reversed:!1,scale:zr.scale,tick:zr.tick,tickCount:void 0,ticks:void 0,type:"number",unit:void 0},SM={allowDataOverflow:$t.allowDataOverflow,allowDecimals:!1,allowDuplicatedCategory:$t.allowDuplicatedCategory,dataKey:void 0,domain:void 0,id:$t.radiusAxisId,includeHidden:!1,name:void 0,reversed:!1,scale:$t.scale,tick:$t.tick,tickCount:$t.tickCount,ticks:void 0,type:"category",unit:void 0},Om=(e,t)=>e.polarAxis.angleAxis[t]!=null?e.polarAxis.angleAxis[t]:e.layout.layoutType==="radial"?wM:bM,Em=(e,t)=>e.polarAxis.radiusAxis[t]!=null?e.polarAxis.radiusAxis[t]:e.layout.layoutType==="radial"?SM:jM,Pu=e=>e.polarOptions,Dm=$([ln,cn,rt],b5),r2=$([Pu,Dm],(e,t)=>{if(e!=null)return Rn(e.innerRadius,t,0)}),n2=$([Pu,Dm],(e,t)=>{if(e!=null)return Rn(e.outerRadius,t,t*.8)}),NM=e=>{if(e==null)return[0,0];var{startAngle:t,endAngle:r}=e;return[t,r]},i2=$([Pu],NM);$([Om,i2],_u);var a2=$([Dm,r2,n2],(e,t,r)=>{if(!(e==null||t==null||r==null))return[t,r]});$([Em,a2],_u);var s2=$([de,Pu,r2,n2,ln,cn],(e,t,r,n,i,s)=>{if(!(e!=="centric"&&e!=="radial"||t==null||r==null||n==null)){var{cx:o,cy:l,startAngle:c,endAngle:d}=t;return{cx:Rn(o,i,i/2),cy:Rn(l,s,s/2),innerRadius:r,outerRadius:n,startAngle:c,endAngle:d,clockWise:!1}}}),We=(e,t)=>t,Cu=(e,t,r)=>r;function Tm(e){return e==null?void 0:e.id}function o2(e,t,r){var{chartData:n=[]}=t,{allowDuplicatedCategory:i,dataKey:s}=r,o=new Map;return e.forEach(l=>{var c,d=(c=l.data)!==null&&c!==void 0?c:n;if(!(d==null||d.length===0)){var u=Tm(l);d.forEach((f,p)=>{var m=s==null||i?p:String(et(f,s,null)),x=et(f,l.dataKey,0),g;o.has(m)?g=o.get(m):g={},Object.assign(g,{[u]:x}),o.set(m,g)})}}),Array.from(o.values())}function Mm(e){return e.stackId!=null&&e.dataKey!=null}var Au=(e,t)=>e===t?!0:e==null||t==null?!1:e[0]===t[0]&&e[1]===t[1];function Ou(e,t){return Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t}function kM(e,t){if(e.length===t.length){for(var r=0;r{var t=de(e);return t==="horizontal"?"xAxis":t==="vertical"?"yAxis":t==="centric"?"angleAxis":"radiusAxis"},Ea=e=>e.tooltip.settings.axisId;function Ny(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function hc(e){for(var t=1;te.cartesianAxis.xAxis[t],dn=(e,t)=>{var r=l2(e,t);return r??Tt},Mt={allowDataOverflow:!1,allowDecimals:!0,allowDuplicatedCategory:!0,angle:0,dataKey:void 0,domain:up,hide:!0,id:0,includeHidden:!1,interval:"preserveEnd",minTickGap:5,mirror:!1,name:void 0,orientation:"left",padding:{top:0,bottom:0},reversed:!1,scale:"auto",tick:!0,tickCount:5,tickFormatter:void 0,ticks:void 0,type:"number",unit:void 0,width:to},c2=(e,t)=>e.cartesianAxis.yAxis[t],fn=(e,t)=>{var r=c2(e,t);return r??Mt},AM={domain:[0,"auto"],includeHidden:!1,reversed:!1,allowDataOverflow:!1,allowDuplicatedCategory:!1,dataKey:void 0,id:0,name:"",range:[64,64],scale:"auto",type:"number",unit:""},Im=(e,t)=>{var r=e.cartesianAxis.zAxis[t];return r??AM},vt=(e,t,r)=>{switch(t){case"xAxis":return dn(e,r);case"yAxis":return fn(e,r);case"zAxis":return Im(e,r);case"angleAxis":return Om(e,r);case"radiusAxis":return Em(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},OM=(e,t,r)=>{switch(t){case"xAxis":return dn(e,r);case"yAxis":return fn(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},oo=(e,t,r)=>{switch(t){case"xAxis":return dn(e,r);case"yAxis":return fn(e,r);case"angleAxis":return Om(e,r);case"radiusAxis":return Em(e,r);default:throw new Error("Unexpected axis type: ".concat(t))}},u2=e=>e.graphicalItems.cartesianItems.some(t=>t.type==="bar")||e.graphicalItems.polarItems.some(t=>t.type==="radialBar");function d2(e,t){return r=>{switch(e){case"xAxis":return"xAxisId"in r&&r.xAxisId===t;case"yAxis":return"yAxisId"in r&&r.yAxisId===t;case"zAxis":return"zAxisId"in r&&r.zAxisId===t;case"angleAxis":return"angleAxisId"in r&&r.angleAxisId===t;case"radiusAxis":return"radiusAxisId"in r&&r.radiusAxisId===t;default:return!1}}}var $m=e=>e.graphicalItems.cartesianItems,EM=$([We,Cu],d2),f2=(e,t,r)=>e.filter(r).filter(n=>(t==null?void 0:t.includeHidden)===!0?!0:!n.hide),lo=$([$m,vt,EM],f2,{memoizeOptions:{resultEqualityCheck:Ou}}),p2=$([lo],e=>e.filter(t=>t.type==="area"||t.type==="bar").filter(Mm)),h2=e=>e.filter(t=>!("stackId"in t)||t.stackId===void 0),DM=$([lo],h2),m2=e=>e.map(t=>t.data).filter(Boolean).flat(1),TM=$([lo],m2,{memoizeOptions:{resultEqualityCheck:Ou}}),g2=(e,t)=>{var{chartData:r=[],dataStartIndex:n,dataEndIndex:i}=t;return e.length>0?e:r.slice(n,i+1)},Lm=$([TM,Su],g2),x2=(e,t,r)=>(t==null?void 0:t.dataKey)!=null?e.map(n=>({value:et(n,t.dataKey)})):r.length>0?r.map(n=>n.dataKey).flatMap(n=>e.map(i=>({value:et(i,n)}))):e.map(n=>({value:n})),Eu=$([Lm,vt,lo],x2);function y2(e,t){switch(e){case"xAxis":return t.direction==="x";case"yAxis":return t.direction==="y";default:return!1}}function cl(e){if(Or(e)||e instanceof Date){var t=Number(e);if(_e(t))return t}}function ky(e){if(Array.isArray(e)){var t=[cl(e[0]),cl(e[1])];return ji(t)?t:void 0}var r=cl(e);if(r!=null)return[r,r]}function an(e){return e.map(cl).filter(UO)}function MM(e,t,r){return!r||typeof t!="number"||yr(t)?[]:r.length?an(r.flatMap(n=>{var i=et(e,n.dataKey),s,o;if(Array.isArray(i)?[s,o]=i:s=o=i,!(!_e(s)||!_e(o)))return[t-s,t+o]})):[]}var Ue=e=>{var t=Fe(e),r=Ea(e);return oo(e,t,r)},v2=$([Ue],e=>e==null?void 0:e.dataKey),IM=$([p2,Su,Ue],o2),b2=(e,t,r)=>{var n={},i=t.reduce((s,o)=>(o.stackId==null||(s[o.stackId]==null&&(s[o.stackId]=[]),s[o.stackId].push(o)),s),n);return Object.fromEntries(Object.entries(i).map(s=>{var[o,l]=s,c=l.map(Tm);return[o,{stackedData:AE(e,c,r),graphicalItems:l}]}))},dp=$([IM,p2,ku],b2),j2=(e,t,r,n)=>{var{dataStartIndex:i,dataEndIndex:s}=t;if(n==null&&r!=="zAxis"){var o=TE(e,i,s);if(!(o!=null&&o[0]===0&&o[1]===0))return o}},$M=$([vt],e=>e.allowDataOverflow),zm=e=>{var t;if(e==null||!("domain"in e))return up;if(e.domain!=null)return e.domain;if(e.ticks!=null){if(e.type==="number"){var r=an(e.ticks);return[Math.min(...r),Math.max(...r)]}if(e.type==="category")return e.ticks.map(String)}return(t=e==null?void 0:e.domain)!==null&&t!==void 0?t:up},w2=$([vt],zm),S2=$([w2,$M],BS),LM=$([dp,Kn,We,S2],j2,{memoizeOptions:{resultEqualityCheck:Au}}),Rm=e=>e.errorBars,zM=(e,t,r)=>e.flatMap(n=>t[n.id]).filter(Boolean).filter(n=>y2(r,n)),mc=function(){for(var t=arguments.length,r=new Array(t),n=0;n{var s,o;if(r.length>0&&e.forEach(l=>{r.forEach(c=>{var d,u,f=(d=n[c.id])===null||d===void 0?void 0:d.filter(v=>y2(i,v)),p=et(l,(u=t.dataKey)!==null&&u!==void 0?u:c.dataKey),m=MM(l,p,f);if(m.length>=2){var x=Math.min(...m),g=Math.max(...m);(s==null||xo)&&(o=g)}var b=ky(p);b!=null&&(s=s==null?b[0]:Math.min(s,b[0]),o=o==null?b[1]:Math.max(o,b[1]))})}),(t==null?void 0:t.dataKey)!=null&&e.forEach(l=>{var c=ky(et(l,t.dataKey));c!=null&&(s=s==null?c[0]:Math.min(s,c[0]),o=o==null?c[1]:Math.max(o,c[1]))}),_e(s)&&_e(o))return[s,o]},RM=$([Lm,vt,DM,Rm,We],N2,{memoizeOptions:{resultEqualityCheck:Au}});function BM(e){var{value:t}=e;if(Or(t)||t instanceof Date)return t}var WM=(e,t,r)=>{var n=e.map(BM).filter(i=>i!=null);return r&&(t.dataKey==null||t.allowDuplicatedCategory&&Oj(n))?aS(0,e.length):t.allowDuplicatedCategory?n:Array.from(new Set(n))},k2=e=>e.referenceElements.dots,Da=(e,t,r)=>e.filter(n=>n.ifOverflow==="extendDomain").filter(n=>t==="xAxis"?n.xAxisId===r:n.yAxisId===r),FM=$([k2,We,Cu],Da),_2=e=>e.referenceElements.areas,UM=$([_2,We,Cu],Da),P2=e=>e.referenceElements.lines,qM=$([P2,We,Cu],Da),C2=(e,t)=>{var r=an(e.map(n=>t==="xAxis"?n.x:n.y));if(r.length!==0)return[Math.min(...r),Math.max(...r)]},HM=$(FM,We,C2),A2=(e,t)=>{var r=an(e.flatMap(n=>[t==="xAxis"?n.x1:n.y1,t==="xAxis"?n.x2:n.y2]));if(r.length!==0)return[Math.min(...r),Math.max(...r)]},KM=$([UM,We],A2);function VM(e){var t;if(e.x!=null)return an([e.x]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.x);return r==null||r.length===0?[]:an(r)}function YM(e){var t;if(e.y!=null)return an([e.y]);var r=(t=e.segment)===null||t===void 0?void 0:t.map(n=>n.y);return r==null||r.length===0?[]:an(r)}var O2=(e,t)=>{var r=e.flatMap(n=>t==="xAxis"?VM(n):YM(n));if(r.length!==0)return[Math.min(...r),Math.max(...r)]},GM=$([qM,We],O2),ZM=$(HM,GM,KM,(e,t,r)=>mc(e,r,t)),E2=(e,t,r,n,i,s,o,l)=>{if(r!=null)return r;var c=o==="vertical"&&l==="xAxis"||o==="horizontal"&&l==="yAxis",d=c?mc(n,s,i):mc(s,i);return sM(t,d,e.allowDataOverflow)},XM=$([vt,w2,S2,LM,RM,ZM,de,We],E2,{memoizeOptions:{resultEqualityCheck:Au}}),JM=[0,1],D2=(e,t,r,n,i,s,o)=>{if(!((e==null||r==null||r.length===0)&&o===void 0)){var{dataKey:l,type:c}=e,d=Mr(t,s);if(d&&l==null){var u;return aS(0,(u=r==null?void 0:r.length)!==null&&u!==void 0?u:0)}return c==="category"?WM(n,e,d):i==="expand"?JM:o}},Bm=$([vt,de,Lm,Eu,ku,We,XM],D2),T2=(e,t,r,n,i)=>{if(e!=null){var{scale:s,type:o}=e;if(s==="auto")return t==="radial"&&i==="radiusAxis"?"band":t==="radial"&&i==="angleAxis"?"linear":o==="category"&&n&&(n.indexOf("LineChart")>=0||n.indexOf("AreaChart")>=0||n.indexOf("ComposedChart")>=0&&!r)?"point":o==="category"?"band":"linear";if(typeof s=="string"){var l="scale".concat(Js(s));return l in rs?l:"point"}}},co=$([vt,de,u2,Pm,We],T2);function QM(e){if(e!=null){if(e in rs)return rs[e]();var t="scale".concat(Js(e));if(t in rs)return rs[t]()}}function Wm(e,t,r,n){if(!(r==null||n==null)){if(typeof e.scale=="function")return e.scale.copy().domain(r).range(n);var i=QM(t);if(i!=null){var s=i.domain(r).range(n);return kE(s),s}}}var M2=(e,t,r)=>{var n=zm(t);if(!(r!=="auto"&&r!=="linear")){if(t!=null&&t.tickCount&&Array.isArray(n)&&(n[0]==="auto"||n[1]==="auto")&&ji(e))return gM(e,t.tickCount,t.allowDecimals);if(t!=null&&t.tickCount&&t.type==="number"&&ji(e))return xM(e,t.tickCount,t.allowDecimals)}},Fm=$([Bm,oo,co],M2),I2=(e,t,r,n)=>{if(n!=="angleAxis"&&(e==null?void 0:e.type)==="number"&&ji(t)&&Array.isArray(r)&&r.length>0){var i=t[0],s=r[0],o=t[1],l=r[r.length-1];return[Math.min(i,s),Math.max(o,l)]}return t},eI=$([vt,Bm,Fm,We],I2),tI=$(Eu,vt,(e,t)=>{if(!(!t||t.type!=="number")){var r=1/0,n=Array.from(an(e.map(l=>l.value))).sort((l,c)=>l-c);if(n.length<2)return 1/0;var i=n[n.length-1]-n[0];if(i===0)return 1/0;for(var s=0;sn,(e,t,r,n,i)=>{if(!_e(e))return 0;var s=t==="vertical"?n.height:n.width;if(i==="gap")return e*s/2;if(i==="no-gap"){var o=Rn(r,e*s),l=e*s/2;return l-o-(l-o)/s*o}return 0}),rI=(e,t)=>{var r=dn(e,t);return r==null||typeof r.padding!="string"?0:$2(e,"xAxis",t,r.padding)},nI=(e,t)=>{var r=fn(e,t);return r==null||typeof r.padding!="string"?0:$2(e,"yAxis",t,r.padding)},iI=$(dn,rI,(e,t)=>{var r,n;if(e==null)return{left:0,right:0};var{padding:i}=e;return typeof i=="string"?{left:t,right:t}:{left:((r=i.left)!==null&&r!==void 0?r:0)+t,right:((n=i.right)!==null&&n!==void 0?n:0)+t}}),aI=$(fn,nI,(e,t)=>{var r,n;if(e==null)return{top:0,bottom:0};var{padding:i}=e;return typeof i=="string"?{top:t,bottom:t}:{top:((r=i.top)!==null&&r!==void 0?r:0)+t,bottom:((n=i.bottom)!==null&&n!==void 0?n:0)+t}}),sI=$([rt,iI,fu,du,(e,t,r)=>r],(e,t,r,n,i)=>{var{padding:s}=n;return i?[s.left,r.width-s.right]:[e.left+t.left,e.left+e.width-t.right]}),oI=$([rt,de,aI,fu,du,(e,t,r)=>r],(e,t,r,n,i,s)=>{var{padding:o}=i;return s?[n.height-o.bottom,o.top]:t==="horizontal"?[e.top+e.height-r.bottom,e.top+r.top]:[e.top+r.top,e.top+e.height-r.bottom]}),uo=(e,t,r,n)=>{var i;switch(t){case"xAxis":return sI(e,r,n);case"yAxis":return oI(e,r,n);case"zAxis":return(i=Im(e,r))===null||i===void 0?void 0:i.range;case"angleAxis":return i2(e);case"radiusAxis":return a2(e,r);default:return}},L2=$([vt,uo],_u),Ta=$([vt,co,eI,L2],Wm);$([lo,Rm,We],zM);function z2(e,t){return e.idt.id?1:0}var Du=(e,t)=>t,Tu=(e,t,r)=>r,lI=$(cu,Du,Tu,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(z2)),cI=$(uu,Du,Tu,(e,t,r)=>e.filter(n=>n.orientation===t).filter(n=>n.mirror===r).sort(z2)),R2=(e,t)=>({width:e.width,height:t.height}),uI=(e,t)=>{var r=typeof t.width=="number"?t.width:to;return{width:r,height:e.height}},dI=$(rt,dn,R2),fI=(e,t,r)=>{switch(t){case"top":return e.top;case"bottom":return r-e.bottom;default:return 0}},pI=(e,t,r)=>{switch(t){case"left":return e.left;case"right":return r-e.right;default:return 0}},hI=$(cn,rt,lI,Du,Tu,(e,t,r,n,i)=>{var s={},o;return r.forEach(l=>{var c=R2(t,l);o==null&&(o=fI(t,n,e));var d=n==="top"&&!i||n==="bottom"&&i;s[l.id]=o-Number(d)*c.height,o+=(d?-1:1)*c.height}),s}),mI=$(ln,rt,cI,Du,Tu,(e,t,r,n,i)=>{var s={},o;return r.forEach(l=>{var c=uI(t,l);o==null&&(o=pI(t,n,e));var d=n==="left"&&!i||n==="right"&&i;s[l.id]=o-Number(d)*c.width,o+=(d?-1:1)*c.width}),s}),gI=(e,t)=>{var r=dn(e,t);if(r!=null)return hI(e,r.orientation,r.mirror)},xI=$([rt,dn,gI,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var i=r==null?void 0:r[n];return i==null?{x:e.left,y:0}:{x:e.left,y:i}}}),yI=(e,t)=>{var r=fn(e,t);if(r!=null)return mI(e,r.orientation,r.mirror)},vI=$([rt,fn,yI,(e,t)=>t],(e,t,r,n)=>{if(t!=null){var i=r==null?void 0:r[n];return i==null?{x:0,y:e.top}:{x:i,y:e.top}}}),bI=$(rt,fn,(e,t)=>{var r=typeof t.width=="number"?t.width:to;return{width:r,height:e.height}}),B2=(e,t,r,n)=>{if(r!=null){var{allowDuplicatedCategory:i,type:s,dataKey:o}=r,l=Mr(e,n),c=t.map(d=>d.value);if(o&&l&&s==="category"&&i&&Oj(c))return c}},Um=$([de,Eu,vt,We],B2),W2=(e,t,r,n)=>{if(!(r==null||r.dataKey==null)){var{type:i,scale:s}=r,o=Mr(e,n);if(o&&(i==="number"||s!=="auto"))return t.map(l=>l.value)}},qm=$([de,Eu,oo,We],W2),_y=$([de,OM,co,Ta,Um,qm,uo,Fm,We],(e,t,r,n,i,s,o,l,c)=>{if(t!=null){var d=Mr(e,c);return{angle:t.angle,interval:t.interval,minTickGap:t.minTickGap,orientation:t.orientation,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,axisType:c,categoricalDomain:s,duplicateDomain:i,isCategorical:d,niceTicks:l,range:o,realScaleType:r,scale:n}}}),jI=(e,t,r,n,i,s,o,l,c)=>{if(!(t==null||n==null)){var d=Mr(e,c),{type:u,ticks:f,tickCount:p}=t,m=r==="scaleBand"&&typeof n.bandwidth=="function"?n.bandwidth()/2:2,x=u==="category"&&n.bandwidth?n.bandwidth()/m:0;x=c==="angleAxis"&&s!=null&&s.length>=2?Jt(s[0]-s[1])*2*x:x;var g=f||i;if(g){var b=g.map((v,j)=>{var y=o?o.indexOf(v):v;return{index:j,coordinate:n(y)+x,value:v,offset:x}});return b.filter(v=>_e(v.coordinate))}return d&&l?l.map((v,j)=>({coordinate:n(v)+x,value:v,index:j,offset:x})).filter(v=>_e(v.coordinate)):n.ticks?n.ticks(p).map(v=>({coordinate:n(v)+x,value:v,offset:x})):n.domain().map((v,j)=>({coordinate:n(v)+x,value:o?o[v]:v,index:j,offset:x}))}},F2=$([de,oo,co,Ta,Fm,uo,Um,qm,We],jI),wI=(e,t,r,n,i,s,o)=>{if(!(t==null||r==null||n==null||n[0]===n[1])){var l=Mr(e,o),{tickCount:c}=t,d=0;return d=o==="angleAxis"&&(n==null?void 0:n.length)>=2?Jt(n[0]-n[1])*2*d:d,l&&s?s.map((u,f)=>({coordinate:r(u)+d,value:u,index:f,offset:d})):r.ticks?r.ticks(c).map(u=>({coordinate:r(u)+d,value:u,offset:d})):r.domain().map((u,f)=>({coordinate:r(u)+d,value:i?i[u]:u,index:f,offset:d}))}},Mu=$([de,oo,Ta,uo,Um,qm,We],wI),Iu=$(vt,Ta,(e,t)=>{if(!(e==null||t==null))return hc(hc({},e),{},{scale:t})}),SI=$([vt,co,Bm,L2],Wm);$((e,t,r)=>Im(e,r),SI,(e,t)=>{if(!(e==null||t==null))return hc(hc({},e),{},{scale:t})});var NI=$([de,cu,uu],(e,t,r)=>{switch(e){case"horizontal":return t.some(n=>n.reversed)?"right-to-left":"left-to-right";case"vertical":return r.some(n=>n.reversed)?"bottom-to-top":"top-to-bottom";case"centric":case"radial":return"left-to-right";default:return}}),U2=e=>e.options.defaultTooltipEventType,q2=e=>e.options.validateTooltipEventTypes;function H2(e,t,r){if(e==null)return t;var n=e?"axis":"item";return r==null?t:r.includes(n)?n:t}function Hm(e,t){var r=U2(e),n=q2(e);return H2(t,r,n)}function kI(e){return G(t=>Hm(t,e))}var K2=(e,t)=>{var r,n=Number(t);if(!(yr(n)||t==null))return n>=0?e==null||(r=e[n])===null||r===void 0?void 0:r.value:void 0},_I=e=>e.tooltip.settings,jn={active:!1,index:null,dataKey:void 0,coordinate:void 0},PI={itemInteraction:{click:jn,hover:jn},axisInteraction:{click:jn,hover:jn},keyboardInteraction:jn,syncInteraction:{active:!1,index:null,dataKey:void 0,label:void 0,coordinate:void 0,sourceViewBox:void 0},tooltipItemPayloads:[],settings:{shared:void 0,trigger:"hover",axisId:0,active:!1,defaultIndex:void 0}},V2=At({name:"tooltip",initialState:PI,reducers:{addTooltipEntrySettings:{reducer(e,t){e.tooltipItemPayloads.push(t.payload)},prepare:Le()},removeTooltipEntrySettings:{reducer(e,t){var r=Kr(e).tooltipItemPayloads.indexOf(t.payload);r>-1&&e.tooltipItemPayloads.splice(r,1)},prepare:Le()},setTooltipSettingsState(e,t){e.settings=t.payload},setActiveMouseOverItemIndex(e,t){e.syncInteraction.active=!1,e.keyboardInteraction.active=!1,e.itemInteraction.hover.active=!0,e.itemInteraction.hover.index=t.payload.activeIndex,e.itemInteraction.hover.dataKey=t.payload.activeDataKey,e.itemInteraction.hover.coordinate=t.payload.activeCoordinate},mouseLeaveChart(e){e.itemInteraction.hover.active=!1,e.axisInteraction.hover.active=!1},mouseLeaveItem(e){e.itemInteraction.hover.active=!1},setActiveClickItemIndex(e,t){e.syncInteraction.active=!1,e.itemInteraction.click.active=!0,e.keyboardInteraction.active=!1,e.itemInteraction.click.index=t.payload.activeIndex,e.itemInteraction.click.dataKey=t.payload.activeDataKey,e.itemInteraction.click.coordinate=t.payload.activeCoordinate},setMouseOverAxisIndex(e,t){e.syncInteraction.active=!1,e.axisInteraction.hover.active=!0,e.keyboardInteraction.active=!1,e.axisInteraction.hover.index=t.payload.activeIndex,e.axisInteraction.hover.dataKey=t.payload.activeDataKey,e.axisInteraction.hover.coordinate=t.payload.activeCoordinate},setMouseClickAxisIndex(e,t){e.syncInteraction.active=!1,e.keyboardInteraction.active=!1,e.axisInteraction.click.active=!0,e.axisInteraction.click.index=t.payload.activeIndex,e.axisInteraction.click.dataKey=t.payload.activeDataKey,e.axisInteraction.click.coordinate=t.payload.activeCoordinate},setSyncInteraction(e,t){e.syncInteraction=t.payload},setKeyboardInteraction(e,t){e.keyboardInteraction.active=t.payload.active,e.keyboardInteraction.index=t.payload.activeIndex,e.keyboardInteraction.coordinate=t.payload.activeCoordinate,e.keyboardInteraction.dataKey=t.payload.activeDataKey}}}),{addTooltipEntrySettings:CI,removeTooltipEntrySettings:AI,setTooltipSettingsState:OI,setActiveMouseOverItemIndex:EI,mouseLeaveItem:TW,mouseLeaveChart:Y2,setActiveClickItemIndex:MW,setMouseOverAxisIndex:G2,setMouseClickAxisIndex:DI,setSyncInteraction:fp,setKeyboardInteraction:pp}=V2.actions,TI=V2.reducer;function Py(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ko(e){for(var t=1;t{if(t==null)return jn;var i=LI(e,t,r);if(i==null)return jn;if(i.active)return i;if(e.keyboardInteraction.active)return e.keyboardInteraction;if(e.syncInteraction.active&&e.syncInteraction.index!=null)return e.syncInteraction;var s=e.settings.active===!0;if(zI(i)){if(s)return Ko(Ko({},i),{},{active:!0})}else if(n!=null)return{active:!0,coordinate:void 0,dataKey:void 0,index:n};return Ko(Ko({},jn),{},{coordinate:i.coordinate})},Km=(e,t)=>{var r=e==null?void 0:e.index;if(r==null)return null;var n=Number(r);if(!_e(n))return r;var i=0,s=1/0;return t.length>0&&(s=t.length-1),String(Math.max(i,Math.min(n,s)))},X2=(e,t,r,n,i,s,o,l)=>{if(!(s==null||l==null)){var c=o[0],d=c==null?void 0:l(c.positions,s);if(d!=null)return d;var u=i==null?void 0:i[Number(s)];if(u)switch(r){case"horizontal":return{x:u.coordinate,y:(n.top+t)/2};default:return{x:(n.left+e)/2,y:u.coordinate}}}},J2=(e,t,r,n)=>{if(t==="axis")return e.tooltipItemPayloads;if(e.tooltipItemPayloads.length===0)return[];var i;return r==="hover"?i=e.itemInteraction.hover.dataKey:i=e.itemInteraction.click.dataKey,i==null&&n!=null?[e.tooltipItemPayloads[0]]:e.tooltipItemPayloads.filter(s=>{var o;return((o=s.settings)===null||o===void 0?void 0:o.dataKey)===i})},fo=e=>e.options.tooltipPayloadSearcher,Ma=e=>e.tooltip;function Cy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ay(e){for(var t=1;t{if(!(t==null||s==null)){var{chartData:l,computedData:c,dataStartIndex:d,dataEndIndex:u}=r,f=[];return e.reduce((p,m)=>{var x,{dataDefinedOnItem:g,settings:b}=m,v=FI(g,l),j=Array.isArray(v)?Ew(v,d,u):v,y=(x=b==null?void 0:b.dataKey)!==null&&x!==void 0?x:n,w=b==null?void 0:b.nameKey,S;if(n&&Array.isArray(j)&&!Array.isArray(j[0])&&o==="axis"?S=Ej(j,n,i):S=s(j,t,c,w),Array.isArray(S))S.forEach(_=>{var P=Ay(Ay({},b),{},{name:_.name,unit:_.unit,color:void 0,fill:void 0});p.push(d0({tooltipEntrySettings:P,dataKey:_.dataKey,payload:_.payload,value:et(_.payload,_.dataKey),name:_.name}))});else{var N;p.push(d0({tooltipEntrySettings:b,dataKey:y,payload:S,value:et(S,y),name:(N=et(S,w))!==null&&N!==void 0?N:b==null?void 0:b.name}))}return p},f)}},Vm=$([Ue,de,u2,Pm,Fe],T2),UI=$([e=>e.graphicalItems.cartesianItems,e=>e.graphicalItems.polarItems],(e,t)=>[...e,...t]),qI=$([Fe,Ea],d2),po=$([UI,Ue,qI],f2,{memoizeOptions:{resultEqualityCheck:Ou}}),HI=$([po],e=>e.filter(Mm)),KI=$([po],m2,{memoizeOptions:{resultEqualityCheck:Ou}}),Ia=$([KI,Kn],g2),VI=$([HI,Kn,Ue],o2),Ym=$([Ia,Ue,po],x2),eN=$([Ue],zm),YI=$([Ue],e=>e.allowDataOverflow),tN=$([eN,YI],BS),GI=$([po],e=>e.filter(Mm)),ZI=$([VI,GI,ku],b2),XI=$([ZI,Kn,Fe,tN],j2),JI=$([po],h2),QI=$([Ia,Ue,JI,Rm,Fe],N2,{memoizeOptions:{resultEqualityCheck:Au}}),e$=$([k2,Fe,Ea],Da),t$=$([e$,Fe],C2),r$=$([_2,Fe,Ea],Da),n$=$([r$,Fe],A2),i$=$([P2,Fe,Ea],Da),a$=$([i$,Fe],O2),s$=$([t$,a$,n$],mc),o$=$([Ue,eN,tN,XI,QI,s$,de,Fe],E2),rN=$([Ue,de,Ia,Ym,ku,Fe,o$],D2),l$=$([rN,Ue,Vm],M2),c$=$([Ue,rN,l$,Fe],I2),nN=e=>{var t=Fe(e),r=Ea(e),n=!1;return uo(e,t,r,n)},iN=$([Ue,nN],_u),aN=$([Ue,Vm,c$,iN],Wm),u$=$([de,Ym,Ue,Fe],B2),d$=$([de,Ym,Ue,Fe],W2),f$=(e,t,r,n,i,s,o,l)=>{if(t){var{type:c}=t,d=Mr(e,l);if(n){var u=r==="scaleBand"&&n.bandwidth?n.bandwidth()/2:2,f=c==="category"&&n.bandwidth?n.bandwidth()/u:0;return f=l==="angleAxis"&&i!=null&&(i==null?void 0:i.length)>=2?Jt(i[0]-i[1])*2*f:f,d&&o?o.map((p,m)=>({coordinate:n(p)+f,value:p,index:m,offset:f})):n.domain().map((p,m)=>({coordinate:n(p)+f,value:s?s[p]:p,index:m,offset:f}))}}},pn=$([de,Ue,Vm,aN,nN,u$,d$,Fe],f$),Gm=$([U2,q2,_I],(e,t,r)=>H2(r.shared,e,t)),sN=e=>e.tooltip.settings.trigger,Zm=e=>e.tooltip.settings.defaultIndex,$u=$([Ma,Gm,sN,Zm],Z2),qs=$([$u,Ia],Km),oN=$([pn,qs],K2),p$=$([$u],e=>{if(e)return e.dataKey}),lN=$([Ma,Gm,sN,Zm],J2),h$=$([ln,cn,de,rt,pn,Zm,lN,fo],X2),m$=$([$u,h$],(e,t)=>e!=null&&e.coordinate?e.coordinate:t),g$=$([$u],e=>e.active),x$=$([lN,qs,Kn,v2,oN,fo,Gm],Q2),y$=$([x$],e=>{if(e!=null){var t=e.map(r=>r.payload).filter(r=>r!=null);return Array.from(new Set(t))}});function Oy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ey(e){for(var t=1;tG(Ue),S$=()=>{var e=w$(),t=G(pn),r=G(aN);return ga(!e||!r?void 0:Ey(Ey({},e),{},{scale:r}),t)};function Dy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ti(e){for(var t=1;t{var i=t.find(s=>s&&s.index===r);if(i){if(e==="horizontal")return{x:i.coordinate,y:n.chartY};if(e==="vertical")return{x:n.chartX,y:i.coordinate}}return{x:0,y:0}},C$=(e,t,r,n)=>{var i=t.find(d=>d&&d.index===r);if(i){if(e==="centric"){var s=i.coordinate,{radius:o}=n;return Ti(Ti(Ti({},n),Je(n.cx,n.cy,o,s)),{},{angle:s,radius:o})}var l=i.coordinate,{angle:c}=n;return Ti(Ti(Ti({},n),Je(n.cx,n.cy,l,c)),{},{angle:c,radius:l})}return{angle:0,clockWise:!1,cx:0,cy:0,endAngle:0,innerRadius:0,outerRadius:0,radius:0,startAngle:0,x:0,y:0}};function A$(e,t){var{chartX:r,chartY:n}=e;return r>=t.left&&r<=t.left+t.width&&n>=t.top&&n<=t.top+t.height}var cN=(e,t,r,n,i)=>{var s,o=-1,l=(s=t==null?void 0:t.length)!==null&&s!==void 0?s:0;if(l<=1||e==null)return 0;if(n==="angleAxis"&&i!=null&&Math.abs(Math.abs(i[1]-i[0])-360)<=1e-6)for(var c=0;c0?r[c-1].coordinate:r[l-1].coordinate,u=r[c].coordinate,f=c>=l-1?r[0].coordinate:r[c+1].coordinate,p=void 0;if(Jt(u-d)!==Jt(f-u)){var m=[];if(Jt(f-u)===Jt(i[1]-i[0])){p=f;var x=u+i[1]-i[0];m[0]=Math.min(x,(x+d)/2),m[1]=Math.max(x,(x+d)/2)}else{p=d;var g=f+i[1]-i[0];m[0]=Math.min(u,(g+u)/2),m[1]=Math.max(u,(g+u)/2)}var b=[Math.min(u,(p+u)/2),Math.max(u,(p+u)/2)];if(e>b[0]&&e<=b[1]||e>=m[0]&&e<=m[1]){({index:o}=r[c]);break}}else{var v=Math.min(d,f),j=Math.max(d,f);if(e>(v+u)/2&&e<=(j+u)/2){({index:o}=r[c]);break}}}else if(t){for(var y=0;y0&&y(t[y].coordinate+t[y-1].coordinate)/2&&e<=(t[y].coordinate+t[y+1].coordinate)/2||y===l-1&&e>(t[y].coordinate+t[y-1].coordinate)/2){({index:o}=t[y]);break}}return o},uN=()=>G(Pm),Xm=(e,t)=>t,dN=(e,t,r)=>r,Jm=(e,t,r,n)=>n,O$=$(pn,e=>ru(e,t=>t.coordinate)),Qm=$([Ma,Xm,dN,Jm],Z2),fN=$([Qm,Ia],Km),E$=(e,t,r)=>{if(t!=null){var n=Ma(e);return t==="axis"?r==="hover"?n.axisInteraction.hover.dataKey:n.axisInteraction.click.dataKey:r==="hover"?n.itemInteraction.hover.dataKey:n.itemInteraction.click.dataKey}},pN=$([Ma,Xm,dN,Jm],J2),gc=$([ln,cn,de,rt,pn,Jm,pN,fo],X2),D$=$([Qm,gc],(e,t)=>{var r;return(r=e.coordinate)!==null&&r!==void 0?r:t}),hN=$([pn,fN],K2),T$=$([pN,fN,Kn,v2,hN,fo,Xm],Q2),M$=$([Qm],e=>({isActive:e.active,activeIndex:e.index})),I$=(e,t,r,n,i,s,o)=>{if(!(!e||!r||!n||!i)&&A$(e,o)){var l=ME(e,t),c=cN(l,s,i,r,n),d=P$(t,i,c,e);return{activeIndex:String(c),activeCoordinate:d}}},$$=(e,t,r,n,i,s,o)=>{if(!(!e||!n||!i||!s||!r)){var l=k5(e,r);if(l){var c=IE(l,t),d=cN(c,o,s,n,i),u=C$(t,s,d,l);return{activeIndex:String(d),activeCoordinate:u}}}},L$=(e,t,r,n,i,s,o,l)=>{if(!(!e||!t||!n||!i||!s))return t==="horizontal"||t==="vertical"?I$(e,t,n,i,s,o,l):$$(e,t,r,n,i,s,o)},z$=$(e=>e.zIndex.zIndexMap,(e,t)=>t,(e,t,r)=>r,(e,t,r)=>{if(t!=null){var n=e[t];if(n!=null)return r?n.panoramaElementId:n.elementId}}),R$=$(e=>e.zIndex.zIndexMap,e=>{var t=Object.keys(e).map(n=>parseInt(n,10)).concat(Object.values(lt)),r=Array.from(new Set(t));return r.sort((n,i)=>n-i)},{memoizeOptions:{resultEqualityCheck:kM}});function Ty(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function My(e){for(var t=1;tMy(My({},e),{},{[t]:{elementId:void 0,panoramaElementId:void 0,consumers:0}}),U$)},H$=new Set(Object.values(lt));function K$(e){return H$.has(e)}var mN=At({name:"zIndex",initialState:q$,reducers:{registerZIndexPortal:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]?e.zIndexMap[r].consumers+=1:e.zIndexMap[r]={consumers:1,elementId:void 0,panoramaElementId:void 0}},prepare:Le()},unregisterZIndexPortal:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]&&(e.zIndexMap[r].consumers-=1,e.zIndexMap[r].consumers<=0&&!K$(r)&&delete e.zIndexMap[r])},prepare:Le()},registerZIndexPortalId:{reducer:(e,t)=>{var{zIndex:r,elementId:n,isPanorama:i}=t.payload;e.zIndexMap[r]?i?e.zIndexMap[r].panoramaElementId=n:e.zIndexMap[r].elementId=n:e.zIndexMap[r]={consumers:0,elementId:i?void 0:n,panoramaElementId:i?n:void 0}},prepare:Le()},unregisterZIndexPortalId:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]&&(t.payload.isPanorama?e.zIndexMap[r].panoramaElementId=void 0:e.zIndexMap[r].elementId=void 0)},prepare:Le()}}}),{registerZIndexPortal:V$,unregisterZIndexPortal:Y$,registerZIndexPortalId:G$,unregisterZIndexPortalId:Z$}=mN.actions,X$=mN.reducer;function Ir(e){var{zIndex:t,children:r}=e,n=c3(),i=n&&t!==void 0&&t!==0,s=pt(),o=Ye();h.useLayoutEffect(()=>i?(o(V$({zIndex:t})),()=>{o(Y$({zIndex:t}))}):Pa,[o,t,i]);var l=G(d=>z$(d,t,s));if(!i)return r;if(!l)return null;var c=document.getElementById(l);return c?wh.createPortal(r,c):null}function hp(){return hp=Object.assign?Object.assign.bind():function(e){for(var t=1;th.useContext(gN),xN={exports:{}};(function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function i(c,d,u){this.fn=c,this.context=d,this.once=u||!1}function s(c,d,u,f,p){if(typeof u!="function")throw new TypeError("The listener must be a function");var m=new i(u,f||c,p),x=r?r+d:d;return c._events[x]?c._events[x].fn?c._events[x]=[c._events[x],m]:c._events[x].push(m):(c._events[x]=m,c._eventsCount++),c}function o(c,d){--c._eventsCount===0?c._events=new n:delete c._events[d]}function l(){this._events=new n,this._eventsCount=0}l.prototype.eventNames=function(){var d=[],u,f;if(this._eventsCount===0)return d;for(f in u=this._events)t.call(u,f)&&d.push(r?f.slice(1):f);return Object.getOwnPropertySymbols?d.concat(Object.getOwnPropertySymbols(u)):d},l.prototype.listeners=function(d){var u=r?r+d:d,f=this._events[u];if(!f)return[];if(f.fn)return[f.fn];for(var p=0,m=f.length,x=new Array(m);p{e.eventEmitter==null&&(e.eventEmitter=Symbol("rechartsEventEmitter"))}}}),l8=vN.reducer,{createEventEmitter:c8}=vN.actions;function u8(e){return e.tooltip.syncInteraction}var d8={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},bN=At({name:"chartData",initialState:d8,reducers:{setChartData(e,t){if(e.chartData=t.payload,t.payload==null){e.dataStartIndex=0,e.dataEndIndex=0;return}t.payload.length>0&&e.dataEndIndex!==t.payload.length-1&&(e.dataEndIndex=t.payload.length-1)},setComputedData(e,t){e.computedData=t.payload},setDataStartEndIndexes(e,t){var{startIndex:r,endIndex:n}=t.payload;r!=null&&(e.dataStartIndex=r),n!=null&&(e.dataEndIndex=n)}}}),{setChartData:Ly,setDataStartEndIndexes:f8,setComputedData:IW}=bN.actions,p8=bN.reducer,h8=["x","y"];function zy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Mi(e){for(var t=1;tc.rootProps.className);h.useEffect(()=>{if(e==null)return Pa;var c=(d,u,f)=>{if(t!==f&&e===d){if(n==="index"){var p;if(o&&u!==null&&u!==void 0&&(p=u.payload)!==null&&p!==void 0&&p.coordinate&&u.payload.sourceViewBox){var m=u.payload.coordinate,{x,y:g}=m,b=y8(m,h8),{x:v,y:j,width:y,height:w}=u.payload.sourceViewBox,S=Mi(Mi({},b),{},{x:o.x+(y?(x-v)/y:0)*o.width,y:o.y+(w?(g-j)/w:0)*o.height});r(Mi(Mi({},u),{},{payload:Mi(Mi({},u.payload),{},{coordinate:S})}))}else r(u);return}if(i!=null){var N;if(typeof n=="function"){var _={activeTooltipIndex:u.payload.index==null?void 0:Number(u.payload.index),isTooltipActive:u.payload.active,activeIndex:u.payload.index==null?void 0:Number(u.payload.index),activeLabel:u.payload.label,activeDataKey:u.payload.dataKey,activeCoordinate:u.payload.coordinate},P=n(i,_);N=i[P]}else n==="value"&&(N=i.find(A=>String(A.value)===u.payload.label));var{coordinate:D}=u.payload;if(N==null||u.payload.active===!1||D==null||o==null){r(fp({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0}));return}var{x:M,y:I}=D,C=Math.min(M,o.x+o.width),B=Math.min(I,o.y+o.height),q={x:s==="horizontal"?N.coordinate:C,y:s==="horizontal"?B:N.coordinate},Z=fp({active:u.payload.active,coordinate:q,dataKey:u.payload.dataKey,index:String(N.index),label:u.payload.label,sourceViewBox:u.payload.sourceViewBox});r(Z)}}};return Hs.on(mp,c),()=>{Hs.off(mp,c)}},[l,r,t,e,n,i,s,o])}function j8(){var e=G(Cm),t=G(Am),r=Ye();h.useEffect(()=>{if(e==null)return Pa;var n=(i,s,o)=>{t!==o&&e===i&&r(f8(s))};return Hs.on($y,n),()=>{Hs.off($y,n)}},[r,t,e])}function w8(){var e=Ye();h.useEffect(()=>{e(c8())},[e]),b8(),j8()}function S8(e,t,r,n,i,s){var o=G(m=>E$(m,e,t)),l=G(Am),c=G(Cm),d=G(t2),u=G(u8),f=u==null?void 0:u.active,p=pu();h.useEffect(()=>{if(!f&&c!=null&&l!=null){var m=fp({active:s,coordinate:r,dataKey:o,index:i,label:typeof n=="number"?String(n):n,sourceViewBox:p});Hs.emit(mp,c,m,l)}},[f,r,o,i,n,l,c,d,s,p])}function Ry(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function By(e){for(var t=1;t{_(OI({shared:j,trigger:y,axisId:N,active:i,defaultIndex:P}))},[_,j,y,N,i,P]);var D=pu(),M=Vw(),I=kI(j),{activeIndex:C,isActive:B}=(t=G(J=>M$(J,I,y,P)))!==null&&t!==void 0?t:{},q=G(J=>T$(J,I,y,P)),Z=G(J=>hN(J,I,y,P)),A=G(J=>D$(J,I,y,P)),T=q,O=i8(),k=(r=i??B)!==null&&r!==void 0?r:!1,[L,W]=N4([T,k]),H=I==="axis"?Z:void 0;S8(I,y,A,H,C,k);var ee=S??O;if(ee==null||D==null||I==null)return null;var re=T??Wy;k||(re=Wy),d&&re.length&&(re=o4(re.filter(J=>J.value!=null&&(J.hide!==!0||n.includeHidden)),p,P8));var Me=re.length>0,E=h.createElement(k3,{allowEscapeViewBox:s,animationDuration:o,animationEasing:l,isAnimationActive:u,active:k,coordinate:A,hasPayload:Me,offset:f,position:m,reverseDirection:x,useTranslate3d:g,viewBox:D,wrapperStyle:b,lastBoundingBox:L,innerRef:W,hasPortalFromProps:!!S},C8(c,By(By({},n),{},{payload:re,label:H,active:k,activeIndex:C,coordinate:A,accessibilityLayer:M})));return h.createElement(h.Fragment,null,wh.createPortal(E,ee),k&&h.createElement(n8,{cursor:v,tooltipEventType:I,coordinate:A,payload:re,index:C}))}function O8(e,t,r){return(t=E8(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function E8(e){var t=D8(e,"string");return typeof t=="symbol"?t:t+""}function D8(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class T8{constructor(t){O8(this,"cache",new Map),this.maxSize=t}get(t){var r=this.cache.get(t);return r!==void 0&&(this.cache.delete(t),this.cache.set(t,r)),r}set(t,r){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){var n=this.cache.keys().next().value;this.cache.delete(n)}this.cache.set(t,r)}clear(){this.cache.clear()}size(){return this.cache.size}}function Uy(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function M8(e){for(var t=1;t{try{var r=document.getElementById(Hy);r||(r=document.createElement("span"),r.setAttribute("id",Hy),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),Object.assign(r.style,R8,t),r.textContent="".concat(e);var n=r.getBoundingClientRect();return{width:n.width,height:n.height}}catch{return{width:0,height:0}}},ps=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t==null||Ci.isSsr)return{width:0,height:0};if(!jN.enableCache)return Ky(t,r);var n=B8(t,r),i=qy.get(n);if(i)return i;var s=Ky(t,r);return qy.set(n,s),s},Vy=/(-?\d+(?:\.\d+)?[a-zA-Z%]*)([*/])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/,Yy=/(-?\d+(?:\.\d+)?[a-zA-Z%]*)([+-])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/,W8=/^px|cm|vh|vw|em|rem|%|mm|in|pt|pc|ex|ch|vmin|vmax|Q$/,F8=/(-?\d+(?:\.\d+)?)([a-zA-Z%]+)?/,wN={cm:96/2.54,mm:96/25.4,pt:96/72,pc:96/6,in:96,Q:96/(2.54*40),px:1},U8=Object.keys(wN),Gi="NaN";function q8(e,t){return e*wN[t]}class jt{static parse(t){var r,[,n,i]=(r=F8.exec(t))!==null&&r!==void 0?r:[];return new jt(parseFloat(n),i??"")}constructor(t,r){this.num=t,this.unit=r,this.num=t,this.unit=r,yr(t)&&(this.unit=""),r!==""&&!W8.test(r)&&(this.num=NaN,this.unit=""),U8.includes(r)&&(this.num=q8(t,r),this.unit="px")}add(t){return this.unit!==t.unit?new jt(NaN,""):new jt(this.num+t.num,this.unit)}subtract(t){return this.unit!==t.unit?new jt(NaN,""):new jt(this.num-t.num,this.unit)}multiply(t){return this.unit!==""&&t.unit!==""&&this.unit!==t.unit?new jt(NaN,""):new jt(this.num*t.num,this.unit||t.unit)}divide(t){return this.unit!==""&&t.unit!==""&&this.unit!==t.unit?new jt(NaN,""):new jt(this.num/t.num,this.unit||t.unit)}toString(){return"".concat(this.num).concat(this.unit)}isNaN(){return yr(this.num)}}function SN(e){if(e.includes(Gi))return Gi;for(var t=e;t.includes("*")||t.includes("/");){var r,[,n,i,s]=(r=Vy.exec(t))!==null&&r!==void 0?r:[],o=jt.parse(n??""),l=jt.parse(s??""),c=i==="*"?o.multiply(l):o.divide(l);if(c.isNaN())return Gi;t=t.replace(Vy,c.toString())}for(;t.includes("+")||/.-\d+(?:\.\d+)?/.test(t);){var d,[,u,f,p]=(d=Yy.exec(t))!==null&&d!==void 0?d:[],m=jt.parse(u??""),x=jt.parse(p??""),g=f==="+"?m.add(x):m.subtract(x);if(g.isNaN())return Gi;t=t.replace(Yy,g.toString())}return t}var Gy=/\(([^()]*)\)/;function H8(e){for(var t=e,r;(r=Gy.exec(t))!=null;){var[,n]=r;t=t.replace(Gy,SN(n))}return t}function K8(e){var t=e.replace(/\s+/g,"");return t=H8(t),t=SN(t),t}function V8(e){try{return K8(e)}catch{return Gi}}function Pd(e){var t=V8(e.slice(5,-1));return t===Gi?"":t}var Y8=["x","y","lineHeight","capHeight","fill","scaleToFit","textAnchor","verticalAnchor"],G8=["dx","dy","angle","className","breakAll"];function gp(){return gp=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{children:t,breakAll:r,style:n}=e;try{var i=[];Re(t)||(r?i=t.toString().split(""):i=t.toString().split(NN));var s=i.map(l=>({word:l,width:ps(l,n).width})),o=r?0:ps(" ",n).width;return{wordsWithComputedWidth:s,spaceWidth:o}}catch{return null}};function X8(e){return e==="start"||e==="middle"||e==="end"||e==="inherit"}var _N=(e,t,r,n)=>e.reduce((i,s)=>{var{word:o,width:l}=s,c=i[i.length-1];if(c&&l!=null&&(t==null||n||c.width+l+re.reduce((t,r)=>t.width>r.width?t:r),J8="…",Xy=(e,t,r,n,i,s,o,l)=>{var c=e.slice(0,t),d=kN({breakAll:r,style:n,children:c+J8});if(!d)return[!1,[]];var u=_N(d.wordsWithComputedWidth,s,o,l),f=u.length>i||PN(u).width>Number(s);return[f,u]},Q8=(e,t,r,n,i)=>{var{maxLines:s,children:o,style:l,breakAll:c}=e,d=Y(s),u=String(o),f=_N(t,n,r,i);if(!d||i)return f;var p=f.length>s||PN(f).width>Number(n);if(!p)return f;for(var m=0,x=u.length-1,g=0,b;m<=x&&g<=u.length-1;){var v=Math.floor((m+x)/2),j=v-1,[y,w]=Xy(u,j,c,l,s,n,r,i),[S]=Xy(u,v,c,l,s,n,r,i);if(!y&&!S&&(m=v+1),y&&S&&(x=v-1),!y&&S){b=w;break}g++}return b||f},Jy=e=>{var t=Re(e)?[]:e.toString().split(NN);return[{words:t,width:void 0}]},eL=e=>{var{width:t,scaleToFit:r,children:n,style:i,breakAll:s,maxLines:o}=e;if((t||r)&&!Ci.isSsr){var l,c,d=kN({breakAll:s,children:n,style:i});if(d){var{wordsWithComputedWidth:u,spaceWidth:f}=d;l=u,c=f}else return Jy(n);return Q8({breakAll:s,children:n,maxLines:o,style:i},l,c,t,!!r)}return Jy(n)},CN="#808080",tL={breakAll:!1,capHeight:"0.71em",fill:CN,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},eg=h.forwardRef((e,t)=>{var r=ft(e,tL),{x:n,y:i,lineHeight:s,capHeight:o,fill:l,scaleToFit:c,textAnchor:d,verticalAnchor:u}=r,f=Zy(r,Y8),p=h.useMemo(()=>eL({breakAll:f.breakAll,children:f.children,maxLines:f.maxLines,scaleToFit:c,style:f.style,width:f.width}),[f.breakAll,f.children,f.maxLines,c,f.style,f.width]),{dx:m,dy:x,angle:g,className:b,breakAll:v}=f,j=Zy(f,G8);if(!Or(n)||!Or(i)||p.length===0)return null;var y=Number(n)+(Y(m)?m:0),w=Number(i)+(Y(x)?x:0);if(!_e(y)||!_e(w))return null;var S;switch(u){case"start":S=Pd("calc(".concat(o,")"));break;case"middle":S=Pd("calc(".concat((p.length-1)/2," * -").concat(s," + (").concat(o," / 2))"));break;default:S=Pd("calc(".concat(p.length-1," * -").concat(s,")"));break}var N=[];if(c){var _=p[0].width,{width:P}=f;N.push("scale(".concat(Y(P)&&Y(_)?P/_:1,")"))}return g&&N.push("rotate(".concat(g,", ").concat(y,", ").concat(w,")")),N.length&&(j.transform=N.join(" ")),h.createElement("text",gp({},ut(j),{ref:t,x:y,y:w,className:ue("recharts-text",b),textAnchor:d,fill:l.includes("url")?CN:l}),p.map((D,M)=>{var I=D.words.join(v?"":" ");return h.createElement("tspan",{x:y,dy:M===0?S:s,key:"".concat(I,"-").concat(M)},I)}))});eg.displayName="Text";var rL=["labelRef"];function nL(e,t){if(e==null)return{};var r,n,i=iL(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{var{x:t,y:r,upperWidth:n,lowerWidth:i,width:s,height:o,children:l}=e,c=h.useMemo(()=>({x:t,y:r,upperWidth:n,lowerWidth:i,width:s,height:o}),[t,r,n,i,s,o]);return h.createElement(AN.Provider,{value:c},l)},ON=()=>{var e=h.useContext(AN),t=pu();return e||Fw(t)},cL=h.createContext(null),uL=()=>{var e=h.useContext(cL),t=G(s2);return e||t},dL=e=>{var{value:t,formatter:r}=e,n=Re(e.children)?t:e.children;return typeof r=="function"?r(n):n},tg=e=>e!=null&&typeof e=="function",fL=(e,t)=>{var r=Jt(t-e),n=Math.min(Math.abs(t-e),360);return r*n},pL=(e,t,r,n,i)=>{var{offset:s,className:o}=e,{cx:l,cy:c,innerRadius:d,outerRadius:u,startAngle:f,endAngle:p,clockWise:m}=i,x=(d+u)/2,g=fL(f,p),b=g>=0?1:-1,v,j;switch(t){case"insideStart":v=f+b*s,j=m;break;case"insideEnd":v=p-b*s,j=!m;break;case"end":v=p+b*s,j=m;break;default:throw new Error("Unsupported position ".concat(t))}j=g<=0?j:!j;var y=Je(l,c,x,v),w=Je(l,c,x,v+(j?1:-1)*359),S="M".concat(y.x,",").concat(y.y,` + A`).concat(x,",").concat(x,",0,1,").concat(j?0:1,`, + `).concat(w.x,",").concat(w.y),N=Re(e.id)?Ms("recharts-radial-line-"):e.id;return h.createElement("text",Rr({},n,{dominantBaseline:"central",className:ue("recharts-radial-bar-label",o)}),h.createElement("defs",null,h.createElement("path",{id:N,d:S})),h.createElement("textPath",{xlinkHref:"#".concat(N)},r))},hL=(e,t,r)=>{var{cx:n,cy:i,innerRadius:s,outerRadius:o,startAngle:l,endAngle:c}=e,d=(l+c)/2;if(r==="outside"){var{x:u,y:f}=Je(n,i,o+t,d);return{x:u,y:f,textAnchor:u>=n?"start":"end",verticalAnchor:"middle"}}if(r==="center")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"middle"};if(r==="centerTop")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"start"};if(r==="centerBottom")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"end"};var p=(s+o)/2,{x:m,y:x}=Je(n,i,p,d);return{x:m,y:x,textAnchor:"middle",verticalAnchor:"middle"}},xp=e=>"cx"in e&&Y(e.cx),mL=(e,t)=>{var{parentViewBox:r,offset:n,position:i}=e,s;r!=null&&!xp(r)&&(s=r);var{x:o,y:l,upperWidth:c,lowerWidth:d,height:u}=t,f=o,p=o+(c-d)/2,m=(f+p)/2,x=(c+d)/2,g=f+c/2,b=u>=0?1:-1,v=b*n,j=b>0?"end":"start",y=b>0?"start":"end",w=c>=0?1:-1,S=w*n,N=w>0?"end":"start",_=w>0?"start":"end";if(i==="top"){var P={x:f+c/2,y:l-v,textAnchor:"middle",verticalAnchor:j};return Pe(Pe({},P),s?{height:Math.max(l-s.y,0),width:c}:{})}if(i==="bottom"){var D={x:p+d/2,y:l+u+v,textAnchor:"middle",verticalAnchor:y};return Pe(Pe({},D),s?{height:Math.max(s.y+s.height-(l+u),0),width:d}:{})}if(i==="left"){var M={x:m-S,y:l+u/2,textAnchor:N,verticalAnchor:"middle"};return Pe(Pe({},M),s?{width:Math.max(M.x-s.x,0),height:u}:{})}if(i==="right"){var I={x:m+x+S,y:l+u/2,textAnchor:_,verticalAnchor:"middle"};return Pe(Pe({},I),s?{width:Math.max(s.x+s.width-I.x,0),height:u}:{})}var C=s?{width:x,height:u}:{};return i==="insideLeft"?Pe({x:m+S,y:l+u/2,textAnchor:_,verticalAnchor:"middle"},C):i==="insideRight"?Pe({x:m+x-S,y:l+u/2,textAnchor:N,verticalAnchor:"middle"},C):i==="insideTop"?Pe({x:f+c/2,y:l+v,textAnchor:"middle",verticalAnchor:y},C):i==="insideBottom"?Pe({x:p+d/2,y:l+u-v,textAnchor:"middle",verticalAnchor:j},C):i==="insideTopLeft"?Pe({x:f+S,y:l+v,textAnchor:_,verticalAnchor:y},C):i==="insideTopRight"?Pe({x:f+c-S,y:l+v,textAnchor:N,verticalAnchor:y},C):i==="insideBottomLeft"?Pe({x:p+S,y:l+u-v,textAnchor:_,verticalAnchor:j},C):i==="insideBottomRight"?Pe({x:p+d-S,y:l+u-v,textAnchor:N,verticalAnchor:j},C):i&&typeof i=="object"&&(Y(i.x)||Qr(i.x))&&(Y(i.y)||Qr(i.y))?Pe({x:o+Rn(i.x,x),y:l+Rn(i.y,u),textAnchor:"end",verticalAnchor:"end"},C):Pe({x:g,y:l+u/2,textAnchor:"middle",verticalAnchor:"middle"},C)},gL={offset:5,zIndex:lt.label};function yn(e){var t=ft(e,gL),{viewBox:r,position:n,value:i,children:s,content:o,className:l="",textBreakAll:c,labelRef:d}=t,u=uL(),f=ON(),p=n==="center"?f:u??f,m,x,g;if(r==null?m=p:xp(r)?m=r:m=Fw(r),!m||Re(i)&&Re(s)&&!h.isValidElement(o)&&typeof o!="function")return null;var b=Pe(Pe({},t),{},{viewBox:m});if(h.isValidElement(o)){var{labelRef:v}=b,j=nL(b,rL);return h.cloneElement(o,j)}if(typeof o=="function"){if(x=h.createElement(o,b),h.isValidElement(x))return x}else x=dL(t);var y=ut(t);if(xp(m)){if(n==="insideStart"||n==="insideEnd"||n==="end")return pL(t,n,x,y,m);g=hL(m,t.offset,t.position)}else g=mL(t,m);return h.createElement(Ir,{zIndex:t.zIndex},h.createElement(eg,Rr({ref:d,className:ue("recharts-label",l)},y,g,{textAnchor:X8(y.textAnchor)?y.textAnchor:g.textAnchor,breakAll:c}),x))}yn.displayName="Label";var xL=(e,t,r)=>{if(!e)return null;var n={viewBox:t,labelRef:r};return e===!0?h.createElement(yn,Rr({key:"label-implicit"},n)):Or(e)?h.createElement(yn,Rr({key:"label-implicit",value:e},n)):h.isValidElement(e)?e.type===yn?h.cloneElement(e,Pe({key:"label-implicit"},n)):h.createElement(yn,Rr({key:"label-implicit",content:e},n)):tg(e)?h.createElement(yn,Rr({key:"label-implicit",content:e},n)):e&&typeof e=="object"?h.createElement(yn,Rr({},e,{key:"label-implicit"},n)):null};function yL(e){var{label:t,labelRef:r}=e,n=ON();return xL(t,n,r)||null}var EN={},DN={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return r[r.length-1]}e.last=t})(DN);var TN={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){return Array.isArray(r)?r:Array.from(r)}e.toArray=t})(TN);(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});const t=DN,r=TN,n=tu;function i(s){if(n.isArrayLike(s))return t.last(r.toArray(s))}e.last=i})(EN);var vL=EN.last;const bL=Tr(vL);var jL=["valueAccessor"],wL=["dataKey","clockWise","id","textBreakAll","zIndex"];function xc(){return xc=Object.assign?Object.assign.bind():function(e){for(var t=1;tArray.isArray(e.value)?bL(e.value):e.value,MN=h.createContext(void 0),IN=MN.Provider,$N=h.createContext(void 0);$N.Provider;function kL(){return h.useContext(MN)}function _L(){return h.useContext($N)}function ul(e){var{valueAccessor:t=NL}=e,r=ev(e,jL),{dataKey:n,clockWise:i,id:s,textBreakAll:o,zIndex:l}=r,c=ev(r,wL),d=kL(),u=_L(),f=d||u;return!f||!f.length?null:h.createElement(Ir,{zIndex:l??lt.label},h.createElement(ir,{className:"recharts-label-list"},f.map((p,m)=>{var x,g=Re(n)?t(p,m):et(p&&p.payload,n),b=Re(s)?{}:{id:"".concat(s,"-").concat(m)};return h.createElement(yn,xc({key:"label-".concat(m)},ut(p),c,b,{fill:(x=r.fill)!==null&&x!==void 0?x:p.fill,parentViewBox:p.parentViewBox,value:g,textBreakAll:o,viewBox:p.viewBox,index:m,zIndex:0}))})))}ul.displayName="LabelList";function LN(e){var{label:t}=e;return t?t===!0?h.createElement(ul,{key:"labelList-implicit"}):h.isValidElement(t)||tg(t)?h.createElement(ul,{key:"labelList-implicit",content:t}):typeof t=="object"?h.createElement(ul,xc({key:"labelList-implicit"},t,{type:String(t.type)})):null:null}function yp(){return yp=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{cx:t,cy:r,r:n,className:i}=e,s=ue("recharts-dot",i);return Y(t)&&Y(r)&&Y(n)?h.createElement("circle",yp({},nr(e),Lh(e),{className:s,cx:t,cy:r,r:n})):null},PL={radiusAxis:{},angleAxis:{}},RN=At({name:"polarAxis",initialState:PL,reducers:{addRadiusAxis(e,t){e.radiusAxis[t.payload.id]=t.payload},removeRadiusAxis(e,t){delete e.radiusAxis[t.payload.id]},addAngleAxis(e,t){e.angleAxis[t.payload.id]=t.payload},removeAngleAxis(e,t){delete e.angleAxis[t.payload.id]}}}),{addRadiusAxis:$W,removeRadiusAxis:LW,addAngleAxis:zW,removeAngleAxis:RW}=RN.actions,CL=RN.reducer,rg=e=>e&&typeof e=="object"&&"clipDot"in e?!!e.clipDot:!0,BN={};(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});function t(r){var i;if(typeof r!="object"||r==null)return!1;if(Object.getPrototypeOf(r)===null)return!0;if(Object.prototype.toString.call(r)!=="[object Object]"){const s=r[Symbol.toStringTag];return s==null||!((i=Object.getOwnPropertyDescriptor(r,Symbol.toStringTag))!=null&&i.writable)?!1:r.toString()===`[object ${s}]`}let n=r;for(;Object.getPrototypeOf(n)!==null;)n=Object.getPrototypeOf(n);return Object.getPrototypeOf(r)===n}e.isPlainObject=t})(BN);var AL=BN.isPlainObject;const OL=Tr(AL);function tv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function rv(e){for(var t=1;t{var s=r-n,o;return o="M ".concat(e,",").concat(t),o+="L ".concat(e+r,",").concat(t),o+="L ".concat(e+r-s/2,",").concat(t+i),o+="L ".concat(e+r-s/2-n,",").concat(t+i),o+="L ".concat(e,",").concat(t," Z"),o},ML={x:0,y:0,upperWidth:0,lowerWidth:0,height:0,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},IL=e=>{var t=ft(e,ML),{x:r,y:n,upperWidth:i,lowerWidth:s,height:o,className:l}=t,{animationEasing:c,animationDuration:d,animationBegin:u,isUpdateAnimationActive:f}=t,p=h.useRef(null),[m,x]=h.useState(-1),g=h.useRef(i),b=h.useRef(s),v=h.useRef(o),j=h.useRef(r),y=h.useRef(n),w=gu(e,"trapezoid-");if(h.useEffect(()=>{if(p.current&&p.current.getTotalLength)try{var q=p.current.getTotalLength();q&&x(q)}catch{}},[]),r!==+r||n!==+n||i!==+i||s!==+s||o!==+o||i===0&&s===0||o===0)return null;var S=ue("recharts-trapezoid",l);if(!f)return h.createElement("g",null,h.createElement("path",yc({},ut(t),{className:S,d:nv(r,n,i,s,o)})));var N=g.current,_=b.current,P=v.current,D=j.current,M=y.current,I="0px ".concat(m===-1?1:m,"px"),C="".concat(m,"px 0px"),B=Yw(["strokeDasharray"],d,c);return h.createElement(mu,{animationId:w,key:w,canBegin:m>0,duration:d,easing:c,isActive:f,begin:u},q=>{var Z=Ee(N,i,q),A=Ee(_,s,q),T=Ee(P,o,q),O=Ee(D,r,q),k=Ee(M,n,q);p.current&&(g.current=Z,b.current=A,v.current=T,j.current=O,y.current=k);var L=q>0?{transition:B,strokeDasharray:C}:{strokeDasharray:I};return h.createElement("path",yc({},ut(t),{className:S,d:nv(O,k,Z,A,T),ref:p,style:rv(rv({},L),t.style)}))})},$L=["option","shapeType","propTransformer","activeClassName","isActive"];function LL(e,t){if(e==null)return{};var r,n,i=zL(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{if(!i){var s=t(r);return n(CI(s)),()=>{n(AI(s))}}},[t,r,n,i]),null}function FN(e){var{legendPayload:t}=e,r=Ye(),n=pt();return h.useLayoutEffect(()=>n?Pa:(r(d3(t)),()=>{r(f3(t))}),[r,n,t]),null}var Cd,KL=()=>{var[e]=h.useState(()=>Ms("uid-"));return e},VL=(Cd=Iv.useId)!==null&&Cd!==void 0?Cd:KL;function UN(e,t){var r=VL();return t||(e?"".concat(e,"-").concat(r):r)}var YL=h.createContext(void 0),qN=e=>{var{id:t,type:r,children:n}=e,i=UN("recharts-".concat(r),t);return h.createElement(YL.Provider,{value:i},n(i))},GL={cartesianItems:[],polarItems:[]},HN=At({name:"graphicalItems",initialState:GL,reducers:{addCartesianGraphicalItem:{reducer(e,t){e.cartesianItems.push(t.payload)},prepare:Le()},replaceCartesianGraphicalItem:{reducer(e,t){var{prev:r,next:n}=t.payload,i=Kr(e).cartesianItems.indexOf(r);i>-1&&(e.cartesianItems[i]=n)},prepare:Le()},removeCartesianGraphicalItem:{reducer(e,t){var r=Kr(e).cartesianItems.indexOf(t.payload);r>-1&&e.cartesianItems.splice(r,1)},prepare:Le()},addPolarGraphicalItem:{reducer(e,t){e.polarItems.push(t.payload)},prepare:Le()},removePolarGraphicalItem:{reducer(e,t){var r=Kr(e).polarItems.indexOf(t.payload);r>-1&&e.polarItems.splice(r,1)},prepare:Le()}}}),{addCartesianGraphicalItem:ZL,replaceCartesianGraphicalItem:XL,removeCartesianGraphicalItem:JL,addPolarGraphicalItem:BW,removePolarGraphicalItem:WW}=HN.actions,QL=HN.reducer;function KN(e){var t=Ye(),r=h.useRef(null);return h.useLayoutEffect(()=>{r.current===null?t(ZL(e)):r.current!==e&&t(XL({prev:r.current,next:e})),r.current=e},[t,e]),h.useLayoutEffect(()=>()=>{r.current&&(t(JL(r.current)),r.current=null)},[t]),null}var ez=["points"];function sv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ad(e){for(var t=1;t{var b,v,j=Ad(Ad(Ad({r:3},o),f),{},{index:g,cx:(b=x.x)!==null&&b!==void 0?b:void 0,cy:(v=x.y)!==null&&v!==void 0?v:void 0,dataKey:s,value:x.value,payload:x.payload,points:t});return h.createElement(sz,{key:"dot-".concat(g),option:r,dotProps:j,className:i})}),m={};return l&&c!=null&&(m.clipPath="url(#clipPath-".concat(u?"":"dots-").concat(c,")")),h.createElement(Ir,{zIndex:d},h.createElement(ir,bc({className:n},m),p))}function ov(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function lv(e){for(var t=1;t({top:e.top,bottom:e.bottom,left:e.left,right:e.right})),vz=$([yz,ln,cn],(e,t,r)=>{if(!(!e||t==null||r==null))return{x:e.left,y:e.top,width:Math.max(0,t-e.left-e.right),height:Math.max(0,r-e.top-e.bottom)}}),Lu=()=>G(vz),bz=()=>G(y$);function cv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Od(e){for(var t=1;t{var{point:t,childIndex:r,mainColor:n,activeDot:i,dataKey:s}=e;if(i===!1||t.x==null||t.y==null)return null;var o={index:r,dataKey:s,cx:t.x,cy:t.y,r:4,fill:n??"none",strokeWidth:2,stroke:"#fff",payload:t.payload,value:t.value},l=Od(Od(Od({},o),Vc(i)),Lh(i)),c;return h.isValidElement(i)?c=h.cloneElement(i,l):typeof i=="function"?c=i(l):c=h.createElement(zN,l),h.createElement(ir,{className:"recharts-active-dot"},c)};function vp(e){var{points:t,mainColor:r,activeDot:n,itemDataKey:i,zIndex:s=lt.activeDot}=e,o=G(qs),l=bz();if(t==null||l==null)return null;var c=t.find(d=>l.includes(d.payload));return Re(c)?null:h.createElement(Ir,{zIndex:s},h.createElement(Nz,{point:c,childIndex:Number(o),mainColor:r,dataKey:i,activeDot:n}))}var kz={},GN=At({name:"errorBars",initialState:kz,reducers:{addErrorBar:(e,t)=>{var{itemId:r,errorBar:n}=t.payload;e[r]||(e[r]=[]),e[r].push(n)},replaceErrorBar:(e,t)=>{var{itemId:r,prev:n,next:i}=t.payload;e[r]&&(e[r]=e[r].map(s=>s.dataKey===n.dataKey&&s.direction===n.direction?i:s))},removeErrorBar:(e,t)=>{var{itemId:r,errorBar:n}=t.payload;e[r]&&(e[r]=e[r].filter(i=>i.dataKey!==n.dataKey||i.direction!==n.direction))}}}),{addErrorBar:qW,replaceErrorBar:HW,removeErrorBar:KW}=GN.actions,_z=GN.reducer,Pz=["children"];function Cz(e,t){if(e==null)return{};var r,n,i=Az(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n({x:0,y:0,value:0}),errorBarOffset:0},Ez=h.createContext(Oz);function Dz(e){var{children:t}=e,r=Cz(e,Pz);return h.createElement(Ez.Provider,{value:r},t)}function ng(e,t){var r,n,i=G(d=>dn(d,e)),s=G(d=>fn(d,t)),o=(r=i==null?void 0:i.allowDataOverflow)!==null&&r!==void 0?r:Tt.allowDataOverflow,l=(n=s==null?void 0:s.allowDataOverflow)!==null&&n!==void 0?n:Mt.allowDataOverflow,c=o||l;return{needClip:c,needClipX:o,needClipY:l}}function ZN(e){var{xAxisId:t,yAxisId:r,clipPathId:n}=e,i=Lu(),{needClipX:s,needClipY:o,needClip:l}=ng(t,r);if(!l||!i)return null;var{x:c,y:d,width:u,height:f}=i;return h.createElement("clipPath",{id:"clipPath-".concat(n)},h.createElement("rect",{x:s?c:c-u/2,y:o?d:d-f/2,width:s?u:u*2,height:o?f:f*2}))}var Tz=e=>{var{chartData:t}=e,r=Ye(),n=pt();return h.useEffect(()=>n?()=>{}:(r(Ly(t)),()=>{r(Ly(void 0))}),[t,r,n]),null},uv={x:0,y:0,width:0,height:0,padding:{top:0,right:0,bottom:0,left:0}},XN=At({name:"brush",initialState:uv,reducers:{setBrushSettings(e,t){return t.payload==null?uv:t.payload}}}),{setBrushSettings:VW}=XN.actions,Mz=XN.reducer;function Iz(e,t,r){return(t=$z(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function $z(e){var t=Lz(e,"string");return typeof t=="symbol"?t:t+""}function Lz(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}class ig{static create(t){return new ig(t)}constructor(t){this.scale=t}get domain(){return this.scale.domain}get range(){return this.scale.range}get rangeMin(){return this.range()[0]}get rangeMax(){return this.range()[1]}get bandwidth(){return this.scale.bandwidth}apply(t){var{bandAware:r,position:n}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t!==void 0){if(n)switch(n){case"start":return this.scale(t);case"middle":{var i=this.bandwidth?this.bandwidth()/2:0;return this.scale(t)+i}case"end":{var s=this.bandwidth?this.bandwidth():0;return this.scale(t)+s}default:return this.scale(t)}if(r){var o=this.bandwidth?this.bandwidth()/2:0;return this.scale(t)+o}return this.scale(t)}}isInRange(t){var r=this.range(),n=r[0],i=r[r.length-1];return n<=i?t>=n&&t<=i:t>=i&&t<=n}}Iz(ig,"EPS",1e-4);function zz(e){return(e%180+180)%180}var Rz=function(t){var{width:r,height:n}=t,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,s=zz(i),o=s*Math.PI/180,l=Math.atan(n/r),c=o>l&&o{e.dots.push(t.payload)},removeDot:(e,t)=>{var r=Kr(e).dots.findIndex(n=>n===t.payload);r!==-1&&e.dots.splice(r,1)},addArea:(e,t)=>{e.areas.push(t.payload)},removeArea:(e,t)=>{var r=Kr(e).areas.findIndex(n=>n===t.payload);r!==-1&&e.areas.splice(r,1)},addLine:(e,t)=>{e.lines.push(t.payload)},removeLine:(e,t)=>{var r=Kr(e).lines.findIndex(n=>n===t.payload);r!==-1&&e.lines.splice(r,1)}}}),{addDot:YW,removeDot:GW,addArea:ZW,removeArea:XW,addLine:JW,removeLine:QW}=JN.actions,Wz=JN.reducer,Fz=h.createContext(void 0),Uz=e=>{var{children:t}=e,[r]=h.useState("".concat(Ms("recharts"),"-clip")),n=Lu();if(n==null)return null;var{x:i,y:s,width:o,height:l}=n;return h.createElement(Fz.Provider,{value:r},h.createElement("defs",null,h.createElement("clipPath",{id:r},h.createElement("rect",{x:i,y:s,height:l,width:o}))),t)};function ba(e,t){for(var r in e)if({}.hasOwnProperty.call(e,r)&&(!{}.hasOwnProperty.call(t,r)||e[r]!==t[r]))return!1;for(var n in t)if({}.hasOwnProperty.call(t,n)&&!{}.hasOwnProperty.call(e,n))return!1;return!0}function QN(e,t){if(t<1)return[];if(t===1)return e;for(var r=[],n=0;ne*i)return!1;var s=r();return e*(t-e*s/2-n)>=0&&e*(t+e*s/2-i)<=0}function Kz(e,t){return QN(e,t+1)}function Vz(e,t,r,n,i){for(var s=(n||[]).slice(),{start:o,end:l}=t,c=0,d=1,u=o,f=function(){var x=n==null?void 0:n[c];if(x===void 0)return{v:QN(n,d)};var g=c,b,v=()=>(b===void 0&&(b=r(x,g)),b),j=x.coordinate,y=c===0||jc(e,j,v,u,l);y||(c=0,u=o,d+=1),y&&(u=j+e*(v()/2+i),c+=d)},p;d<=s.length;)if(p=f(),p)return p.v;return[]}function dv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function at(e){for(var t=1;t(x===void 0&&(x=r(m,p)),x);if(p===o-1){var b=e*(m.coordinate+e*g()/2-c);s[p]=m=at(at({},m),{},{tickCoord:b>0?m.coordinate-b*e:m.coordinate})}else s[p]=m=at(at({},m),{},{tickCoord:m.coordinate});if(m.tickCoord!=null){var v=jc(e,m.tickCoord,g,l,c);v&&(c=m.tickCoord-e*(g()/2+i),s[p]=at(at({},m),{},{isShow:!0}))}},u=o-1;u>=0;u--)d(u);return s}function Jz(e,t,r,n,i,s){var o=(n||[]).slice(),l=o.length,{start:c,end:d}=t;if(s){var u=n[l-1],f=r(u,l-1),p=e*(u.coordinate+e*f/2-d);if(o[l-1]=u=at(at({},u),{},{tickCoord:p>0?u.coordinate-p*e:u.coordinate}),u.tickCoord!=null){var m=jc(e,u.tickCoord,()=>f,c,d);m&&(d=u.tickCoord-e*(f/2+i),o[l-1]=at(at({},u),{},{isShow:!0}))}}for(var x=s?l-1:l,g=function(j){var y=o[j],w,S=()=>(w===void 0&&(w=r(y,j)),w);if(j===0){var N=e*(y.coordinate-e*S()/2-c);o[j]=y=at(at({},y),{},{tickCoord:N<0?y.coordinate-N*e:y.coordinate})}else o[j]=y=at(at({},y),{},{tickCoord:y.coordinate});if(y.tickCoord!=null){var _=jc(e,y.tickCoord,S,c,d);_&&(c=y.tickCoord+e*(S()/2+i),o[j]=at(at({},y),{},{isShow:!0}))}},b=0;b{var S=typeof d=="function"?d(y.value,w):y.value;return x==="width"?qz(ps(S,{fontSize:t,letterSpacing:r}),g,f):ps(S,{fontSize:t,letterSpacing:r})[x]},v=i.length>=2?Jt(i[1].coordinate-i[0].coordinate):1,j=Hz(s,v,x);return c==="equidistantPreserveStart"?Vz(v,j,b,i,o):(c==="preserveStart"||c==="preserveStartEnd"?m=Jz(v,j,b,i,o,c==="preserveStartEnd"):m=Xz(v,j,b,i,o),m.filter(y=>y.isShow))}var Qz=e=>{var{ticks:t,label:r,labelGapWithTick:n=5,tickSize:i=0,tickMargin:s=0}=e,o=0;if(t){Array.from(t).forEach(u=>{if(u){var f=u.getBoundingClientRect();f.width>o&&(o=f.width)}});var l=r?r.getBoundingClientRect().width:0,c=i+s,d=o+c+l+(r?n:0);return Math.round(d)}return 0},eR=["axisLine","width","height","className","hide","ticks","axisType"],tR=["viewBox"],rR=["viewBox"];function bp(e,t){if(e==null)return{};var r,n,i=nR(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{var{ticks:r=[],tick:n,tickLine:i,stroke:s,tickFormatter:o,unit:l,padding:c,tickTextProps:d,orientation:u,mirror:f,x:p,y:m,width:x,height:g,tickSize:b,tickMargin:v,fontSize:j,letterSpacing:y,getTicksConfig:w,events:S,axisType:N}=e,_=ag(Oe(Oe({},w),{},{ticks:r}),j,y),P=cR(u,f),D=uR(u,f),M=nr(w),I=Vc(n),C={};typeof i=="object"&&(C=i);var B=Oe(Oe({},M),{},{fill:"none"},C),q=_.map(T=>Oe({entry:T},lR(T,p,m,x,g,u,b,f,v))),Z=q.map(T=>{var{entry:O,line:k}=T;return h.createElement(ir,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(O.value,"-").concat(O.coordinate,"-").concat(O.tickCoord)},i&&h.createElement("line",Si({},B,k,{className:ue("recharts-cartesian-axis-tick-line",eu(i,"className"))})))}),A=q.map((T,O)=>{var{entry:k,tick:L}=T,W=Oe(Oe(Oe(Oe({textAnchor:P,verticalAnchor:D},M),{},{stroke:"none",fill:s},I),L),{},{index:O,payload:k,visibleTicksCount:_.length,tickFormatter:o,padding:c},d);return h.createElement(ir,Si({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(k.value,"-").concat(k.coordinate,"-").concat(k.tickCoord)},t4(S,k,O)),n&&h.createElement(dR,{option:n,tickProps:W,value:"".concat(typeof o=="function"?o(k.value,O):k.value).concat(l||"")}))});return h.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(N,"-ticks")},A.length>0&&h.createElement(Ir,{zIndex:lt.label},h.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(N,"-tick-labels"),ref:t},A)),Z.length>0&&h.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(N,"-tick-lines")},Z))}),pR=h.forwardRef((e,t)=>{var{axisLine:r,width:n,height:i,className:s,hide:o,ticks:l,axisType:c}=e,d=bp(e,eR),[u,f]=h.useState(""),[p,m]=h.useState(""),x=h.useRef(null);h.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var b;return Qz({ticks:x.current,label:(b=e.labelRef)===null||b===void 0?void 0:b.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var g=h.useCallback(b=>{if(b){var v=b.getElementsByClassName("recharts-cartesian-axis-tick-value");x.current=v;var j=v[0];if(j){var y=window.getComputedStyle(j),w=y.fontSize,S=y.letterSpacing;(w!==u||S!==p)&&(f(w),m(S))}}},[u,p]);return o||n!=null&&n<=0||i!=null&&i<=0?null:h.createElement(Ir,{zIndex:e.zIndex},h.createElement(ir,{className:ue("recharts-cartesian-axis",s)},h.createElement(oR,{x:e.x,y:e.y,width:n,height:i,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:nr(e)}),h.createElement(fR,{ref:g,axisType:c,events:d,fontSize:u,getTicksConfig:e,height:e.height,letterSpacing:p,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:l,unit:e.unit,width:e.width,x:e.x,y:e.y}),h.createElement(lL,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},h.createElement(yL,{label:e.label,labelRef:e.labelRef}),e.children)))}),hR=h.memo(pR,(e,t)=>{var{viewBox:r}=e,n=bp(e,tR),{viewBox:i}=t,s=bp(t,rR);return ba(r,i)&&ba(n,s)}),og=h.forwardRef((e,t)=>{var r=ft(e,sg);return h.createElement(hR,Si({},r,{ref:t}))});og.displayName="CartesianAxis";var mR=["x1","y1","x2","y2","key"],gR=["offset"],xR=["xAxisId","yAxisId"],yR=["xAxisId","yAxisId"];function pv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function ot(e){for(var t=1;t{var{fill:t}=e;if(!t||t==="none")return null;var{fillOpacity:r,x:n,y:i,width:s,height:o,ry:l}=e;return h.createElement("rect",{x:n,y:i,ry:l,width:s,height:o,stroke:"none",fill:t,fillOpacity:r,className:"recharts-cartesian-grid-bg"})};function ek(e){var{option:t,lineItemProps:r}=e,n;if(h.isValidElement(t))n=h.cloneElement(t,r);else if(typeof t=="function")n=t(r);else{var i,{x1:s,y1:o,x2:l,y2:c,key:d}=r,u=wc(r,mR),f=(i=nr(u))!==null&&i!==void 0?i:{},{offset:p}=f,m=wc(f,gR);n=h.createElement("line",ai({},m,{x1:s,y1:o,x2:l,y2:c,fill:"none",key:d}))}return n}function NR(e){var{x:t,width:r,horizontal:n=!0,horizontalPoints:i}=e;if(!n||!i||!i.length)return null;var{xAxisId:s,yAxisId:o}=e,l=wc(e,xR),c=i.map((d,u)=>{var f=ot(ot({},l),{},{x1:t,y1:d,x2:t+r,y2:d,key:"line-".concat(u),index:u});return h.createElement(ek,{key:"line-".concat(u),option:n,lineItemProps:f})});return h.createElement("g",{className:"recharts-cartesian-grid-horizontal"},c)}function kR(e){var{y:t,height:r,vertical:n=!0,verticalPoints:i}=e;if(!n||!i||!i.length)return null;var{xAxisId:s,yAxisId:o}=e,l=wc(e,yR),c=i.map((d,u)=>{var f=ot(ot({},l),{},{x1:d,y1:t,x2:d,y2:t+r,key:"line-".concat(u),index:u});return h.createElement(ek,{option:n,lineItemProps:f,key:"line-".concat(u)})});return h.createElement("g",{className:"recharts-cartesian-grid-vertical"},c)}function _R(e){var{horizontalFill:t,fillOpacity:r,x:n,y:i,width:s,height:o,horizontalPoints:l,horizontal:c=!0}=e;if(!c||!t||!t.length||l==null)return null;var d=l.map(f=>Math.round(f+i-i)).sort((f,p)=>f-p);i!==d[0]&&d.unshift(0);var u=d.map((f,p)=>{var m=!d[p+1],x=m?i+o-f:d[p+1]-f;if(x<=0)return null;var g=p%t.length;return h.createElement("rect",{key:"react-".concat(p),y:f,x:n,height:x,width:s,stroke:"none",fill:t[g],fillOpacity:r,className:"recharts-cartesian-grid-bg"})});return h.createElement("g",{className:"recharts-cartesian-gridstripes-horizontal"},u)}function PR(e){var{vertical:t=!0,verticalFill:r,fillOpacity:n,x:i,y:s,width:o,height:l,verticalPoints:c}=e;if(!t||!r||!r.length)return null;var d=c.map(f=>Math.round(f+i-i)).sort((f,p)=>f-p);i!==d[0]&&d.unshift(0);var u=d.map((f,p)=>{var m=!d[p+1],x=m?i+o-f:d[p+1]-f;if(x<=0)return null;var g=p%r.length;return h.createElement("rect",{key:"react-".concat(p),x:f,y:s,width:x,height:l,stroke:"none",fill:r[g],fillOpacity:n,className:"recharts-cartesian-grid-bg"})});return h.createElement("g",{className:"recharts-cartesian-gridstripes-vertical"},u)}var CR=(e,t)=>{var{xAxis:r,width:n,height:i,offset:s}=e;return Dw(ag(ot(ot(ot({},sg),r),{},{ticks:Tw(r),viewBox:{x:0,y:0,width:n,height:i}})),s.left,s.left+s.width,t)},AR=(e,t)=>{var{yAxis:r,width:n,height:i,offset:s}=e;return Dw(ag(ot(ot(ot({},sg),r),{},{ticks:Tw(r),viewBox:{x:0,y:0,width:n,height:i}})),s.top,s.top+s.height,t)},OR={horizontal:!0,vertical:!0,horizontalPoints:[],verticalPoints:[],stroke:"#ccc",fill:"none",verticalFill:[],horizontalFill:[],xAxisId:0,yAxisId:0,syncWithTicks:!1,zIndex:lt.grid};function jp(e){var t=qw(),r=Hw(),n=Uw(),i=ot(ot({},ft(e,OR)),{},{x:Y(e.x)?e.x:n.left,y:Y(e.y)?e.y:n.top,width:Y(e.width)?e.width:n.width,height:Y(e.height)?e.height:n.height}),{xAxisId:s,yAxisId:o,x:l,y:c,width:d,height:u,syncWithTicks:f,horizontalValues:p,verticalValues:m}=i,x=pt(),g=G(D=>_y(D,"xAxis",s,x)),b=G(D=>_y(D,"yAxis",o,x));if(!Er(d)||!Er(u)||!Y(l)||!Y(c))return null;var v=i.verticalCoordinatesGenerator||CR,j=i.horizontalCoordinatesGenerator||AR,{horizontalPoints:y,verticalPoints:w}=i;if((!y||!y.length)&&typeof j=="function"){var S=p&&p.length,N=j({yAxis:b?ot(ot({},b),{},{ticks:S?p:b.ticks}):void 0,width:t??d,height:r??u,offset:n},S?!0:f);Jl(Array.isArray(N),"horizontalCoordinatesGenerator should return Array but instead it returned [".concat(typeof N,"]")),Array.isArray(N)&&(y=N)}if((!w||!w.length)&&typeof v=="function"){var _=m&&m.length,P=v({xAxis:g?ot(ot({},g),{},{ticks:_?m:g.ticks}):void 0,width:t??d,height:r??u,offset:n},_?!0:f);Jl(Array.isArray(P),"verticalCoordinatesGenerator should return Array but instead it returned [".concat(typeof P,"]")),Array.isArray(P)&&(w=P)}return h.createElement(Ir,{zIndex:i.zIndex},h.createElement("g",{className:"recharts-cartesian-grid"},h.createElement(SR,{fill:i.fill,fillOpacity:i.fillOpacity,x:i.x,y:i.y,width:i.width,height:i.height,ry:i.ry}),h.createElement(_R,ai({},i,{horizontalPoints:y})),h.createElement(PR,ai({},i,{verticalPoints:w})),h.createElement(NR,ai({},i,{offset:n,horizontalPoints:y,xAxis:g,yAxis:b})),h.createElement(kR,ai({},i,{offset:n,verticalPoints:w,xAxis:g,yAxis:b}))))}jp.displayName="CartesianGrid";var tk=(e,t,r,n)=>Iu(e,"xAxis",t,n),rk=(e,t,r,n)=>Mu(e,"xAxis",t,n),nk=(e,t,r,n)=>Iu(e,"yAxis",r,n),ik=(e,t,r,n)=>Mu(e,"yAxis",r,n),ER=$([de,tk,nk,rk,ik],(e,t,r,n,i)=>Mr(e,"xAxis")?ga(t,n,!1):ga(r,i,!1)),DR=(e,t,r,n,i)=>i;function TR(e){return e.type==="line"}var MR=$([$m,DR],(e,t)=>e.filter(TR).find(r=>r.id===t)),IR=$([de,tk,nk,rk,ik,MR,ER,Su],(e,t,r,n,i,s,o,l)=>{var{chartData:c,dataStartIndex:d,dataEndIndex:u}=l;if(!(s==null||t==null||r==null||n==null||i==null||n.length===0||i.length===0||o==null)){var{dataKey:f,data:p}=s,m;if(p!=null&&p.length>0?m=p:m=c==null?void 0:c.slice(d,u+1),m!=null)return t9({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:i,dataKey:f,bandSize:o,displayedData:m})}});function ak(e){var t=Vc(e),r=3,n=2;if(t!=null){var{r:i,strokeWidth:s}=t,o=Number(i),l=Number(s);return(Number.isNaN(o)||o<0)&&(o=r),(Number.isNaN(l)||l<0)&&(l=n),{r:o,strokeWidth:l}}return{r,strokeWidth:n}}var $R=["id"],LR=["type","layout","connectNulls","needClip","shape"],zR=["activeDot","animateNewValues","animationBegin","animationDuration","animationEasing","connectNulls","dot","hide","isAnimationActive","label","legendType","xAxisId","yAxisId","id"];function Ks(){return Ks=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{dataKey:t,name:r,stroke:n,legendType:i,hide:s}=e;return[{inactive:s,dataKey:t,type:i,color:n,value:lu(r,t),payload:e}]};function qR(e){var{dataKey:t,data:r,stroke:n,strokeWidth:i,fill:s,name:o,hide:l,unit:c}=e;return{dataDefinedOnItem:r,positions:void 0,settings:{stroke:n,strokeWidth:i,fill:s,dataKey:t,nameKey:void 0,name:lu(o,t),hide:l,type:e.tooltipType,color:e.stroke,unit:c}}}var sk=(e,t)=>"".concat(t,"px ").concat(e-t,"px");function HR(e,t){for(var r=e.length%2!==0?[...e,0]:e,n=[],i=0;i{var n=r.reduce((f,p)=>f+p);if(!n)return sk(t,e);for(var i=Math.floor(e/n),s=e%n,o=t-e,l=[],c=0,d=0;cs){l=[...r.slice(0,c),s-d];break}var u=l.length%2===0?[0,o]:[o];return[...HR(r,i),...l,...u].map(f=>"".concat(f,"px")).join(", ")};function VR(e){var{clipPathId:t,points:r,props:n}=e,{dot:i,dataKey:s,needClip:o}=n,{id:l}=n,c=lg(n,$R),d=nr(c);return h.createElement(VN,{points:r,dot:i,className:"recharts-line-dots",dotClassName:"recharts-line-dot",dataKey:s,baseProps:d,needClip:o,clipPathId:t})}function YR(e){var{showLabels:t,children:r,points:n}=e,i=h.useMemo(()=>n==null?void 0:n.map(s=>{var o,l,c={x:(o=s.x)!==null&&o!==void 0?o:0,y:(l=s.y)!==null&&l!==void 0?l:0,width:0,lowerWidth:0,upperWidth:0,height:0};return wr(wr({},c),{},{value:s.value,payload:s.payload,viewBox:c,parentViewBox:void 0,fill:void 0})}),[n]);return h.createElement(IN,{value:t?i:void 0},r)}function mv(e){var{clipPathId:t,pathRef:r,points:n,strokeDasharray:i,props:s}=e,{type:o,layout:l,connectNulls:c,needClip:d,shape:u}=s,f=lg(s,LR),p=wr(wr({},ut(f)),{},{fill:"none",className:"recharts-line-curve",clipPath:d?"url(#clipPath-".concat(t,")"):void 0,points:n,type:o,layout:l,connectNulls:c,strokeDasharray:i??s.strokeDasharray});return h.createElement(h.Fragment,null,(n==null?void 0:n.length)>1&&h.createElement(HL,Ks({shapeType:"curve",option:u},p,{pathRef:r})),h.createElement(VR,{points:n,clipPathId:t,props:s}))}function GR(e){try{return e&&e.getTotalLength&&e.getTotalLength()||0}catch{return 0}}function ZR(e){var{clipPathId:t,props:r,pathRef:n,previousPointsRef:i,longestAnimatedLengthRef:s}=e,{points:o,strokeDasharray:l,isAnimationActive:c,animationBegin:d,animationDuration:u,animationEasing:f,animateNewValues:p,width:m,height:x,onAnimationEnd:g,onAnimationStart:b}=r,v=i.current,j=gu(r,"recharts-line-"),[y,w]=h.useState(!1),S=!y,N=h.useCallback(()=>{typeof g=="function"&&g(),w(!1)},[g]),_=h.useCallback(()=>{typeof b=="function"&&b(),w(!0)},[b]),P=GR(n.current),D=s.current;return h.createElement(YR,{points:o,showLabels:S},r.children,h.createElement(mu,{animationId:j,begin:d,duration:u,isActive:c,easing:f,onAnimationEnd:N,onAnimationStart:_,key:j},M=>{var I=Ee(D,P+D,M),C=Math.min(I,P),B;if(c)if(l){var q="".concat(l).split(/[,\s]+/gim).map(T=>parseFloat(T));B=KR(C,P,q)}else B=sk(P,C);else B=l==null?void 0:String(l);if(v){var Z=v.length/o.length,A=M===1?o:o.map((T,O)=>{var k=Math.floor(O*Z);if(v[k]){var L=v[k];return wr(wr({},T),{},{x:Ee(L.x,T.x,M),y:Ee(L.y,T.y,M)})}return p?wr(wr({},T),{},{x:Ee(m*2,T.x,M),y:Ee(x/2,T.y,M)}):wr(wr({},T),{},{x:T.x,y:T.y})});return i.current=A,h.createElement(mv,{props:r,points:A,clipPathId:t,pathRef:n,strokeDasharray:B})}return M>0&&P>0&&(i.current=o,s.current=C),h.createElement(mv,{props:r,points:o,clipPathId:t,pathRef:n,strokeDasharray:B})}),h.createElement(LN,{label:r.label}))}function XR(e){var{clipPathId:t,props:r}=e,n=h.useRef(null),i=h.useRef(0),s=h.useRef(null);return h.createElement(ZR,{props:r,clipPathId:t,previousPointsRef:n,longestAnimatedLengthRef:i,pathRef:s})}var JR=(e,t)=>{var r,n;return{x:(r=e.x)!==null&&r!==void 0?r:void 0,y:(n=e.y)!==null&&n!==void 0?n:void 0,value:e.value,errorVal:et(e.payload,t)}};class QR extends h.Component{render(){var{hide:t,dot:r,points:n,className:i,xAxisId:s,yAxisId:o,top:l,left:c,width:d,height:u,id:f,needClip:p,zIndex:m}=this.props;if(t)return null;var x=ue("recharts-line",i),g=f,{r:b,strokeWidth:v}=ak(r),j=rg(r),y=b*2+v;return h.createElement(Ir,{zIndex:m},h.createElement(ir,{className:x},p&&h.createElement("defs",null,h.createElement(ZN,{clipPathId:g,xAxisId:s,yAxisId:o}),!j&&h.createElement("clipPath",{id:"clipPath-dots-".concat(g)},h.createElement("rect",{x:c-y/2,y:l-y/2,width:d+y,height:u+y}))),h.createElement(Dz,{xAxisId:s,yAxisId:o,data:n,dataPointFormatter:JR,errorBarOffset:0},h.createElement(XR,{props:this.props,clipPathId:g}))),h.createElement(vp,{activeDot:this.props.activeDot,points:n,mainColor:this.props.stroke,itemDataKey:this.props.dataKey}))}}var ok={activeDot:!0,animateNewValues:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",connectNulls:!1,dot:!0,fill:"#fff",hide:!1,isAnimationActive:!Ci.isSsr,label:!1,legendType:"line",stroke:"#3182bd",strokeWidth:1,xAxisId:0,yAxisId:0,zIndex:lt.line};function e9(e){var t=ft(e,ok),{activeDot:r,animateNewValues:n,animationBegin:i,animationDuration:s,animationEasing:o,connectNulls:l,dot:c,hide:d,isAnimationActive:u,label:f,legendType:p,xAxisId:m,yAxisId:x,id:g}=t,b=lg(t,zR),{needClip:v}=ng(m,x),j=Lu(),y=ro(),w=pt(),S=G(M=>IR(M,m,x,w,g));if(y!=="horizontal"&&y!=="vertical"||S==null||j==null)return null;var{height:N,width:_,x:P,y:D}=j;return h.createElement(QR,Ks({},b,{id:g,connectNulls:l,dot:c,activeDot:r,animateNewValues:n,animationBegin:i,animationDuration:s,animationEasing:o,isAnimationActive:u,hide:d,label:f,legendType:p,xAxisId:m,yAxisId:x,points:S,layout:y,height:N,width:_,left:P,top:D,needClip:v}))}function t9(e){var{layout:t,xAxis:r,yAxis:n,xAxisTicks:i,yAxisTicks:s,dataKey:o,bandSize:l,displayedData:c}=e;return c.map((d,u)=>{var f=et(d,o);if(t==="horizontal"){var p=Xl({axis:r,ticks:i,bandSize:l,entry:d,index:u}),m=Re(f)?null:n.scale(f);return{x:p,y:m,value:f,payload:d}}var x=Re(f)?null:r.scale(f),g=Xl({axis:n,ticks:s,bandSize:l,entry:d,index:u});return x==null||g==null?null:{x,y:g,value:f,payload:d}}).filter(Boolean)}function r9(e){var t=ft(e,ok),r=pt();return h.createElement(qN,{id:t.id,type:"line"},n=>h.createElement(h.Fragment,null,h.createElement(FN,{legendPayload:UR(t)}),h.createElement(WN,{fn:qR,args:t}),h.createElement(KN,{type:"line",id:n,data:t.data,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,dataKey:t.dataKey,hide:t.hide,isPanorama:r}),h.createElement(e9,Ks({},t,{id:n}))))}var lk=h.memo(r9);lk.displayName="Line";var ck=(e,t,r,n)=>Iu(e,"xAxis",t,n),uk=(e,t,r,n)=>Mu(e,"xAxis",t,n),dk=(e,t,r,n)=>Iu(e,"yAxis",r,n),fk=(e,t,r,n)=>Mu(e,"yAxis",r,n),n9=$([de,ck,dk,uk,fk],(e,t,r,n,i)=>Mr(e,"xAxis")?ga(t,n,!1):ga(r,i,!1)),i9=(e,t,r,n,i)=>i,pk=$([$m,i9],(e,t)=>e.filter(r=>r.type==="area").find(r=>r.id===t)),a9=(e,t,r,n,i)=>{var s,o=pk(e,t,r,n,i);if(o!=null){var l=de(e),c=Mr(l,"xAxis"),d;if(c?d=dp(e,"yAxis",r,n):d=dp(e,"xAxis",t,n),d!=null){var{stackId:u}=o,f=Tm(o);if(!(u==null||f==null)){var p=(s=d[u])===null||s===void 0?void 0:s.stackedData;return p==null?void 0:p.find(m=>m.key===f)}}}},s9=$([de,ck,dk,uk,fk,a9,Su,n9,pk,vM],(e,t,r,n,i,s,o,l,c,d)=>{var{chartData:u,dataStartIndex:f,dataEndIndex:p}=o;if(!(c==null||e!=="horizontal"&&e!=="vertical"||t==null||r==null||n==null||i==null||n.length===0||i.length===0||l==null)){var{data:m}=c,x;if(m&&m.length>0?x=m:x=u==null?void 0:u.slice(f,p+1),x!=null)return k9({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:i,dataStartIndex:f,areaSettings:c,stackedData:s,displayedData:x,chartBaseValue:d,bandSize:l})}}),o9=["id"],l9=["activeDot","animationBegin","animationDuration","animationEasing","connectNulls","dot","fill","fillOpacity","hide","isAnimationActive","legendType","stroke","xAxisId","yAxisId"];function fi(){return fi=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var{dataKey:t,name:r,stroke:n,fill:i,legendType:s,hide:o}=e;return[{inactive:o,dataKey:t,type:s,color:Sc(n,i),value:lu(r,t),payload:e}]};function h9(e){var{dataKey:t,data:r,stroke:n,strokeWidth:i,fill:s,name:o,hide:l,unit:c}=e;return{dataDefinedOnItem:r,positions:void 0,settings:{stroke:n,strokeWidth:i,fill:s,dataKey:t,nameKey:void 0,name:lu(o,t),hide:l,type:e.tooltipType,color:Sc(n,s),unit:c}}}function m9(e){var{clipPathId:t,points:r,props:n}=e,{needClip:i,dot:s,dataKey:o}=n,l=nr(n);return h.createElement(VN,{points:r,dot:s,className:"recharts-area-dots",dotClassName:"recharts-area-dot",dataKey:o,baseProps:l,needClip:i,clipPathId:t})}function g9(e){var{showLabels:t,children:r,points:n}=e,i=n.map(s=>{var o,l,c={x:(o=s.x)!==null&&o!==void 0?o:0,y:(l=s.y)!==null&&l!==void 0?l:0,width:0,lowerWidth:0,upperWidth:0,height:0};return Zi(Zi({},c),{},{value:s.value,payload:s.payload,parentViewBox:void 0,viewBox:c,fill:void 0})});return h.createElement(IN,{value:t?i:void 0},r)}function xv(e){var{points:t,baseLine:r,needClip:n,clipPathId:i,props:s}=e,{layout:o,type:l,stroke:c,connectNulls:d,isRange:u}=s,{id:f}=s,p=hk(s,o9),m=nr(p),x=ut(p);return h.createElement(h.Fragment,null,(t==null?void 0:t.length)>1&&h.createElement(ir,{clipPath:n?"url(#clipPath-".concat(i,")"):void 0},h.createElement(fs,fi({},x,{id:f,points:t,connectNulls:d,type:l,baseLine:r,layout:o,stroke:"none",className:"recharts-area-area"})),c!=="none"&&h.createElement(fs,fi({},m,{className:"recharts-area-curve",layout:o,type:l,connectNulls:d,fill:"none",points:t})),c!=="none"&&u&&h.createElement(fs,fi({},m,{className:"recharts-area-curve",layout:o,type:l,connectNulls:d,fill:"none",points:r}))),h.createElement(m9,{points:t,props:p,clipPathId:i}))}function x9(e){var{alpha:t,baseLine:r,points:n,strokeWidth:i}=e,s=n[0].y,o=n[n.length-1].y;if(!_e(s)||!_e(o))return null;var l=t*Math.abs(s-o),c=Math.max(...n.map(d=>d.x||0));return Y(r)?c=Math.max(r,c):r&&Array.isArray(r)&&r.length&&(c=Math.max(...r.map(d=>d.x||0),c)),Y(c)?h.createElement("rect",{x:0,y:sd.y||0));return Y(r)?c=Math.max(r,c):r&&Array.isArray(r)&&r.length&&(c=Math.max(...r.map(d=>d.y||0),c)),Y(c)?h.createElement("rect",{x:s{typeof m=="function"&&m(),b(!1)},[m]),y=h.useCallback(()=>{typeof p=="function"&&p(),b(!0)},[p]),w=i.current,S=s.current;return h.createElement(g9,{showLabels:v,points:o},n.children,h.createElement(mu,{animationId:x,begin:d,duration:u,isActive:c,easing:f,onAnimationEnd:j,onAnimationStart:y,key:x},N=>{if(w){var _=w.length/o.length,P=N===1?o:o.map((M,I)=>{var C=Math.floor(I*_);if(w[C]){var B=w[C];return Zi(Zi({},M),{},{x:Ee(B.x,M.x,N),y:Ee(B.y,M.y,N)})}return M}),D;return Y(l)?D=Ee(S,l,N):Re(l)||yr(l)?D=Ee(S,0,N):D=l.map((M,I)=>{var C=Math.floor(I*_);if(Array.isArray(S)&&S[C]){var B=S[C];return Zi(Zi({},M),{},{x:Ee(B.x,M.x,N),y:Ee(B.y,M.y,N)})}return M}),N>0&&(i.current=P,s.current=D),h.createElement(xv,{points:P,baseLine:D,needClip:t,clipPathId:r,props:n})}return N>0&&(i.current=o,s.current=l),h.createElement(ir,null,c&&h.createElement("defs",null,h.createElement("clipPath",{id:"animationClipPath-".concat(r)},h.createElement(v9,{alpha:N,points:o,baseLine:l,layout:n.layout,strokeWidth:n.strokeWidth}))),h.createElement(ir,{clipPath:"url(#animationClipPath-".concat(r,")")},h.createElement(xv,{points:o,baseLine:l,needClip:t,clipPathId:r,props:n})))}),h.createElement(LN,{label:n.label}))}function j9(e){var{needClip:t,clipPathId:r,props:n}=e,i=h.useRef(null),s=h.useRef();return h.createElement(b9,{needClip:t,clipPathId:r,props:n,previousPointsRef:i,previousBaselineRef:s})}class w9 extends h.PureComponent{render(){var{hide:t,dot:r,points:n,className:i,top:s,left:o,needClip:l,xAxisId:c,yAxisId:d,width:u,height:f,id:p,baseLine:m,zIndex:x}=this.props;if(t)return null;var g=ue("recharts-area",i),b=p,{r:v,strokeWidth:j}=ak(r),y=rg(r),w=v*2+j;return h.createElement(Ir,{zIndex:x},h.createElement(ir,{className:g},l&&h.createElement("defs",null,h.createElement(ZN,{clipPathId:b,xAxisId:c,yAxisId:d}),!y&&h.createElement("clipPath",{id:"clipPath-dots-".concat(b)},h.createElement("rect",{x:o-w/2,y:s-w/2,width:u+w,height:f+w}))),h.createElement(j9,{needClip:l,clipPathId:b,props:this.props})),h.createElement(vp,{points:n,mainColor:Sc(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot}),this.props.isRange&&Array.isArray(m)&&h.createElement(vp,{points:m,mainColor:Sc(this.props.stroke,this.props.fill),itemDataKey:this.props.dataKey,activeDot:this.props.activeDot}))}}var mk={activeDot:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",connectNulls:!1,dot:!1,fill:"#3182bd",fillOpacity:.6,hide:!1,isAnimationActive:!Ci.isSsr,legendType:"line",stroke:"#3182bd",xAxisId:0,yAxisId:0,zIndex:lt.area};function S9(e){var t,r=ft(e,mk),{activeDot:n,animationBegin:i,animationDuration:s,animationEasing:o,connectNulls:l,dot:c,fill:d,fillOpacity:u,hide:f,isAnimationActive:p,legendType:m,stroke:x,xAxisId:g,yAxisId:b}=r,v=hk(r,l9),j=ro(),y=uN(),{needClip:w}=ng(g,b),S=pt(),{points:N,isRange:_,baseLine:P}=(t=G(q=>s9(q,g,b,S,e.id)))!==null&&t!==void 0?t:{},D=Lu();if(j!=="horizontal"&&j!=="vertical"||D==null||y!=="AreaChart"&&y!=="ComposedChart")return null;var{height:M,width:I,x:C,y:B}=D;return!N||!N.length?null:h.createElement(w9,fi({},v,{activeDot:n,animationBegin:i,animationDuration:s,animationEasing:o,baseLine:P,connectNulls:l,dot:c,fill:d,fillOpacity:u,height:M,hide:f,layout:j,isAnimationActive:p,isRange:_,legendType:m,needClip:w,points:N,stroke:x,width:I,left:C,top:B,xAxisId:g,yAxisId:b}))}var N9=(e,t,r,n,i)=>{var s=r??t;if(Y(s))return s;var o=e==="horizontal"?i:n,l=o.scale.domain();if(o.type==="number"){var c=Math.max(l[0],l[1]),d=Math.min(l[0],l[1]);return s==="dataMin"?d:s==="dataMax"||c<0?c:Math.max(Math.min(l[0],l[1]),0)}return s==="dataMin"?l[0]:s==="dataMax"?l[1]:l[0]};function k9(e){var{areaSettings:{connectNulls:t,baseValue:r,dataKey:n},stackedData:i,layout:s,chartBaseValue:o,xAxis:l,yAxis:c,displayedData:d,dataStartIndex:u,xAxisTicks:f,yAxisTicks:p,bandSize:m}=e,x=i&&i.length,g=N9(s,o,r,l,c),b=s==="horizontal",v=!1,j=d.map((w,S)=>{var N;x?N=i[u+S]:(N=et(w,n),Array.isArray(N)?v=!0:N=[g,N]);var _=N[1]==null||x&&!t&&et(w,n)==null;return b?{x:Xl({axis:l,ticks:f,bandSize:m,entry:w,index:S}),y:_?null:c.scale(N[1]),value:N,payload:w}:{x:_?null:l.scale(N[1]),y:Xl({axis:c,ticks:p,bandSize:m,entry:w,index:S}),value:N,payload:w}}),y;return x||v?y=j.map(w=>{var S=Array.isArray(w.value)?w.value[0]:null;return b?{x:w.x,y:S!=null&&w.y!=null?c.scale(S):null,payload:w.payload}:{x:S!=null?l.scale(S):null,y:w.y,payload:w.payload}}):y=b?c.scale(g):l.scale(g),{points:j,baseLine:y,isRange:v}}function _9(e){var t=ft(e,mk),r=pt();return h.createElement(qN,{id:t.id,type:"area"},n=>h.createElement(h.Fragment,null,h.createElement(FN,{legendPayload:p9(t)}),h.createElement(WN,{fn:h9,args:t}),h.createElement(KN,{type:"area",id:n,data:t.data,dataKey:t.dataKey,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,stackId:OE(t.stackId),hide:t.hide,barSize:void 0,baseValue:t.baseValue,isPanorama:r,connectNulls:t.connectNulls}),h.createElement(S9,fi({},t,{id:n}))))}var gk=h.memo(_9);gk.displayName="Area";var P9=["dangerouslySetInnerHTML","ticks"],C9=["id"],A9=["domain"],O9=["domain"];function wp(){return wp=Object.assign?Object.assign.bind():function(e){for(var t=1;t(t(fz(e)),()=>{t(pz(e))}),[e,t]),null}var T9=e=>{var{xAxisId:t,className:r}=e,n=G(Iw),i=pt(),s="xAxis",o=G(b=>Ta(b,s,t,i)),l=G(b=>F2(b,s,t,i)),c=G(b=>dI(b,t)),d=G(b=>xI(b,t)),u=G(b=>l2(b,t));if(c==null||d==null||u==null)return null;var{dangerouslySetInnerHTML:f,ticks:p}=e,m=Nc(e,P9),{id:x}=u,g=Nc(u,C9);return h.createElement(og,wp({},m,g,{scale:o,x:d.x,y:d.y,width:c.width,height:c.height,className:ue("recharts-".concat(s," ").concat(s),r),viewBox:n,ticks:l,axisType:s}))},M9={allowDataOverflow:Tt.allowDataOverflow,allowDecimals:Tt.allowDecimals,allowDuplicatedCategory:Tt.allowDuplicatedCategory,height:Tt.height,hide:!1,mirror:Tt.mirror,orientation:Tt.orientation,padding:Tt.padding,reversed:Tt.reversed,scale:Tt.scale,tickCount:Tt.tickCount,type:Tt.type,xAxisId:0},I9=e=>{var t,r,n,i,s,o=ft(e,M9);return h.createElement(h.Fragment,null,h.createElement(D9,{interval:(t=o.interval)!==null&&t!==void 0?t:"preserveEnd",id:o.xAxisId,scale:o.scale,type:o.type,padding:o.padding,allowDataOverflow:o.allowDataOverflow,domain:o.domain,dataKey:o.dataKey,allowDuplicatedCategory:o.allowDuplicatedCategory,allowDecimals:o.allowDecimals,tickCount:o.tickCount,includeHidden:(r=o.includeHidden)!==null&&r!==void 0?r:!1,reversed:o.reversed,ticks:o.ticks,height:o.height,orientation:o.orientation,mirror:o.mirror,hide:o.hide,unit:o.unit,name:o.name,angle:(n=o.angle)!==null&&n!==void 0?n:0,minTickGap:(i=o.minTickGap)!==null&&i!==void 0?i:5,tick:(s=o.tick)!==null&&s!==void 0?s:!0,tickFormatter:o.tickFormatter}),h.createElement(T9,o))},$9=(e,t)=>{var{domain:r}=e,n=Nc(e,A9),{domain:i}=t,s=Nc(t,O9);return ba(n,s)?Array.isArray(r)&&r.length===2&&Array.isArray(i)&&i.length===2?r[0]===i[0]&&r[1]===i[1]:ba({domain:r},{domain:i}):!1},Sp=h.memo(I9,$9);Sp.displayName="XAxis";var L9=["dangerouslySetInnerHTML","ticks"],z9=["id"],R9=["domain"],B9=["domain"];function Np(){return Np=Object.assign?Object.assign.bind():function(e){for(var t=1;t(t(hz(e)),()=>{t(mz(e))}),[e,t]),null}var U9=e=>{var{yAxisId:t,className:r,width:n,label:i}=e,s=h.useRef(null),o=h.useRef(null),l=G(Iw),c=pt(),d=Ye(),u="yAxis",f=G(S=>Ta(S,u,t,c)),p=G(S=>bI(S,t)),m=G(S=>vI(S,t)),x=G(S=>F2(S,u,t,c)),g=G(S=>c2(S,t));if(h.useLayoutEffect(()=>{if(!(n!=="auto"||!p||tg(i)||h.isValidElement(i)||g==null)){var S=s.current;if(S){var N=S.getCalculatedWidth();Math.round(p.width)!==Math.round(N)&&d(gz({id:t,width:N}))}}},[x,p,d,i,t,n,g]),p==null||m==null||g==null)return null;var{dangerouslySetInnerHTML:b,ticks:v}=e,j=kc(e,L9),{id:y}=g,w=kc(g,z9);return h.createElement(og,Np({},j,w,{ref:s,labelRef:o,scale:f,x:m.x,y:m.y,tickTextProps:n==="auto"?{width:void 0}:{width:n},width:p.width,height:p.height,className:ue("recharts-".concat(u," ").concat(u),r),viewBox:l,ticks:x,axisType:u}))},q9={allowDataOverflow:Mt.allowDataOverflow,allowDecimals:Mt.allowDecimals,allowDuplicatedCategory:Mt.allowDuplicatedCategory,hide:!1,mirror:Mt.mirror,orientation:Mt.orientation,padding:Mt.padding,reversed:Mt.reversed,scale:Mt.scale,tickCount:Mt.tickCount,type:Mt.type,width:Mt.width,yAxisId:0},H9=e=>{var t,r,n,i,s,o=ft(e,q9);return h.createElement(h.Fragment,null,h.createElement(F9,{interval:(t=o.interval)!==null&&t!==void 0?t:"preserveEnd",id:o.yAxisId,scale:o.scale,type:o.type,domain:o.domain,allowDataOverflow:o.allowDataOverflow,dataKey:o.dataKey,allowDuplicatedCategory:o.allowDuplicatedCategory,allowDecimals:o.allowDecimals,tickCount:o.tickCount,padding:o.padding,includeHidden:(r=o.includeHidden)!==null&&r!==void 0?r:!1,reversed:o.reversed,ticks:o.ticks,width:o.width,orientation:o.orientation,mirror:o.mirror,hide:o.hide,unit:o.unit,name:o.name,angle:(n=o.angle)!==null&&n!==void 0?n:0,minTickGap:(i=o.minTickGap)!==null&&i!==void 0?i:5,tick:(s=o.tick)!==null&&s!==void 0?s:!0,tickFormatter:o.tickFormatter}),h.createElement(U9,o))},K9=(e,t)=>{var{domain:r}=e,n=kc(e,R9),{domain:i}=t,s=kc(t,B9);return ba(n,s)?Array.isArray(r)&&r.length===2&&Array.isArray(i)&&i.length===2?r[0]===i[0]&&r[1]===i[1]:ba({domain:r},{domain:i}):!1},kp=h.memo(H9,K9);kp.displayName="YAxis";var V9={};/** + * @license React + * use-sync-external-store-with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ho=h;function Y9(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var G9=typeof Object.is=="function"?Object.is:Y9,Z9=ho.useSyncExternalStore,X9=ho.useRef,J9=ho.useEffect,Q9=ho.useMemo,eB=ho.useDebugValue;V9.useSyncExternalStoreWithSelector=function(e,t,r,n,i){var s=X9(null);if(s.current===null){var o={hasValue:!1,value:null};s.current=o}else o=s.current;s=Q9(function(){function c(m){if(!d){if(d=!0,u=m,m=n(m),i!==void 0&&o.hasValue){var x=o.value;if(i(x,m))return f=x}return f=m}if(x=f,G9(u,m))return x;var g=n(m);return i!==void 0&&i(x,g)?(u=m,x):(u=m,f=g)}var d=!1,u,f,p=r===void 0?null:r;return[function(){return c(t())},p===null?void 0:function(){return c(p())}]},[t,r,n,i]);var l=Z9(e,s[0],s[1]);return J9(function(){o.hasValue=!0,o.value=l},[l]),eB(l),l};function tB(e){e()}function rB(){let e=null,t=null;return{clear(){e=null,t=null},notify(){tB(()=>{let r=e;for(;r;)r.callback(),r=r.next})},get(){const r=[];let n=e;for(;n;)r.push(n),n=n.next;return r},subscribe(r){let n=!0;const i=t={callback:r,next:null,prev:t};return i.prev?i.prev.next=i:e=i,function(){!n||e===null||(n=!1,i.next?i.next.prev=i.prev:t=i.prev,i.prev?i.prev.next=i.next:e=i.next)}}}}var yv={notify(){},get:()=>[]};function nB(e,t){let r,n=yv,i=0,s=!1;function o(g){u();const b=n.subscribe(g);let v=!1;return()=>{v||(v=!0,b(),f())}}function l(){n.notify()}function c(){x.onStateChange&&x.onStateChange()}function d(){return s}function u(){i++,r||(r=e.subscribe(c),n=rB())}function f(){i--,r&&i===0&&(r(),r=void 0,n.clear(),n=yv)}function p(){s||(s=!0,u())}function m(){s&&(s=!1,f())}const x={addNestedSub:o,notifyNestedSubs:l,handleChangeWrapper:c,isSubscribed:d,trySubscribe:p,tryUnsubscribe:m,getListeners:()=>n};return x}var iB=()=>typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",aB=iB(),sB=()=>typeof navigator<"u"&&navigator.product==="ReactNative",oB=sB(),lB=()=>aB||oB?h.useLayoutEffect:h.useEffect,cB=lB(),Ed=Symbol.for("react-redux-context"),Dd=typeof globalThis<"u"?globalThis:{};function uB(){if(!h.createContext)return{};const e=Dd[Ed]??(Dd[Ed]=new Map);let t=e.get(h.createContext);return t||(t=h.createContext(null),e.set(h.createContext,t)),t}var dB=uB();function fB(e){const{children:t,context:r,serverState:n,store:i}=e,s=h.useMemo(()=>{const c=nB(i);return{store:i,subscription:c,getServerState:n?()=>n:void 0}},[i,n]),o=h.useMemo(()=>i.getState(),[i]);cB(()=>{const{subscription:c}=s;return c.onStateChange=c.notifyNestedSubs,c.trySubscribe(),o!==i.getState()&&c.notifyNestedSubs(),()=>{c.tryUnsubscribe(),c.onStateChange=void 0}},[s,o]);const l=r||dB;return h.createElement(l.Provider,{value:s},t)}var pB=fB,hB=(e,t)=>t,cg=$([hB,de,s2,Fe,iN,pn,O$,rt],L$),ug=e=>{var t=e.currentTarget.getBoundingClientRect(),r=t.width/e.currentTarget.offsetWidth,n=t.height/e.currentTarget.offsetHeight;return{chartX:Math.round((e.clientX-t.left)/r),chartY:Math.round((e.clientY-t.top)/n)}},xk=ar("mouseClick"),yk=eo();yk.startListening({actionCreator:xk,effect:(e,t)=>{var r=e.payload,n=cg(t.getState(),ug(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(DI({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var _p=ar("mouseMove"),vk=eo();vk.startListening({actionCreator:_p,effect:(e,t)=>{var r=e.payload,n=t.getState(),i=Hm(n,n.tooltip.settings.shared),s=cg(n,ug(r));i==="axis"&&((s==null?void 0:s.activeIndex)!=null?t.dispatch(G2({activeIndex:s.activeIndex,activeDataKey:void 0,activeCoordinate:s.activeCoordinate})):t.dispatch(Y2()))}});var vv={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0},bk=At({name:"rootProps",initialState:vv,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:vv.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue}}}),mB=bk.reducer,{updateOptions:gB}=bk.actions,jk=At({name:"polarOptions",initialState:null,reducers:{updatePolarOptions:(e,t)=>t.payload}}),{updatePolarOptions:eF}=jk.actions,xB=jk.reducer,wk=ar("keyDown"),Sk=ar("focus"),dg=eo();dg.startListening({actionCreator:wk,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var{keyboardInteraction:i}=r.tooltip,s=e.payload;if(!(s!=="ArrowRight"&&s!=="ArrowLeft"&&s!=="Enter")){var o=Number(Km(i,Ia(r))),l=pn(r);if(s==="Enter"){var c=gc(r,"axis","hover",String(i.index));t.dispatch(pp({active:!i.active,activeIndex:i.index,activeDataKey:i.dataKey,activeCoordinate:c}));return}var d=NI(r),u=d==="left-to-right"?1:-1,f=s==="ArrowRight"?1:-1,p=o+f*u;if(!(l==null||p>=l.length||p<0)){var m=gc(r,"axis","hover",String(p));t.dispatch(pp({active:!0,activeIndex:p.toString(),activeDataKey:void 0,activeCoordinate:m}))}}}}});dg.startListening({actionCreator:Sk,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var{keyboardInteraction:i}=r.tooltip;if(!i.active&&i.index==null){var s="0",o=gc(r,"axis","hover",String(s));t.dispatch(pp({activeDataKey:void 0,active:!0,activeIndex:s,activeCoordinate:o}))}}}});var Vt=ar("externalEvent"),Nk=eo();Nk.startListening({actionCreator:Vt,effect:(e,t)=>{if(e.payload.handler!=null){var r=t.getState(),n={activeCoordinate:m$(r),activeDataKey:p$(r),activeIndex:qs(r),activeLabel:oN(r),activeTooltipIndex:qs(r),isTooltipActive:g$(r)};e.payload.handler(n,e.payload.reactEvent)}}});var yB=$([Ma],e=>e.tooltipItemPayloads),vB=$([yB,fo,(e,t,r)=>t,(e,t,r)=>r],(e,t,r,n)=>{var i=e.find(l=>l.settings.dataKey===n);if(i!=null){var{positions:s}=i;if(s!=null){var o=t(s,r);return o}}}),kk=ar("touchMove"),_k=eo();_k.startListening({actionCreator:kk,effect:(e,t)=>{var r=e.payload;if(!(r.touches==null||r.touches.length===0)){var n=t.getState(),i=Hm(n,n.tooltip.settings.shared);if(i==="axis"){var s=cg(n,ug({clientX:r.touches[0].clientX,clientY:r.touches[0].clientY,currentTarget:r.currentTarget}));(s==null?void 0:s.activeIndex)!=null&&t.dispatch(G2({activeIndex:s.activeIndex,activeDataKey:void 0,activeCoordinate:s.activeCoordinate}))}else if(i==="item"){var o,l=r.touches[0];if(document.elementFromPoint==null)return;var c=document.elementFromPoint(l.clientX,l.clientY);if(!c||!c.getAttribute)return;var d=c.getAttribute(LE),u=(o=c.getAttribute(zE))!==null&&o!==void 0?o:void 0,f=vB(t.getState(),d,u);t.dispatch(EI({activeDataKey:u,activeIndex:d,activeCoordinate:f}))}}}});var bB=sw({brush:Mz,cartesianAxis:xz,chartData:p8,errorBars:_z,graphicalItems:QL,layout:bE,legend:p3,options:l8,polarAxis:CL,polarOptions:xB,referenceElements:Wz,rootProps:mB,tooltip:TI,zIndex:X$}),jB=function(t){return H4({reducer:bB,preloadedState:t,middleware:r=>r({serializableCheck:!1}).concat([yk.middleware,vk.middleware,dg.middleware,Nk.middleware,_k.middleware]),enhancers:r=>{var n=r;return typeof r=="function"&&(n=r()),n.concat(yw({type:"raf"}))},devTools:Ci.devToolsEnabled})};function wB(e){var{preloadedState:t,children:r,reduxStoreName:n}=e,i=pt(),s=h.useRef(null);if(i)return r;s.current==null&&(s.current=jB(t));var o=Vh;return h.createElement(pB,{context:o,store:s.current},r)}function SB(e){var{layout:t,margin:r}=e,n=Ye(),i=pt();return h.useEffect(()=>{i||(n(xE(t)),n(gE(r)))},[n,i,t,r]),null}function NB(e){var t=Ye();return h.useEffect(()=>{t(gB(e))},[t,e]),null}function bv(e){var{zIndex:t,isPanorama:r}=e,n=r?"recharts-zindex-panorama-":"recharts-zindex-",i=UN("".concat(n).concat(t)),s=Ye();return h.useLayoutEffect(()=>(s(G$({zIndex:t,elementId:i,isPanorama:r})),()=>{s(Z$({zIndex:t,isPanorama:r}))}),[s,t,i,r]),h.createElement("g",{id:i})}function jv(e){var{children:t,isPanorama:r}=e,n=G(R$);if(!n||n.length===0)return t;var i=n.filter(o=>o<0),s=n.filter(o=>o>0);return h.createElement(h.Fragment,null,i.map(o=>h.createElement(bv,{key:o,zIndex:o,isPanorama:r})),t,s.map(o=>h.createElement(bv,{key:o,zIndex:o,isPanorama:r})))}var kB=["children"];function _B(e,t){if(e==null)return{};var r,n,i=PB(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{var r=qw(),n=Hw(),i=Vw();if(!Er(r)||!Er(n))return null;var{children:s,otherAttributes:o,title:l,desc:c}=e,d,u;return o!=null&&(typeof o.tabIndex=="number"?d=o.tabIndex:d=i?0:void 0,typeof o.role=="string"?u=o.role:u=i?"application":void 0),h.createElement(dj,_c({},o,{title:l,desc:c,role:u,tabIndex:d,width:r,height:n,style:CB,ref:t}),s)}),OB=e=>{var{children:t}=e,r=G(fu);if(!r)return null;var{width:n,height:i,y:s,x:o}=r;return h.createElement(dj,{width:n,height:i,x:o,y:s},t)},wv=h.forwardRef((e,t)=>{var{children:r}=e,n=_B(e,kB),i=pt();return i?h.createElement(OB,null,h.createElement(jv,{isPanorama:!0},r)):h.createElement(AB,_c({ref:t},n),h.createElement(jv,{isPanorama:!1},r))});function EB(){var e=Ye(),[t,r]=h.useState(null),n=G($E);return h.useEffect(()=>{if(t!=null){var i=t.getBoundingClientRect(),s=i.width/t.offsetWidth;_e(s)&&s!==n&&e(vE(s))}},[t,e,n]),r}function Sv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function DB(e){for(var t=1;t(w8(),null);function Pc(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var LB=h.forwardRef((e,t)=>{var r,n,i=h.useRef(null),[s,o]=h.useState({containerWidth:Pc((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:Pc((n=e.style)===null||n===void 0?void 0:n.height)}),l=h.useCallback((d,u)=>{o(f=>{var p=Math.round(d),m=Math.round(u);return f.containerWidth===p&&f.containerHeight===m?f:{containerWidth:p,containerHeight:m}})},[]),c=h.useCallback(d=>{if(typeof t=="function"&&t(d),d!=null&&typeof ResizeObserver<"u"){var{width:u,height:f}=d.getBoundingClientRect();l(u,f);var p=x=>{var{width:g,height:b}=x[0].contentRect;l(g,b)},m=new ResizeObserver(p);m.observe(d),i.current=m}},[t,l]);return h.useEffect(()=>()=>{var d=i.current;d!=null&&d.disconnect()},[l]),h.createElement(h.Fragment,null,h.createElement(hu,{width:s.containerWidth,height:s.containerHeight}),h.createElement("div",Ni({ref:c},e)))}),zB=h.forwardRef((e,t)=>{var{width:r,height:n}=e,[i,s]=h.useState({containerWidth:Pc(r),containerHeight:Pc(n)}),o=h.useCallback((c,d)=>{s(u=>{var f=Math.round(c),p=Math.round(d);return u.containerWidth===f&&u.containerHeight===p?u:{containerWidth:f,containerHeight:p}})},[]),l=h.useCallback(c=>{if(typeof t=="function"&&t(c),c!=null){var{width:d,height:u}=c.getBoundingClientRect();o(d,u)}},[t,o]);return h.createElement(h.Fragment,null,h.createElement(hu,{width:i.containerWidth,height:i.containerHeight}),h.createElement("div",Ni({ref:l},e)))}),RB=h.forwardRef((e,t)=>{var{width:r,height:n}=e;return h.createElement(h.Fragment,null,h.createElement(hu,{width:r,height:n}),h.createElement("div",Ni({ref:t},e)))}),BB=h.forwardRef((e,t)=>{var{width:r,height:n}=e;return Qr(r)||Qr(n)?h.createElement(zB,Ni({},e,{ref:t})):h.createElement(RB,Ni({},e,{ref:t}))});function WB(e){return e===!0?LB:BB}var FB=h.forwardRef((e,t)=>{var{children:r,className:n,height:i,onClick:s,onContextMenu:o,onDoubleClick:l,onMouseDown:c,onMouseEnter:d,onMouseLeave:u,onMouseMove:f,onMouseUp:p,onTouchEnd:m,onTouchMove:x,onTouchStart:g,style:b,width:v,responsive:j,dispatchTouchEvents:y=!0}=e,w=h.useRef(null),S=Ye(),[N,_]=h.useState(null),[P,D]=h.useState(null),M=EB(),I=tm(),C=(I==null?void 0:I.width)>0?I.width:v,B=(I==null?void 0:I.height)>0?I.height:i,q=h.useCallback(R=>{M(R),typeof t=="function"&&t(R),_(R),D(R),R!=null&&(w.current=R)},[M,t,_,D]),Z=h.useCallback(R=>{S(xk(R)),S(Vt({handler:s,reactEvent:R}))},[S,s]),A=h.useCallback(R=>{S(_p(R)),S(Vt({handler:d,reactEvent:R}))},[S,d]),T=h.useCallback(R=>{S(Y2()),S(Vt({handler:u,reactEvent:R}))},[S,u]),O=h.useCallback(R=>{S(_p(R)),S(Vt({handler:f,reactEvent:R}))},[S,f]),k=h.useCallback(()=>{S(Sk())},[S]),L=h.useCallback(R=>{S(wk(R.key))},[S]),W=h.useCallback(R=>{S(Vt({handler:o,reactEvent:R}))},[S,o]),H=h.useCallback(R=>{S(Vt({handler:l,reactEvent:R}))},[S,l]),ee=h.useCallback(R=>{S(Vt({handler:c,reactEvent:R}))},[S,c]),re=h.useCallback(R=>{S(Vt({handler:p,reactEvent:R}))},[S,p]),Me=h.useCallback(R=>{S(Vt({handler:g,reactEvent:R}))},[S,g]),E=h.useCallback(R=>{y&&S(kk(R)),S(Vt({handler:x,reactEvent:R}))},[S,y,x]),J=h.useCallback(R=>{S(Vt({handler:m,reactEvent:R}))},[S,m]),Ot=WB(j);return h.createElement(gN.Provider,{value:N},h.createElement(oO.Provider,{value:P},h.createElement(Ot,{width:C??(b==null?void 0:b.width),height:B??(b==null?void 0:b.height),className:ue("recharts-wrapper",n),style:DB({position:"relative",cursor:"default",width:C,height:B},b),onClick:Z,onContextMenu:W,onDoubleClick:H,onFocus:k,onKeyDown:L,onMouseDown:ee,onMouseEnter:A,onMouseLeave:T,onMouseMove:O,onMouseUp:re,onTouchEnd:J,onTouchMove:E,onTouchStart:Me,ref:q},h.createElement($B,null),r)))}),UB=["width","height","responsive","children","className","style","compact","title","desc"];function qB(e,t){if(e==null)return{};var r,n,i=HB(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n{var{width:r,height:n,responsive:i,children:s,className:o,style:l,compact:c,title:d,desc:u}=e,f=qB(e,UB),p=nr(f);return c?h.createElement(h.Fragment,null,h.createElement(hu,{width:r,height:n}),h.createElement(wv,{otherAttributes:p,title:d,desc:u},s)):h.createElement(FB,{className:o,style:l,width:r,height:n,responsive:i??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},h.createElement(wv,{otherAttributes:p,title:d,desc:u,ref:t},h.createElement(Uz,null,s)))});function Pp(){return Pp=Object.assign?Object.assign.bind():function(e){for(var t=1;th.createElement(Pk,{chartName:"LineChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:GB,tooltipPayloadSearcher:yN,categoricalChartProps:e,ref:t})),XB=["axis"],JB=h.forwardRef((e,t)=>h.createElement(Pk,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:XB,tooltipPayloadSearcher:yN,categoricalChartProps:e,ref:t}));function QB(){var b,v,j,y,w,S,N,_,P,D,M,I,C,B,q,Z,A,T,O,k,L;const[e,t]=h.useState(null),[r,n]=h.useState(null),[i,s]=h.useState(!0),[o,l]=h.useState(0),[c,d]=h.useState(!1);h.useEffect(()=>{f(),u()},[]);const u=async()=>{try{const H=(await z.getChangeStats()).pending_count;l(H);const ee=localStorage.getItem("dismissedPendingChangesCount"),re=ee&&parseInt(ee)>=H;d(H>0&&!re)}catch(W){console.error("Failed to load change stats:",W),d(!1)}},f=async()=>{try{const W=await z.getDutchieAZDashboard();t({products:{total:W.productCount,in_stock:W.productCount,with_images:0},stores:{total:W.dispensaryCount,active:W.dispensaryCount},brands:{total:W.brandCount},campaigns:{active:0,total:0},clicks:{clicks_24h:W.snapshotCount24h},failedJobs:W.failedJobCount,lastCrawlTime:W.lastCrawlTime});try{const H=await z.getDashboardActivity();n(H)}catch{n(null)}}catch(W){console.error("Failed to load dashboard:",W)}finally{s(!1)}},p=()=>{localStorage.setItem("dismissedPendingChangesCount",o.toString()),d(!1)};if(i)return a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx(Xt,{className:"w-8 h-8 animate-spin text-gray-400"})})});const m=Math.round(((b=e==null?void 0:e.products)==null?void 0:b.with_images)/((v=e==null?void 0:e.products)==null?void 0:v.total)*100)||0;Math.round(((j=e==null?void 0:e.stores)==null?void 0:j.active)/((y=e==null?void 0:e.stores)==null?void 0:y.total)*100);const x=[{date:"Mon",products:120},{date:"Tue",products:145},{date:"Wed",products:132},{date:"Thu",products:178},{date:"Fri",products:195},{date:"Sat",products:210},{date:"Sun",products:((w=e==null?void 0:e.products)==null?void 0:w.total)||225}],g=[{time:"00:00",scrapes:5},{time:"04:00",scrapes:12},{time:"08:00",scrapes:18},{time:"12:00",scrapes:25},{time:"16:00",scrapes:30},{time:"20:00",scrapes:22},{time:"24:00",scrapes:((S=r==null?void 0:r.recent_scrapes)==null?void 0:S.length)||15}];return a.jsxs(X,{children:[c&&a.jsx("div",{className:"mb-6 bg-amber-50 border-l-4 border-amber-500 rounded-lg p-4",children:a.jsxs("div",{className:"flex items-center justify-between gap-4",children:[a.jsxs("div",{className:"flex items-center gap-3 flex-1",children:[a.jsx(sj,{className:"w-5 h-5 text-amber-600 flex-shrink-0"}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("h3",{className:"text-sm font-semibold text-amber-900",children:[o," pending change",o!==1?"s":""," require review"]}),a.jsx("p",{className:"text-sm text-amber-700 mt-0.5",children:"Proposed changes to dispensary data are waiting for approval"})]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("button",{className:"btn btn-sm bg-amber-600 hover:bg-amber-700 text-white border-none",children:"Review Changes"}),a.jsx("button",{onClick:p,className:"btn btn-sm btn-ghost text-amber-900 hover:bg-amber-100","aria-label":"Dismiss notification",children:a.jsx(Eh,{className:"w-4 h-4"})})]})]})}),a.jsxs("div",{className:"space-y-8",children:[a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-semibold text-gray-900",children:"Dashboard"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Monitor your dispensary data aggregation"})]}),a.jsxs("button",{onClick:f,className:"inline-flex items-center gap-2 px-4 py-2 bg-white border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors text-sm font-medium text-gray-700",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Refresh"]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Ct,{className:"w-5 h-5 text-blue-600"})}),a.jsxs("div",{className:"flex items-center gap-1 text-xs text-green-600",children:[a.jsx(zn,{className:"w-3 h-3"}),a.jsx("span",{children:"12.5%"})]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Total Products"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((_=(N=e==null?void 0:e.products)==null?void 0:N.total)==null?void 0:_.toLocaleString())||0}),a.jsxs("p",{className:"text-xs text-gray-500",children:[((P=e==null?void 0:e.products)==null?void 0:P.in_stock)||0," in stock"]})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-emerald-50 rounded-lg",children:a.jsx(zl,{className:"w-5 h-5 text-emerald-600"})}),a.jsxs("div",{className:"flex items-center gap-1 text-xs text-green-600",children:[a.jsx(zn,{className:"w-3 h-3"}),a.jsx("span",{children:"8.2%"})]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Total Dispensaries"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((D=e==null?void 0:e.stores)==null?void 0:D.total)||0}),a.jsxs("p",{className:"text-xs text-gray-500",children:[((M=e==null?void 0:e.stores)==null?void 0:M.active)||0," active (crawlable)"]})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(ij,{className:"w-5 h-5 text-purple-600"})}),a.jsxs("div",{className:"flex items-center gap-1 text-xs text-red-600",children:[a.jsx(F6,{className:"w-3 h-3"}),a.jsx("span",{children:"3.1%"})]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Active Campaigns"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((I=e==null?void 0:e.campaigns)==null?void 0:I.active)||0}),a.jsxs("p",{className:"text-xs text-gray-500",children:[((C=e==null?void 0:e.campaigns)==null?void 0:C.total)||0," total campaigns"]})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-amber-50 rounded-lg",children:a.jsx(p6,{className:"w-5 h-5 text-amber-600"})}),a.jsxs("span",{className:"text-xs font-medium text-gray-600",children:[m,"%"]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Images Downloaded"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((q=(B=e==null?void 0:e.products)==null?void 0:B.with_images)==null?void 0:q.toLocaleString())||0}),a.jsx("div",{className:"mt-3",children:a.jsx("div",{className:"w-full bg-gray-100 rounded-full h-1.5",children:a.jsx("div",{className:"bg-amber-500 h-1.5 rounded-full transition-all",style:{width:`${m}%`}})})})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-cyan-50 rounded-lg",children:a.jsx(na,{className:"w-5 h-5 text-cyan-600"})}),a.jsx(xr,{className:"w-4 h-4 text-gray-400"})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Snapshots (24h)"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((A=(Z=e==null?void 0:e.clicks)==null?void 0:Z.clicks_24h)==null?void 0:A.toLocaleString())||0}),a.jsx("p",{className:"text-xs text-gray-500",children:"Product snapshots created"})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-indigo-50 rounded-lg",children:a.jsx(Cr,{className:"w-5 h-5 text-indigo-600"})}),a.jsx(na,{className:"w-4 h-4 text-gray-400"})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Brands"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:((T=e==null?void 0:e.brands)==null?void 0:T.total)||((O=e==null?void 0:e.products)==null?void 0:O.unique_brands)||0}),a.jsx("p",{className:"text-xs text-gray-500",children:"Unique brands tracked"})]})]})]}),a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"mb-6",children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:"Product Growth"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Weekly product count trend"})]}),a.jsx(m0,{width:"100%",height:200,children:a.jsxs(JB,{data:x,children:[a.jsx("defs",{children:a.jsxs("linearGradient",{id:"productGradient",x1:"0",y1:"0",x2:"0",y2:"1",children:[a.jsx("stop",{offset:"5%",stopColor:"#3b82f6",stopOpacity:.1}),a.jsx("stop",{offset:"95%",stopColor:"#3b82f6",stopOpacity:0})]})}),a.jsx(jp,{strokeDasharray:"3 3",stroke:"#f1f5f9"}),a.jsx(Sp,{dataKey:"date",tick:{fill:"#94a3b8",fontSize:12},axisLine:{stroke:"#e2e8f0"}}),a.jsx(kp,{tick:{fill:"#94a3b8",fontSize:12},axisLine:{stroke:"#e2e8f0"}}),a.jsx(Fy,{contentStyle:{backgroundColor:"#ffffff",border:"1px solid #e2e8f0",borderRadius:"8px",fontSize:"12px"}}),a.jsx(gk,{type:"monotone",dataKey:"products",stroke:"#3b82f6",strokeWidth:2,fill:"url(#productGradient)"})]})})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"mb-6",children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:"Scrape Activity"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Scrapes over the last 24 hours"})]}),a.jsx(m0,{width:"100%",height:200,children:a.jsxs(ZB,{data:g,children:[a.jsx(jp,{strokeDasharray:"3 3",stroke:"#f1f5f9"}),a.jsx(Sp,{dataKey:"time",tick:{fill:"#94a3b8",fontSize:12},axisLine:{stroke:"#e2e8f0"}}),a.jsx(kp,{tick:{fill:"#94a3b8",fontSize:12},axisLine:{stroke:"#e2e8f0"}}),a.jsx(Fy,{contentStyle:{backgroundColor:"#ffffff",border:"1px solid #e2e8f0",borderRadius:"8px",fontSize:"12px"}}),a.jsx(lk,{type:"monotone",dataKey:"scrapes",stroke:"#10b981",strokeWidth:2,dot:{fill:"#10b981",r:4}})]})})]})]}),a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200",children:[a.jsxs("div",{className:"px-6 py-4 border-b border-gray-200",children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:"Recent Scrapes"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Latest data collection activities"})]}),a.jsx("div",{className:"divide-y divide-gray-100",children:((k=r==null?void 0:r.recent_scrapes)==null?void 0:k.length)>0?r.recent_scrapes.slice(0,5).map((W,H)=>a.jsx("div",{className:"px-6 py-4 hover:bg-gray-50 transition-colors",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsx("p",{className:"text-sm font-medium text-gray-900 truncate",children:W.name}),a.jsx("p",{className:"text-xs text-gray-500 mt-1",children:new Date(W.last_scraped_at).toLocaleString("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})})]}),a.jsx("div",{className:"ml-4 flex-shrink-0",children:a.jsxs("span",{className:"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-blue-50 text-blue-700",children:[W.product_count," products"]})})]})},H)):a.jsxs("div",{className:"px-6 py-12 text-center",children:[a.jsx(na,{className:"w-8 h-8 text-gray-300 mx-auto mb-2"}),a.jsx("p",{className:"text-sm text-gray-500",children:"No recent scrapes"})]})})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200",children:[a.jsxs("div",{className:"px-6 py-4 border-b border-gray-200",children:[a.jsx("h3",{className:"text-base font-semibold text-gray-900",children:"Recent Products"}),a.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Newly added to inventory"})]}),a.jsx("div",{className:"divide-y divide-gray-100",children:((L=r==null?void 0:r.recent_products)==null?void 0:L.length)>0?r.recent_products.slice(0,5).map((W,H)=>a.jsx("div",{className:"px-6 py-4 hover:bg-gray-50 transition-colors",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsx("p",{className:"text-sm font-medium text-gray-900 truncate",children:W.name}),a.jsx("p",{className:"text-xs text-gray-500 mt-1",children:W.store_name})]}),W.price&&a.jsx("div",{className:"ml-4 flex-shrink-0",children:a.jsxs("span",{className:"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-emerald-50 text-emerald-700",children:["$",W.price]})})]})},H)):a.jsxs("div",{className:"px-6 py-12 text-center",children:[a.jsx(Ct,{className:"w-8 h-8 text-gray-300 mx-auto mb-2"}),a.jsx("p",{className:"text-sm text-gray-500",children:"No recent products"})]})})]})]})]})]})}function eW(){const[e,t]=sA(),r=dt(),[n,i]=h.useState([]),[s,o]=h.useState([]),[l,c]=h.useState([]),[d,u]=h.useState(!1),[f,p]=h.useState(""),[m,x]=h.useState(""),[g,b]=h.useState(""),[v,j]=h.useState(""),[y,w]=h.useState(0),[S,N]=h.useState(0),_=50;h.useEffect(()=>{const k=e.get("store");k&&x(k),D()},[]),h.useEffect(()=>{m&&(M(),P())},[f,m,g,v,S]);const P=async()=>{try{const k=await z.getCategoryTree(parseInt(m));c(k.categories||[])}catch(k){console.error("Failed to load categories:",k)}},D=async()=>{try{const k=await z.getStores();o(k.stores)}catch(k){console.error("Failed to load stores:",k)}},M=async()=>{u(!0);try{const k={limit:_,offset:S,store_id:m};f&&(k.search=f),g&&(k.category_id=g),v&&(k.in_stock=v);const L=await z.getProducts(k);i(L.products),w(L.total)}catch(k){console.error("Failed to load products:",k)}finally{u(!1)}},I=k=>{p(k),N(0)},C=k=>{x(k),b(""),N(0),p(""),t(k?{store:k}:{})},B=k=>{b(k),N(0)},q=(k,L=0)=>k.map(W=>a.jsxs("div",{style:{marginLeft:`${L*20}px`},children:[a.jsxs("button",{onClick:()=>B(W.id.toString()),style:{width:"100%",textAlign:"left",padding:"10px 15px",background:g===W.id.toString()?"#667eea":"transparent",color:g===W.id.toString()?"white":"#333",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:L===0?"600":"400",fontSize:L===0?"15px":"14px",marginBottom:"4px",transition:"all 0.2s"},onMouseEnter:H=>{g!==W.id.toString()&&(H.currentTarget.style.background="#f5f5f5")},onMouseLeave:H=>{g!==W.id.toString()&&(H.currentTarget.style.background="transparent")},children:[W.name," (",W.product_count||0,")"]}),W.children&&W.children.length>0&&q(W.children,L+1)]},W.id)),Z=l.find(k=>k.id.toString()===g),A=()=>{S+_{S>0&&N(Math.max(0,S-_))},O=s.find(k=>k.id.toString()===m);return a.jsx(X,{children:a.jsxs("div",{children:[a.jsx("h1",{style:{fontSize:"32px",marginBottom:"30px"},children:"Products"}),a.jsxs("div",{style:{background:"white",padding:"30px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"30px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"15px",fontSize:"18px",fontWeight:"600",color:"#333"},children:"Select a Store to View Products:"}),a.jsxs("select",{value:m,onChange:k=>C(k.target.value),style:{width:"100%",padding:"15px",border:"2px solid #667eea",borderRadius:"8px",fontSize:"16px",fontWeight:"500",cursor:"pointer",background:"white"},children:[a.jsx("option",{value:"",children:"-- Select a Store --"}),s.map(k=>a.jsx("option",{value:k.id,children:k.name},k.id))]})]}),m?a.jsxs(a.Fragment,{children:[a.jsxs("div",{style:{background:"#667eea",color:"white",padding:"20px",borderRadius:"8px",marginBottom:"20px",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("div",{children:[a.jsx("h2",{style:{margin:0,fontSize:"24px"},children:O==null?void 0:O.name}),Z&&a.jsx("div",{style:{marginTop:"8px",fontSize:"14px",opacity:.9},children:Z.name})]}),a.jsxs("div",{style:{fontSize:"18px",fontWeight:"bold"},children:[y," Products"]})]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"280px 1fr",gap:"20px"},children:[a.jsx("div",{children:a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",position:"sticky",top:"20px"},children:[a.jsx("h3",{style:{margin:"0 0 16px 0",fontSize:"18px",fontWeight:"600",color:"#333"},children:"Categories"}),a.jsxs("button",{onClick:()=>B(""),style:{width:"100%",textAlign:"left",padding:"10px 15px",background:g===""?"#667eea":"transparent",color:g===""?"white":"#333",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600",fontSize:"15px",marginBottom:"12px"},children:["All Products (",y,")"]}),a.jsx("div",{style:{borderTop:"1px solid #eee",marginBottom:"12px"}}),q(l)]})}),a.jsxs("div",{children:[a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"20px",display:"flex",gap:"15px",flexWrap:"wrap"},children:[a.jsx("input",{type:"text",placeholder:"Search products...",value:f,onChange:k=>I(k.target.value),style:{flex:"1",minWidth:"200px",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"}}),a.jsxs("select",{value:v,onChange:k=>{j(k.target.value),N(0)},style:{padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"",children:"All Products"}),a.jsx("option",{value:"true",children:"In Stock"}),a.jsx("option",{value:"false",children:"Out of Stock"})]})]}),d?a.jsx("div",{style:{textAlign:"center",padding:"40px"},children:"Loading..."}):a.jsxs(a.Fragment,{children:[a.jsx("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(250px, 1fr))",gap:"20px",marginBottom:"20px"},children:n.map(k=>a.jsx(tW,{product:k,onViewDetails:()=>r(`/products/${k.id}`)},k.id))}),n.length===0&&a.jsx("div",{style:{background:"white",padding:"40px",borderRadius:"8px",textAlign:"center",color:"#999"},children:"No products found"}),y>_&&a.jsxs("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:"15px",marginTop:"30px"},children:[a.jsx("button",{onClick:T,disabled:S===0,style:{padding:"10px 20px",background:S===0?"#ddd":"#667eea",color:S===0?"#999":"white",border:"none",borderRadius:"6px",cursor:S===0?"not-allowed":"pointer"},children:"Previous"}),a.jsxs("span",{children:["Showing ",S+1," - ",Math.min(S+_,y)," of ",y]}),a.jsx("button",{onClick:A,disabled:S+_>=y,style:{padding:"10px 20px",background:S+_>=y?"#ddd":"#667eea",color:S+_>=y?"#999":"white",border:"none",borderRadius:"6px",cursor:S+_>=y?"not-allowed":"pointer"},children:"Next"})]})]})]})]})]}):a.jsxs("div",{style:{background:"white",padding:"60px 40px",borderRadius:"8px",textAlign:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"48px",marginBottom:"20px"},children:"🏪"}),a.jsx("div",{style:{fontSize:"18px",color:"#666"},children:"Please select a store from the dropdown above to view products"})]})]})})}function tW({product:e,onViewDetails:t}){const r=n=>{if(!n)return"Never";const i=new Date(n),o=new Date().getTime()-i.getTime(),l=Math.floor(o/(1e3*60*60*24));return l===0?"Today":l===1?"Yesterday":l<7?`${l} days ago`:i.toLocaleDateString()};return a.jsxs("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden",transition:"transform 0.2s"},onMouseEnter:n=>n.currentTarget.style.transform="translateY(-4px)",onMouseLeave:n=>n.currentTarget.style.transform="translateY(0)",children:[e.image_url_full?a.jsx("img",{src:e.image_url_full,alt:e.name,style:{width:"100%",height:"200px",objectFit:"cover",background:"#f5f5f5"},onError:n=>{n.currentTarget.src='data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="200" height="200"%3E%3Crect fill="%23ddd" width="200" height="200"/%3E%3Ctext x="50%25" y="50%25" text-anchor="middle" dy=".3em" fill="%23999"%3ENo Image%3C/text%3E%3C/svg%3E'}}):a.jsx("div",{style:{width:"100%",height:"200px",background:"#f5f5f5",display:"flex",alignItems:"center",justifyContent:"center",color:"#999"},children:"No Image"}),a.jsxs("div",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"500",marginBottom:"8px",fontSize:"14px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"8px"},children:[a.jsx("div",{style:{fontWeight:"bold",color:"#667eea"},children:e.price?`$${e.price}`:"N/A"}),a.jsx("div",{style:{padding:"4px 8px",borderRadius:"4px",fontSize:"12px",background:e.in_stock?"#d4edda":"#f8d7da",color:e.in_stock?"#155724":"#721c24"},children:e.in_stock?"In Stock":"Out of Stock"})]}),a.jsxs("div",{style:{fontSize:"11px",color:"#888",marginBottom:"12px",borderTop:"1px solid #eee",paddingTop:"8px"},children:["Last Updated: ",r(e.last_seen_at)]}),a.jsxs("div",{style:{display:"flex",gap:"8px"},children:[e.dutchie_url&&a.jsx("a",{href:e.dutchie_url,target:"_blank",rel:"noopener noreferrer",style:{flex:1,padding:"8px 12px",background:"#f0f0f0",color:"#333",textDecoration:"none",borderRadius:"6px",fontSize:"12px",fontWeight:"500",textAlign:"center",border:"1px solid #ddd"},onClick:n=>n.stopPropagation(),children:"Dutchie"}),a.jsx("button",{onClick:n=>{n.stopPropagation(),t()},style:{flex:1,padding:"8px 12px",background:"#667eea",color:"white",border:"none",borderRadius:"6px",fontSize:"12px",fontWeight:"500",cursor:"pointer"},children:"Details"})]})]})]})}function rW(){const{id:e}=_a(),t=dt(),[r,n]=h.useState(null),[i,s]=h.useState(!0),[o,l]=h.useState(null);h.useEffect(()=>{c()},[e]);const c=async()=>{if(e){s(!0),l(null);try{const p=await z.getProduct(parseInt(e));n(p.product)}catch(p){l(p.message||"Failed to load product")}finally{s(!1)}}};if(i)return a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 border-t-blue-600 rounded-full animate-spin"})})});if(o||!r)return a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx(Ct,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:"Product not found"}),a.jsx("p",{className:"text-gray-500 mb-4",children:o}),a.jsx("button",{onClick:()=>t(-1),className:"text-blue-600 hover:text-blue-700",children:"← Go back"})]})});const d=r.metadata||{},f=r.image_url_full?r.image_url_full:r.medium_path?`http://localhost:9020/dutchie/${r.medium_path}`:r.thumbnail_path?`http://localhost:9020/dutchie/${r.thumbnail_path}`:null;return a.jsx(X,{children:a.jsxs("div",{className:"max-w-6xl mx-auto",children:[a.jsxs("button",{onClick:()=>t(-1),className:"flex items-center gap-2 text-gray-600 hover:text-gray-900 mb-6",children:[a.jsx(Ch,{className:"w-4 h-4"}),"Back"]}),a.jsx("div",{className:"bg-white rounded-xl border border-gray-200 overflow-hidden",children:a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-8 p-6",children:[a.jsx("div",{className:"aspect-square bg-gray-50 rounded-lg overflow-hidden",children:f?a.jsx("img",{src:f,alt:r.name,className:"w-full h-full object-contain"}):a.jsx("div",{className:"w-full h-full flex items-center justify-center text-gray-400",children:a.jsx(Ct,{className:"w-24 h-24"})})}),a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[r.in_stock?a.jsx("span",{className:"px-2 py-1 bg-green-100 text-green-700 text-xs font-medium rounded",children:"In Stock"}):a.jsx("span",{className:"px-2 py-1 bg-red-100 text-red-700 text-xs font-medium rounded",children:"Out of Stock"}),r.strain_type&&a.jsx("span",{className:"px-2 py-1 bg-purple-100 text-purple-700 text-xs font-medium rounded capitalize",children:r.strain_type})]}),a.jsx("h1",{className:"text-2xl font-bold text-gray-900 mb-2",children:r.name}),r.brand&&a.jsx("p",{className:"text-lg text-gray-600 font-medium",children:r.brand}),a.jsxs("div",{className:"flex items-center gap-4 mt-2 text-sm text-gray-500",children:[r.store_name&&a.jsx("span",{children:r.store_name}),r.category_name&&a.jsxs(a.Fragment,{children:[a.jsx("span",{children:"•"}),a.jsx("span",{children:r.category_name})]})]})]}),r.price!==null&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsxs("div",{className:"text-3xl font-bold text-blue-600",children:["$",parseFloat(r.price).toFixed(2)]}),r.weight&&a.jsx("div",{className:"text-sm text-gray-500 mt-1",children:r.weight})]}),(r.thc_percentage||r.cbd_percentage)&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-3",children:"Cannabinoid Content"}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[r.thc_percentage!==null&&a.jsxs("div",{className:"bg-green-50 rounded-lg p-3",children:[a.jsx("div",{className:"text-xs text-gray-500 uppercase",children:"THC"}),a.jsxs("div",{className:"text-xl font-bold text-green-600",children:[r.thc_percentage,"%"]})]}),r.cbd_percentage!==null&&a.jsxs("div",{className:"bg-blue-50 rounded-lg p-3",children:[a.jsx("div",{className:"text-xs text-gray-500 uppercase",children:"CBD"}),a.jsxs("div",{className:"text-xl font-bold text-blue-600",children:[r.cbd_percentage,"%"]})]})]})]}),r.description&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Description"}),a.jsx("p",{className:"text-gray-600 text-sm leading-relaxed",children:r.description})]}),d.terpenes&&d.terpenes.length>0&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Terpenes"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:d.terpenes.map(p=>a.jsx("span",{className:"px-2 py-1 bg-amber-100 text-amber-700 text-xs font-medium rounded",children:p},p))})]}),d.effects&&d.effects.length>0&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Effects"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:d.effects.map(p=>a.jsx("span",{className:"px-2 py-1 bg-indigo-100 text-indigo-700 text-xs font-medium rounded",children:p},p))})]}),d.flavors&&d.flavors.length>0&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Flavors"}),a.jsx("div",{className:"flex flex-wrap gap-2",children:d.flavors.map(p=>a.jsx("span",{className:"px-2 py-1 bg-pink-100 text-pink-700 text-xs font-medium rounded",children:p},p))})]}),d.lineage&&a.jsxs("div",{className:"border-t border-gray-100 pt-4",children:[a.jsx("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:"Lineage"}),a.jsx("p",{className:"text-gray-600 text-sm",children:d.lineage})]}),r.dutchie_url&&a.jsx("div",{className:"border-t border-gray-100 pt-4",children:a.jsxs("a",{href:r.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-2 text-sm text-blue-600 hover:text-blue-700",children:["View on Dutchie",a.jsx(Jr,{className:"w-4 h-4"})]})}),r.last_seen_at&&a.jsxs("div",{className:"text-xs text-gray-400 pt-4 border-t border-gray-100",children:["Last updated: ",new Date(r.last_seen_at).toLocaleString()]})]})]})})]})})}function nW(){const[e,t]=h.useState([]),[r,n]=h.useState(!0),[i,s]=h.useState(new Set),[o,l]=h.useState(new Set),c=dt();h.useEffect(()=>{d()},[]);const d=async()=>{n(!0);try{const v=await z.getStores();t(v.stores)}catch(v){console.error("Failed to load stores:",v)}finally{n(!1)}},u=v=>{const j=v.match(/(?:^|-)(al|ak|az|ar|ca|co|ct|de|fl|ga|hi|id|il|in|ia|ks|ky|la|me|md|ma|mi|mn|ms|mo|mt|ne|nv|nh|nj|nm|ny|nc|nd|oh|ok|or|pa|ri|sc|sd|tn|tx|ut|vt|va|wa|wv|wi|wy)-/i),y={peoria:"AZ"};let w=j?j[1].toUpperCase():null;if(!w){for(const[S,N]of Object.entries(y))if(v.toLowerCase().includes(S)){w=N;break}}return w||"UNKNOWN"},f=v=>{const j=u(v.slug).toLowerCase(),y=v.name.match(/^([^-]+)/),w=y?y[1].trim().toLowerCase().replace(/\s+/g,"-"):"other";return`/stores/${j}/${w}/${v.slug}`},p=e.reduce((v,j)=>{const y=j.name.match(/^([^-]+)/),w=y?y[1].trim():"Other",S=u(j.slug),_={AZ:"Arizona",FL:"Florida",PA:"Pennsylvania",NJ:"New Jersey",MA:"Massachusetts",IL:"Illinois",NY:"New York",MD:"Maryland",MI:"Michigan",OH:"Ohio",CT:"Connecticut",ME:"Maine",MO:"Missouri",NV:"Nevada",OR:"Oregon",UT:"Utah"}[S]||S;return v[w]||(v[w]={}),v[w][_]||(v[w][_]=[]),v[w][_].push(j),v},{}),m=async(v,j,y)=>{y.stopPropagation();try{await z.updateStore(v,{scrape_enabled:!j}),t(e.map(w=>w.id===v?{...w,scrape_enabled:!j}:w))}catch(w){console.error("Failed to update scraping status:",w)}},x=v=>v?new Date(v).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"}):"Never",g=v=>{const j=new Set(i);j.has(v)?j.delete(v):j.add(v),s(j)},b=(v,j)=>{const y=`${v}-${j}`,w=new Set(o);w.has(y)?w.delete(y):w.add(y),l(w)};return r?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 border-t-blue-600 rounded-full animate-spin"})})}):a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsx("div",{className:"flex items-center justify-between",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(zl,{className:"w-6 h-6 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-semibold text-gray-900",children:"Stores"}),a.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:[e.length," total stores"]})]})]})}),a.jsx("div",{className:"bg-white rounded-xl border border-gray-200 overflow-hidden",children:a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full",children:[a.jsx("thead",{className:"bg-gray-50 border-b border-gray-200",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Store Name"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Type"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"View Online"}),a.jsx("th",{className:"px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Categories"}),a.jsx("th",{className:"px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Products"}),a.jsx("th",{className:"px-6 py-3 text-center text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Scraping"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Last Scraped"})]})}),a.jsx("tbody",{children:Object.entries(p).map(([v,j])=>{const y=Object.values(j).flat().length,w=y===1,S=i.has(v);if(w){const P=Object.values(j).flat()[0];return a.jsxs("tr",{className:"border-b border-gray-100 hover:bg-gray-50 cursor-pointer transition-colors",onClick:()=>c(f(P)),title:"Click to view store",children:[a.jsx("td",{className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[P.logo_url?a.jsx("img",{src:P.logo_url,alt:`${P.name} logo`,className:"w-8 h-8 object-contain flex-shrink-0",onError:D=>{D.target.style.display="none"}}):null,a.jsxs("div",{children:[a.jsx("div",{className:"font-semibold text-gray-900",children:P.name}),a.jsx("div",{className:"text-xs text-gray-500",children:P.slug})]})]})}),a.jsx("td",{className:"px-6 py-4",children:a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-blue-50 text-blue-700 rounded",children:"Dutchie"})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("a",{href:P.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-sm text-blue-600 hover:text-blue-700",onClick:D=>D.stopPropagation(),children:[a.jsx("span",{children:"View Online"}),a.jsx(Jr,{className:"w-3 h-3"})]})}),a.jsx("td",{className:"px-6 py-4 text-center",children:a.jsxs("div",{className:"flex items-center justify-center gap-1",children:[a.jsx(Cr,{className:"w-4 h-4 text-gray-400"}),a.jsx("span",{className:"text-sm font-medium text-gray-900",children:P.category_count||0})]})}),a.jsx("td",{className:"px-6 py-4 text-center",children:a.jsxs("div",{className:"flex items-center justify-center gap-1",children:[a.jsx(Ct,{className:"w-4 h-4 text-gray-400"}),a.jsx("span",{className:"text-sm font-medium text-gray-900",children:P.product_count||0})]})}),a.jsx("td",{className:"px-6 py-4 text-center",onClick:D=>D.stopPropagation(),children:a.jsx("button",{onClick:D=>m(P.id,P.scrape_enabled,D),className:"inline-flex items-center gap-1 text-sm font-medium transition-colors",children:P.scrape_enabled?a.jsxs(a.Fragment,{children:[a.jsx(Lx,{className:"w-5 h-5 text-green-600"}),a.jsx("span",{className:"text-green-600",children:"On"})]}):a.jsxs(a.Fragment,{children:[a.jsx($x,{className:"w-5 h-5 text-gray-400"}),a.jsx("span",{className:"text-gray-500",children:"Off"})]})})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(xr,{className:"w-4 h-4 text-gray-400"}),x(P.last_scraped_at)]})})]},P.id)}const N=Object.values(j).flat()[0],_=N==null?void 0:N.logo_url;return a.jsxs(hs.Fragment,{children:[a.jsx("tr",{className:"bg-gray-100 border-b border-gray-200 cursor-pointer hover:bg-gray-150 transition-colors",onClick:()=>g(v),children:a.jsx("td",{colSpan:7,className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(Ef,{className:`w-5 h-5 text-gray-600 transition-transform ${S?"rotate-90":""}`}),_&&a.jsx("img",{src:_,alt:`${v} logo`,className:"w-8 h-8 object-contain flex-shrink-0",onError:P=>{P.target.style.display="none"}}),a.jsx("span",{className:"text-base font-semibold text-gray-900",children:v}),a.jsxs("span",{className:"text-sm text-gray-500",children:["(",y," stores)"]})]})})}),S&&Object.entries(j).map(([P,D])=>{const M=`${v}-${P}`,I=o.has(M);return a.jsxs(hs.Fragment,{children:[a.jsx("tr",{className:"bg-gray-50 border-b border-gray-100 cursor-pointer hover:bg-gray-100 transition-colors",onClick:()=>b(v,P),children:a.jsx("td",{colSpan:7,className:"px-6 py-3 pl-12",children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Ef,{className:`w-4 h-4 text-gray-500 transition-transform ${I?"rotate-90":""}`}),a.jsx("span",{className:"text-sm font-medium text-gray-700",children:P}),a.jsxs("span",{className:"text-xs text-gray-500",children:["(",D.length," locations)"]})]})})}),I&&D.map(C=>a.jsxs("tr",{className:"border-b border-gray-100 hover:bg-gray-50 cursor-pointer transition-colors",onClick:()=>c(f(C)),title:"Click to view store",children:[a.jsx("td",{className:"px-6 py-4 pl-16",children:a.jsxs("div",{children:[a.jsx("div",{className:"font-semibold text-gray-900",children:C.name}),a.jsx("div",{className:"text-xs text-gray-500",children:C.slug})]})}),a.jsx("td",{className:"px-6 py-4",children:a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-blue-50 text-blue-700 rounded",children:"Dutchie"})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("a",{href:C.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-sm text-blue-600 hover:text-blue-700",onClick:B=>B.stopPropagation(),children:[a.jsx("span",{children:"View Online"}),a.jsx(Jr,{className:"w-3 h-3"})]})}),a.jsx("td",{className:"px-6 py-4 text-center",children:a.jsxs("div",{className:"flex items-center justify-center gap-1",children:[a.jsx(Cr,{className:"w-4 h-4 text-gray-400"}),a.jsx("span",{className:"text-sm font-medium text-gray-900",children:C.category_count||0})]})}),a.jsx("td",{className:"px-6 py-4 text-center",children:a.jsxs("div",{className:"flex items-center justify-center gap-1",children:[a.jsx(Ct,{className:"w-4 h-4 text-gray-400"}),a.jsx("span",{className:"text-sm font-medium text-gray-900",children:C.product_count||0})]})}),a.jsx("td",{className:"px-6 py-4 text-center",onClick:B=>B.stopPropagation(),children:a.jsx("button",{onClick:B=>m(C.id,C.scrape_enabled,B),className:"inline-flex items-center gap-1 text-sm font-medium transition-colors",children:C.scrape_enabled?a.jsxs(a.Fragment,{children:[a.jsx(Lx,{className:"w-5 h-5 text-green-600"}),a.jsx("span",{className:"text-green-600",children:"On"})]}):a.jsxs(a.Fragment,{children:[a.jsx($x,{className:"w-5 h-5 text-gray-400"}),a.jsx("span",{className:"text-gray-500",children:"Off"})]})})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(xr,{className:"w-4 h-4 text-gray-400"}),x(C.last_scraped_at)]})})]},C.id))]},`state-${M}`)})]},`chain-${v}`)})})]})})}),e.length===0&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-12 text-center",children:[a.jsx(zl,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"No stores found"}),a.jsx("p",{className:"text-gray-500",children:"Start by adding stores to your database"})]})]})})}function iW(){const e=dt(),[t,r]=h.useState([]),[n,i]=h.useState(!0),[s,o]=h.useState(""),[l,c]=h.useState(""),[d,u]=h.useState(null),[f,p]=h.useState({});h.useEffect(()=>{m()},[]);const m=async()=>{i(!0);try{const y=await z.getDispensaries();r(y.dispensaries)}catch(y){console.error("Failed to load dispensaries:",y)}finally{i(!1)}},x=y=>{u(y),p({dba_name:y.dba_name||"",website:y.website||"",phone:y.phone||"",google_rating:y.google_rating||"",google_review_count:y.google_review_count||""})},g=async()=>{if(d)try{await z.updateDispensary(d.id,f),await m(),u(null),p({})}catch(y){console.error("Failed to update dispensary:",y),alert("Failed to update dispensary")}},b=()=>{u(null),p({})},v=t.filter(y=>{const w=s.toLowerCase(),S=!s||y.name.toLowerCase().includes(w)||y.company_name&&y.company_name.toLowerCase().includes(w)||y.dba_name&&y.dba_name.toLowerCase().includes(w),N=!l||y.city===l;return S&&N}),j=Array.from(new Set(t.map(y=>y.city).filter(Boolean))).sort();return a.jsxs(X,{children:[a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Dispensaries"}),a.jsxs("p",{className:"text-sm text-gray-600 mt-1",children:["AZDHS official dispensary directory (",t.length," total)"]})]}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Search"}),a.jsxs("div",{className:"relative",children:[a.jsx(E6,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-gray-400"}),a.jsx("input",{type:"text",value:s,onChange:y=>o(y.target.value),placeholder:"Search by name or company...",className:"w-full pl-10 pr-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Filter by City"}),a.jsxs("select",{value:l,onChange:y=>c(y.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"",children:"All Cities"}),j.map(y=>a.jsx("option",{value:y,children:y},y))]})]})]})}),n?a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading dispensaries..."})]}):a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 overflow-hidden",children:[a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full",children:[a.jsx("thead",{className:"bg-gray-50 border-b border-gray-200",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Name"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Company"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Address"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"City"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Phone"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Email"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Website"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-700 uppercase tracking-wider",children:"Actions"})]})}),a.jsx("tbody",{className:"divide-y divide-gray-200",children:v.length===0?a.jsx("tr",{children:a.jsx("td",{colSpan:8,className:"px-4 py-8 text-center text-sm text-gray-500",children:"No dispensaries found"})}):v.map(y=>a.jsxs("tr",{className:"hover:bg-gray-50",children:[a.jsx("td",{className:"px-4 py-3",children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Ln,{className:"w-4 h-4 text-gray-400 flex-shrink-0"}),a.jsxs("div",{className:"flex flex-col",children:[a.jsx("span",{className:"text-sm font-medium text-gray-900",children:y.dba_name||y.name}),y.dba_name&&y.google_rating&&a.jsxs("span",{className:"text-xs text-gray-500",children:["⭐ ",y.google_rating," (",y.google_review_count," reviews)"]})]})]})}),a.jsx("td",{className:"px-4 py-3",children:a.jsx("span",{className:"text-sm text-gray-600",children:y.company_name||"-"})}),a.jsx("td",{className:"px-4 py-3",children:a.jsxs("div",{className:"flex items-start gap-1",children:[a.jsx(yi,{className:"w-3 h-3 text-gray-400 flex-shrink-0 mt-0.5"}),a.jsx("span",{className:"text-sm text-gray-600",children:y.address||"-"})]})}),a.jsxs("td",{className:"px-4 py-3",children:[a.jsx("span",{className:"text-sm text-gray-600",children:y.city||"-"}),y.zip&&a.jsxs("span",{className:"text-xs text-gray-400 ml-1",children:["(",y.zip,")"]})]}),a.jsx("td",{className:"px-4 py-3",children:y.phone?a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(Oh,{className:"w-3 h-3 text-gray-400"}),a.jsx("span",{className:"text-sm text-gray-600",children:y.phone.replace(/(\d{3})(\d{3})(\d{4})/,"($1) $2-$3")})]}):a.jsx("span",{className:"text-sm text-gray-400",children:"-"})}),a.jsx("td",{className:"px-4 py-3",children:y.email?a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(rj,{className:"w-3 h-3 text-gray-400"}),a.jsx("a",{href:`mailto:${y.email}`,className:"text-sm text-blue-600 hover:text-blue-800",children:y.email})]}):a.jsx("span",{className:"text-sm text-gray-400",children:"-"})}),a.jsx("td",{className:"px-4 py-3",children:y.website?a.jsxs("a",{href:y.website,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-sm text-blue-600 hover:text-blue-800",children:[a.jsx(Jr,{className:"w-3 h-3"}),a.jsx("span",{children:"Visit Site"})]}):a.jsx("span",{className:"text-sm text-gray-400",children:"-"})}),a.jsx("td",{className:"px-4 py-3",children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("button",{onClick:()=>x(y),className:"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 rounded-lg transition-colors",title:"Edit",children:a.jsx(nj,{className:"w-4 h-4"})}),a.jsx("button",{onClick:()=>{const w=y.city.toLowerCase().replace(/\s+/g,"-");e(`/dispensaries/${y.state}/${w}/${y.slug}`)},className:"inline-flex items-center gap-1 px-3 py-1.5 text-sm font-medium text-blue-600 hover:text-blue-800 hover:bg-blue-50 rounded-lg transition-colors",title:"View",children:a.jsx(o6,{className:"w-4 h-4"})})]})})]},y.id))})]})}),a.jsx("div",{className:"bg-gray-50 px-4 py-3 border-t border-gray-200",children:a.jsxs("div",{className:"text-sm text-gray-600",children:["Showing ",v.length," of ",t.length," dispensaries"]})})]})]}),d&&a.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:a.jsxs("div",{className:"bg-white rounded-lg shadow-xl max-w-2xl w-full mx-4 max-h-[90vh] overflow-y-auto",children:[a.jsxs("div",{className:"flex items-center justify-between p-6 border-b border-gray-200",children:[a.jsxs("h2",{className:"text-xl font-bold text-gray-900",children:["Edit Dispensary: ",d.name]}),a.jsx("button",{onClick:b,className:"text-gray-400 hover:text-gray-600",children:a.jsx(Eh,{className:"w-6 h-6"})})]}),a.jsxs("div",{className:"p-6 space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"DBA Name (Display Name)"}),a.jsx("input",{type:"text",value:f.dba_name,onChange:y=>p({...f,dba_name:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"e.g., Green Med Wellness"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Website"}),a.jsx("input",{type:"url",value:f.website,onChange:y=>p({...f,website:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"https://example.com"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Phone Number"}),a.jsx("input",{type:"tel",value:f.phone,onChange:y=>p({...f,phone:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"5551234567"})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Google Rating"}),a.jsx("input",{type:"number",step:"0.1",min:"0",max:"5",value:f.google_rating,onChange:y=>p({...f,google_rating:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"4.5"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Review Count"}),a.jsx("input",{type:"number",min:"0",value:f.google_review_count,onChange:y=>p({...f,google_review_count:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"123"})]})]}),a.jsxs("div",{className:"bg-gray-50 p-4 rounded-lg space-y-2",children:[a.jsxs("div",{className:"text-sm",children:[a.jsx("span",{className:"font-medium text-gray-700",children:"AZDHS Name:"})," ",a.jsx("span",{className:"text-gray-600",children:d.name})]}),a.jsxs("div",{className:"text-sm",children:[a.jsx("span",{className:"font-medium text-gray-700",children:"Address:"})," ",a.jsxs("span",{className:"text-gray-600",children:[d.address,", ",d.city,", ",d.state," ",d.zip]})]})]})]}),a.jsxs("div",{className:"flex items-center justify-end gap-3 p-6 border-t border-gray-200",children:[a.jsx("button",{onClick:b,className:"px-4 py-2 text-sm font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-100 rounded-lg transition-colors",children:"Cancel"}),a.jsxs("button",{onClick:g,className:"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg transition-colors",children:[a.jsx(A6,{className:"w-4 h-4"}),"Save Changes"]})]})]})})]})}function aW(){const{state:e,city:t,slug:r}=_a(),n=dt(),[i,s]=h.useState(null),[o,l]=h.useState([]),[c,d]=h.useState([]),[u,f]=h.useState([]),[p,m]=h.useState(!0),[x,g]=h.useState("products"),[b,v]=h.useState(!1),[j,y]=h.useState(!1),[w,S]=h.useState(""),[N,_]=h.useState(1),[P]=h.useState(25),D=T=>{if(!T)return"Never";const O=new Date(T),L=new Date().getTime()-O.getTime(),W=Math.floor(L/(1e3*60)),H=Math.floor(L/(1e3*60*60)),ee=Math.floor(L/(1e3*60*60*24));return W<1?"Just now":W<60?`${W}m ago`:H<24?`${H}h ago`:ee===1?"Yesterday":ee<7?`${ee} days ago`:O.toLocaleDateString()};h.useEffect(()=>{M()},[r]);const M=async()=>{m(!0);try{const[T,O,k,L]=await Promise.all([z.getDispensary(r),z.getDispensaryProducts(r).catch(()=>({products:[]})),z.getDispensaryBrands(r).catch(()=>({brands:[]})),z.getDispensarySpecials(r).catch(()=>({specials:[]}))]);s(T),l(O.products),d(k.brands),f(L.specials)}catch(T){console.error("Failed to load dispensary:",T)}finally{m(!1)}},I=async T=>{v(!1),y(!0);try{const O=await fetch(`http://localhost:3010/api/dispensaries/${r}/scrape`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${localStorage.getItem("token")}`},body:JSON.stringify({type:T})});if(!O.ok)throw new Error("Failed to trigger scraping");const k=await O.json();alert(`${T.charAt(0).toUpperCase()+T.slice(1)} update started! ${k.message||""}`)}catch(O){console.error("Failed to trigger scraping:",O),alert("Failed to start update. Please try again.")}finally{y(!1)}},C=o.filter(T=>{var k,L,W,H,ee;if(!w)return!0;const O=w.toLowerCase();return((k=T.name)==null?void 0:k.toLowerCase().includes(O))||((L=T.brand)==null?void 0:L.toLowerCase().includes(O))||((W=T.variant)==null?void 0:W.toLowerCase().includes(O))||((H=T.description)==null?void 0:H.toLowerCase().includes(O))||((ee=T.strain_type)==null?void 0:ee.toLowerCase().includes(O))}),B=Math.ceil(C.length/P),q=(N-1)*P,Z=q+P,A=C.slice(q,Z);return h.useEffect(()=>{_(1)},[w]),p?a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading dispensary..."})]})}):i?a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between gap-4",children:[a.jsxs("button",{onClick:()=>n("/dispensaries"),className:"flex items-center gap-2 text-sm text-gray-600 hover:text-gray-900",children:[a.jsx(Ch,{className:"w-4 h-4"}),"Back to Dispensaries"]}),a.jsxs("div",{className:"relative",children:[a.jsxs("button",{onClick:()=>v(!b),disabled:j,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed",children:[a.jsx(Xt,{className:`w-4 h-4 ${j?"animate-spin":""}`}),j?"Updating...":"Update",!j&&a.jsx(tj,{className:"w-4 h-4"})]}),b&&!j&&a.jsxs("div",{className:"absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-lg border border-gray-200 z-10",children:[a.jsx("button",{onClick:()=>I("products"),className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-t-lg",children:"Products"}),a.jsx("button",{onClick:()=>I("brands"),className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100",children:"Brands"}),a.jsx("button",{onClick:()=>I("specials"),className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100",children:"Specials"}),a.jsx("button",{onClick:()=>I("all"),className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-b-lg border-t border-gray-200",children:"All"})]})]})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-start justify-between gap-4 mb-4",children:[a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"p-3 bg-blue-50 rounded-lg",children:a.jsx(Ln,{className:"w-8 h-8 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:i.dba_name||i.name}),i.company_name&&a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:i.company_name})]})]}),a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 bg-gray-50 px-4 py-2 rounded-lg",children:[a.jsx(Ah,{className:"w-4 h-4"}),a.jsxs("div",{children:[a.jsx("span",{className:"font-medium",children:"Last Crawl Date:"}),a.jsx("span",{className:"ml-2",children:i.last_menu_scrape?new Date(i.last_menu_scrape).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"Never"})]})]})]}),a.jsxs("div",{className:"flex flex-wrap gap-4",children:[i.address&&a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(yi,{className:"w-4 h-4"}),a.jsxs("span",{children:[i.address,", ",i.city,", ",i.state," ",i.zip]})]}),i.phone&&a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(Oh,{className:"w-4 h-4"}),a.jsx("span",{children:i.phone.replace(/(\d{3})(\d{3})(\d{4})/,"($1) $2-$3")})]}),a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(Jr,{className:"w-4 h-4"}),i.website?a.jsx("a",{href:i.website,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:text-blue-800",children:"Website"}):a.jsx("span",{children:"Website N/A"})]}),i.email&&a.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[a.jsx(rj,{className:"w-4 h-4 text-gray-400"}),a.jsx("a",{href:`mailto:${i.email}`,className:"text-blue-600 hover:text-blue-800",children:i.email})]}),i.azdhs_url&&a.jsxs("a",{href:i.azdhs_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-sm text-blue-600 hover:text-blue-800",children:[a.jsx(Jr,{className:"w-4 h-4"}),a.jsx("span",{children:"AZDHS Profile"})]}),a.jsxs($l,{to:"/schedule",className:"flex items-center gap-2 text-sm text-blue-600 hover:text-blue-800",children:[a.jsx(xr,{className:"w-4 h-4"}),a.jsx("span",{children:"View Schedule"})]})]})]}),a.jsxs("div",{className:"grid grid-cols-4 gap-6",children:[a.jsx("button",{onClick:()=>{g("products"),S("")},className:"bg-white rounded-lg border border-gray-200 p-6 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(Ct,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Total Products"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:o.length})]})]})}),a.jsx("button",{onClick:()=>g("brands"),className:"bg-white rounded-lg border border-gray-200 p-6 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(Cr,{className:"w-5 h-5 text-purple-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Brands"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:c.length})]})]})}),a.jsx("button",{onClick:()=>g("specials"),className:"bg-white rounded-lg border border-gray-200 p-6 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(zn,{className:"w-5 h-5 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Active Specials"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:u.length})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-orange-50 rounded-lg",children:a.jsx(i6,{className:"w-5 h-5 text-orange-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Avg Price"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:o.length>0?`$${(o.reduce((T,O)=>T+(O.sale_price||O.regular_price||0),0)/o.length).toFixed(2)}`:"-"})]})]})})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200",children:[a.jsx("div",{className:"border-b border-gray-200",children:a.jsxs("div",{className:"flex gap-4 px-6",children:[a.jsxs("button",{onClick:()=>g("products"),className:`py-4 px-2 text-sm font-medium border-b-2 ${x==="products"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Products (",o.length,")"]}),a.jsxs("button",{onClick:()=>g("brands"),className:`py-4 px-2 text-sm font-medium border-b-2 ${x==="brands"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Brands (",c.length,")"]}),a.jsxs("button",{onClick:()=>g("specials"),className:`py-4 px-2 text-sm font-medium border-b-2 ${x==="specials"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Specials (",u.length,")"]})]})}),a.jsxs("div",{className:"p-6",children:[x==="products"&&a.jsx("div",{className:"space-y-4",children:o.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No products available"}):a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[a.jsx("input",{type:"text",placeholder:"Search products by name, brand, variant, description, or strain type...",value:w,onChange:T=>S(T.target.value),className:"input input-bordered input-sm flex-1"}),w&&a.jsx("button",{onClick:()=>S(""),className:"btn btn-sm btn-ghost",children:"Clear"}),a.jsxs("div",{className:"text-sm text-gray-600",children:["Showing ",q+1,"-",Math.min(Z,C.length)," of ",C.length," products"]})]}),a.jsx("div",{className:"overflow-x-auto -mx-6 px-6",children:a.jsxs("table",{className:"table table-xs table-zebra table-pin-rows w-full",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Image"}),a.jsx("th",{children:"Product Name"}),a.jsx("th",{children:"Brand"}),a.jsx("th",{children:"Variant"}),a.jsx("th",{children:"Description"}),a.jsx("th",{className:"text-right",children:"Price"}),a.jsx("th",{className:"text-center",children:"THC %"}),a.jsx("th",{className:"text-center",children:"CBD %"}),a.jsx("th",{className:"text-center",children:"Strain Type"}),a.jsx("th",{className:"text-center",children:"In Stock"}),a.jsx("th",{children:"Last Updated"}),a.jsx("th",{children:"Actions"})]})}),a.jsx("tbody",{children:A.map(T=>a.jsxs("tr",{children:[a.jsx("td",{className:"whitespace-nowrap",children:T.image_url?a.jsx("img",{src:T.image_url,alt:T.name,className:"w-12 h-12 object-cover rounded",onError:O=>O.currentTarget.style.display="none"}):"-"}),a.jsx("td",{className:"font-medium max-w-[150px]",children:a.jsx("div",{className:"line-clamp-2",title:T.name,children:T.name})}),a.jsx("td",{className:"max-w-[120px]",children:a.jsx("div",{className:"line-clamp-2",title:T.brand||"-",children:T.brand||"-"})}),a.jsx("td",{className:"max-w-[100px]",children:a.jsx("div",{className:"line-clamp-2",title:T.variant||"-",children:T.variant||"-"})}),a.jsx("td",{className:"w-[120px]",children:a.jsx("span",{title:T.description,children:T.description?T.description.length>15?T.description.substring(0,15)+"...":T.description:"-"})}),a.jsx("td",{className:"text-right font-semibold whitespace-nowrap",children:T.sale_price?a.jsxs("div",{className:"flex flex-col items-end",children:[a.jsxs("span",{className:"text-error",children:["$",T.sale_price]}),a.jsxs("span",{className:"text-gray-400 line-through text-xs",children:["$",T.regular_price]})]}):T.regular_price?`$${T.regular_price}`:"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:T.thc_percentage?a.jsxs("span",{className:"badge badge-success badge-sm",children:[T.thc_percentage,"%"]}):"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:T.cbd_percentage?a.jsxs("span",{className:"badge badge-info badge-sm",children:[T.cbd_percentage,"%"]}):"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:T.strain_type?a.jsx("span",{className:"badge badge-ghost badge-sm",children:T.strain_type}):"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:T.in_stock?a.jsx("span",{className:"badge badge-success badge-sm",children:"Yes"}):T.in_stock===!1?a.jsx("span",{className:"badge badge-error badge-sm",children:"No"}):"-"}),a.jsx("td",{className:"whitespace-nowrap text-xs text-gray-500",children:T.updated_at?D(T.updated_at):"-"}),a.jsx("td",{children:a.jsxs("div",{className:"flex gap-1",children:[T.dutchie_url&&a.jsx("a",{href:T.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"btn btn-xs btn-outline",children:"Dutchie"}),a.jsx("button",{onClick:()=>n(`/products/${T.id}`),className:"btn btn-xs btn-primary",children:"Details"})]})})]},T.id))})]})}),B>1&&a.jsxs("div",{className:"flex justify-center items-center gap-2 mt-4",children:[a.jsx("button",{onClick:()=>_(T=>Math.max(1,T-1)),disabled:N===1,className:"btn btn-sm btn-outline",children:"Previous"}),a.jsx("div",{className:"flex gap-1",children:Array.from({length:B},(T,O)=>O+1).map(T=>{const O=T===1||T===B||T>=N-1&&T<=N+1;return T===2&&N>3||T===B-1&&N_(T),className:`btn btn-sm ${N===T?"btn-primary":"btn-outline"}`,children:T},T):null})}),a.jsx("button",{onClick:()=>_(T=>Math.min(B,T+1)),disabled:N===B,className:"btn btn-sm btn-outline",children:"Next"})]})]})}),x==="brands"&&a.jsx("div",{className:"space-y-4",children:c.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No brands available"}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:c.map(T=>a.jsxs("button",{onClick:()=>{g("products"),S(T.brand)},className:"border border-gray-200 rounded-lg p-4 text-center hover:border-blue-300 hover:shadow-md transition-all cursor-pointer",children:[a.jsx("p",{className:"font-medium text-gray-900 line-clamp-2",children:T.brand}),a.jsxs("p",{className:"text-sm text-gray-600 mt-1",children:[T.product_count," product",T.product_count!==1?"s":""]})]},T.brand))})}),x==="specials"&&a.jsx("div",{className:"space-y-4",children:u.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No active specials"}):a.jsx("div",{className:"space-y-3",children:u.map(T=>a.jsxs("div",{className:"border border-gray-200 rounded-lg p-4",children:[a.jsx("h4",{className:"font-medium text-gray-900",children:T.name}),T.description&&a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:T.description}),a.jsxs("div",{className:"flex items-center gap-4 mt-2 text-sm text-gray-500",children:[a.jsxs("span",{children:[new Date(T.start_date).toLocaleDateString()," -"," ",T.end_date?new Date(T.end_date).toLocaleDateString():"Ongoing"]}),a.jsxs("span",{children:[T.product_count," products"]})]})]},T.id))})})]})]})]})}):a.jsx(X,{children:a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-600",children:"Dispensary not found"})})})}function sW(){var M,I;const{slug:e}=_a(),t=dt(),[r,n]=h.useState(null),[i,s]=h.useState([]),[o,l]=h.useState([]),[c,d]=h.useState([]),[u,f]=h.useState(!0),[p,m]=h.useState(null),[x,g]=h.useState(""),[b,v]=h.useState("products"),[j,y]=h.useState("name");h.useEffect(()=>{w()},[e]),h.useEffect(()=>{r&&S()},[p,x,j,r]);const w=async()=>{f(!0);try{const B=(await z.getStores()).stores.find(T=>T.slug===e);if(!B)throw new Error("Store not found");const[q,Z,A]=await Promise.all([z.getStore(B.id),z.getCategories(B.id),z.getStoreBrands(B.id)]);n(q),l(Z.categories||[]),d(A.brands||[])}catch(C){console.error("Failed to load store data:",C)}finally{f(!1)}},S=async()=>{if(r)try{const C={store_id:r.id,limit:1e3};p&&(C.category_id=p),x&&(C.brand=x);let q=(await z.getProducts(C)).products||[];q.sort((Z,A)=>{switch(j){case"name":return(Z.name||"").localeCompare(A.name||"");case"price_asc":return(Z.price||0)-(A.price||0);case"price_desc":return(A.price||0)-(Z.price||0);case"thc":return(A.thc_percentage||0)-(Z.thc_percentage||0);default:return 0}}),s(q)}catch(C){console.error("Failed to load products:",C)}},N=C=>C.image_url_full?C.image_url_full:C.medium_path?`http://localhost:9020/dutchie/${C.medium_path}`:C.thumbnail_path?`http://localhost:9020/dutchie/${C.thumbnail_path}`:"https://via.placeholder.com/300x300?text=No+Image",_=C=>C?new Date(C).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"}):"Never",P=C=>{switch(C==null?void 0:C.toLowerCase()){case"dutchie":return"bg-green-100 text-green-700";case"jane":return"bg-purple-100 text-purple-700";case"treez":return"bg-blue-100 text-blue-700";case"weedmaps":return"bg-orange-100 text-orange-700";case"leafly":return"bg-emerald-100 text-emerald-700";default:return"bg-gray-100 text-gray-700"}},D=C=>{switch(C){case"completed":return a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-green-100 text-green-700 rounded-full flex items-center gap-1",children:[a.jsx(Pr,{className:"w-3 h-3"})," Completed"]});case"running":return a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-blue-100 text-blue-700 rounded-full flex items-center gap-1",children:[a.jsx(Xt,{className:"w-3 h-3 animate-spin"})," Running"]});case"failed":return a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-red-100 text-red-700 rounded-full flex items-center gap-1",children:[a.jsx(Hr,{className:"w-3 h-3"})," Failed"]});case"pending":return a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-yellow-100 text-yellow-700 rounded-full flex items-center gap-1",children:[a.jsx(xr,{className:"w-3 h-3"})," Pending"]});default:return a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-gray-100 text-gray-700 rounded-full",children:C})}};return u?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 border-t-blue-600 rounded-full animate-spin"})})}):r?a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-start justify-between mb-6",children:[a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("button",{onClick:()=>t("/stores"),className:"text-gray-600 hover:text-gray-900 mt-1",children:"← Back"}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("h1",{className:"text-2xl font-semibold text-gray-900",children:r.name}),a.jsx("span",{className:`px-2 py-1 text-xs font-medium rounded ${P(r.provider)}`,children:r.provider||"Unknown"})]}),a.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:["Store ID: ",r.id]})]})]}),a.jsxs("a",{href:r.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-sm text-blue-600 hover:text-blue-700",children:["View Menu ",a.jsx(Jr,{className:"w-4 h-4"})]})]}),a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4 mb-6",children:[a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-gray-500 text-xs mb-1",children:[a.jsx(Ct,{className:"w-4 h-4"}),"Products"]}),a.jsx("p",{className:"text-xl font-semibold text-gray-900",children:r.product_count||0})]}),a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-gray-500 text-xs mb-1",children:[a.jsx(Cr,{className:"w-4 h-4"}),"Categories"]}),a.jsx("p",{className:"text-xl font-semibold text-gray-900",children:r.category_count||0})]}),a.jsxs("div",{className:"p-4 bg-green-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-green-600 text-xs mb-1",children:[a.jsx(Pr,{className:"w-4 h-4"}),"In Stock"]}),a.jsx("p",{className:"text-xl font-semibold text-green-700",children:r.in_stock_count||0})]}),a.jsxs("div",{className:"p-4 bg-red-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-red-600 text-xs mb-1",children:[a.jsx(Hr,{className:"w-4 h-4"}),"Out of Stock"]}),a.jsx("p",{className:"text-xl font-semibold text-red-700",children:r.out_of_stock_count||0})]}),a.jsxs("div",{className:`p-4 rounded-lg ${r.is_stale?"bg-yellow-50":"bg-blue-50"}`,children:[a.jsxs("div",{className:`flex items-center gap-2 text-xs mb-1 ${r.is_stale?"text-yellow-600":"text-blue-600"}`,children:[a.jsx(xr,{className:"w-4 h-4"}),"Freshness"]}),a.jsx("p",{className:`text-sm font-semibold ${r.is_stale?"text-yellow-700":"text-blue-700"}`,children:r.freshness||"Never scraped"})]}),a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg",children:[a.jsxs("div",{className:"flex items-center gap-2 text-gray-500 text-xs mb-1",children:[a.jsx(Ah,{className:"w-4 h-4"}),"Next Crawl"]}),a.jsx("p",{className:"text-sm font-semibold text-gray-700",children:(M=r.schedule)!=null&&M.next_run_at?_(r.schedule.next_run_at):"Not scheduled"})]})]}),r.linked_dispensary&&a.jsxs("div",{className:"p-4 bg-indigo-50 rounded-lg mb-6",children:[a.jsxs("div",{className:"flex items-center gap-2 text-indigo-600 text-xs mb-2",children:[a.jsx(HA,{className:"w-4 h-4"}),"Linked Dispensary"]}),a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("p",{className:"font-semibold text-indigo-900",children:r.linked_dispensary.name}),a.jsxs("p",{className:"text-sm text-indigo-700 flex items-center gap-1",children:[a.jsx(yi,{className:"w-3 h-3"}),r.linked_dispensary.city,", ",r.linked_dispensary.state,r.linked_dispensary.address&&` - ${r.linked_dispensary.address}`]})]}),a.jsx("button",{onClick:()=>t(`/dispensaries/${r.linked_dispensary.slug}`),className:"text-sm text-indigo-600 hover:text-indigo-700 font-medium",children:"View Dispensary →"})]})]}),a.jsxs("div",{className:"flex gap-2 border-b border-gray-200",children:[a.jsx("button",{onClick:()=>v("products"),className:`px-4 py-2 border-b-2 transition-colors ${b==="products"?"border-blue-600 text-blue-600 font-medium":"border-transparent text-gray-600 hover:text-gray-900"}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Ct,{className:"w-4 h-4"}),"Products (",i.length,")"]})}),a.jsx("button",{onClick:()=>v("brands"),className:`px-4 py-2 border-b-2 transition-colors ${b==="brands"?"border-blue-600 text-blue-600 font-medium":"border-transparent text-gray-600 hover:text-gray-900"}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(Cr,{className:"w-4 h-4"}),"Brands (",c.length,")"]})}),a.jsx("button",{onClick:()=>v("specials"),className:`px-4 py-2 border-b-2 transition-colors ${b==="specials"?"border-blue-600 text-blue-600 font-medium":"border-transparent text-gray-600 hover:text-gray-900"}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(zx,{className:"w-4 h-4"}),"Specials"]})}),a.jsx("button",{onClick:()=>v("crawl-history"),className:`px-4 py-2 border-b-2 transition-colors ${b==="crawl-history"?"border-blue-600 text-blue-600 font-medium":"border-transparent text-gray-600 hover:text-gray-900"}`,children:a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(na,{className:"w-4 h-4"}),"Crawl History (",((I=r.recent_jobs)==null?void 0:I.length)||0,")"]})})]})]}),b==="crawl-history"&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 overflow-hidden",children:[a.jsxs("div",{className:"p-4 border-b border-gray-200",children:[a.jsx("h2",{className:"text-lg font-semibold text-gray-900",children:"Recent Crawl Jobs"}),a.jsx("p",{className:"text-sm text-gray-500",children:"Last 10 crawl jobs for this store"})]}),r.recent_jobs&&r.recent_jobs.length>0?a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full",children:[a.jsx("thead",{className:"bg-gray-50",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Status"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Type"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Started"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Completed"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"Found"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"New"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"Updated"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"In Stock"}),a.jsx("th",{className:"px-4 py-3 text-center text-xs font-medium text-gray-500 uppercase",children:"Out of Stock"}),a.jsx("th",{className:"px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase",children:"Error"})]})}),a.jsx("tbody",{className:"divide-y divide-gray-100",children:r.recent_jobs.map(C=>a.jsxs("tr",{className:"hover:bg-gray-50",children:[a.jsx("td",{className:"px-4 py-3",children:D(C.status)}),a.jsx("td",{className:"px-4 py-3 text-sm text-gray-700",children:C.job_type||"-"}),a.jsx("td",{className:"px-4 py-3 text-sm text-gray-700",children:_(C.started_at)}),a.jsx("td",{className:"px-4 py-3 text-sm text-gray-700",children:_(C.completed_at)}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-gray-900",children:C.products_found??"-"}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-green-600",children:C.products_new??"-"}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-blue-600",children:C.products_updated??"-"}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-green-600",children:C.in_stock_count??"-"}),a.jsx("td",{className:"px-4 py-3 text-center text-sm font-medium text-red-600",children:C.out_of_stock_count??"-"}),a.jsx("td",{className:"px-4 py-3 text-sm text-red-600 max-w-xs truncate",title:C.error_message||"",children:C.error_message||"-"})]},C.id))})]})}):a.jsxs("div",{className:"text-center py-12",children:[a.jsx(na,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("p",{className:"text-gray-500",children:"No crawl history available"})]})]}),b==="products"&&a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"bg-white rounded-xl border border-gray-200 p-4",children:a.jsxs("div",{className:"flex flex-wrap gap-4",children:[a.jsxs("div",{className:"flex-1 min-w-[200px]",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Category"}),a.jsxs("select",{value:p||"",onChange:C=>m(C.target.value?parseInt(C.target.value):null),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"",children:"All Categories"}),o.map(C=>a.jsxs("option",{value:C.id,children:[C.name," (",i.filter(B=>B.category_id===C.id).length,")"]},C.id))]})]}),a.jsxs("div",{className:"flex-1 min-w-[200px]",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Brand"}),a.jsxs("select",{value:x,onChange:C=>g(C.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"",children:"All Brands"}),c.map(C=>a.jsx("option",{value:C,children:C},C))]})]}),a.jsxs("div",{className:"flex-1 min-w-[200px]",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Sort By"}),a.jsxs("select",{value:j,onChange:C=>y(C.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"name",children:"Name (A-Z)"}),a.jsx("option",{value:"price_asc",children:"Price (Low to High)"}),a.jsx("option",{value:"price_desc",children:"Price (High to Low)"}),a.jsx("option",{value:"thc",children:"THC % (High to Low)"})]})]})]})}),i.length>0?a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:i.map(C=>a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 overflow-hidden hover:shadow-lg transition-shadow",children:[a.jsxs("div",{className:"aspect-square bg-gray-50 relative",children:[a.jsx("img",{src:N(C),alt:C.name,className:"w-full h-full object-cover"}),C.in_stock?a.jsx("span",{className:"absolute top-2 right-2 px-2 py-1 bg-green-500 text-white text-xs font-medium rounded",children:"In Stock"}):a.jsx("span",{className:"absolute top-2 right-2 px-2 py-1 bg-red-500 text-white text-xs font-medium rounded",children:"Out of Stock"})]}),a.jsxs("div",{className:"p-3 space-y-2",children:[a.jsx("h3",{className:"font-semibold text-sm text-gray-900 line-clamp-2",children:C.name}),C.brand&&a.jsx("p",{className:"text-xs text-gray-600 font-medium",children:C.brand}),C.category_name&&a.jsx("p",{className:"text-xs text-gray-500",children:C.category_name}),a.jsxs("div",{className:"grid grid-cols-2 gap-2 pt-2 border-t border-gray-100",children:[C.price!==null&&a.jsxs("div",{className:"text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"Price:"}),a.jsxs("span",{className:"ml-1 font-semibold text-blue-600",children:["$",parseFloat(C.price).toFixed(2)]})]}),C.weight&&a.jsxs("div",{className:"text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"Weight:"}),a.jsx("span",{className:"ml-1 font-medium",children:C.weight})]}),C.thc_percentage!==null&&a.jsxs("div",{className:"text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"THC:"}),a.jsxs("span",{className:"ml-1 font-medium text-green-600",children:[C.thc_percentage,"%"]})]}),C.cbd_percentage!==null&&a.jsxs("div",{className:"text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"CBD:"}),a.jsxs("span",{className:"ml-1 font-medium text-blue-600",children:[C.cbd_percentage,"%"]})]}),C.strain_type&&a.jsxs("div",{className:"text-xs col-span-2",children:[a.jsx("span",{className:"text-gray-500",children:"Type:"}),a.jsx("span",{className:"ml-1 font-medium capitalize",children:C.strain_type})]})]}),C.description&&a.jsx("p",{className:"text-xs text-gray-600 line-clamp-2 pt-2 border-t border-gray-100",children:C.description}),C.last_seen_at&&a.jsxs("p",{className:"text-xs text-gray-400 pt-2 border-t border-gray-100",children:["Updated: ",new Date(C.last_seen_at).toLocaleDateString()]}),a.jsxs("div",{className:"flex gap-2 mt-3 pt-3 border-t border-gray-100",children:[C.dutchie_url&&a.jsx("a",{href:C.dutchie_url,target:"_blank",rel:"noopener noreferrer",className:"flex-1 px-3 py-2 bg-gray-100 text-gray-700 text-sm font-medium rounded-lg hover:bg-gray-200 transition-colors text-center border border-gray-200",children:"Dutchie"}),a.jsx("button",{onClick:()=>t(`/products/${C.id}`),className:"flex-1 px-3 py-2 bg-blue-600 text-white text-sm font-medium rounded-lg hover:bg-blue-700 transition-colors",children:"Details"})]})]})]},C.id))}):a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-12 text-center",children:[a.jsx(Ct,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"No products found"}),a.jsx("p",{className:"text-gray-500",children:"Try adjusting your filters"})]})]}),b==="brands"&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("h2",{className:"text-lg font-semibold text-gray-900 mb-4",children:["All Brands (",c.length,")"]}),c.length>0?a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-3",children:c.map(C=>{const B=i.filter(q=>q.brand===C);return a.jsxs("div",{className:"p-4 border border-gray-200 rounded-lg hover:border-blue-500 hover:bg-blue-50 transition-all cursor-pointer",onClick:()=>{v("products"),g(C)},children:[a.jsx("p",{className:"font-medium text-gray-900 text-sm",children:C}),a.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:[B.length," products"]})]},C)})}):a.jsxs("div",{className:"text-center py-12",children:[a.jsx(Cr,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("p",{className:"text-gray-500",children:"No brands found"})]})]}),b==="specials"&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsx("h2",{className:"text-lg font-semibold text-gray-900 mb-4",children:"Daily Specials"}),a.jsxs("div",{className:"text-center py-12",children:[a.jsx(zx,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("p",{className:"text-gray-500",children:"No specials available"})]})]})]})}):a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("h2",{className:"text-2xl font-bold text-gray-900 mb-2",children:"Store not found"}),a.jsx("button",{onClick:()=>t("/stores"),className:"text-blue-600 hover:text-blue-700",children:"← Back to stores"})]})})}function oW(){const{state:e,storeName:t,slug:r}=_a(),n=dt(),[i,s]=h.useState(null),[o,l]=h.useState([]),[c,d]=h.useState(!0);h.useEffect(()=>{u()},[r]);const u=async()=>{d(!0);try{const p=(await z.getStores()).stores.find(x=>x.slug===r);if(!p)throw new Error("Store not found");s(p);const m=await z.getStoreBrands(p.id);l(m.brands)}catch(f){console.error("Failed to load brands:",f)}finally{d(!1)}};return c?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("span",{className:"loading loading-spinner loading-lg"})})}):i?a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsx("button",{onClick:()=>n(`/stores/${e}/${t}/${r}`),className:"btn btn-ghost btn-sm",children:"← Back to Store"}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("h1",{className:"text-3xl font-bold",children:[i.name," - Brands"]}),a.jsxs("div",{className:"flex gap-3 mt-2",children:[a.jsx("a",{href:`${i.dutchie_url}/brands`,target:"_blank",rel:"noopener noreferrer",className:"link link-primary text-sm",children:"View Live Brands Page"}),a.jsx("span",{className:"text-sm text-gray-500",children:"•"}),a.jsxs("span",{className:"text-sm text-gray-500",children:[o.length," ",o.length===1?"Brand":"Brands"]})]})]})]}),o.length>0?a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:o.map((f,p)=>a.jsx("div",{className:"card bg-base-100 shadow-md hover:shadow-lg transition-shadow",children:a.jsx("div",{className:"card-body p-6",children:a.jsx("h3",{className:"text-lg font-semibold text-center",children:f})})},p))}):a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body text-center py-12",children:[a.jsx("p",{className:"text-gray-500",children:"No brands found for this store"}),a.jsx("p",{className:"text-sm text-gray-400 mt-2",children:"Brands are automatically extracted from products"})]})})]})}):a.jsx(X,{children:a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-500",children:"Store not found"})})})}function lW(){const{state:e,storeName:t,slug:r}=_a(),n=dt(),[i,s]=h.useState(null),[o,l]=h.useState([]),[c,d]=h.useState(new Date().toISOString().split("T")[0]),[u,f]=h.useState(!0);h.useEffect(()=>{p()},[r,c]);const p=async()=>{f(!0);try{const x=(await z.getStores()).stores.find(b=>b.slug===r);if(!x)throw new Error("Store not found");s(x);const g=await z.getStoreSpecials(x.id,c);l(g.specials)}catch(m){console.error("Failed to load specials:",m)}finally{f(!1)}};return u?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("span",{className:"loading loading-spinner loading-lg"})})}):i?a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsx("button",{onClick:()=>n(`/stores/${e}/${t}/${r}`),className:"btn btn-ghost btn-sm",children:"← Back to Store"}),a.jsxs("div",{className:"flex-1",children:[a.jsxs("h1",{className:"text-3xl font-bold",children:[i.name," - Specials"]}),a.jsxs("div",{className:"flex gap-3 mt-2",children:[a.jsx("a",{href:`${i.dutchie_url}/specials`,target:"_blank",rel:"noopener noreferrer",className:"link link-primary text-sm",children:"View Live Specials Page"}),a.jsx("span",{className:"text-sm text-gray-500",children:"•"}),a.jsxs("span",{className:"text-sm text-gray-500",children:[o.length," ",o.length===1?"Special":"Specials"]})]})]})]}),a.jsx("div",{className:"card bg-base-100 shadow-md",children:a.jsx("div",{className:"card-body p-4",children:a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsx("label",{className:"font-semibold",children:"Select Date:"}),a.jsx("input",{type:"date",value:c,onChange:m=>d(m.target.value),className:"input input-bordered input-sm"})]})})}),o.length>0?a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:o.map((m,x)=>a.jsx("div",{className:"card bg-base-100 shadow-xl hover:shadow-2xl transition-shadow",children:a.jsxs("div",{className:"card-body",children:[a.jsx("h3",{className:"card-title text-lg",children:m.name}),m.description&&a.jsx("p",{className:"text-sm text-gray-600",children:m.description}),a.jsxs("div",{className:"space-y-2 mt-2",children:[m.original_price&&a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsx("span",{className:"text-sm opacity-60",children:"Original Price:"}),a.jsxs("span",{className:"line-through text-gray-500",children:["$",parseFloat(m.original_price).toFixed(2)]})]}),m.special_price&&a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsx("span",{className:"text-sm opacity-60",children:"Special Price:"}),a.jsxs("span",{className:"text-lg font-bold text-success",children:["$",parseFloat(m.special_price).toFixed(2)]})]}),m.discount_percentage&&a.jsxs("div",{className:"badge badge-success badge-lg",children:[m.discount_percentage,"% OFF"]}),m.discount_amount&&a.jsxs("div",{className:"badge badge-info badge-lg",children:["Save $",parseFloat(m.discount_amount).toFixed(2)]})]})]})},x))}):a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body text-center py-12",children:[a.jsxs("p",{className:"text-gray-500",children:["No specials found for ",c]}),a.jsx("p",{className:"text-sm text-gray-400 mt-2",children:"Try selecting a different date"})]})})]})}):a.jsx(X,{children:a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-500",children:"Store not found"})})})}function cW(){const[e,t]=h.useState([]),[r,n]=h.useState(null),[i,s]=h.useState([]),[o,l]=h.useState(!0);h.useEffect(()=>{c()},[]),h.useEffect(()=>{r&&d()},[r]);const c=async()=>{try{const f=await z.getStores();t(f.stores),f.stores.length>0&&n(f.stores[0].id)}catch(f){console.error("Failed to load stores:",f)}finally{l(!1)}},d=async()=>{if(r)try{const f=await z.getCategoryTree(r);s(f.tree)}catch(f){console.error("Failed to load categories:",f)}};if(o)return a.jsx(X,{children:a.jsx("div",{children:"Loading..."})});const u=e.find(f=>f.id===r);return a.jsx(X,{children:a.jsxs("div",{children:[a.jsx("h1",{style:{fontSize:"32px",marginBottom:"30px"},children:"Categories"}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"30px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"10px",fontWeight:"600"},children:"Select Store:"}),a.jsx("select",{value:r||"",onChange:f=>n(parseInt(f.target.value)),style:{width:"100%",padding:"12px",border:"2px solid #667eea",borderRadius:"6px",fontSize:"16px",cursor:"pointer"},children:e.map(f=>a.jsxs("option",{value:f.id,children:[f.name," (",f.category_count||0," categories)"]},f.id))})]}),u&&a.jsxs("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsxs("h2",{style:{marginBottom:"20px",fontSize:"24px"},children:[u.name," - Categories"]}),i.length===0?a.jsx("div",{style:{color:"#999",textAlign:"center",padding:"40px"},children:'No categories found. Run "Discover Categories" from the Stores page.'}):a.jsx("div",{children:i.map(f=>a.jsx(Ck,{category:f},f.id))})]})]})})}function Ck({category:e,level:t=0}){return a.jsxs("div",{style:{marginLeft:t*30+"px",marginBottom:"10px"},children:[a.jsxs("div",{style:{padding:"12px 15px",background:t===0?"#f0f0ff":"#f8f9fa",borderRadius:"6px",borderLeft:`4px solid ${t===0?"#667eea":"#999"}`,display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("div",{children:[a.jsxs("strong",{style:{fontSize:t===0?"16px":"14px"},children:[t>0&&"└── ",e.name]}),a.jsxs("span",{style:{marginLeft:"10px",color:"#666",fontSize:"12px"},children:["(",e.product_count||0," products)"]})]}),a.jsx("div",{style:{fontSize:"12px",color:"#999"},children:a.jsx("code",{children:e.path})})]}),e.children&&e.children.length>0&&a.jsx("div",{style:{marginTop:"5px"},children:e.children.map(r=>a.jsx(Ck,{category:r,level:t+1},r.id))})]})}function Vn({message:e,type:t,onClose:r,duration:n=4e3}){h.useEffect(()=>{const s=setTimeout(r,n);return()=>clearTimeout(s)},[n,r]);const i={success:"#10b981",error:"#ef4444",info:"#3b82f6"};return a.jsxs("div",{style:{position:"fixed",top:"20px",right:"20px",background:i[t],color:"white",padding:"16px 24px",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:9999,maxWidth:"400px",animation:"slideIn 0.3s ease-out",fontSize:"14px",fontWeight:"500"},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"12px"},children:[a.jsx("div",{style:{flex:1,whiteSpace:"pre-wrap"},children:e}),a.jsx("button",{onClick:r,style:{background:"transparent",border:"none",color:"white",cursor:"pointer",fontSize:"18px",padding:"0 4px",opacity:.8},children:"×"})]}),a.jsx("style",{children:` + @keyframes slideIn { + from { + transform: translateX(100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } + } + `})]})}function uW(){const[e,t]=h.useState([]),[r,n]=h.useState(!0),[i,s]=h.useState(!1),[o,l]=h.useState(null);h.useEffect(()=>{c()},[]);const c=async()=>{n(!0);try{const u=await z.getCampaigns();t(u.campaigns)}catch(u){console.error("Failed to load campaigns:",u)}finally{n(!1)}},d=async(u,f)=>{if(confirm(`Are you sure you want to delete campaign "${f}"?`))try{await z.deleteCampaign(u),c()}catch(p){l({message:"Failed to delete campaign: "+p.message,type:"error"})}};return r?a.jsx(X,{children:a.jsx("div",{children:"Loading..."})}):a.jsxs(X,{children:[o&&a.jsx(Vn,{message:o.message,type:o.type,onClose:()=>l(null)}),a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Campaigns"}),a.jsx("button",{onClick:()=>s(!0),style:{padding:"12px 24px",background:"#667eea",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px",fontWeight:"500"},children:"+ Create Campaign"})]}),i&&a.jsx(dW,{onClose:()=>s(!1),onSuccess:()=>{s(!1),c()}}),a.jsx("div",{style:{display:"grid",gap:"20px"},children:e.map(u=>a.jsx("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsxs("h3",{style:{marginBottom:"10px",fontSize:"20px"},children:[u.name,a.jsx("span",{style:{marginLeft:"10px",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",background:u.active?"#d4edda":"#f8d7da",color:u.active?"#155724":"#721c24"},children:u.active?"Active":"Inactive"})]}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"5px"},children:[a.jsx("strong",{children:"Slug:"})," ",u.slug]}),u.description&&a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"5px"},children:[a.jsx("strong",{children:"Description:"})," ",u.description]}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"5px"},children:[a.jsx("strong",{children:"Display Style:"})," ",u.display_style]}),a.jsxs("div",{style:{fontSize:"14px",color:"#666"},children:[a.jsx("strong",{children:"Products:"})," ",u.product_count||0]})]}),a.jsx("div",{style:{display:"flex",gap:"10px"},children:a.jsx("button",{onClick:()=>d(u.id,u.name),style:{padding:"8px 16px",background:"#e74c3c",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px"},children:"Delete"})})]})},u.id))}),e.length===0&&!i&&a.jsx("div",{style:{background:"white",padding:"40px",borderRadius:"8px",textAlign:"center",color:"#999"},children:"No campaigns found"})]})]})}function dW({onClose:e,onSuccess:t}){const[r,n]=h.useState(""),[i,s]=h.useState(""),[o,l]=h.useState(""),[c,d]=h.useState("grid"),[u,f]=h.useState(!0),[p,m]=h.useState(!1),[x,g]=h.useState(null),b=async v=>{v.preventDefault(),m(!0);try{await z.createCampaign({name:r,slug:i,description:o,display_style:c,active:u}),t()}catch(j){g({message:"Failed to create campaign: "+j.message,type:"error"})}finally{m(!1)}};return a.jsxs("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"20px"},children:[x&&a.jsx(Vn,{message:x.message,type:x.type,onClose:()=>g(null)}),a.jsx("h3",{style:{marginBottom:"20px"},children:"Create New Campaign"}),a.jsxs("form",{onSubmit:b,children:[a.jsxs("div",{style:{display:"grid",gap:"15px"},children:[a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"5px",fontWeight:"500"},children:"Name *"}),a.jsx("input",{type:"text",value:r,onChange:v=>n(v.target.value),required:!0,style:{width:"100%",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"}})]}),a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"5px",fontWeight:"500"},children:"Slug *"}),a.jsx("input",{type:"text",value:i,onChange:v=>s(v.target.value),required:!0,placeholder:"e.g., summer-sale",style:{width:"100%",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"}})]}),a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"5px",fontWeight:"500"},children:"Description"}),a.jsx("textarea",{value:o,onChange:v=>l(v.target.value),rows:3,style:{width:"100%",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"}})]}),a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"5px",fontWeight:"500"},children:"Display Style"}),a.jsxs("select",{value:c,onChange:v=>d(v.target.value),style:{width:"100%",padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"grid",children:"Grid"}),a.jsx("option",{value:"list",children:"List"}),a.jsx("option",{value:"carousel",children:"Carousel"})]})]}),a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[a.jsx("input",{type:"checkbox",id:"active",checked:u,onChange:v=>f(v.target.checked)}),a.jsx("label",{htmlFor:"active",children:"Active"})]})]}),a.jsxs("div",{style:{display:"flex",gap:"10px",marginTop:"20px"},children:[a.jsx("button",{type:"submit",disabled:p,style:{padding:"10px 20px",background:p?"#999":"#667eea",color:"white",border:"none",borderRadius:"6px",cursor:p?"not-allowed":"pointer",fontSize:"14px"},children:p?"Creating...":"Create Campaign"}),a.jsx("button",{type:"button",onClick:e,style:{padding:"10px 20px",background:"#ddd",color:"#333",border:"none",borderRadius:"6px",cursor:"pointer",fontSize:"14px"},children:"Cancel"})]})]})]})}function fW(){var l,c,d,u;const[e,t]=h.useState(null),[r,n]=h.useState(!0),[i,s]=h.useState(30);h.useEffect(()=>{o()},[i]);const o=async()=>{n(!0);try{const f=await z.getAnalyticsOverview(i);t(f)}catch(f){console.error("Failed to load analytics:",f)}finally{n(!1)}};return r?a.jsx(X,{children:a.jsx("div",{children:"Loading..."})}):a.jsx(X,{children:a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Analytics"}),a.jsxs("select",{value:i,onChange:f=>s(parseInt(f.target.value)),style:{padding:"10px 15px",border:"1px solid #ddd",borderRadius:"6px",fontSize:"14px"},children:[a.jsx("option",{value:7,children:"Last 7 days"}),a.jsx("option",{value:30,children:"Last 30 days"}),a.jsx("option",{value:90,children:"Last 90 days"}),a.jsx("option",{value:365,children:"Last year"})]})]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(250px, 1fr))",gap:"20px",marginBottom:"30px"},children:[a.jsx(Nv,{title:"Total Clicks",value:((l=e==null?void 0:e.overview)==null?void 0:l.total_clicks)||0,icon:"👆",color:"#3498db"}),a.jsx(Nv,{title:"Unique Products Clicked",value:((c=e==null?void 0:e.overview)==null?void 0:c.unique_products)||0,icon:"📦",color:"#2ecc71"})]}),a.jsxs("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"30px"},children:[a.jsx("h3",{style:{marginBottom:"20px"},children:"Clicks Over Time"}),((d=e==null?void 0:e.clicks_by_day)==null?void 0:d.length)>0?a.jsx("div",{style:{overflowX:"auto"},children:a.jsx("div",{style:{display:"flex",alignItems:"flex-end",gap:"8px",minWidth:"600px",height:"200px"},children:e.clicks_by_day.slice().reverse().map((f,p)=>{const m=Math.max(...e.clicks_by_day.map(g=>g.clicks)),x=f.clicks/m*180;return a.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",alignItems:"center"},children:[a.jsx("div",{style:{width:"100%",height:`${x}px`,background:"#667eea",borderRadius:"4px 4px 0 0",position:"relative",minHeight:"2px"},title:`${f.clicks} clicks`,children:a.jsx("div",{style:{position:"absolute",top:"-25px",left:"50%",transform:"translateX(-50%)",fontSize:"12px",fontWeight:"bold"},children:f.clicks})}),a.jsx("div",{style:{fontSize:"10px",marginTop:"5px",color:"#666",transform:"rotate(-45deg)",transformOrigin:"left",whiteSpace:"nowrap"},children:new Date(f.date).toLocaleDateString("en-US",{month:"short",day:"numeric"})})]},p)})})}):a.jsx("div",{style:{color:"#999",textAlign:"center",padding:"40px"},children:"No click data for this period"})]}),a.jsxs("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("h3",{style:{marginBottom:"20px"},children:"Top Products"}),((u=e==null?void 0:e.top_products)==null?void 0:u.length)>0?a.jsx("div",{children:e.top_products.map((f,p)=>a.jsxs("div",{style:{padding:"15px 0",borderBottom:p{u()},[]);const u=async()=>{n(!0);try{const x=await z.getSettings();t(x.settings)}catch(x){console.error("Failed to load settings:",x)}finally{n(!1)}},f=(x,g)=>{l(b=>({...b,[x]:g}))},p=async()=>{s(!0);try{const x=Object.entries(o).map(([g,b])=>({key:g,value:b}));await z.updateSettings(x),l({}),u(),d({message:"Settings saved successfully!",type:"success"})}catch(x){d({message:"Failed to save settings: "+x.message,type:"error"})}finally{s(!1)}},m=Object.keys(o).length>0;return r?a.jsx(X,{children:a.jsx("div",{children:"Loading..."})}):a.jsxs(X,{children:[c&&a.jsx(Vn,{message:c.message,type:c.type,onClose:()=>d(null)}),a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Settings"}),m&&a.jsx("button",{onClick:p,disabled:i,style:{padding:"12px 24px",background:i?"#999":"#2ecc71",color:"white",border:"none",borderRadius:"6px",cursor:i?"not-allowed":"pointer",fontSize:"14px",fontWeight:"500"},children:i?"Saving...":"Save Changes"})]}),a.jsx("div",{style:{background:"white",padding:"25px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:a.jsx("div",{style:{display:"grid",gap:"25px"},children:e.map(x=>{const g=o[x.key]!==void 0?o[x.key]:x.value;return a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"500",fontSize:"16px"},children:hW(x.key)}),x.description&&a.jsx("div",{style:{fontSize:"13px",color:"#666",marginBottom:"8px"},children:x.description}),a.jsx("input",{type:"text",value:g,onChange:b=>f(x.key,b.target.value),style:{width:"100%",maxWidth:"500px",padding:"10px",border:o[x.key]!==void 0?"2px solid #667eea":"1px solid #ddd",borderRadius:"6px",fontSize:"14px"}}),a.jsxs("div",{style:{fontSize:"12px",color:"#999",marginTop:"5px"},children:["Last updated: ",new Date(x.updated_at).toLocaleString()]})]},x.key)})})}),m&&a.jsx("div",{style:{marginTop:"20px",padding:"15px",background:"#fff3cd",border:"1px solid #ffc107",borderRadius:"6px",color:"#856404"},children:'⚠️ You have unsaved changes. Click "Save Changes" to apply them.'})]})]})}function hW(e){return e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function mW(){const[e,t]=h.useState([]),[r,n]=h.useState(!0),[i,s]=h.useState(!1),[o,l]=h.useState({}),[c,d]=h.useState(null),[u,f]=h.useState(null);h.useEffect(()=>{p(),m()},[]),h.useEffect(()=>{if(!(c!=null&&c.id))return;if(c.status==="completed"||c.status==="cancelled"||c.status==="failed"){p();return}const _=setInterval(async()=>{try{const P=await z.getProxyTestJob(c.id);d(P.job),(P.job.status==="completed"||P.job.status==="cancelled"||P.job.status==="failed")&&(clearInterval(_),p())}catch(P){console.error("Failed to poll job status:",P)}},2e3);return()=>clearInterval(_)},[c==null?void 0:c.id]);const p=async()=>{n(!0);try{const N=await z.getProxies();t(N.proxies)}catch(N){console.error("Failed to load proxies:",N)}finally{n(!1)}},m=async()=>{try{const N=await z.getActiveProxyTestJob();N.job&&d(N.job)}catch{console.log("No active job found")}},x=async N=>{l(_=>({..._,[N]:!0}));try{await z.testProxy(N),p()}catch(_){f({message:"Test failed: "+_.message,type:"error"})}finally{l(_=>({..._,[N]:!1}))}},g=async N=>{l(_=>({..._,[N]:!0})),z.testProxy(N).then(()=>{p(),l(_=>({..._,[N]:!1}))}).catch(()=>{l(_=>({..._,[N]:!1}))})},b=async()=>{try{const N=await z.testAllProxies();f({message:"Proxy testing job started",type:"success"}),d({id:N.jobId,status:"pending",tested_proxies:0,total_proxies:e.length,passed_proxies:0,failed_proxies:0})}catch(N){f({message:"Failed to start testing: "+N.message,type:"error"})}},v=async()=>{if(c!=null&&c.id)try{await z.cancelProxyTestJob(c.id),f({message:"Job cancelled",type:"info"})}catch(N){f({message:"Failed to cancel job: "+N.message,type:"error"})}},j=async()=>{try{await z.updateProxyLocations(),f({message:"Location update job started",type:"success"})}catch(N){f({message:"Failed to start location update: "+N.message,type:"error"})}},y=async N=>{if(confirm("Delete this proxy?"))try{await z.deleteProxy(N),p()}catch(_){f({message:"Failed to delete proxy: "+_.message,type:"error"})}};if(r)return a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 border-t-blue-600 rounded-full animate-spin"})})});const w={total:e.length,passed:e.filter(N=>N.active).length,failed:e.filter(N=>!N.active).length},S=w.total>0?Math.round(w.passed/w.total*100):0;return a.jsxs(X,{children:[u&&a.jsx(Vn,{message:u.message,type:u.type,onClose:()=>f(null)}),a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(ol,{className:"w-6 h-6 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-semibold text-gray-900",children:"Proxies"}),a.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:[w.total," total • ",w.passed," active • ",w.failed," inactive"]})]})]}),a.jsxs("div",{className:"flex gap-2",children:[a.jsxs("button",{onClick:b,disabled:!!c&&c.status!=="completed"&&c.status!=="cancelled"&&c.status!=="failed",className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-50 text-blue-700 rounded-lg hover:bg-blue-100 transition-colors text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Test All"]}),a.jsxs("button",{onClick:j,className:"inline-flex items-center gap-2 px-4 py-2 bg-purple-50 text-purple-700 rounded-lg hover:bg-purple-100 transition-colors text-sm font-medium",children:[a.jsx(yi,{className:"w-4 h-4"}),"Update Locations"]}),a.jsxs("button",{onClick:()=>s(!0),className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-sm font-medium",children:[a.jsx(Ll,{className:"w-4 h-4"}),"Add Proxy"]})]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4",children:[a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(ol,{className:"w-5 h-5 text-blue-600"})}),a.jsx("div",{className:"flex items-center gap-1 text-xs text-gray-500",children:a.jsxs("span",{children:[S,"% pass rate"]})})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Total Proxies"}),a.jsx("p",{className:"text-3xl font-semibold text-gray-900",children:w.total})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(Pr,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{className:"flex items-center gap-1 text-xs text-green-600",children:[a.jsx(zn,{className:"w-3 h-3"}),a.jsxs("span",{children:[Math.round(w.passed/w.total*100)||0,"%"]})]})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Active"}),a.jsx("p",{className:"text-3xl font-semibold text-green-600",children:w.passed}),a.jsx("p",{className:"text-xs text-gray-500",children:"Passing health checks"})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"p-2 bg-red-50 rounded-lg",children:a.jsx(Hr,{className:"w-5 h-5 text-red-600"})}),a.jsx("div",{className:"flex items-center gap-1 text-xs text-red-600",children:a.jsxs("span",{children:[Math.round(w.failed/w.total*100)||0,"%"]})})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Inactive"}),a.jsx("p",{className:"text-3xl font-semibold text-red-600",children:w.failed}),a.jsx("p",{className:"text-xs text-gray-500",children:"Failed health checks"})]})]}),a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsx("div",{className:"flex items-center justify-between mb-4",children:a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(zn,{className:"w-5 h-5 text-purple-600"})})}),a.jsxs("div",{className:"space-y-1",children:[a.jsx("p",{className:"text-sm font-medium text-gray-600",children:"Success Rate"}),a.jsxs("p",{className:"text-3xl font-semibold text-gray-900",children:[S,"%"]}),a.jsx("div",{className:"w-full bg-gray-200 rounded-full h-2 mt-3",children:a.jsx("div",{className:"bg-green-600 h-2 rounded-full transition-all",style:{width:`${S}%`}})})]})]})]}),c&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex justify-between items-center mb-4",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Xt,{className:`w-5 h-5 text-blue-600 ${c.status==="running"?"animate-spin":""}`})}),a.jsxs("div",{children:[a.jsx("h3",{className:"font-semibold text-gray-900",children:"Proxy Testing Job"}),a.jsx("p",{className:"text-sm text-gray-500",children:c.status.charAt(0).toUpperCase()+c.status.slice(1)})]})]}),a.jsxs("div",{className:"flex gap-2",children:[c.status==="running"&&a.jsx("button",{onClick:v,className:"px-3 py-1.5 bg-red-50 text-red-700 rounded-lg hover:bg-red-100 transition-colors text-sm font-medium",children:"Cancel"}),(c.status==="completed"||c.status==="cancelled"||c.status==="failed")&&a.jsx("button",{onClick:()=>d(null),className:"px-3 py-1.5 text-gray-600 hover:bg-gray-50 rounded-lg transition-colors text-sm font-medium",children:"Dismiss"})]})]}),a.jsxs("div",{className:"mb-4",children:[a.jsxs("div",{className:"text-sm text-gray-600 mb-2",children:["Progress: ",c.tested_proxies||0," / ",c.total_proxies||0," proxies tested"]}),a.jsx("div",{className:"w-full bg-gray-200 rounded-full h-2",children:a.jsx("div",{className:`h-2 rounded-full transition-all ${c.status==="completed"?"bg-green-600":c.status==="cancelled"||c.status==="failed"?"bg-red-600":"bg-blue-600"}`,style:{width:`${(c.tested_proxies||0)/(c.total_proxies||100)*100}%`}})})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm text-gray-600",children:"Passed:"}),a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-green-50 text-green-700 rounded",children:c.passed_proxies||0})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-sm text-gray-600",children:"Failed:"}),a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-red-50 text-red-700 rounded",children:c.failed_proxies||0})]})]}),c.error&&a.jsxs("div",{className:"mt-4 p-3 bg-red-50 border border-red-200 rounded-lg flex items-start gap-2",children:[a.jsx(ha,{className:"w-5 h-5 text-red-600 flex-shrink-0 mt-0.5"}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm font-medium text-red-900",children:"Error"}),a.jsx("p",{className:"text-sm text-red-700",children:c.error})]})]})]}),i&&a.jsx(gW,{onClose:()=>s(!1),onSuccess:()=>{s(!1),p()}}),a.jsx("div",{className:"space-y-3",children:e.map(N=>a.jsx("div",{className:"bg-white rounded-xl border border-gray-200 p-4 hover:shadow-lg transition-shadow",children:a.jsxs("div",{className:"flex justify-between items-center",children:[a.jsxs("div",{className:"flex-1",children:[a.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[a.jsxs("h3",{className:"font-semibold text-gray-900",children:[N.protocol,"://",N.host,":",N.port]}),a.jsx("span",{className:`px-2 py-1 text-xs font-medium rounded ${N.active?"bg-green-50 text-green-700":"bg-red-50 text-red-700"}`,children:N.active?"Active":"Inactive"}),N.is_anonymous&&a.jsx("span",{className:"px-2 py-1 text-xs font-medium bg-blue-50 text-blue-700 rounded",children:"Anonymous"}),(N.city||N.state||N.country)&&a.jsxs("span",{className:"px-2 py-1 text-xs font-medium bg-purple-50 text-purple-700 rounded flex items-center gap-1",children:[a.jsx(yi,{className:"w-3 h-3"}),N.city&&`${N.city}/`,N.state&&`${N.state.substring(0,2).toUpperCase()} `,N.country]})]}),a.jsx("div",{className:"text-sm text-gray-600",children:N.last_tested_at?a.jsxs("div",{className:"flex items-center gap-4",children:[a.jsxs("div",{className:"flex items-center gap-1",children:[a.jsx(xr,{className:"w-4 h-4 text-gray-400"}),a.jsxs("span",{children:["Last tested: ",new Date(N.last_tested_at).toLocaleString()]})]}),N.test_result==="success"?a.jsxs("span",{className:"flex items-center gap-1 text-green-600",children:[a.jsx(Pr,{className:"w-4 h-4"}),"Success (",N.response_time_ms,"ms)"]}):a.jsxs("span",{className:"flex items-center gap-1 text-red-600",children:[a.jsx(Hr,{className:"w-4 h-4"}),"Failed"]})]}):"Not tested yet"})]}),a.jsxs("div",{className:"flex gap-2",children:[N.active?a.jsx("button",{onClick:()=>x(N.id),disabled:o[N.id],className:"inline-flex items-center gap-1 px-3 py-1.5 bg-blue-50 text-blue-700 rounded-lg hover:bg-blue-100 transition-colors text-sm font-medium disabled:opacity-50",children:o[N.id]?a.jsx("div",{className:"w-4 h-4 border-2 border-blue-700 border-t-transparent rounded-full animate-spin"}):a.jsxs(a.Fragment,{children:[a.jsx(Xt,{className:"w-4 h-4"}),"Test"]})}):a.jsx("button",{onClick:()=>g(N.id),disabled:o[N.id],className:"inline-flex items-center gap-1 px-3 py-1.5 bg-yellow-50 text-yellow-700 rounded-lg hover:bg-yellow-100 transition-colors text-sm font-medium disabled:opacity-50",children:o[N.id]?a.jsx("div",{className:"w-4 h-4 border-2 border-yellow-700 border-t-transparent rounded-full animate-spin"}):a.jsxs(a.Fragment,{children:[a.jsx(Xt,{className:"w-4 h-4"}),"Retest"]})}),a.jsxs("button",{onClick:()=>y(N.id),className:"inline-flex items-center gap-1 px-3 py-1.5 bg-red-50 text-red-700 rounded-lg hover:bg-red-100 transition-colors text-sm font-medium",children:[a.jsx(aj,{className:"w-4 h-4"}),"Delete"]})]})]})},N.id))}),e.length===0&&!i&&a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200 p-12 text-center",children:[a.jsx(ol,{className:"w-16 h-16 text-gray-300 mx-auto mb-4"}),a.jsx("h3",{className:"text-xl font-semibold text-gray-900 mb-2",children:"No proxies configured"}),a.jsx("p",{className:"text-gray-500 mb-6",children:"Add your first proxy to get started with scraping"}),a.jsxs("button",{onClick:()=>s(!0),className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium",children:[a.jsx(Ll,{className:"w-4 h-4"}),"Add Proxy"]})]})]})]})}function gW({onClose:e,onSuccess:t}){const[r,n]=h.useState("single"),[i,s]=h.useState(""),[o,l]=h.useState(""),[c,d]=h.useState("http"),[u,f]=h.useState(""),[p,m]=h.useState(""),[x,g]=h.useState(""),[b,v]=h.useState(!1),[j,y]=h.useState(null),w=P=>{if(P=P.trim(),!P||P.startsWith("#"))return null;let D;return D=P.match(/^(https?|socks5):\/\/([^:]+):([^@]+)@([^:]+):(\d+)$/),D?{protocol:D[1],username:D[2],password:D[3],host:D[4],port:parseInt(D[5])}:(D=P.match(/^(https?|socks5):\/\/([^:]+):(\d+)$/),D?{protocol:D[1],host:D[2],port:parseInt(D[3])}:(D=P.match(/^([^:]+):(\d+):([^:]+):(.+)$/),D?{protocol:"http",host:D[1],port:parseInt(D[2]),username:D[3],password:D[4]}:(D=P.match(/^([^:]+):(\d+)$/),D?{protocol:"http",host:D[1],port:parseInt(D[2])}:null)))},S=async()=>{const D=x.split(` +`).map(M=>w(M)).filter(M=>M!==null);if(D.length===0){y({message:"No valid proxies found. Please check the format.",type:"error"});return}v(!0);try{const M=await z.addProxiesBulk(D),I=`Import complete! + +Added: ${M.added} +Duplicates: ${M.duplicates||0} +Failed: ${M.failed} + +Proxies are inactive by default. Use "Test All Proxies" to verify and activate them.`;y({message:I,type:"success"}),t()}catch(M){y({message:"Failed to import proxies: "+M.message,type:"error"})}finally{v(!1)}},N=async P=>{var I;const D=(I=P.target.files)==null?void 0:I[0];if(!D)return;const M=await D.text();g(M)},_=async P=>{if(P.preventDefault(),r==="bulk"){await S();return}v(!0);try{await z.addProxy({host:i,port:parseInt(o),protocol:c,username:u||void 0,password:p||void 0}),t()}catch(D){y({message:"Failed to add proxy: "+D.message,type:"error"})}finally{v(!1)}};return a.jsxs("div",{className:"bg-white rounded-xl border border-gray-200",children:[j&&a.jsx(Vn,{message:j.message,type:j.type,onClose:()=>y(null)}),a.jsxs("div",{className:"p-6",children:[a.jsxs("div",{className:"flex justify-between items-center mb-6",children:[a.jsx("h2",{className:"text-xl font-semibold text-gray-900",children:"Add Proxies"}),a.jsxs("div",{className:"flex bg-gray-100 rounded-lg p-1",children:[a.jsx("button",{type:"button",onClick:()=>n("single"),className:`px-4 py-2 rounded-md text-sm font-medium transition-colors ${r==="single"?"bg-white text-gray-900 shadow-sm":"text-gray-600 hover:text-gray-900"}`,children:"Single"}),a.jsx("button",{type:"button",onClick:()=>n("bulk"),className:`px-4 py-2 rounded-md text-sm font-medium transition-colors ${r==="bulk"?"bg-white text-gray-900 shadow-sm":"text-gray-600 hover:text-gray-900"}`,children:"Bulk Import"})]})]}),a.jsxs("form",{onSubmit:_,children:[r==="single"?a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Host *"}),a.jsx("input",{type:"text",value:i,onChange:P=>s(P.target.value),required:!0,placeholder:"proxy.example.com",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Port *"}),a.jsx("input",{type:"number",value:o,onChange:P=>l(P.target.value),required:!0,placeholder:"8080",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Protocol *"}),a.jsxs("select",{value:c,onChange:P=>d(P.target.value),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"http",children:"HTTP"}),a.jsx("option",{value:"https",children:"HTTPS"}),a.jsx("option",{value:"socks5",children:"SOCKS5"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Username"}),a.jsx("input",{type:"text",value:u,onChange:P=>f(P.target.value),placeholder:"Optional",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]}),a.jsxs("div",{className:"md:col-span-2",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Password"}),a.jsx("input",{type:"password",value:p,onChange:P=>m(P.target.value),placeholder:"Optional",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500"})]})]}):a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Upload File"}),a.jsxs("label",{className:"flex items-center justify-center w-full px-4 py-6 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-colors",children:[a.jsxs("div",{className:"flex flex-col items-center",children:[a.jsx(K6,{className:"w-8 h-8 text-gray-400 mb-2"}),a.jsx("span",{className:"text-sm text-gray-600",children:"Click to upload or drag and drop"}),a.jsx("span",{className:"text-xs text-gray-500 mt-1",children:".txt or .list files"})]}),a.jsx("input",{type:"file",accept:".txt,.list",onChange:N,className:"hidden"})]})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Or Paste Proxies (one per line)"}),a.jsx("textarea",{value:x,onChange:P=>g(P.target.value),placeholder:`Supported formats: +host:port +protocol://host:port +host:port:username:password +protocol://username:password@host:port + +Example: +192.168.1.1:8080 +http://proxy.example.com:3128 +10.0.0.1:8080:user:pass +socks5://user:pass@proxy.example.com:1080`,rows:12,className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 font-mono text-sm"})]}),a.jsxs("div",{className:"p-3 bg-blue-50 border border-blue-200 rounded-lg flex items-start gap-2",children:[a.jsx(ha,{className:"w-5 h-5 text-blue-600 flex-shrink-0 mt-0.5"}),a.jsx("span",{className:"text-sm text-blue-900",children:"Lines starting with # are treated as comments and ignored."})]})]}),a.jsxs("div",{className:"flex justify-end gap-3 mt-6 pt-6 border-t border-gray-200",children:[a.jsx("button",{type:"button",onClick:e,className:"px-4 py-2 text-gray-700 hover:bg-gray-50 rounded-lg transition-colors font-medium",children:"Cancel"}),a.jsx("button",{type:"submit",disabled:b,className:"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium disabled:opacity-50 disabled:cursor-not-allowed",children:b?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin"}),a.jsx("span",{children:"Processing..."})]}):a.jsxs(a.Fragment,{children:[a.jsx(Ll,{className:"w-4 h-4"}),r==="bulk"?"Import Proxies":"Add Proxy"]})})]})]})]})]})}function xW(){const[e,t]=h.useState([]),[r,n]=h.useState(!0),[i,s]=h.useState(!0),[o,l]=h.useState(""),[c,d]=h.useState(""),[u,f]=h.useState(200),[p,m]=h.useState(null),x=h.useRef(null);h.useEffect(()=>{g()},[o,c,u]),h.useEffect(()=>{if(!i)return;const S=setInterval(()=>{g()},2e3);return()=>clearInterval(S)},[i,o,c,u]);const g=async()=>{try{const S=await z.getLogs(u,o,c);t(S.logs)}catch(S){console.error("Failed to load logs:",S)}finally{n(!1)}},b=async()=>{if(confirm("Are you sure you want to clear all logs?"))try{await z.clearLogs(),t([]),m({message:"Logs cleared successfully",type:"success"})}catch(S){m({message:"Failed to clear logs: "+S.message,type:"error"})}},v=()=>{var S;(S=x.current)==null||S.scrollIntoView({behavior:"smooth"})},j=S=>{switch(S){case"error":return"#dc3545";case"warn":return"#ffc107";case"info":return"#17a2b8";case"debug":return"#6c757d";default:return"#333"}},y=S=>{switch(S){case"error":return"#f8d7da";case"warn":return"#fff3cd";case"info":return"#d1ecf1";case"debug":return"#e2e3e5";default:return"#f8f9fa"}},w=S=>{switch(S){case"scraper":return"🔍";case"images":return"📸";case"categories":return"📂";case"system":return"⚙️";case"api":return"🌐";default:return"📝"}};return r?a.jsx(X,{children:a.jsx("div",{children:"Loading logs..."})}):a.jsxs(X,{children:[p&&a.jsx(Vn,{message:p.message,type:p.type,onClose:()=>m(null)}),a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"20px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"System Logs"}),a.jsxs("div",{style:{display:"flex",gap:"10px",alignItems:"center"},children:[a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"5px"},children:[a.jsx("input",{type:"checkbox",checked:i,onChange:S=>s(S.target.checked)}),"Auto-refresh (2s)"]}),a.jsx("button",{onClick:v,style:{padding:"8px 16px",background:"#6c757d",color:"white",border:"none",borderRadius:"6px",cursor:"pointer"},children:"⬇️ Scroll to Bottom"}),a.jsx("button",{onClick:b,style:{padding:"8px 16px",background:"#dc3545",color:"white",border:"none",borderRadius:"6px",cursor:"pointer"},children:"🗑️ Clear Logs"})]})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"20px",display:"flex",gap:"15px",flexWrap:"wrap"},children:[a.jsxs("select",{value:o,onChange:S=>l(S.target.value),style:{padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"",children:"All Levels"}),a.jsx("option",{value:"info",children:"Info"}),a.jsx("option",{value:"warn",children:"Warning"}),a.jsx("option",{value:"error",children:"Error"}),a.jsx("option",{value:"debug",children:"Debug"})]}),a.jsxs("select",{value:c,onChange:S=>d(S.target.value),style:{padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"",children:"All Categories"}),a.jsx("option",{value:"scraper",children:"🔍 Scraper"}),a.jsx("option",{value:"images",children:"📸 Images"}),a.jsx("option",{value:"categories",children:"📂 Categories"}),a.jsx("option",{value:"system",children:"⚙️ System"}),a.jsx("option",{value:"api",children:"🌐 API"})]}),a.jsxs("select",{value:u,onChange:S=>f(parseInt(S.target.value)),style:{padding:"10px",border:"1px solid #ddd",borderRadius:"6px"},children:[a.jsx("option",{value:"50",children:"Last 50"}),a.jsx("option",{value:"100",children:"Last 100"}),a.jsx("option",{value:"200",children:"Last 200"}),a.jsx("option",{value:"500",children:"Last 500"}),a.jsx("option",{value:"1000",children:"Last 1000"})]}),a.jsx("div",{style:{marginLeft:"auto",display:"flex",alignItems:"center",gap:"10px"},children:a.jsxs("span",{style:{fontSize:"14px",color:"#666"},children:["Showing ",e.length," logs"]})})]}),a.jsxs("div",{style:{background:"#1e1e1e",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",maxHeight:"70vh",overflowY:"auto",fontFamily:"monospace",fontSize:"13px"},children:[e.length===0?a.jsx("div",{style:{color:"#999",textAlign:"center",padding:"40px"},children:"No logs to display"}):e.map((S,N)=>a.jsxs("div",{style:{padding:"8px 12px",marginBottom:"4px",borderRadius:"4px",background:y(S.level),borderLeft:`4px solid ${j(S.level)}`,display:"flex",gap:"10px",alignItems:"flex-start"},children:[a.jsx("span",{style:{color:"#666",fontSize:"11px",whiteSpace:"nowrap"},children:new Date(S.timestamp).toLocaleTimeString()}),a.jsx("span",{style:{fontSize:"14px"},children:w(S.category)}),a.jsx("span",{style:{padding:"2px 6px",borderRadius:"3px",fontSize:"10px",fontWeight:"bold",background:j(S.level),color:"white",textTransform:"uppercase"},children:S.level}),a.jsx("span",{style:{padding:"2px 6px",borderRadius:"3px",fontSize:"10px",background:"#e2e3e5",color:"#333"},children:S.category}),a.jsx("span",{style:{flex:1,color:"#333",wordBreak:"break-word"},children:S.message})]},N)),a.jsx("div",{ref:x})]})]})]})}function yW(){const[e,t]=h.useState([]),[r,n]=h.useState([]),[i,s]=h.useState(null),[o,l]=h.useState([]),[c,d]=h.useState([]),[u,f]=h.useState([]),[p,m]=h.useState(!0),[x,g]=h.useState(!0),[b,v]=h.useState("az-live"),[j,y]=h.useState(null),[w,S]=h.useState(""),[N,_]=h.useState(null),[P,D]=h.useState({scheduledJobs:[],crawlJobs:[],inMemoryScrapers:[],totalActive:0}),[M,I]=h.useState({jobLogs:[],crawlJobs:[]}),[C,B]=h.useState([]),q=async A=>{try{if(A==="az-live"){const[T,O,k,L]=await Promise.all([z.getAZMonitorSummary().catch(()=>null),z.getAZMonitorActiveJobs().catch(()=>({scheduledJobs:[],crawlJobs:[],inMemoryScrapers:[],totalActive:0})),z.getAZMonitorRecentJobs(30).catch(()=>({jobLogs:[],crawlJobs:[]})),z.getAZMonitorErrors({limit:10,hours:24}).catch(()=>({errors:[]}))]);_(T),D(O),I(k),B((L==null?void 0:L.errors)||[])}else if(A==="jobs"){const[T,O,k,L]=await Promise.all([z.getJobStats(),z.getActiveJobs(),z.getWorkerStats(),z.getRecentJobs({limit:50})]);s(T),l(O.jobs||[]),d(k.workers||[]),f(L.jobs||[])}else if(A==="scrapers"){const[T,O]=await Promise.all([z.getActiveScrapers(),z.getScraperHistory()]);t(T.scrapers||[]),n(O.history||[])}}catch(T){console.error("Failed to load scraper data:",T)}finally{m(!1)}};h.useEffect(()=>{q(b)},[b]),h.useEffect(()=>{if(x){const A=setInterval(()=>q(b),3e3);return()=>clearInterval(A)}},[x,b]);const Z=A=>{const T=Math.floor(A/1e3),O=Math.floor(T/60),k=Math.floor(O/60);return k>0?`${k}h ${O%60}m ${T%60}s`:O>0?`${O}m ${T%60}s`:`${T}s`};return a.jsx(X,{children:a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Scraper Monitor"}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:x,onChange:A=>g(A.target.checked),style:{width:"18px",height:"18px",cursor:"pointer"}}),a.jsx("span",{children:"Auto-refresh (3s)"})]})]}),a.jsxs("div",{style:{marginBottom:"30px",display:"flex",gap:"10px",borderBottom:"2px solid #eee"},children:[a.jsxs("button",{onClick:()=>v("az-live"),style:{padding:"12px 24px",background:b==="az-live"?"white":"transparent",border:"none",borderBottom:b==="az-live"?"3px solid #10b981":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:b==="az-live"?"600":"400",color:b==="az-live"?"#10b981":"#666",marginBottom:"-2px"},children:["AZ Live ",P.totalActive>0&&a.jsx("span",{style:{marginLeft:"8px",padding:"2px 8px",background:"#10b981",color:"white",borderRadius:"10px",fontSize:"12px"},children:P.totalActive})]}),a.jsx("button",{onClick:()=>v("jobs"),style:{padding:"12px 24px",background:b==="jobs"?"white":"transparent",border:"none",borderBottom:b==="jobs"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:b==="jobs"?"600":"400",color:b==="jobs"?"#2563eb":"#666",marginBottom:"-2px"},children:"Dispensary Jobs"}),a.jsx("button",{onClick:()=>v("scrapers"),style:{padding:"12px 24px",background:b==="scrapers"?"white":"transparent",border:"none",borderBottom:b==="scrapers"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:b==="scrapers"?"600":"400",color:b==="scrapers"?"#2563eb":"#666",marginBottom:"-2px"},children:"Crawl History"})]}),b==="az-live"&&a.jsxs(a.Fragment,{children:[N&&a.jsx("div",{style:{marginBottom:"30px"},children:a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(180px, 1fr))",gap:"15px"},children:[a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Running Jobs"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:P.totalActive>0?"#10b981":"#666"},children:P.totalActive})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Successful (24h)"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#10b981"},children:(N.successful_jobs_24h||0)+(N.successful_crawls_24h||0)})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Failed (24h)"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:(N.failed_jobs_24h||0)+(N.failed_crawls_24h||0)>0?"#ef4444":"#666"},children:(N.failed_jobs_24h||0)+(N.failed_crawls_24h||0)})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Products (24h)"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#8b5cf6"},children:N.products_found_24h||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Snapshots (24h)"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#06b6d4"},children:N.snapshots_created_24h||0})]})]})}),a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px",display:"flex",alignItems:"center",gap:"10px"},children:["Active Jobs",P.totalActive>0&&a.jsxs("span",{style:{padding:"4px 12px",background:"#d1fae5",color:"#065f46",borderRadius:"12px",fontSize:"14px",fontWeight:"600"},children:[P.totalActive," running"]})]}),P.totalActive===0?a.jsxs("div",{style:{background:"white",padding:"60px 40px",borderRadius:"8px",textAlign:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"48px",marginBottom:"20px"},children:"😴"}),a.jsx("div",{style:{fontSize:"18px",color:"#666"},children:"No jobs currently running"})]}):a.jsxs("div",{style:{display:"grid",gap:"15px"},children:[P.scheduledJobs.map(A=>a.jsx("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:"4px solid #10b981"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsx("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"8px"},children:A.job_name}),a.jsx("div",{style:{fontSize:"14px",color:"#666",marginBottom:"12px"},children:A.job_description||"Scheduled job"}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(120px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Processed"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600"},children:A.items_processed||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Succeeded"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#10b981"},children:A.items_succeeded||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Failed"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:A.items_failed>0?"#ef4444":"#666"},children:A.items_failed||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Duration"}),a.jsxs("div",{style:{fontSize:"16px",fontWeight:"600"},children:[Math.floor((A.duration_seconds||0)/60),"m ",Math.floor((A.duration_seconds||0)%60),"s"]})]})]})]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:"#d1fae5",color:"#065f46"},children:"RUNNING"})]})},`sched-${A.id}`)),P.crawlJobs.length>0&&a.jsxs("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden",marginTop:"15px"},children:[a.jsx("div",{style:{padding:"15px 20px",borderBottom:"2px solid #eee",background:"#f8f8f8"},children:a.jsxs("h3",{style:{margin:0,fontSize:"16px",fontWeight:"600"},children:["Active Crawler Sessions (",P.crawlJobs.length,")"]})}),a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsx("th",{style:{padding:"12px 15px",textAlign:"left",fontWeight:"600",fontSize:"13px",color:"#666"},children:"Store"}),a.jsx("th",{style:{padding:"12px 15px",textAlign:"left",fontWeight:"600",fontSize:"13px",color:"#666"},children:"Worker"}),a.jsx("th",{style:{padding:"12px 15px",textAlign:"center",fontWeight:"600",fontSize:"13px",color:"#666"},children:"Page"}),a.jsx("th",{style:{padding:"12px 15px",textAlign:"right",fontWeight:"600",fontSize:"13px",color:"#666"},children:"Products"}),a.jsx("th",{style:{padding:"12px 15px",textAlign:"right",fontWeight:"600",fontSize:"13px",color:"#666"},children:"Snapshots"}),a.jsx("th",{style:{padding:"12px 15px",textAlign:"right",fontWeight:"600",fontSize:"13px",color:"#666"},children:"Duration"}),a.jsx("th",{style:{padding:"12px 15px",textAlign:"center",fontWeight:"600",fontSize:"13px",color:"#666"},children:"Status"})]})}),a.jsx("tbody",{children:P.crawlJobs.map(A=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"12px 15px"},children:[a.jsx("div",{style:{fontWeight:"600",marginBottom:"2px"},children:A.dispensary_name||"Unknown"}),a.jsxs("div",{style:{fontSize:"12px",color:"#999"},children:[A.city," | ID: ",A.dispensary_id]})]}),a.jsxs("td",{style:{padding:"12px 15px",fontSize:"13px"},children:[a.jsx("div",{style:{fontFamily:"monospace",fontSize:"11px",color:"#666"},children:A.worker_id?A.worker_id.substring(0,8):"-"}),A.worker_hostname&&a.jsx("div",{style:{fontSize:"11px",color:"#999"},children:A.worker_hostname})]}),a.jsx("td",{style:{padding:"12px 15px",textAlign:"center",fontSize:"13px"},children:A.current_page&&A.total_pages?a.jsxs("span",{children:[A.current_page,"/",A.total_pages]}):"-"}),a.jsx("td",{style:{padding:"12px 15px",textAlign:"right",fontWeight:"600",color:"#8b5cf6"},children:A.products_found||0}),a.jsx("td",{style:{padding:"12px 15px",textAlign:"right",fontWeight:"600",color:"#06b6d4"},children:A.snapshots_created||0}),a.jsxs("td",{style:{padding:"12px 15px",textAlign:"right",fontSize:"13px"},children:[Math.floor((A.duration_seconds||0)/60),"m ",Math.floor((A.duration_seconds||0)%60),"s"]}),a.jsx("td",{style:{padding:"12px 15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"11px",fontWeight:"600",background:A.last_heartbeat_at&&Date.now()-new Date(A.last_heartbeat_at).getTime()>6e4?"#fef3c7":"#dbeafe",color:A.last_heartbeat_at&&Date.now()-new Date(A.last_heartbeat_at).getTime()>6e4?"#92400e":"#1e40af"},children:A.last_heartbeat_at&&Date.now()-new Date(A.last_heartbeat_at).getTime()>6e4?"STALE":"CRAWLING"})})]},`crawl-${A.id}`))})]})]})]})]}),(N==null?void 0:N.nextRuns)&&N.nextRuns.length>0&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsx("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:"Next Scheduled Runs"}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Job"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Next Run"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Last Status"})]})}),a.jsx("tbody",{children:N.nextRuns.map(A=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:A.job_name}),a.jsx("div",{style:{fontSize:"13px",color:"#666"},children:A.description})]}),a.jsx("td",{style:{padding:"15px"},children:a.jsx("div",{style:{fontWeight:"600",color:"#2563eb"},children:A.next_run_at?new Date(A.next_run_at).toLocaleString():"-"})}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",background:A.last_status==="success"?"#d1fae5":A.last_status==="error"?"#fee2e2":"#fef3c7",color:A.last_status==="success"?"#065f46":A.last_status==="error"?"#991b1b":"#92400e"},children:A.last_status||"never"})})]},A.id))})]})})]}),C.length>0&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsx("h2",{style:{fontSize:"24px",marginBottom:"20px",color:"#ef4444"},children:"Recent Errors (24h)"}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:C.map((A,T)=>a.jsxs("div",{style:{padding:"15px",borderBottom:Ta.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:A.job_name}),a.jsxs("div",{style:{fontSize:"12px",color:"#999"},children:["Log #",A.id]})]}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",background:A.status==="success"?"#d1fae5":A.status==="running"?"#dbeafe":A.status==="error"?"#fee2e2":"#fef3c7",color:A.status==="success"?"#065f46":A.status==="running"?"#1e40af":A.status==="error"?"#991b1b":"#92400e"},children:A.status})}),a.jsxs("td",{style:{padding:"15px",textAlign:"right"},children:[a.jsx("span",{style:{color:"#10b981"},children:A.items_succeeded||0})," / ",a.jsx("span",{children:A.items_processed||0})]}),a.jsx("td",{style:{padding:"15px",textAlign:"right"},children:A.duration_ms?`${Math.floor(A.duration_ms/6e4)}m ${Math.floor(A.duration_ms%6e4/1e3)}s`:"-"}),a.jsx("td",{style:{padding:"15px",color:"#666"},children:A.completed_at?new Date(A.completed_at).toLocaleString():"-"})]},`log-${A.id}`))})]})})]})]}),b==="jobs"&&a.jsxs(a.Fragment,{children:[i&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsx("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:"Job Statistics"}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(200px, 1fr))",gap:"15px"},children:[a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Pending"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#f59e0b"},children:i.pending||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"In Progress"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#3b82f6"},children:i.in_progress||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Completed"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#10b981"},children:i.completed||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Failed"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#ef4444"},children:i.failed||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Products Found"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#8b5cf6"},children:i.total_products_found||0})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Products Saved"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#06b6d4"},children:i.total_products_saved||0})]})]})]}),c.length>0&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Active Workers (",c.length,")"]}),a.jsx("div",{style:{display:"grid",gap:"15px"},children:c.map(A=>a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:"4px solid #10b981"},children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"12px"},children:["Worker: ",A.worker_id]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:"#d1fae5",color:"#065f46"},children:"ACTIVE"})]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Active Jobs"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600"},children:A.active_jobs})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Found"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#8b5cf6"},children:A.total_products_found||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Saved"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#10b981"},children:A.total_products_saved||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Running Since"}),a.jsx("div",{style:{fontSize:"14px"},children:new Date(A.earliest_start).toLocaleTimeString()})]})]})]},A.worker_id))})]}),a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Active Jobs (",o.length,")"]}),o.length===0?a.jsxs("div",{style:{background:"white",padding:"60px 40px",borderRadius:"8px",textAlign:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"48px",marginBottom:"20px"},children:"😴"}),a.jsx("div",{style:{fontSize:"18px",color:"#666"},children:"No jobs currently running"})]}):a.jsx("div",{style:{display:"grid",gap:"15px"},children:o.map(A=>a.jsx("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:"4px solid #3b82f6"},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsx("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"8px"},children:A.dispensary_name||A.brand_name}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"12px"},children:[A.job_type||"crawl"," | Job #",A.id]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Found"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#8b5cf6"},children:A.products_found||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Products Saved"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#10b981"},children:A.products_saved||0})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Duration"}),a.jsxs("div",{style:{fontSize:"16px",fontWeight:"600"},children:[Math.floor(A.duration_seconds/60),"m ",Math.floor(A.duration_seconds%60),"s"]})]})]})]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:"#dbeafe",color:"#1e40af"},children:"IN PROGRESS"})]})},A.id))})]}),a.jsxs("div",{children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Recent Jobs (",u.length,")"]}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Dispensary"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Type"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Found"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Saved"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Duration"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Completed"})]})}),a.jsx("tbody",{children:u.map(A=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsx("td",{style:{padding:"15px"},children:A.dispensary_name||A.brand_name}),a.jsx("td",{style:{padding:"15px",fontSize:"14px",color:"#666"},children:A.job_type||"-"}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",background:A.status==="completed"?"#d1fae5":A.status==="in_progress"?"#dbeafe":A.status==="failed"?"#fee2e2":"#fef3c7",color:A.status==="completed"?"#065f46":A.status==="in_progress"?"#1e40af":A.status==="failed"?"#991b1b":"#92400e"},children:A.status})}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:A.products_found||0}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600",color:"#10b981"},children:A.products_saved||0}),a.jsx("td",{style:{padding:"15px",textAlign:"right"},children:A.duration_seconds?`${Math.floor(A.duration_seconds/60)}m ${Math.floor(A.duration_seconds%60)}s`:"-"}),a.jsx("td",{style:{padding:"15px",color:"#666"},children:A.completed_at?new Date(A.completed_at).toLocaleString():"-"})]},A.id))})]})})]})]}),b==="scrapers"&&a.jsxs(a.Fragment,{children:[a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Active Scrapers (",e.length,")"]}),e.length===0?a.jsxs("div",{style:{background:"white",padding:"60px 40px",borderRadius:"8px",textAlign:"center",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"48px",marginBottom:"20px"},children:"🛌"}),a.jsx("div",{style:{fontSize:"18px",color:"#666"},children:"No scrapers currently running"})]}):a.jsx("div",{style:{display:"grid",gap:"15px"},children:e.map(A=>a.jsx("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",borderLeft:`4px solid ${A.status==="running"?A.isStale?"#ff9800":"#2ecc71":A.status==="error"?"#e74c3c":"#95a5a6"}`},children:a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start"},children:[a.jsxs("div",{style:{flex:1},children:[a.jsxs("div",{style:{fontSize:"18px",fontWeight:"600",marginBottom:"8px"},children:[A.storeName," - ",A.categoryName]}),a.jsxs("div",{style:{fontSize:"14px",color:"#666",marginBottom:"12px"},children:["ID: ",A.id]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"12px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Requests"}),a.jsxs("div",{style:{fontSize:"16px",fontWeight:"600"},children:[A.stats.requestsSuccess," / ",A.stats.requestsTotal]})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Items Saved"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#2ecc71"},children:A.stats.itemsSaved})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Items Dropped"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:"#e74c3c"},children:A.stats.itemsDropped})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Errors"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600",color:A.stats.errorsCount>0?"#ff9800":"#999"},children:A.stats.errorsCount})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"12px",color:"#999",marginBottom:"4px"},children:"Duration"}),a.jsx("div",{style:{fontSize:"16px",fontWeight:"600"},children:Z(A.duration)})]})]}),A.currentActivity&&a.jsxs("div",{style:{marginTop:"12px",padding:"8px 12px",background:"#f8f8f8",borderRadius:"4px",fontSize:"14px",color:"#666"},children:["📍 ",A.currentActivity]}),A.isStale&&a.jsx("div",{style:{marginTop:"12px",padding:"8px 12px",background:"#fff3cd",borderRadius:"4px",fontSize:"14px",color:"#856404"},children:"⚠️ No update in over 1 minute - scraper may be stuck"})]}),a.jsx("div",{style:{padding:"6px 12px",borderRadius:"4px",fontSize:"13px",fontWeight:"600",background:A.status==="running"?"#d4edda":A.status==="error"?"#f8d7da":"#e7e7e7",color:A.status==="running"?"#155724":A.status==="error"?"#721c24":"#666"},children:A.status.toUpperCase()})]})},A.id))})]}),a.jsxs("div",{children:[a.jsxs("h2",{style:{fontSize:"24px",marginBottom:"20px"},children:["Recent Scrapes (",r.length,")"]}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Dispensary"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Found"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"New"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Updated"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Products"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Last Crawled"})]})}),a.jsx("tbody",{children:r.map((A,T)=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsx("td",{style:{padding:"15px"},children:A.dispensary_name||A.store_name}),a.jsx("td",{style:{padding:"15px"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",background:A.status==="completed"?"#d1fae5":A.status==="failed"?"#fee2e2":"#fef3c7",color:A.status==="completed"?"#065f46":A.status==="failed"?"#991b1b":"#92400e"},children:A.status||"-"})}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:A.products_found||"-"}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600",color:"#059669"},children:A.products_new||0}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600",color:"#2563eb"},children:A.products_updated||0}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:A.product_count}),a.jsx("td",{style:{padding:"15px",color:"#666"},children:A.last_scraped_at?new Date(A.last_scraped_at).toLocaleString():"-"})]},T))})]})})]})]})]})})}function vW(){var Me;const[e,t]=h.useState([]),[r,n]=h.useState([]),[i,s]=h.useState([]),[o,l]=h.useState(!0),[c,d]=h.useState(!0),[u,f]=h.useState("dispensaries"),[p,m]=h.useState(null),[x,g]=h.useState(null),[b,v]=h.useState(null),[j,y]=h.useState(null),[w,S]=h.useState(!1),[N,_]=h.useState("all"),[P,D]=h.useState(""),[M,I]=h.useState("");h.useEffect(()=>{const E=setTimeout(()=>{D(M)},300);return()=>clearTimeout(E)},[M]),h.useEffect(()=>{if(C(),c){const E=setInterval(C,5e3);return()=>clearInterval(E)}},[c,N,P]);const C=async()=>{try{const E={};N==="AZ"&&(E.state="AZ"),P.trim()&&(E.search=P.trim());const[J,Ot,R]=await Promise.all([z.getGlobalSchedule(),z.getDispensarySchedules(Object.keys(E).length>0?E:void 0),z.getDispensaryCrawlJobs(100)]);t(J.schedules||[]),n(Ot.dispensaries||[]),s(R.jobs||[])}catch(E){console.error("Failed to load schedule data:",E)}finally{l(!1)}},B=async E=>{m(E);try{await z.triggerDispensaryCrawl(E),await C()}catch(J){console.error("Failed to trigger crawl:",J)}finally{m(null)}},q=async()=>{if(confirm("This will create crawl jobs for ALL active stores. Continue?"))try{const E=await z.triggerAllCrawls();alert(`Created ${E.jobs_created} crawl jobs`),await C()}catch(E){console.error("Failed to trigger all crawls:",E)}},Z=async E=>{try{await z.cancelCrawlJob(E),await C()}catch(J){console.error("Failed to cancel job:",J)}},A=async E=>{g(E);try{const J=await z.resolvePlatformId(E);J.success?alert(J.message):alert(`Failed: ${J.error||J.message}`),await C()}catch(J){console.error("Failed to resolve platform ID:",J),alert(`Error: ${J.message}`)}finally{g(null)}},T=async E=>{v(E);try{const J=await z.refreshDetection(E);alert(`Detected: ${J.menu_type}${J.platform_dispensary_id?`, Platform ID: ${J.platform_dispensary_id}`:""}`),await C()}catch(J){console.error("Failed to refresh detection:",J),alert(`Error: ${J.message}`)}finally{v(null)}},O=async(E,J)=>{y(E);try{await z.toggleDispensarySchedule(E,!J),await C()}catch(Ot){console.error("Failed to toggle schedule:",Ot),alert(`Error: ${Ot.message}`)}finally{y(null)}},k=async(E,J)=>{try{await z.updateGlobalSchedule(E,J),await C()}catch(Ot){console.error("Failed to update global schedule:",Ot)}},L=E=>{if(!E)return"Never";const J=new Date(E),R=new Date().getTime()-J.getTime(),te=Math.floor(R/6e4),ne=Math.floor(te/60),U=Math.floor(ne/24);return te<1?"Just now":te<60?`${te}m ago`:ne<24?`${ne}h ago`:`${U}d ago`},W=E=>{const J=new Date(E),Ot=new Date,R=J.getTime()-Ot.getTime();if(R<0)return"Overdue";const te=Math.floor(R/6e4),ne=Math.floor(te/60);return te<60?`${te}m`:`${ne}h ${te%60}m`},H=E=>{switch(E){case"completed":case"success":return{bg:"#d1fae5",color:"#065f46"};case"running":return{bg:"#dbeafe",color:"#1e40af"};case"failed":case"error":return{bg:"#fee2e2",color:"#991b1b"};case"cancelled":return{bg:"#f3f4f6",color:"#374151"};case"pending":return{bg:"#fef3c7",color:"#92400e"};case"sandbox_only":return{bg:"#e0e7ff",color:"#3730a3"};case"detection_only":return{bg:"#fce7f3",color:"#9d174d"};default:return{bg:"#f3f4f6",color:"#374151"}}},ee=e.find(E=>E.schedule_type==="global_interval"),re=e.find(E=>E.schedule_type==="daily_special");return a.jsx(X,{children:a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Crawler Schedule"}),a.jsxs("div",{style:{display:"flex",gap:"15px",alignItems:"center"},children:[a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:c,onChange:E=>d(E.target.checked),style:{width:"18px",height:"18px",cursor:"pointer"}}),a.jsx("span",{children:"Auto-refresh (5s)"})]}),a.jsx("button",{onClick:q,style:{padding:"10px 20px",background:"#2563eb",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600"},children:"Crawl All Stores"})]})]}),a.jsxs("div",{style:{marginBottom:"30px",display:"flex",gap:"10px",borderBottom:"2px solid #eee"},children:[a.jsxs("button",{onClick:()=>f("dispensaries"),style:{padding:"12px 24px",background:u==="dispensaries"?"white":"transparent",border:"none",borderBottom:u==="dispensaries"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:u==="dispensaries"?"600":"400",color:u==="dispensaries"?"#2563eb":"#666",marginBottom:"-2px"},children:["Dispensary Schedules (",r.length,")"]}),a.jsxs("button",{onClick:()=>f("jobs"),style:{padding:"12px 24px",background:u==="jobs"?"white":"transparent",border:"none",borderBottom:u==="jobs"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:u==="jobs"?"600":"400",color:u==="jobs"?"#2563eb":"#666",marginBottom:"-2px"},children:["Job Queue (",i.filter(E=>E.status==="pending"||E.status==="running").length,")"]}),a.jsx("button",{onClick:()=>f("global"),style:{padding:"12px 24px",background:u==="global"?"white":"transparent",border:"none",borderBottom:u==="global"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:u==="global"?"600":"400",color:u==="global"?"#2563eb":"#666",marginBottom:"-2px"},children:"Global Settings"})]}),u==="global"&&a.jsxs("div",{style:{display:"grid",gap:"20px"},children:[a.jsxs("div",{style:{background:"white",padding:"24px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start",marginBottom:"20px"},children:[a.jsxs("div",{children:[a.jsx("h2",{style:{fontSize:"20px",margin:0,marginBottom:"8px"},children:"Interval Crawl Schedule"}),a.jsx("p",{style:{color:"#666",margin:0},children:"Crawl all stores periodically"})]}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("span",{style:{color:"#666"},children:"Enabled"}),a.jsx("input",{type:"checkbox",checked:(ee==null?void 0:ee.enabled)??!0,onChange:E=>k("global_interval",{enabled:E.target.checked}),style:{width:"20px",height:"20px",cursor:"pointer"}})]})]}),a.jsx("div",{style:{display:"flex",alignItems:"center",gap:"15px"},children:a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[a.jsx("span",{children:"Crawl every"}),a.jsxs("select",{value:(ee==null?void 0:ee.interval_hours)??4,onChange:E=>k("global_interval",{interval_hours:parseInt(E.target.value)}),style:{padding:"8px 12px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"16px"},children:[a.jsx("option",{value:1,children:"1 hour"}),a.jsx("option",{value:2,children:"2 hours"}),a.jsx("option",{value:4,children:"4 hours"}),a.jsx("option",{value:6,children:"6 hours"}),a.jsx("option",{value:8,children:"8 hours"}),a.jsx("option",{value:12,children:"12 hours"}),a.jsx("option",{value:24,children:"24 hours"})]})]})})]}),a.jsxs("div",{style:{background:"white",padding:"24px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"start",marginBottom:"20px"},children:[a.jsxs("div",{children:[a.jsx("h2",{style:{fontSize:"20px",margin:0,marginBottom:"8px"},children:"Daily Special Crawl"}),a.jsx("p",{style:{color:"#666",margin:0},children:"Crawl stores at local midnight to capture daily specials"})]}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("span",{style:{color:"#666"},children:"Enabled"}),a.jsx("input",{type:"checkbox",checked:(re==null?void 0:re.enabled)??!0,onChange:E=>k("daily_special",{enabled:E.target.checked}),style:{width:"20px",height:"20px",cursor:"pointer"}})]})]}),a.jsx("div",{style:{display:"flex",alignItems:"center",gap:"15px"},children:a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[a.jsx("span",{children:"Run at"}),a.jsx("input",{type:"time",value:((Me=re==null?void 0:re.run_time)==null?void 0:Me.slice(0,5))??"00:01",onChange:E=>k("daily_special",{run_time:E.target.value}),style:{padding:"8px 12px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"16px"}}),a.jsx("span",{style:{color:"#666"},children:"(store local time)"})]})})]})]}),u==="dispensaries"&&a.jsxs("div",{children:[a.jsxs("div",{style:{marginBottom:"15px",display:"flex",gap:"20px",alignItems:"center",flexWrap:"wrap"},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[a.jsx("span",{style:{fontWeight:"500",color:"#374151"},children:"State:"}),a.jsxs("div",{style:{display:"flex",borderRadius:"6px",overflow:"hidden",border:"1px solid #d1d5db"},children:[a.jsx("button",{onClick:()=>_("all"),style:{padding:"6px 14px",background:N==="all"?"#2563eb":"white",color:N==="all"?"white":"#374151",border:"none",cursor:"pointer",fontSize:"14px",fontWeight:"500"},children:"All"}),a.jsx("button",{onClick:()=>_("AZ"),style:{padding:"6px 14px",background:N==="AZ"?"#2563eb":"white",color:N==="AZ"?"white":"#374151",border:"none",borderLeft:"1px solid #d1d5db",cursor:"pointer",fontSize:"14px",fontWeight:"500"},children:"AZ Only"})]})]}),a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[a.jsx("span",{style:{fontWeight:"500",color:"#374151"},children:"Search:"}),a.jsx("input",{type:"text",placeholder:"Store name or slug...",value:M,onChange:E=>I(E.target.value),style:{padding:"6px 12px",borderRadius:"6px",border:"1px solid #d1d5db",fontSize:"14px",width:"200px"}}),M&&a.jsx("button",{onClick:()=>{I(""),D("")},style:{padding:"4px 8px",background:"#f3f4f6",border:"1px solid #d1d5db",borderRadius:"4px",cursor:"pointer",fontSize:"12px"},children:"Clear"})]}),a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"8px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:w,onChange:E=>S(E.target.checked),style:{width:"16px",height:"16px",cursor:"pointer"}}),a.jsx("span",{children:"Dutchie only"})]}),a.jsxs("span",{style:{color:"#666",fontSize:"14px",marginLeft:"auto"},children:["Showing ",(w?r.filter(E=>E.menu_type==="dutchie"):r).length," dispensaries"]})]}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"auto"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",minWidth:"1200px"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"12px",textAlign:"left",fontWeight:"600"},children:"Dispensary"}),a.jsx("th",{style:{padding:"12px",textAlign:"center",fontWeight:"600"},children:"Menu Type"}),a.jsx("th",{style:{padding:"12px",textAlign:"center",fontWeight:"600"},children:"Platform ID"}),a.jsx("th",{style:{padding:"12px",textAlign:"center",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"12px",textAlign:"left",fontWeight:"600"},children:"Last Run"}),a.jsx("th",{style:{padding:"12px",textAlign:"left",fontWeight:"600"},children:"Next Run"}),a.jsx("th",{style:{padding:"12px",textAlign:"left",fontWeight:"600"},children:"Last Result"}),a.jsx("th",{style:{padding:"12px",textAlign:"center",fontWeight:"600",minWidth:"220px"},children:"Actions"})]})}),a.jsx("tbody",{children:(w?r.filter(E=>E.menu_type==="dutchie"):r).map(E=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"12px"},children:[a.jsx("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:E.state&&E.city&&(E.dispensary_slug||E.slug)?a.jsx($l,{to:`/dispensaries/${E.state}/${E.city.toLowerCase().replace(/\s+/g,"-")}/${E.dispensary_slug||E.slug}`,style:{fontWeight:"600",color:"#2563eb",textDecoration:"none"},children:E.dispensary_name}):a.jsx("span",{style:{fontWeight:"600"},children:E.dispensary_name})}),a.jsx("div",{style:{fontSize:"12px",color:"#666"},children:E.city?`${E.city}, ${E.state}`:E.state})]}),a.jsx("td",{style:{padding:"12px",textAlign:"center"},children:E.menu_type?a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"11px",fontWeight:"600",background:E.menu_type==="dutchie"?"#d1fae5":"#e0e7ff",color:E.menu_type==="dutchie"?"#065f46":"#3730a3"},children:E.menu_type}):a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"11px",fontWeight:"600",background:"#f3f4f6",color:"#666"},children:"unknown"})}),a.jsx("td",{style:{padding:"12px",textAlign:"center"},children:E.platform_dispensary_id?a.jsx("span",{style:{padding:"4px 8px",borderRadius:"4px",fontSize:"10px",fontFamily:"monospace",background:"#d1fae5",color:"#065f46"},title:E.platform_dispensary_id,children:E.platform_dispensary_id.length>12?`${E.platform_dispensary_id.slice(0,6)}...${E.platform_dispensary_id.slice(-4)}`:E.platform_dispensary_id}):a.jsx("span",{style:{padding:"4px 8px",borderRadius:"4px",fontSize:"10px",background:"#fee2e2",color:"#991b1b"},children:"missing"})}),a.jsx("td",{style:{padding:"12px",textAlign:"center"},children:a.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:"4px"},children:[a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"11px",fontWeight:"600",background:E.can_crawl?"#d1fae5":E.is_active!==!1?"#fef3c7":"#fee2e2",color:E.can_crawl?"#065f46":E.is_active!==!1?"#92400e":"#991b1b"},children:E.can_crawl?"Ready":E.is_active!==!1?"Not Ready":"Disabled"}),E.schedule_status_reason&&E.schedule_status_reason!=="ready"&&a.jsx("span",{style:{fontSize:"10px",color:"#666",maxWidth:"100px",textAlign:"center"},children:E.schedule_status_reason}),E.interval_minutes&&a.jsxs("span",{style:{fontSize:"10px",color:"#999"},children:["Every ",Math.round(E.interval_minutes/60),"h"]})]})}),a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{children:L(E.last_run_at)}),E.last_run_at&&a.jsx("div",{style:{fontSize:"12px",color:"#999"},children:new Date(E.last_run_at).toLocaleString()})]}),a.jsx("td",{style:{padding:"15px"},children:a.jsx("div",{style:{fontWeight:"600",color:"#2563eb"},children:E.next_run_at?W(E.next_run_at):"Not scheduled"})}),a.jsx("td",{style:{padding:"15px"},children:E.last_status||E.latest_job_status?a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"4px"},children:[a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",...H(E.last_status||E.latest_job_status||"pending")},children:E.last_status||E.latest_job_status}),E.last_error&&a.jsx("button",{onClick:()=>alert(E.last_error),style:{padding:"2px 6px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"10px"},children:"Error"})]}),E.last_summary?a.jsx("div",{style:{fontSize:"12px",color:"#666",maxWidth:"250px"},children:E.last_summary}):E.latest_products_found!==null?a.jsxs("div",{style:{fontSize:"12px",color:"#666"},children:[E.latest_products_found," products"]}):null]}):a.jsx("span",{style:{color:"#999",fontSize:"13px"},children:"No runs yet"})}),a.jsx("td",{style:{padding:"12px",textAlign:"center"},children:a.jsxs("div",{style:{display:"flex",gap:"6px",justifyContent:"center",flexWrap:"wrap"},children:[a.jsx("button",{onClick:()=>T(E.dispensary_id),disabled:b===E.dispensary_id,style:{padding:"4px 8px",background:b===E.dispensary_id?"#94a3b8":"#f3f4f6",color:"#374151",border:"1px solid #d1d5db",borderRadius:"4px",cursor:b===E.dispensary_id?"wait":"pointer",fontSize:"11px"},title:"Re-detect menu type and resolve platform ID",children:b===E.dispensary_id?"...":"Refresh"}),E.menu_type==="dutchie"&&!E.platform_dispensary_id&&a.jsx("button",{onClick:()=>A(E.dispensary_id),disabled:x===E.dispensary_id,style:{padding:"4px 8px",background:x===E.dispensary_id?"#94a3b8":"#fef3c7",color:"#92400e",border:"1px solid #fcd34d",borderRadius:"4px",cursor:x===E.dispensary_id?"wait":"pointer",fontSize:"11px"},title:"Resolve platform dispensary ID via GraphQL",children:x===E.dispensary_id?"...":"Resolve ID"}),a.jsx("button",{onClick:()=>B(E.dispensary_id),disabled:p===E.dispensary_id||!E.can_crawl,style:{padding:"4px 8px",background:p===E.dispensary_id?"#94a3b8":E.can_crawl?"#2563eb":"#e5e7eb",color:E.can_crawl?"white":"#9ca3af",border:"none",borderRadius:"4px",cursor:p===E.dispensary_id||!E.can_crawl?"not-allowed":"pointer",fontSize:"11px"},title:E.can_crawl?"Trigger immediate crawl":`Cannot crawl: ${E.schedule_status_reason}`,children:p===E.dispensary_id?"...":"Run"}),a.jsx("button",{onClick:()=>O(E.dispensary_id,E.is_active),disabled:j===E.dispensary_id,style:{padding:"4px 8px",background:j===E.dispensary_id?"#94a3b8":E.is_active?"#fee2e2":"#d1fae5",color:E.is_active?"#991b1b":"#065f46",border:"none",borderRadius:"4px",cursor:j===E.dispensary_id?"wait":"pointer",fontSize:"11px"},title:E.is_active?"Disable scheduled crawling":"Enable scheduled crawling",children:j===E.dispensary_id?"...":E.is_active?"Disable":"Enable"})]})})]},E.dispensary_id))})]})})]}),u==="jobs"&&a.jsxs(a.Fragment,{children:[a.jsx("div",{style:{marginBottom:"30px"},children:a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"15px"},children:[a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Pending"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#f59e0b"},children:i.filter(E=>E.status==="pending").length})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Running"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#3b82f6"},children:i.filter(E=>E.status==="running").length})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Completed"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#10b981"},children:i.filter(E=>E.status==="completed").length})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#999",marginBottom:"8px"},children:"Failed"}),a.jsx("div",{style:{fontSize:"32px",fontWeight:"600",color:"#ef4444"},children:i.filter(E=>E.status==="failed").length})]})]})}),a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Dispensary"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Type"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Trigger"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Products"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Started"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Completed"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Actions"})]})}),a.jsx("tbody",{children:i.length===0?a.jsx("tr",{children:a.jsx("td",{colSpan:8,style:{padding:"40px",textAlign:"center",color:"#666"},children:"No crawl jobs found"})}):i.map(E=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:E.dispensary_name}),a.jsxs("div",{style:{fontSize:"12px",color:"#999"},children:["Job #",E.id]})]}),a.jsx("td",{style:{padding:"15px",textAlign:"center",fontSize:"13px"},children:E.job_type}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"3px 8px",borderRadius:"4px",fontSize:"12px",background:E.trigger_type==="manual"?"#e0e7ff":E.trigger_type==="daily_special"?"#fce7f3":"#f3f4f6",color:E.trigger_type==="manual"?"#3730a3":E.trigger_type==="daily_special"?"#9d174d":"#374151"},children:E.trigger_type})}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",...H(E.status)},children:E.status})}),a.jsx("td",{style:{padding:"15px",textAlign:"right"},children:E.products_found!==null?a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600"},children:E.products_found}),E.products_new!==null&&E.products_updated!==null&&a.jsxs("div",{style:{fontSize:"12px",color:"#666"},children:["+",E.products_new," / ~",E.products_updated]})]}):"-"}),a.jsx("td",{style:{padding:"15px",fontSize:"13px"},children:E.started_at?new Date(E.started_at).toLocaleString():"-"}),a.jsx("td",{style:{padding:"15px",fontSize:"13px"},children:E.completed_at?new Date(E.completed_at).toLocaleString():"-"}),a.jsxs("td",{style:{padding:"15px",textAlign:"center"},children:[E.status==="pending"&&a.jsx("button",{onClick:()=>Z(E.id),style:{padding:"4px 10px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"12px"},children:"Cancel"}),E.error_message&&a.jsx("button",{onClick:()=>alert(E.error_message),style:{padding:"4px 10px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"12px"},children:"View Error"})]})]},E.id))})]})})]})]})})}function bW(){const[e,t]=h.useState([]),[r,n]=h.useState(null),[i,s]=h.useState(3),[o,l]=h.useState("rotate-desktop"),[c,d]=h.useState(!1),[u,f]=h.useState(!1),[p,m]=h.useState(null),[x,g]=h.useState(!0);h.useEffect(()=>{b()},[]);const b=async()=>{g(!0);try{const S=(await z.getDispensaries()).dispensaries.filter(N=>N.menu_url&&N.scrape_enabled);t(S),S.length>0&&n(S[0].id)}catch(w){console.error("Failed to load dispensaries:",w)}finally{g(!1)}},v=async()=>{if(!(!r||c)){d(!0);try{await z.triggerDispensaryCrawl(r),m({message:"Crawl started for dispensary! Check the Scraper Monitor for progress.",type:"success"})}catch(w){m({message:"Failed to start crawl: "+w.message,type:"error"})}finally{d(!1)}}},j=async()=>{if(!(!r||u)){f(!0);try{m({message:"Image download feature coming soon!",type:"info"})}catch(w){m({message:"Failed to start image download: "+w.message,type:"error"})}finally{f(!1)}}},y=e.find(w=>w.id===r);return x?a.jsx(X,{children:a.jsx("div",{className:"flex items-center justify-center h-64",children:a.jsx("span",{className:"loading loading-spinner loading-lg"})})}):a.jsxs(X,{children:[p&&a.jsx(Vn,{message:p.message,type:p.type,onClose:()=>m(null)}),a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-3xl font-bold",children:"Scraper Tools"}),a.jsx("p",{className:"text-gray-500 mt-2",children:"Manage crawling operations for dispensaries"})]}),a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body",children:[a.jsx("h2",{className:"card-title",children:"Select Dispensary"}),a.jsx("select",{className:"select select-bordered w-full max-w-md",value:r||"",onChange:w=>n(parseInt(w.target.value)),children:e.map(w=>a.jsxs("option",{value:w.id,children:[w.dba_name||w.name," - ",w.city,", ",w.state]},w.id))}),y&&a.jsx("div",{className:"mt-4 p-4 bg-base-200 rounded-lg",children:a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-gray-500",children:"Status"}),a.jsx("div",{className:"font-semibold",children:y.scrape_enabled?a.jsx("span",{className:"badge badge-success",children:"Enabled"}):a.jsx("span",{className:"badge badge-error",children:"Disabled"})})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-gray-500",children:"Provider"}),a.jsx("div",{className:"font-semibold",children:y.provider_type||"Unknown"})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-gray-500",children:"Products"}),a.jsx("div",{className:"font-semibold",children:y.product_count||0})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-gray-500",children:"Last Crawled"}),a.jsx("div",{className:"font-semibold",children:y.last_crawl_at?new Date(y.last_crawl_at).toLocaleDateString():"Never"})]})]})})]})}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body",children:[a.jsx("h2",{className:"card-title",children:"Crawl Dispensary"}),a.jsx("p",{className:"text-sm text-gray-500",children:"Start crawling products from the selected dispensary menu"}),a.jsx("div",{className:"card-actions justify-end mt-4",children:a.jsx("button",{onClick:v,disabled:!r||c,className:`btn btn-primary ${c?"loading":""}`,children:c?"Starting...":"Start Crawl"})})]})}),a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body",children:[a.jsx("h2",{className:"card-title",children:"Download Images"}),a.jsx("p",{className:"text-sm text-gray-500",children:"Download missing product images for the selected dispensary"}),a.jsx("div",{className:"card-actions justify-end mt-auto",children:a.jsx("button",{onClick:j,disabled:!r||u,className:`btn btn-secondary ${u?"loading":""}`,children:u?"Downloading...":"Download Missing Images"})})]})})]}),a.jsxs("div",{className:"alert alert-info",children:[a.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",className:"stroke-current shrink-0 w-6 h-6",children:a.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),a.jsxs("span",{children:["After starting scraper operations, check the"," ",a.jsx("a",{href:"/scraper-monitor",className:"link",children:"Scraper Monitor"})," for real-time progress and ",a.jsx("a",{href:"/logs",className:"link",children:"Logs"})," for detailed output."]})]})]})]})}function jW(){const[e,t]=h.useState([]),[r,n]=h.useState(null),[i,s]=h.useState(!0),[o,l]=h.useState("pending"),[c,d]=h.useState(null);h.useEffect(()=>{u()},[o]);const u=async()=>{s(!0);try{const[g,b]=await Promise.all([z.getChanges(o==="all"?void 0:o),z.getChangeStats()]);t(g.changes),n(b)}catch(g){console.error("Failed to load changes:",g)}finally{s(!1)}},f=async g=>{d(g);try{(await z.approveChange(g)).requires_recrawl&&alert("Change approved! This dispensary requires a menu recrawl."),await u()}catch(b){console.error("Failed to approve change:",b),alert("Failed to approve change. Please try again.")}finally{d(null)}},p=async g=>{const b=prompt("Enter rejection reason (optional):");d(g);try{await z.rejectChange(g,b||void 0),await u()}catch(v){console.error("Failed to reject change:",v),alert("Failed to reject change. Please try again.")}finally{d(null)}},m=g=>({dba_name:"DBA Name",website:"Website",phone:"Phone",email:"Email",google_rating:"Google Rating",google_review_count:"Google Review Count",menu_url:"Menu URL"})[g]||g,x=g=>({high:"bg-green-100 text-green-800",medium:"bg-yellow-100 text-yellow-800",low:"bg-red-100 text-red-800"})[g]||"bg-gray-100 text-gray-800";return i?a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading changes..."})]})}):a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Change Approval"}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"Review and approve proposed changes to dispensary data"})]}),a.jsxs("button",{onClick:u,className:"flex items-center gap-2 px-4 py-2 text-sm border border-gray-300 rounded-lg hover:bg-gray-50",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Refresh"]})]}),r&&a.jsxs("div",{className:"grid grid-cols-4 gap-6",children:[a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-yellow-50 rounded-lg",children:a.jsx(xr,{className:"w-5 h-5 text-yellow-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Pending"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:r.pending_count})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-orange-50 rounded-lg",children:a.jsx(sj,{className:"w-5 h-5 text-orange-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Needs Recrawl"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:r.pending_recrawl_count})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(Pr,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Approved"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:r.approved_count})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-red-50 rounded-lg",children:a.jsx(Hr,{className:"w-5 h-5 text-red-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Rejected"}),a.jsx("p",{className:"text-2xl font-bold text-gray-900",children:r.rejected_count})]})]})})]}),a.jsx("div",{className:"flex gap-2",children:["all","pending","approved","rejected"].map(g=>a.jsx("button",{onClick:()=>l(g),className:`px-4 py-2 text-sm font-medium rounded-lg ${o===g?"bg-blue-600 text-white":"bg-white text-gray-700 border border-gray-300 hover:bg-gray-50"}`,children:g.charAt(0).toUpperCase()+g.slice(1)},g))}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200",children:e.length===0?a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-600",children:"No changes found"})}):a.jsx("div",{className:"divide-y divide-gray-200",children:e.map(g=>a.jsx("div",{className:"p-6",children:a.jsxs("div",{className:"flex items-start justify-between",children:[a.jsxs("div",{className:"flex-1",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[a.jsx("h3",{className:"text-lg font-semibold text-gray-900",children:g.dispensary_name}),a.jsx("span",{className:`px-2 py-1 text-xs font-medium rounded ${x(g.confidence_score)}`,children:g.confidence_score||"N/A"}),g.requires_recrawl&&a.jsx("span",{className:"px-2 py-1 text-xs font-medium rounded bg-orange-100 text-orange-800",children:"Requires Recrawl"})]}),a.jsxs("p",{className:"text-sm text-gray-600 mb-3",children:[g.city,", ",g.state," • Source: ",g.source]}),a.jsxs("div",{className:"grid grid-cols-2 gap-4 mb-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"text-xs font-medium text-gray-500",children:"Field"}),a.jsx("p",{className:"text-sm text-gray-900",children:m(g.field_name)})]}),a.jsxs("div",{children:[a.jsx("label",{className:"text-xs font-medium text-gray-500",children:"Old Value"}),a.jsx("p",{className:"text-sm text-gray-900",children:g.old_value||a.jsx("em",{className:"text-gray-400",children:"None"})})]}),a.jsxs("div",{className:"col-span-2",children:[a.jsx("label",{className:"text-xs font-medium text-gray-500",children:"New Value"}),a.jsx("p",{className:"text-sm font-medium text-blue-600",children:g.new_value})]}),g.change_notes&&a.jsxs("div",{className:"col-span-2",children:[a.jsx("label",{className:"text-xs font-medium text-gray-500",children:"Notes"}),a.jsx("p",{className:"text-sm text-gray-700",children:g.change_notes})]})]}),a.jsxs("p",{className:"text-xs text-gray-500",children:["Created ",new Date(g.created_at).toLocaleString()]}),g.status==="rejected"&&g.rejection_reason&&a.jsxs("div",{className:"mt-2 p-3 bg-red-50 rounded border border-red-200",children:[a.jsx("p",{className:"text-xs font-medium text-red-800",children:"Rejection Reason:"}),a.jsx("p",{className:"text-sm text-red-700",children:g.rejection_reason})]})]}),a.jsxs("div",{className:"flex items-center gap-2 ml-4",children:[g.status==="pending"&&a.jsxs(a.Fragment,{children:[a.jsxs("button",{onClick:()=>f(g.id),disabled:c===g.id,className:"flex items-center gap-2 px-4 py-2 bg-green-600 text-white text-sm font-medium rounded-lg hover:bg-green-700 disabled:opacity-50",children:[a.jsx(Pr,{className:"w-4 h-4"}),"Approve"]}),a.jsxs("button",{onClick:()=>p(g.id),disabled:c===g.id,className:"flex items-center gap-2 px-4 py-2 bg-red-600 text-white text-sm font-medium rounded-lg hover:bg-red-700 disabled:opacity-50",children:[a.jsx(Hr,{className:"w-4 h-4"}),"Reject"]})]}),g.status==="approved"&&a.jsxs("span",{className:"flex items-center gap-2 px-4 py-2 bg-green-100 text-green-800 text-sm font-medium rounded-lg",children:[a.jsx(Pr,{className:"w-4 h-4"}),"Approved"]}),g.status==="rejected"&&a.jsxs("span",{className:"flex items-center gap-2 px-4 py-2 bg-red-100 text-red-800 text-sm font-medium rounded-lg",children:[a.jsx(Hr,{className:"w-4 h-4"}),"Rejected"]}),a.jsx("a",{href:`/dispensaries/${g.dispensary_slug}`,target:"_blank",rel:"noopener noreferrer",className:"p-2 text-gray-400 hover:text-gray-600",children:a.jsx(Jr,{className:"w-4 h-4"})})]})]})},g.id))})})]})})}function wW(){const[e,t]=h.useState([]),[r,n]=h.useState([]),[i,s]=h.useState(!0),[o,l]=h.useState(!1),[c,d]=h.useState({user_name:"",store_id:"",allowed_ips:"",allowed_domains:""}),[u,f]=h.useState(null);h.useEffect(()=>{m(),p()},[]);const p=async()=>{try{const y=await z.getApiPermissionDispensaries();n(y.dispensaries)}catch(y){console.error("Failed to load dispensaries:",y)}},m=async()=>{s(!0);try{const y=await z.getApiPermissions();t(y.permissions)}catch(y){f({message:"Failed to load API permissions: "+y.message,type:"error"})}finally{s(!1)}},x=async y=>{if(y.preventDefault(),!c.user_name.trim()){f({message:"User name is required",type:"error"});return}if(!c.store_id){f({message:"Store is required",type:"error"});return}try{const w=await z.createApiPermission({...c,store_id:parseInt(c.store_id)});f({message:w.message,type:"success"}),d({user_name:"",store_id:"",allowed_ips:"",allowed_domains:""}),l(!1),m()}catch(w){f({message:"Failed to create permission: "+w.message,type:"error"})}},g=async y=>{try{await z.toggleApiPermission(y),f({message:"Permission status updated",type:"success"}),m()}catch(w){f({message:"Failed to toggle permission: "+w.message,type:"error"})}},b=async y=>{if(confirm("Are you sure you want to delete this API permission?"))try{await z.deleteApiPermission(y),f({message:"Permission deleted successfully",type:"success"}),m()}catch(w){f({message:"Failed to delete permission: "+w.message,type:"error"})}},v=y=>{navigator.clipboard.writeText(y),f({message:"API key copied to clipboard!",type:"success"})},j=y=>{if(!y)return"Never";const w=new Date(y);return w.toLocaleDateString()+" "+w.toLocaleTimeString()};return i?a.jsx(X,{children:a.jsx("div",{className:"p-6",children:a.jsx("div",{className:"text-center text-gray-600",children:"Loading API permissions..."})})}):a.jsx(X,{children:a.jsxs("div",{className:"p-6",children:[u&&a.jsx(Vn,{message:u.message,type:u.type,onClose:()=>f(null)}),a.jsxs("div",{className:"flex justify-between items-center mb-6",children:[a.jsx("h1",{className:"text-2xl font-bold",children:"API Permissions"}),a.jsx("button",{onClick:()=>l(!o),className:"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700",children:o?"Cancel":"Add New Permission"})]}),a.jsxs("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4 mb-6",children:[a.jsx("h3",{className:"font-semibold text-blue-900 mb-2",children:"How it works:"}),a.jsx("p",{className:"text-blue-800 text-sm",children:"Users with valid permissions can access your API without entering tokens. Access is automatically validated based on their IP address and/or domain name."})]}),o&&a.jsxs("div",{className:"bg-white rounded-lg shadow-md p-6 mb-6",children:[a.jsx("h2",{className:"text-xl font-semibold mb-4",children:"Add New API User"}),a.jsxs("form",{onSubmit:x,children:[a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"User/Client Name *"}),a.jsx("input",{type:"text",value:c.user_name,onChange:y=>d({...c,user_name:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",placeholder:"e.g., My Website",required:!0}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"A friendly name to identify this API user"})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Store *"}),a.jsxs("select",{value:c.store_id,onChange:y=>d({...c,store_id:y.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500",required:!0,children:[a.jsx("option",{value:"",children:"Select a store..."}),r.map(y=>a.jsx("option",{value:y.id,children:y.name},y.id))]}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"The store this API token can access"})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Allowed IP Addresses"}),a.jsx("textarea",{value:c.allowed_ips,onChange:y=>d({...c,allowed_ips:y.target.value}),rows:3,className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm",placeholder:`192.168.1.1 +10.0.0.0/8 +2001:db8::/32`}),a.jsxs("p",{className:"text-sm text-gray-600 mt-1",children:["One IP address or CIDR range per line. Leave empty to allow any IP.",a.jsx("br",{}),"Supports IPv4, IPv6, and CIDR notation (e.g., 192.168.0.0/24)"]})]}),a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Allowed Domains"}),a.jsx("textarea",{value:c.allowed_domains,onChange:y=>d({...c,allowed_domains:y.target.value}),rows:3,className:"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm",placeholder:`example.com +*.example.com +subdomain.example.com`}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"One domain per line. Wildcards supported (e.g., *.example.com). Leave empty to allow any domain."})]}),a.jsx("button",{type:"submit",className:"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700",children:"Create API Permission"})]})]}),a.jsxs("div",{className:"bg-white rounded-lg shadow-md overflow-hidden",children:[a.jsx("div",{className:"px-6 py-4 border-b border-gray-200",children:a.jsx("h2",{className:"text-xl font-semibold",children:"Active API Users"})}),e.length===0?a.jsx("div",{className:"p-6 text-center text-gray-600",children:"No API permissions configured yet. Add your first user above."}):a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full",children:[a.jsx("thead",{className:"bg-gray-50",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"User Name"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Store"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"API Key"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Allowed IPs"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Allowed Domains"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Status"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Last Used"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Actions"})]})}),a.jsx("tbody",{className:"bg-white divide-y divide-gray-200",children:e.map(y=>a.jsxs("tr",{children:[a.jsx("td",{className:"px-6 py-4 whitespace-nowrap",children:a.jsx("div",{className:"font-medium text-gray-900",children:y.user_name})}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap",children:a.jsx("div",{className:"text-sm text-gray-900",children:y.store_name||a.jsx("span",{className:"text-gray-400 italic",children:"No store"})})}),a.jsx("td",{className:"px-6 py-4",children:a.jsxs("div",{className:"flex items-center space-x-2",children:[a.jsxs("code",{className:"text-xs bg-gray-100 px-2 py-1 rounded",children:[y.api_key.substring(0,16),"..."]}),a.jsx("button",{onClick:()=>v(y.api_key),className:"text-blue-600 hover:text-blue-800 text-sm",children:"Copy"})]})}),a.jsx("td",{className:"px-6 py-4",children:y.allowed_ips?a.jsxs("div",{className:"text-sm text-gray-600",children:[y.allowed_ips.split(` +`).slice(0,2).join(", "),y.allowed_ips.split(` +`).length>2&&a.jsxs("span",{className:"text-gray-400",children:[" +",y.allowed_ips.split(` +`).length-2," more"]})]}):a.jsx("span",{className:"text-gray-400 italic",children:"Any IP"})}),a.jsx("td",{className:"px-6 py-4",children:y.allowed_domains?a.jsxs("div",{className:"text-sm text-gray-600",children:[y.allowed_domains.split(` +`).slice(0,2).join(", "),y.allowed_domains.split(` +`).length>2&&a.jsxs("span",{className:"text-gray-400",children:[" +",y.allowed_domains.split(` +`).length-2," more"]})]}):a.jsx("span",{className:"text-gray-400 italic",children:"Any domain"})}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap",children:y.is_active?a.jsx("span",{className:"px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800",children:"Active"}):a.jsx("span",{className:"px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 text-red-800",children:"Disabled"})}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-600",children:j(y.last_used_at)}),a.jsxs("td",{className:"px-6 py-4 whitespace-nowrap text-sm space-x-2",children:[a.jsx("button",{onClick:()=>g(y.id),className:"text-blue-600 hover:text-blue-800",children:y.is_active?"Disable":"Enable"}),a.jsx("button",{onClick:()=>b(y.id),className:"text-red-600 hover:text-red-800",children:"Delete"})]})]},y.id))})]})})]})]})})}function SW(){const[e,t]=h.useState([]),[r,n]=h.useState([]),[i,s]=h.useState(null),[o,l]=h.useState(null),[c,d]=h.useState(!0),[u,f]=h.useState(!0),[p,m]=h.useState("schedules"),[x,g]=h.useState(null),[b,v]=h.useState(!1),[j,y]=h.useState(!1),[w,S]=h.useState(null);h.useEffect(()=>{if(N(),u){const k=setInterval(N,1e4);return()=>clearInterval(k)}},[u]);const N=async()=>{try{const[k,L,W,H]=await Promise.all([z.getDutchieAZSchedules(),z.getDutchieAZRunLogs({limit:50}),z.getDutchieAZSchedulerStatus(),z.getDetectionStats().catch(()=>null)]);t(k.schedules||[]),n(L.logs||[]),s(W),l(H)}catch(k){console.error("Failed to load schedule data:",k)}finally{d(!1)}},_=async()=>{try{i!=null&&i.running?await z.stopDutchieAZScheduler():await z.startDutchieAZScheduler(),await N()}catch(k){console.error("Failed to toggle scheduler:",k)}},P=async()=>{try{await z.initDutchieAZSchedules(),await N()}catch(k){console.error("Failed to initialize schedules:",k)}},D=async k=>{try{await z.triggerDutchieAZSchedule(k),await N()}catch(L){console.error("Failed to trigger schedule:",L)}},M=async k=>{try{await z.updateDutchieAZSchedule(k.id,{enabled:!k.enabled}),await N()}catch(L){console.error("Failed to toggle schedule:",L)}},I=async(k,L)=>{try{const W={description:L.description??void 0,enabled:L.enabled,baseIntervalMinutes:L.baseIntervalMinutes,jitterMinutes:L.jitterMinutes,jobConfig:L.jobConfig??void 0};await z.updateDutchieAZSchedule(k,W),g(null),await N()}catch(W){console.error("Failed to update schedule:",W)}},C=async()=>{if(confirm("Run menu detection on all dispensaries with unknown/missing menu_type?")){y(!0),S(null);try{const k=await z.detectAllDispensaries({state:"AZ",onlyUnknown:!0});S(k),await N()}catch(k){console.error("Failed to run bulk detection:",k)}finally{y(!1)}}},B=async()=>{if(confirm("Resolve platform IDs for all Dutchie dispensaries missing them?")){y(!0),S(null);try{const k=await z.detectAllDispensaries({state:"AZ",onlyMissingPlatformId:!0,onlyUnknown:!1});S(k),await N()}catch(k){console.error("Failed to resolve platform IDs:",k)}finally{y(!1)}}},q=k=>{if(!k)return"Never";const L=new Date(k),H=new Date().getTime()-L.getTime(),ee=Math.floor(H/6e4),re=Math.floor(ee/60),Me=Math.floor(re/24);return ee<1?"Just now":ee<60?`${ee}m ago`:re<24?`${re}h ago`:`${Me}d ago`},Z=k=>{if(!k)return"Not scheduled";const L=new Date(k),W=new Date,H=L.getTime()-W.getTime();if(H<0)return"Overdue";const ee=Math.floor(H/6e4),re=Math.floor(ee/60);return ee<60?`${ee}m`:`${re}h ${ee%60}m`},A=k=>{if(!k)return"-";if(k<1e3)return`${k}ms`;const L=Math.floor(k/1e3),W=Math.floor(L/60);return W<1?`${L}s`:`${W}m ${L%60}s`},T=(k,L)=>{const W=Math.floor(k/60),H=k%60,ee=Math.floor(L/60),re=L%60;let Me=W>0?`${W}h`:"";H>0&&(Me+=`${H}m`);let E=ee>0?`${ee}h`:"";return re>0&&(E+=`${re}m`),`${Me} +/- ${E}`},O=k=>{switch(k){case"success":return{bg:"#d1fae5",color:"#065f46"};case"running":return{bg:"#dbeafe",color:"#1e40af"};case"error":return{bg:"#fee2e2",color:"#991b1b"};case"partial":return{bg:"#fef3c7",color:"#92400e"};default:return{bg:"#f3f4f6",color:"#374151"}}};return a.jsx(X,{children:a.jsxs("div",{children:[a.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"30px"},children:[a.jsxs("div",{children:[a.jsx("h1",{style:{fontSize:"32px",margin:0},children:"Dutchie AZ Schedule"}),a.jsx("p",{style:{color:"#666",margin:"8px 0 0 0"},children:"Jittered scheduling for Arizona Dutchie product crawls"})]}),a.jsx("div",{style:{display:"flex",gap:"15px",alignItems:"center"},children:a.jsxs("label",{style:{display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[a.jsx("input",{type:"checkbox",checked:u,onChange:k=>f(k.target.checked),style:{width:"18px",height:"18px",cursor:"pointer"}}),a.jsx("span",{children:"Auto-refresh (10s)"})]})})]}),a.jsxs("div",{style:{background:"white",padding:"20px",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",marginBottom:"30px",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"20px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontSize:"14px",color:"#666",marginBottom:"4px"},children:"Scheduler Status"}),a.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[a.jsx("span",{style:{width:"12px",height:"12px",borderRadius:"50%",background:i!=null&&i.running?"#10b981":"#ef4444",display:"inline-block"}}),a.jsx("span",{style:{fontWeight:"600",fontSize:"18px"},children:i!=null&&i.running?"Running":"Stopped"})]})]}),a.jsxs("div",{style:{borderLeft:"1px solid #eee",paddingLeft:"20px"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#666",marginBottom:"4px"},children:"Poll Interval"}),a.jsx("div",{style:{fontWeight:"600"},children:i?`${i.pollIntervalMs/1e3}s`:"-"})]}),a.jsxs("div",{style:{borderLeft:"1px solid #eee",paddingLeft:"20px"},children:[a.jsx("div",{style:{fontSize:"14px",color:"#666",marginBottom:"4px"},children:"Active Schedules"}),a.jsxs("div",{style:{fontWeight:"600"},children:[e.filter(k=>k.enabled).length," / ",e.length]})]})]}),a.jsxs("div",{style:{display:"flex",gap:"10px"},children:[a.jsx("button",{onClick:_,style:{padding:"10px 20px",background:i!=null&&i.running?"#ef4444":"#10b981",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600"},children:i!=null&&i.running?"Stop Scheduler":"Start Scheduler"}),e.length===0&&a.jsx("button",{onClick:P,style:{padding:"10px 20px",background:"#2563eb",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600"},children:"Initialize Default Schedules"})]})]}),a.jsxs("div",{style:{marginBottom:"30px",display:"flex",gap:"10px",borderBottom:"2px solid #eee"},children:[a.jsxs("button",{onClick:()=>m("schedules"),style:{padding:"12px 24px",background:p==="schedules"?"white":"transparent",border:"none",borderBottom:p==="schedules"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:p==="schedules"?"600":"400",color:p==="schedules"?"#2563eb":"#666",marginBottom:"-2px"},children:["Schedule Configs (",e.length,")"]}),a.jsxs("button",{onClick:()=>m("logs"),style:{padding:"12px 24px",background:p==="logs"?"white":"transparent",border:"none",borderBottom:p==="logs"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:p==="logs"?"600":"400",color:p==="logs"?"#2563eb":"#666",marginBottom:"-2px"},children:["Run Logs (",r.length,")"]}),a.jsxs("button",{onClick:()=>m("detection"),style:{padding:"12px 24px",background:p==="detection"?"white":"transparent",border:"none",borderBottom:p==="detection"?"3px solid #2563eb":"3px solid transparent",cursor:"pointer",fontSize:"16px",fontWeight:p==="detection"?"600":"400",color:p==="detection"?"#2563eb":"#666",marginBottom:"-2px"},children:["Menu Detection ",o!=null&&o.needsDetection?`(${o.needsDetection} pending)`:""]})]}),p==="schedules"&&a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:e.length===0?a.jsx("div",{style:{padding:"40px",textAlign:"center",color:"#666"},children:'No schedules configured. Click "Initialize Default Schedules" to create the default crawl schedule.'}):a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Job Name"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Enabled"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Interval (Jitter)"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Last Run"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Next Run"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Last Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Actions"})]})}),a.jsx("tbody",{children:e.map(k=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:k.jobName}),k.description&&a.jsx("div",{style:{fontSize:"13px",color:"#666",marginTop:"4px"},children:k.description}),k.jobConfig&&a.jsxs("div",{style:{fontSize:"11px",color:"#999",marginTop:"4px"},children:["Config: ",JSON.stringify(k.jobConfig)]})]}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("button",{onClick:()=>M(k),style:{padding:"4px 12px",borderRadius:"12px",border:"none",cursor:"pointer",fontWeight:"600",fontSize:"12px",background:k.enabled?"#d1fae5":"#fee2e2",color:k.enabled?"#065f46":"#991b1b"},children:k.enabled?"ON":"OFF"})}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsx("div",{style:{fontWeight:"600"},children:T(k.baseIntervalMinutes,k.jitterMinutes)})}),a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{children:q(k.lastRunAt)}),k.lastDurationMs&&a.jsxs("div",{style:{fontSize:"12px",color:"#666"},children:["Duration: ",A(k.lastDurationMs)]})]}),a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600",color:"#2563eb"},children:Z(k.nextRunAt)}),k.nextRunAt&&a.jsx("div",{style:{fontSize:"12px",color:"#999"},children:new Date(k.nextRunAt).toLocaleString()})]}),a.jsx("td",{style:{padding:"15px"},children:k.lastStatus?a.jsxs("div",{children:[a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",...O(k.lastStatus)},children:k.lastStatus}),k.lastErrorMessage&&a.jsx("button",{onClick:()=>alert(k.lastErrorMessage),style:{marginLeft:"8px",padding:"2px 6px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"10px"},children:"Error"})]}):a.jsx("span",{style:{color:"#999"},children:"Never run"})}),a.jsx("td",{style:{padding:"15px",textAlign:"center"},children:a.jsxs("div",{style:{display:"flex",gap:"8px",justifyContent:"center"},children:[a.jsx("button",{onClick:()=>D(k.id),disabled:k.lastStatus==="running",style:{padding:"6px 12px",background:k.lastStatus==="running"?"#94a3b8":"#2563eb",color:"white",border:"none",borderRadius:"4px",cursor:k.lastStatus==="running"?"not-allowed":"pointer",fontSize:"13px"},children:"Run Now"}),a.jsx("button",{onClick:()=>g(k),style:{padding:"6px 12px",background:"#f3f4f6",color:"#374151",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"13px"},children:"Edit"})]})})]},k.id))})]})}),p==="logs"&&a.jsx("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",overflow:"hidden"},children:r.length===0?a.jsx("div",{style:{padding:"40px",textAlign:"center",color:"#666"},children:"No run logs yet. Logs will appear here after jobs execute."}):a.jsxs("table",{style:{width:"100%",borderCollapse:"collapse"},children:[a.jsx("thead",{children:a.jsxs("tr",{style:{background:"#f8f8f8",borderBottom:"2px solid #eee"},children:[a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Job"}),a.jsx("th",{style:{padding:"15px",textAlign:"center",fontWeight:"600"},children:"Status"}),a.jsx("th",{style:{padding:"15px",textAlign:"left",fontWeight:"600"},children:"Started"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Duration"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Processed"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Succeeded"}),a.jsx("th",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:"Failed"})]})}),a.jsx("tbody",{children:r.map(k=>a.jsxs("tr",{style:{borderBottom:"1px solid #eee"},children:[a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{style:{fontWeight:"600"},children:k.job_name}),a.jsxs("div",{style:{fontSize:"12px",color:"#999"},children:["Run #",k.id]})]}),a.jsxs("td",{style:{padding:"15px",textAlign:"center"},children:[a.jsx("span",{style:{padding:"4px 10px",borderRadius:"12px",fontSize:"12px",fontWeight:"600",...O(k.status)},children:k.status}),k.error_message&&a.jsx("button",{onClick:()=>alert(k.error_message),style:{marginLeft:"8px",padding:"2px 6px",background:"#fee2e2",color:"#991b1b",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"10px"},children:"Error"})]}),a.jsxs("td",{style:{padding:"15px"},children:[a.jsx("div",{children:k.started_at?new Date(k.started_at).toLocaleString():"-"}),a.jsx("div",{style:{fontSize:"12px",color:"#999"},children:q(k.started_at)})]}),a.jsx("td",{style:{padding:"15px",textAlign:"right",fontWeight:"600"},children:A(k.duration_ms)}),a.jsx("td",{style:{padding:"15px",textAlign:"right"},children:k.items_processed??"-"}),a.jsx("td",{style:{padding:"15px",textAlign:"right",color:"#10b981"},children:k.items_succeeded??"-"}),a.jsx("td",{style:{padding:"15px",textAlign:"right",color:k.items_failed?"#ef4444":"inherit"},children:k.items_failed??"-"})]},k.id))})]})}),p==="detection"&&a.jsxs("div",{style:{background:"white",borderRadius:"8px",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",padding:"30px"},children:[o&&a.jsxs("div",{style:{marginBottom:"30px"},children:[a.jsx("h3",{style:{margin:"0 0 20px 0"},children:"Detection Statistics"}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"20px"},children:[a.jsxs("div",{style:{padding:"20px",background:"#f8f8f8",borderRadius:"8px",textAlign:"center"},children:[a.jsx("div",{style:{fontSize:"32px",fontWeight:"700",color:"#2563eb"},children:o.totalDispensaries}),a.jsx("div",{style:{color:"#666",marginTop:"4px"},children:"Total Dispensaries"})]}),a.jsxs("div",{style:{padding:"20px",background:"#f8f8f8",borderRadius:"8px",textAlign:"center"},children:[a.jsx("div",{style:{fontSize:"32px",fontWeight:"700",color:"#10b981"},children:o.withMenuType}),a.jsx("div",{style:{color:"#666",marginTop:"4px"},children:"With Menu Type"})]}),a.jsxs("div",{style:{padding:"20px",background:"#f8f8f8",borderRadius:"8px",textAlign:"center"},children:[a.jsx("div",{style:{fontSize:"32px",fontWeight:"700",color:"#10b981"},children:o.withPlatformId}),a.jsx("div",{style:{color:"#666",marginTop:"4px"},children:"With Platform ID"})]}),a.jsxs("div",{style:{padding:"20px",background:"#fef3c7",borderRadius:"8px",textAlign:"center"},children:[a.jsx("div",{style:{fontSize:"32px",fontWeight:"700",color:"#92400e"},children:o.needsDetection}),a.jsx("div",{style:{color:"#666",marginTop:"4px"},children:"Needs Detection"})]})]}),Object.keys(o.byProvider).length>0&&a.jsxs("div",{style:{marginTop:"20px"},children:[a.jsx("h4",{style:{margin:"0 0 10px 0"},children:"By Provider"}),a.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"10px"},children:Object.entries(o.byProvider).map(([k,L])=>a.jsxs("span",{style:{padding:"6px 14px",background:k==="dutchie"?"#dbeafe":"#f3f4f6",borderRadius:"16px",fontSize:"14px",fontWeight:"600"},children:[k,": ",L]},k))})]})]}),a.jsxs("div",{style:{marginBottom:"30px",display:"flex",gap:"15px",flexWrap:"wrap"},children:[a.jsx("button",{onClick:C,disabled:j||!(o!=null&&o.needsDetection),style:{padding:"12px 24px",background:j?"#94a3b8":"#2563eb",color:"white",border:"none",borderRadius:"6px",cursor:j?"not-allowed":"pointer",fontWeight:"600",fontSize:"14px"},children:j?"Detecting...":"Detect All Unknown"}),a.jsx("button",{onClick:B,disabled:j,style:{padding:"12px 24px",background:j?"#94a3b8":"#10b981",color:"white",border:"none",borderRadius:"6px",cursor:j?"not-allowed":"pointer",fontWeight:"600",fontSize:"14px"},children:j?"Resolving...":"Resolve Missing Platform IDs"})]}),w&&a.jsxs("div",{style:{marginBottom:"30px",padding:"20px",background:"#f8f8f8",borderRadius:"8px"},children:[a.jsx("h4",{style:{margin:"0 0 15px 0"},children:"Detection Results"}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(4, 1fr)",gap:"15px",marginBottom:"15px"},children:[a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600",fontSize:"24px"},children:w.totalProcessed}),a.jsx("div",{style:{color:"#666",fontSize:"13px"},children:"Processed"})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600",fontSize:"24px",color:"#10b981"},children:w.totalSucceeded}),a.jsx("div",{style:{color:"#666",fontSize:"13px"},children:"Succeeded"})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600",fontSize:"24px",color:"#ef4444"},children:w.totalFailed}),a.jsx("div",{style:{color:"#666",fontSize:"13px"},children:"Failed"})]}),a.jsxs("div",{children:[a.jsx("div",{style:{fontWeight:"600",fontSize:"24px",color:"#666"},children:w.totalSkipped}),a.jsx("div",{style:{color:"#666",fontSize:"13px"},children:"Skipped"})]})]}),w.errors&&w.errors.length>0&&a.jsxs("div",{style:{marginTop:"15px"},children:[a.jsx("div",{style:{fontWeight:"600",marginBottom:"8px",color:"#991b1b"},children:"Errors:"}),a.jsxs("div",{style:{maxHeight:"150px",overflow:"auto",background:"#fee2e2",padding:"10px",borderRadius:"4px",fontSize:"12px"},children:[w.errors.slice(0,10).map((k,L)=>a.jsx("div",{style:{marginBottom:"4px"},children:k},L)),w.errors.length>10&&a.jsxs("div",{style:{fontStyle:"italic",marginTop:"8px"},children:["...and ",w.errors.length-10," more"]})]})]})]}),a.jsxs("div",{style:{padding:"20px",background:"#f0f9ff",borderRadius:"8px",fontSize:"14px"},children:[a.jsx("h4",{style:{margin:"0 0 10px 0",color:"#1e40af"},children:"About Menu Detection"}),a.jsxs("ul",{style:{margin:0,paddingLeft:"20px",color:"#1e40af"},children:[a.jsxs("li",{style:{marginBottom:"8px"},children:[a.jsx("strong",{children:"Detect All Unknown:"})," Scans dispensaries with no menu_type set and detects the provider (dutchie, treez, jane, etc.) from their menu_url."]}),a.jsxs("li",{style:{marginBottom:"8px"},children:[a.jsx("strong",{children:"Resolve Missing Platform IDs:"}),' For dispensaries already detected as "dutchie", extracts the cName from menu_url and resolves the platform_dispensary_id via GraphQL.']}),a.jsxs("li",{children:[a.jsx("strong",{children:"Automatic scheduling:"}),' A "Menu Detection" job runs daily (24h +/- 1h jitter) to detect new dispensaries.']})]})]})]}),x&&a.jsx("div",{style:{position:"fixed",top:0,left:0,right:0,bottom:0,background:"rgba(0,0,0,0.5)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e3},children:a.jsxs("div",{style:{background:"white",padding:"30px",borderRadius:"12px",width:"500px",maxWidth:"90vw"},children:[a.jsxs("h2",{style:{margin:"0 0 20px 0"},children:["Edit Schedule: ",x.jobName]}),a.jsxs("div",{style:{marginBottom:"20px"},children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"600"},children:"Description"}),a.jsx("input",{type:"text",value:x.description||"",onChange:k=>g({...x,description:k.target.value}),style:{width:"100%",padding:"10px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"14px"}})]}),a.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"20px",marginBottom:"20px"},children:[a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"600"},children:"Base Interval (minutes)"}),a.jsx("input",{type:"number",value:x.baseIntervalMinutes,onChange:k=>g({...x,baseIntervalMinutes:parseInt(k.target.value)||240}),style:{width:"100%",padding:"10px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"14px"}}),a.jsxs("div",{style:{fontSize:"12px",color:"#666",marginTop:"4px"},children:["= ",Math.floor(x.baseIntervalMinutes/60),"h ",x.baseIntervalMinutes%60,"m"]})]}),a.jsxs("div",{children:[a.jsx("label",{style:{display:"block",marginBottom:"8px",fontWeight:"600"},children:"Jitter (minutes)"}),a.jsx("input",{type:"number",value:x.jitterMinutes,onChange:k=>g({...x,jitterMinutes:parseInt(k.target.value)||30}),style:{width:"100%",padding:"10px",borderRadius:"6px",border:"1px solid #ddd",fontSize:"14px"}}),a.jsxs("div",{style:{fontSize:"12px",color:"#666",marginTop:"4px"},children:["+/- ",x.jitterMinutes,"m random offset"]})]})]}),a.jsxs("div",{style:{fontSize:"13px",color:"#666",marginBottom:"20px",padding:"15px",background:"#f8f8f8",borderRadius:"6px"},children:[a.jsx("strong",{children:"Effective range:"})," ",Math.floor((x.baseIntervalMinutes-x.jitterMinutes)/60),"h ",(x.baseIntervalMinutes-x.jitterMinutes)%60,"m"," to ",Math.floor((x.baseIntervalMinutes+x.jitterMinutes)/60),"h ",(x.baseIntervalMinutes+x.jitterMinutes)%60,"m"]}),a.jsxs("div",{style:{display:"flex",gap:"10px",justifyContent:"flex-end"},children:[a.jsx("button",{onClick:()=>g(null),style:{padding:"10px 20px",background:"#f3f4f6",color:"#374151",border:"none",borderRadius:"6px",cursor:"pointer"},children:"Cancel"}),a.jsx("button",{onClick:()=>I(x.id,{description:x.description,baseIntervalMinutes:x.baseIntervalMinutes,jitterMinutes:x.jitterMinutes}),style:{padding:"10px 20px",background:"#2563eb",color:"white",border:"none",borderRadius:"6px",cursor:"pointer",fontWeight:"600"},children:"Save Changes"})]})]})})]})})}function NW(){const e=dt(),[t,r]=h.useState([]),[n,i]=h.useState(0),[s,o]=h.useState(!0),[l,c]=h.useState(null);h.useEffect(()=>{d()},[]);const d=async()=>{o(!0);try{const[u,f]=await Promise.all([z.getDutchieAZStores({limit:200}),z.getDutchieAZDashboard()]);r(u.stores),i(u.total),c(f)}catch(u){console.error("Failed to load data:",u)}finally{o(!1)}};return s?a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading stores..."})]})}):a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Dutchie AZ Stores"}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"Arizona dispensaries using the Dutchie platform - data from the new pipeline"})]}),a.jsxs("button",{onClick:d,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Refresh"]})]}),l&&a.jsxs("div",{className:"grid grid-cols-4 gap-4",children:[a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Ln,{className:"w-5 h-5 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Dispensaries"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:l.dispensaryCount})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(Ct,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Total Products"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:l.productCount.toLocaleString()})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(Pr,{className:"w-5 h-5 text-purple-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Brands"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:l.brandCount})]})]})}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-orange-50 rounded-lg",children:a.jsx(Hr,{className:"w-5 h-5 text-orange-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Failed Jobs (24h)"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:l.failedJobCount})]})]})})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200",children:[a.jsx("div",{className:"p-4 border-b border-gray-200",children:a.jsxs("h2",{className:"text-lg font-semibold text-gray-900",children:["All Stores (",n,")"]})}),a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"table table-zebra w-full",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Name"}),a.jsx("th",{children:"City"}),a.jsx("th",{children:"Menu Type"}),a.jsx("th",{children:"Platform ID"}),a.jsx("th",{children:"Status"}),a.jsx("th",{children:"Actions"})]})}),a.jsx("tbody",{children:t.map(u=>a.jsxs("tr",{children:[a.jsx("td",{children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-blue-50 rounded-lg",children:a.jsx(Ln,{className:"w-4 h-4 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"font-medium text-gray-900",children:u.dba_name||u.name}),u.company_name&&u.company_name!==u.name&&a.jsx("p",{className:"text-xs text-gray-500",children:u.company_name})]})]})}),a.jsx("td",{children:a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(yi,{className:"w-4 h-4"}),u.city,", ",u.state]})}),a.jsx("td",{children:u.menu_type?a.jsx("span",{className:`badge badge-sm ${u.menu_type==="dutchie"?"badge-success":u.menu_type==="jane"?"badge-info":u.menu_type==="joint"?"badge-primary":u.menu_type==="treez"?"badge-secondary":u.menu_type==="leafly"?"badge-accent":"badge-ghost"}`,children:u.menu_type}):a.jsx("span",{className:"badge badge-ghost badge-sm",children:"unknown"})}),a.jsx("td",{children:u.platform_dispensary_id?a.jsx("span",{className:"text-xs font-mono text-gray-600",children:u.platform_dispensary_id}):a.jsx("span",{className:"badge badge-warning badge-sm",children:"Not Resolved"})}),a.jsx("td",{children:u.platform_dispensary_id?a.jsx("span",{className:"badge badge-success badge-sm",children:"Ready"}):a.jsx("span",{className:"badge badge-warning badge-sm",children:"Pending"})}),a.jsx("td",{children:a.jsx("button",{onClick:()=>e(`/az/stores/${u.id}`),className:"btn btn-sm btn-primary",disabled:!u.platform_dispensary_id,children:"View Products"})})]},u.id))})]})})]})]})})}function kW(){const{id:e}=_a(),t=dt(),[r,n]=h.useState(null),[i,s]=h.useState([]),[o,l]=h.useState(!0),[c,d]=h.useState(!1),[u,f]=h.useState("products"),[p,m]=h.useState(!1),[x,g]=h.useState(!1),[b,v]=h.useState(""),[j,y]=h.useState(1),[w,S]=h.useState(0),[N]=h.useState(25),[_,P]=h.useState(""),D=O=>{if(!O)return"Never";const k=new Date(O),W=new Date().getTime()-k.getTime(),H=Math.floor(W/(1e3*60)),ee=Math.floor(W/(1e3*60*60)),re=Math.floor(W/(1e3*60*60*24));return H<1?"Just now":H<60?`${H}m ago`:ee<24?`${ee}h ago`:re===1?"Yesterday":re<7?`${re} days ago`:k.toLocaleDateString()};h.useEffect(()=>{e&&M()},[e]),h.useEffect(()=>{e&&u==="products"&&I()},[e,j,b,_,u]),h.useEffect(()=>{y(1)},[b,_]);const M=async()=>{l(!0);try{const O=await z.getDutchieAZStoreSummary(parseInt(e,10));n(O)}catch(O){console.error("Failed to load store summary:",O)}finally{l(!1)}},I=async()=>{if(e){d(!0);try{const O=await z.getDutchieAZStoreProducts(parseInt(e,10),{search:b||void 0,stockStatus:_||void 0,limit:N,offset:(j-1)*N});s(O.products),S(O.total)}catch(O){console.error("Failed to load products:",O)}finally{d(!1)}}},C=async()=>{m(!1),g(!0);try{await z.triggerDutchieAZCrawl(parseInt(e,10)),alert("Crawl started! Refresh the page in a few minutes to see updated data.")}catch(O){console.error("Failed to trigger crawl:",O),alert("Failed to start crawl. Please try again.")}finally{g(!1)}},B=Math.ceil(w/N);if(o)return a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading store..."})]})});if(!r)return a.jsx(X,{children:a.jsx("div",{className:"text-center py-12",children:a.jsx("p",{className:"text-gray-600",children:"Store not found"})})});const{dispensary:q,brands:Z,categories:A,lastCrawl:T}=r;return a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between gap-4",children:[a.jsxs("button",{onClick:()=>t("/az"),className:"flex items-center gap-2 text-sm text-gray-600 hover:text-gray-900",children:[a.jsx(Ch,{className:"w-4 h-4"}),"Back to AZ Stores"]}),a.jsxs("div",{className:"relative",children:[a.jsxs("button",{onClick:()=>m(!p),disabled:x,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed",children:[a.jsx(Xt,{className:`w-4 h-4 ${x?"animate-spin":""}`}),x?"Crawling...":"Crawl Now",!x&&a.jsx(tj,{className:"w-4 h-4"})]}),p&&!x&&a.jsx("div",{className:"absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-lg border border-gray-200 z-10",children:a.jsx("button",{onClick:C,className:"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-lg",children:"Start Full Crawl"})})]})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 p-6",children:[a.jsxs("div",{className:"flex items-start justify-between gap-4 mb-4",children:[a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"p-3 bg-blue-50 rounded-lg",children:a.jsx(Ln,{className:"w-8 h-8 text-blue-600"})}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:q.dba_name||q.name}),q.company_name&&a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:q.company_name}),a.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:["Platform ID: ",q.platform_dispensary_id||"Not resolved"]})]})]}),a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 bg-gray-50 px-4 py-2 rounded-lg",children:[a.jsx(xr,{className:"w-4 h-4"}),a.jsxs("div",{children:[a.jsx("span",{className:"font-medium",children:"Last Crawl:"}),a.jsx("span",{className:"ml-2",children:T!=null&&T.completed_at?new Date(T.completed_at).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"Never"}),(T==null?void 0:T.status)&&a.jsx("span",{className:`ml-2 px-2 py-0.5 rounded text-xs ${T.status==="completed"?"bg-green-100 text-green-800":T.status==="failed"?"bg-red-100 text-red-800":"bg-yellow-100 text-yellow-800"}`,children:T.status})]})]})]}),a.jsxs("div",{className:"flex flex-wrap gap-4",children:[q.address&&a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(yi,{className:"w-4 h-4"}),a.jsxs("span",{children:[q.address,", ",q.city,", ",q.state," ",q.zip]})]}),q.phone&&a.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600",children:[a.jsx(Oh,{className:"w-4 h-4"}),a.jsx("span",{children:q.phone})]}),q.website&&a.jsxs("a",{href:q.website,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-sm text-blue-600 hover:text-blue-800",children:[a.jsx(Jr,{className:"w-4 h-4"}),"Website"]})]})]}),a.jsxs("div",{className:"grid grid-cols-5 gap-4",children:[a.jsx("button",{onClick:()=>{f("products"),P(""),v("")},className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${u==="products"&&!_?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-green-50 rounded-lg",children:a.jsx(Ct,{className:"w-5 h-5 text-green-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Total Products"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.totalProducts})]})]})}),a.jsx("button",{onClick:()=>{f("products"),P("in_stock"),v("")},className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${_==="in_stock"?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-emerald-50 rounded-lg",children:a.jsx(Pr,{className:"w-5 h-5 text-emerald-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"In Stock"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.inStockCount})]})]})}),a.jsx("button",{onClick:()=>{f("products"),P("out_of_stock"),v("")},className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${_==="out_of_stock"?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-red-50 rounded-lg",children:a.jsx(Hr,{className:"w-5 h-5 text-red-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Out of Stock"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.outOfStockCount})]})]})}),a.jsx("button",{onClick:()=>f("brands"),className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${u==="brands"?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-purple-50 rounded-lg",children:a.jsx(Cr,{className:"w-5 h-5 text-purple-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Brands"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.brandCount})]})]})}),a.jsx("button",{onClick:()=>f("categories"),className:`bg-white rounded-lg border p-4 hover:border-blue-300 hover:shadow-md transition-all cursor-pointer text-left ${u==="categories"?"border-blue-500":"border-gray-200"}`,children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"p-2 bg-orange-50 rounded-lg",children:a.jsx(ha,{className:"w-5 h-5 text-orange-600"})}),a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-gray-600",children:"Categories"}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:r.categoryCount})]})]})})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200",children:[a.jsx("div",{className:"border-b border-gray-200",children:a.jsxs("div",{className:"flex gap-4 px-6",children:[a.jsxs("button",{onClick:()=>{f("products"),P("")},className:`py-4 px-2 text-sm font-medium border-b-2 ${u==="products"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Products (",r.totalProducts,")"]}),a.jsxs("button",{onClick:()=>f("brands"),className:`py-4 px-2 text-sm font-medium border-b-2 ${u==="brands"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Brands (",r.brandCount,")"]}),a.jsxs("button",{onClick:()=>f("categories"),className:`py-4 px-2 text-sm font-medium border-b-2 ${u==="categories"?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:["Categories (",r.categoryCount,")"]})]})}),a.jsxs("div",{className:"p-6",children:[u==="products"&&a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[a.jsx("input",{type:"text",placeholder:"Search products by name or brand...",value:b,onChange:O=>v(O.target.value),className:"input input-bordered input-sm flex-1"}),a.jsxs("select",{value:_,onChange:O=>P(O.target.value),className:"select select-bordered select-sm",children:[a.jsx("option",{value:"",children:"All Stock"}),a.jsx("option",{value:"in_stock",children:"In Stock"}),a.jsx("option",{value:"out_of_stock",children:"Out of Stock"}),a.jsx("option",{value:"unknown",children:"Unknown"})]}),(b||_)&&a.jsx("button",{onClick:()=>{v(""),P("")},className:"btn btn-sm btn-ghost",children:"Clear"}),a.jsxs("div",{className:"text-sm text-gray-600",children:[w," products"]})]}),c?a.jsxs("div",{className:"text-center py-8",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-6 w-6 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading products..."})]}):i.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No products found"}):a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"overflow-x-auto -mx-6 px-6",children:a.jsxs("table",{className:"table table-xs table-zebra table-pin-rows w-full",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Image"}),a.jsx("th",{children:"Product Name"}),a.jsx("th",{children:"Brand"}),a.jsx("th",{children:"Type"}),a.jsx("th",{className:"text-right",children:"Price"}),a.jsx("th",{className:"text-center",children:"THC %"}),a.jsx("th",{className:"text-center",children:"Stock"}),a.jsx("th",{className:"text-center",children:"Qty"}),a.jsx("th",{children:"Last Updated"})]})}),a.jsx("tbody",{children:i.map(O=>a.jsxs("tr",{children:[a.jsx("td",{className:"whitespace-nowrap",children:O.image_url?a.jsx("img",{src:O.image_url,alt:O.name,className:"w-12 h-12 object-cover rounded",onError:k=>k.currentTarget.style.display="none"}):"-"}),a.jsx("td",{className:"font-medium max-w-[200px]",children:a.jsx("div",{className:"line-clamp-2",title:O.name,children:O.name})}),a.jsx("td",{className:"max-w-[120px]",children:a.jsx("div",{className:"line-clamp-2",title:O.brand||"-",children:O.brand||"-"})}),a.jsxs("td",{className:"whitespace-nowrap",children:[a.jsx("span",{className:"badge badge-ghost badge-sm",children:O.type||"-"}),O.subcategory&&a.jsx("span",{className:"badge badge-ghost badge-sm ml-1",children:O.subcategory})]}),a.jsx("td",{className:"text-right font-semibold whitespace-nowrap",children:O.sale_price?a.jsxs("div",{className:"flex flex-col items-end",children:[a.jsxs("span",{className:"text-error",children:["$",O.sale_price]}),a.jsxs("span",{className:"text-gray-400 line-through text-xs",children:["$",O.regular_price]})]}):O.regular_price?`$${O.regular_price}`:"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:O.thc_percentage?a.jsxs("span",{className:"badge badge-success badge-sm",children:[O.thc_percentage,"%"]}):"-"}),a.jsx("td",{className:"text-center whitespace-nowrap",children:O.stock_status==="in_stock"?a.jsx("span",{className:"badge badge-success badge-sm",children:"In Stock"}):O.stock_status==="out_of_stock"?a.jsx("span",{className:"badge badge-error badge-sm",children:"Out"}):a.jsx("span",{className:"badge badge-warning badge-sm",children:"Unknown"})}),a.jsx("td",{className:"text-center whitespace-nowrap",children:O.total_quantity!=null?O.total_quantity:"-"}),a.jsx("td",{className:"whitespace-nowrap text-xs text-gray-500",children:O.updated_at?D(O.updated_at):"-"})]},O.id))})]})}),B>1&&a.jsxs("div",{className:"flex justify-center items-center gap-2 mt-4",children:[a.jsx("button",{onClick:()=>y(O=>Math.max(1,O-1)),disabled:j===1,className:"btn btn-sm btn-outline",children:"Previous"}),a.jsx("div",{className:"flex gap-1",children:Array.from({length:Math.min(5,B)},(O,k)=>{let L;return B<=5||j<=3?L=k+1:j>=B-2?L=B-4+k:L=j-2+k,a.jsx("button",{onClick:()=>y(L),className:`btn btn-sm ${j===L?"btn-primary":"btn-outline"}`,children:L},L)})}),a.jsx("button",{onClick:()=>y(O=>Math.min(B,O+1)),disabled:j===B,className:"btn btn-sm btn-outline",children:"Next"})]})]})]}),u==="brands"&&a.jsx("div",{className:"space-y-4",children:Z.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No brands found"}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:Z.map(O=>a.jsxs("button",{onClick:()=>{f("products"),v(O.brand_name),P("")},className:"border border-gray-200 rounded-lg p-4 text-center hover:border-blue-300 hover:shadow-md transition-all cursor-pointer",children:[a.jsx("p",{className:"font-medium text-gray-900 line-clamp-2",children:O.brand_name}),a.jsxs("p",{className:"text-sm text-gray-600 mt-1",children:[O.product_count," product",O.product_count!==1?"s":""]})]},O.brand_name))})}),u==="categories"&&a.jsx("div",{className:"space-y-4",children:A.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No categories found"}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:A.map((O,k)=>a.jsxs("div",{className:"border border-gray-200 rounded-lg p-4 text-center",children:[a.jsx("p",{className:"font-medium text-gray-900",children:O.type}),O.subcategory&&a.jsx("p",{className:"text-sm text-gray-600",children:O.subcategory}),a.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:[O.product_count," product",O.product_count!==1?"s":""]})]},k))})})]})]})]})})}function _W(){const e=dt(),[t,r]=h.useState(null),[n,i]=h.useState([]),[s,o]=h.useState([]),[l,c]=h.useState([]),[d,u]=h.useState(!0),[f,p]=h.useState("overview");h.useEffect(()=>{m()},[]);const m=async()=>{u(!0);try{const[g,b,v,j]=await Promise.all([z.getDutchieAZDashboard(),z.getDutchieAZStores({limit:200}),z.getDutchieAZBrands?z.getDutchieAZBrands({limit:100}):Promise.resolve({brands:[]}),z.getDutchieAZCategories?z.getDutchieAZCategories():Promise.resolve({categories:[]})]);r(g),i(b.stores||[]),o(v.brands||[]),c(j.categories||[])}catch(g){console.error("Failed to load analytics data:",g)}finally{u(!1)}},x=g=>{if(!g)return"Never";const b=new Date(g),j=new Date().getTime()-b.getTime(),y=Math.floor(j/(1e3*60*60)),w=Math.floor(j/(1e3*60*60*24));return y<1?"Just now":y<24?`${y}h ago`:w===1?"Yesterday":w<7?`${w} days ago`:b.toLocaleDateString()};return d?a.jsx(X,{children:a.jsxs("div",{className:"text-center py-12",children:[a.jsx("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-4 border-blue-500 border-t-transparent"}),a.jsx("p",{className:"mt-2 text-sm text-gray-600",children:"Loading analytics..."})]})}):a.jsx(X,{children:a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"Wholesale & Inventory Analytics"}),a.jsx("p",{className:"text-sm text-gray-600 mt-1",children:"Arizona Dutchie dispensaries data overview"})]}),a.jsxs("button",{onClick:m,className:"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50",children:[a.jsx(Xt,{className:"w-4 h-4"}),"Refresh"]})]}),a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-7 gap-4",children:[a.jsx(Ii,{title:"Dispensaries",value:(t==null?void 0:t.dispensaryCount)||0,icon:a.jsx(Ln,{className:"w-5 h-5 text-blue-600"}),color:"blue"}),a.jsx(Ii,{title:"Total Products",value:(t==null?void 0:t.productCount)||0,icon:a.jsx(Ct,{className:"w-5 h-5 text-green-600"}),color:"green"}),a.jsx(Ii,{title:"Brands",value:(t==null?void 0:t.brandCount)||0,icon:a.jsx(Cr,{className:"w-5 h-5 text-purple-600"}),color:"purple"}),a.jsx(Ii,{title:"Categories",value:(t==null?void 0:t.categoryCount)||0,icon:a.jsx(Ix,{className:"w-5 h-5 text-orange-600"}),color:"orange"}),a.jsx(Ii,{title:"Snapshots (24h)",value:(t==null?void 0:t.snapshotCount24h)||0,icon:a.jsx(zn,{className:"w-5 h-5 text-cyan-600"}),color:"cyan"}),a.jsx(Ii,{title:"Failed Jobs (24h)",value:(t==null?void 0:t.failedJobCount)||0,icon:a.jsx(ha,{className:"w-5 h-5 text-red-600"}),color:"red"}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:[a.jsxs("div",{className:"flex items-center gap-2 text-gray-600 mb-1",children:[a.jsx(xr,{className:"w-4 h-4"}),a.jsx("span",{className:"text-xs",children:"Last Crawl"})]}),a.jsx("p",{className:"text-sm font-semibold text-gray-900",children:x((t==null?void 0:t.lastCrawlTime)||null)})]})]}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200",children:[a.jsx("div",{className:"border-b border-gray-200",children:a.jsxs("div",{className:"flex gap-4 px-6",children:[a.jsx(Yo,{active:f==="overview",onClick:()=>p("overview"),icon:a.jsx(YA,{className:"w-4 h-4"}),label:"Overview"}),a.jsx(Yo,{active:f==="stores",onClick:()=>p("stores"),icon:a.jsx(Ln,{className:"w-4 h-4"}),label:`Stores (${n.length})`}),a.jsx(Yo,{active:f==="brands",onClick:()=>p("brands"),icon:a.jsx(Cr,{className:"w-4 h-4"}),label:`Brands (${s.length})`}),a.jsx(Yo,{active:f==="categories",onClick:()=>p("categories"),icon:a.jsx(Ix,{className:"w-4 h-4"}),label:`Categories (${l.length})`})]})}),a.jsxs("div",{className:"p-6",children:[f==="overview"&&a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:"Top Stores by Products"}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:n.slice(0,6).map(g=>a.jsxs("button",{onClick:()=>e(`/az/stores/${g.id}`),className:"flex items-center justify-between p-4 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors text-left",children:[a.jsxs("div",{children:[a.jsx("p",{className:"font-medium text-gray-900",children:g.dba_name||g.name}),a.jsxs("p",{className:"text-sm text-gray-600",children:[g.city,", ",g.state]}),a.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:["Last crawl: ",x(g.last_crawl_at||null)]})]}),a.jsx(Ef,{className:"w-5 h-5 text-gray-400"})]},g.id))})]}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:"Top Brands"}),a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4",children:s.slice(0,12).map(g=>a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg text-center",children:[a.jsx("p",{className:"font-medium text-gray-900 text-sm line-clamp-2",children:g.brand_name}),a.jsx("p",{className:"text-lg font-bold text-purple-600 mt-1",children:g.product_count}),a.jsx("p",{className:"text-xs text-gray-500",children:"products"})]},g.brand_name))})]}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:"Product Categories"}),a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4",children:l.slice(0,12).map((g,b)=>a.jsxs("div",{className:"p-4 bg-gray-50 rounded-lg text-center",children:[a.jsx("p",{className:"font-medium text-gray-900",children:g.type}),g.subcategory&&a.jsx("p",{className:"text-xs text-gray-600",children:g.subcategory}),a.jsx("p",{className:"text-lg font-bold text-orange-600 mt-1",children:g.product_count}),a.jsx("p",{className:"text-xs text-gray-500",children:"products"})]},b))})]})]}),f==="stores"&&a.jsx("div",{className:"space-y-4",children:a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"table table-sm w-full",children:[a.jsx("thead",{children:a.jsxs("tr",{children:[a.jsx("th",{children:"Store Name"}),a.jsx("th",{children:"City"}),a.jsx("th",{className:"text-center",children:"Platform ID"}),a.jsx("th",{className:"text-center",children:"Last Crawl"}),a.jsx("th",{})]})}),a.jsx("tbody",{children:n.map(g=>a.jsxs("tr",{className:"hover",children:[a.jsx("td",{className:"font-medium",children:g.dba_name||g.name}),a.jsxs("td",{children:[g.city,", ",g.state]}),a.jsx("td",{className:"text-center",children:g.platform_dispensary_id?a.jsx("span",{className:"badge badge-success badge-sm",children:"Resolved"}):a.jsx("span",{className:"badge badge-warning badge-sm",children:"Pending"})}),a.jsx("td",{className:"text-center text-sm text-gray-600",children:x(g.last_crawl_at||null)}),a.jsx("td",{children:a.jsx("button",{onClick:()=>e(`/az/stores/${g.id}`),className:"btn btn-xs btn-ghost",children:"View"})})]},g.id))})]})})}),f==="brands"&&a.jsx("div",{className:"space-y-4",children:s.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No brands found. Run a crawl to populate brand data."}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4",children:s.map(g=>a.jsxs("div",{className:"border border-gray-200 rounded-lg p-4 text-center hover:border-purple-300 hover:shadow-md transition-all",children:[a.jsx("p",{className:"font-medium text-gray-900 text-sm line-clamp-2 h-10",children:g.brand_name}),a.jsxs("div",{className:"mt-2 space-y-1",children:[a.jsxs("div",{className:"flex justify-between text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"Products:"}),a.jsx("span",{className:"font-semibold",children:g.product_count})]}),a.jsxs("div",{className:"flex justify-between text-xs",children:[a.jsx("span",{className:"text-gray-500",children:"Stores:"}),a.jsx("span",{className:"font-semibold",children:g.dispensary_count})]})]})]},g.brand_name))})}),f==="categories"&&a.jsx("div",{className:"space-y-4",children:l.length===0?a.jsx("p",{className:"text-center py-8 text-gray-500",children:"No categories found. Run a crawl to populate category data."}):a.jsx("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",children:l.map((g,b)=>a.jsxs("div",{className:"border border-gray-200 rounded-lg p-4 hover:border-orange-300 hover:shadow-md transition-all",children:[a.jsx("p",{className:"font-medium text-gray-900",children:g.type}),g.subcategory&&a.jsx("p",{className:"text-sm text-gray-600",children:g.subcategory}),a.jsxs("div",{className:"mt-3 grid grid-cols-2 gap-2 text-xs",children:[a.jsxs("div",{className:"bg-gray-50 rounded p-2 text-center",children:[a.jsx("p",{className:"font-bold text-lg text-orange-600",children:g.product_count}),a.jsx("p",{className:"text-gray-500",children:"products"})]}),a.jsxs("div",{className:"bg-gray-50 rounded p-2 text-center",children:[a.jsx("p",{className:"font-bold text-lg text-blue-600",children:g.brand_count}),a.jsx("p",{className:"text-gray-500",children:"brands"})]})]}),g.avg_thc!=null&&a.jsxs("p",{className:"text-xs text-gray-500 mt-2 text-center",children:["Avg THC: ",g.avg_thc.toFixed(1),"%"]})]},b))})})]})]})]})})}function Ii({title:e,value:t,icon:r,color:n}){const i={blue:"bg-blue-50",green:"bg-green-50",purple:"bg-purple-50",orange:"bg-orange-50",cyan:"bg-cyan-50",red:"bg-red-50"};return a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:`p-2 ${i[n]||"bg-gray-50"} rounded-lg`,children:r}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs text-gray-600",children:e}),a.jsx("p",{className:"text-xl font-bold text-gray-900",children:t.toLocaleString()})]})]})})}function Yo({active:e,onClick:t,icon:r,label:n}){return a.jsxs("button",{onClick:t,className:`flex items-center gap-2 py-4 px-2 text-sm font-medium border-b-2 transition-colors ${e?"border-blue-600 text-blue-600":"border-transparent text-gray-600 hover:text-gray-900"}`,children:[r,n]})}function PW(){const{user:e}=Kc(),[t,r]=h.useState([]),[n,i]=h.useState(!0),[s,o]=h.useState(null),[l,c]=h.useState(!1),[d,u]=h.useState(null),[f,p]=h.useState({email:"",password:"",role:"viewer"}),[m,x]=h.useState(null),[g,b]=h.useState(!1),v=async()=>{try{i(!0);const D=await z.getUsers();r(D.users),o(null)}catch(D){o(D.message||"Failed to fetch users")}finally{i(!1)}};h.useEffect(()=>{v()},[]);const j=async()=>{if(!f.email||!f.password){x("Email and password are required");return}try{b(!0),x(null),await z.createUser(f),c(!1),p({email:"",password:"",role:"viewer"}),v()}catch(D){x(D.message||"Failed to create user")}finally{b(!1)}},y=async()=>{if(!d)return;const D={};if(f.email&&f.email!==d.email&&(D.email=f.email),f.password&&(D.password=f.password),f.role&&f.role!==d.role&&(D.role=f.role),Object.keys(D).length===0){u(null);return}try{b(!0),x(null),await z.updateUser(d.id,D),u(null),p({email:"",password:"",role:"viewer"}),v()}catch(M){x(M.message||"Failed to update user")}finally{b(!1)}},w=async D=>{if(confirm(`Are you sure you want to delete ${D.email}?`))try{await z.deleteUser(D.id),v()}catch(M){alert(M.message||"Failed to delete user")}},S=D=>{u(D),p({email:D.email,password:"",role:D.role}),x(null)},N=()=>{c(!1),u(null),p({email:"",password:"",role:"viewer"}),x(null)},_=D=>{switch(D){case"superadmin":return"bg-purple-100 text-purple-800";case"admin":return"bg-blue-100 text-blue-800";case"analyst":return"bg-green-100 text-green-800";case"viewer":return"bg-gray-100 text-gray-700";default:return"bg-gray-100 text-gray-700"}},P=D=>!((e==null?void 0:e.id)===D.id||D.role==="superadmin"&&(e==null?void 0:e.role)!=="superadmin");return a.jsxs(X,{children:[a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx(oj,{className:"w-8 h-8 text-blue-600"}),a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"User Management"}),a.jsx("p",{className:"text-sm text-gray-500",children:"Manage system users and their roles"})]})]}),a.jsxs("button",{onClick:()=>{c(!0),x(null)},className:"flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",children:[a.jsx(Ll,{className:"w-4 h-4"}),"Add User"]})]}),s&&a.jsxs("div",{className:"bg-red-50 border border-red-200 rounded-lg p-4 flex items-center gap-3",children:[a.jsx(ha,{className:"w-5 h-5 text-red-500"}),a.jsx("p",{className:"text-red-700",children:s})]}),a.jsx("div",{className:"bg-white rounded-lg border border-gray-200 overflow-hidden",children:n?a.jsxs("div",{className:"p-8 text-center",children:[a.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto"}),a.jsx("p",{className:"mt-2 text-gray-500",children:"Loading users..."})]}):t.length===0?a.jsx("div",{className:"p-8 text-center text-gray-500",children:"No users found"}):a.jsxs("table",{className:"min-w-full divide-y divide-gray-200",children:[a.jsx("thead",{className:"bg-gray-50",children:a.jsxs("tr",{children:[a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Email"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Role"}),a.jsx("th",{className:"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Created"}),a.jsx("th",{className:"px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider",children:"Actions"})]})}),a.jsx("tbody",{className:"bg-white divide-y divide-gray-200",children:t.map(D=>a.jsxs("tr",{className:"hover:bg-gray-50",children:[a.jsx("td",{className:"px-6 py-4 whitespace-nowrap",children:a.jsxs("div",{className:"flex items-center",children:[a.jsx("div",{className:"flex-shrink-0 h-8 w-8 rounded-full bg-gray-200 flex items-center justify-center",children:a.jsx("span",{className:"text-sm font-medium text-gray-600",children:D.email.charAt(0).toUpperCase()})}),a.jsxs("div",{className:"ml-3",children:[a.jsx("p",{className:"text-sm font-medium text-gray-900",children:D.email}),(e==null?void 0:e.id)===D.id&&a.jsx("p",{className:"text-xs text-gray-500",children:"(you)"})]})]})}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap",children:a.jsx("span",{className:`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${_(D.role)}`,children:D.role})}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-sm text-gray-500",children:new Date(D.created_at).toLocaleDateString()}),a.jsx("td",{className:"px-6 py-4 whitespace-nowrap text-right text-sm font-medium",children:P(D)?a.jsxs("div",{className:"flex items-center justify-end gap-2",children:[a.jsx("button",{onClick:()=>S(D),className:"p-1.5 text-gray-400 hover:text-blue-600 hover:bg-blue-50 rounded transition-colors",title:"Edit user",children:a.jsx(nj,{className:"w-4 h-4"})}),a.jsx("button",{onClick:()=>w(D),className:"p-1.5 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded transition-colors",title:"Delete user",children:a.jsx(aj,{className:"w-4 h-4"})})]}):a.jsx("span",{className:"text-xs text-gray-400",children:"—"})})]},D.id))})]})}),a.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 p-4",children:[a.jsx("h3",{className:"text-sm font-medium text-gray-700 mb-3",children:"Role Permissions"}),a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",children:[a.jsxs("div",{children:[a.jsx("span",{className:`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${_("superadmin")}`,children:"superadmin"}),a.jsx("p",{className:"mt-1 text-gray-500",children:"Full system access"})]}),a.jsxs("div",{children:[a.jsx("span",{className:`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${_("admin")}`,children:"admin"}),a.jsx("p",{className:"mt-1 text-gray-500",children:"Manage users & settings"})]}),a.jsxs("div",{children:[a.jsx("span",{className:`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${_("analyst")}`,children:"analyst"}),a.jsx("p",{className:"mt-1 text-gray-500",children:"View & analyze data"})]}),a.jsxs("div",{children:[a.jsx("span",{className:`inline-flex px-2 py-1 text-xs font-semibold rounded-full ${_("viewer")}`,children:"viewer"}),a.jsx("p",{className:"mt-1 text-gray-500",children:"Read-only access"})]})]})]})]}),(l||d)&&a.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:a.jsxs("div",{className:"bg-white rounded-lg shadow-xl w-full max-w-md mx-4",children:[a.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-200",children:[a.jsx("h2",{className:"text-lg font-semibold text-gray-900",children:d?"Edit User":"Create New User"}),a.jsx("button",{onClick:N,className:"p-1 text-gray-400 hover:text-gray-600 rounded",children:a.jsx(Eh,{className:"w-5 h-5"})})]}),a.jsxs("div",{className:"px-6 py-4 space-y-4",children:[m&&a.jsxs("div",{className:"bg-red-50 border border-red-200 rounded-lg p-3 flex items-center gap-2",children:[a.jsx(ha,{className:"w-4 h-4 text-red-500"}),a.jsx("p",{className:"text-sm text-red-700",children:m})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Email"}),a.jsx("input",{type:"email",value:f.email,onChange:D=>p({...f,email:D.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"user@example.com"})]}),a.jsxs("div",{children:[a.jsxs("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:["Password ",d&&a.jsx("span",{className:"text-gray-400 font-normal",children:"(leave blank to keep current)"})]}),a.jsx("input",{type:"password",value:f.password,onChange:D=>p({...f,password:D.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:d?"••••••••":"Enter password"})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Role"}),a.jsxs("select",{value:f.role,onChange:D=>p({...f,role:D.target.value}),className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500",children:[a.jsx("option",{value:"viewer",children:"Viewer"}),a.jsx("option",{value:"analyst",children:"Analyst"}),a.jsx("option",{value:"admin",children:"Admin"}),(e==null?void 0:e.role)==="superadmin"&&a.jsx("option",{value:"superadmin",children:"Superadmin"})]})]})]}),a.jsxs("div",{className:"flex items-center justify-end gap-3 px-6 py-4 border-t border-gray-200 bg-gray-50",children:[a.jsx("button",{onClick:N,className:"px-4 py-2 text-gray-700 hover:bg-gray-100 rounded-lg transition-colors",disabled:g,children:"Cancel"}),a.jsx("button",{onClick:d?y:j,disabled:g,className:"flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors disabled:opacity-50",children:g?a.jsxs(a.Fragment,{children:[a.jsx("div",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-white"}),"Saving..."]}):a.jsxs(a.Fragment,{children:[a.jsx(ZA,{className:"w-4 h-4"}),d?"Update":"Create"]})})]})]})})]})}function CW(){return a.jsxs("div",{className:"min-h-screen bg-base-200",children:[a.jsx("div",{className:"hero min-h-[70vh] bg-gradient-to-br from-primary to-secondary",children:a.jsx("div",{className:"hero-content text-center text-neutral-content",children:a.jsxs("div",{className:"max-w-2xl",children:[a.jsx("h1",{className:"mb-5 text-5xl font-bold text-white",children:"Cannabrands Intelligence"}),a.jsx("p",{className:"mb-8 text-xl text-white/90",children:"Real-time cannabis menu data for dispensaries. Track products, prices, and availability across your favorite stores with our powerful API."}),a.jsxs("div",{className:"flex gap-4 justify-center flex-wrap",children:[a.jsx($l,{to:"/login",className:"btn btn-lg bg-white text-primary hover:bg-gray-100",children:"Sign In"}),a.jsx("a",{href:"/downloads/cb-wpmenu-1.5.1.zip",className:"btn btn-lg btn-outline text-white border-white hover:bg-white hover:text-primary",children:"Download WordPress Plugin"})]})]})})}),a.jsx("div",{className:"py-20 px-4",children:a.jsxs("div",{className:"max-w-6xl mx-auto",children:[a.jsx("h2",{className:"text-3xl font-bold text-center mb-12",children:"Why Choose Cannabrands Intelligence?"}),a.jsxs("div",{className:"grid md:grid-cols-3 gap-8",children:[a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body items-center text-center",children:[a.jsx("div",{className:"text-4xl mb-4",children:"📊"}),a.jsx("h3",{className:"card-title",children:"Real-Time Data"}),a.jsx("p",{children:"Get up-to-date product information, prices, and stock levels directly from dispensary menus."})]})}),a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body items-center text-center",children:[a.jsx("div",{className:"text-4xl mb-4",children:"🔌"}),a.jsx("h3",{className:"card-title",children:"Easy Integration"}),a.jsx("p",{children:"Simple REST API and WordPress plugin make it easy to display menus on your website."})]})}),a.jsx("div",{className:"card bg-base-100 shadow-xl",children:a.jsxs("div",{className:"card-body items-center text-center",children:[a.jsx("div",{className:"text-4xl mb-4",children:"📈"}),a.jsx("h3",{className:"card-title",children:"Analytics Ready"}),a.jsx("p",{children:"Track price changes, brand performance, and market trends with historical data."})]})})]})]})}),a.jsx("div",{className:"py-20 px-4 bg-base-100",children:a.jsxs("div",{className:"max-w-4xl mx-auto text-center",children:[a.jsx("h2",{className:"text-3xl font-bold mb-6",children:"WordPress Integration"}),a.jsx("p",{className:"text-lg mb-8",children:"Display your dispensary menu directly on your WordPress site with our free plugin. Features Elementor widgets and shortcode support for maximum flexibility."}),a.jsxs("div",{className:"mockup-code text-left mb-8",children:[a.jsx("pre",{"data-prefix":"1",children:a.jsx("code",{children:'[cb_products limit="12" columns="3"]'})}),a.jsx("pre",{"data-prefix":"2",children:a.jsx("code",{children:'[cb_product id="123"]'})})]}),a.jsx("a",{href:"/downloads/cb-wpmenu-1.5.1.zip",className:"btn btn-primary btn-lg",children:"Download Plugin v1.5.1"})]})}),a.jsx("div",{className:"py-20 px-4 bg-gradient-to-r from-primary to-secondary",children:a.jsxs("div",{className:"max-w-2xl mx-auto text-center text-white",children:[a.jsx("h2",{className:"text-3xl font-bold mb-6",children:"Ready to Get Started?"}),a.jsx("p",{className:"text-lg mb-8",children:"Contact us to get your API key and start integrating cannabis menu data into your applications."}),a.jsx($l,{to:"/login",className:"btn btn-lg bg-white text-primary hover:bg-gray-100",children:"Access Dashboard"})]})}),a.jsx("footer",{className:"footer footer-center p-10 bg-base-300 text-base-content",children:a.jsxs("div",{children:[a.jsx("p",{className:"font-bold",children:"Cannabrands Intelligence"}),a.jsxs("p",{children:["Powered by ",a.jsx("a",{href:"https://creationshop.io",target:"_blank",rel:"noopener noreferrer",className:"link link-primary",children:"Creationshop"})]})]})})]})}function ge({children:e}){const{isAuthenticated:t,checkAuth:r}=Kc();return h.useEffect(()=>{r()},[]),t?a.jsx(a.Fragment,{children:e}):a.jsx(V1,{to:"/login",replace:!0})}function AW(){return a.jsx(rA,{children:a.jsxs(YC,{children:[a.jsx(oe,{path:"/login",element:a.jsx(IA,{})}),a.jsx(oe,{path:"/",element:a.jsx(CW,{})}),a.jsx(oe,{path:"/dashboard",element:a.jsx(ge,{children:a.jsx(QB,{})})}),a.jsx(oe,{path:"/products",element:a.jsx(ge,{children:a.jsx(eW,{})})}),a.jsx(oe,{path:"/products/:id",element:a.jsx(ge,{children:a.jsx(rW,{})})}),a.jsx(oe,{path:"/stores",element:a.jsx(ge,{children:a.jsx(nW,{})})}),a.jsx(oe,{path:"/dispensaries",element:a.jsx(ge,{children:a.jsx(iW,{})})}),a.jsx(oe,{path:"/dispensaries/:state/:city/:slug",element:a.jsx(ge,{children:a.jsx(aW,{})})}),a.jsx(oe,{path:"/stores/:state/:storeName/:slug/brands",element:a.jsx(ge,{children:a.jsx(oW,{})})}),a.jsx(oe,{path:"/stores/:state/:storeName/:slug/specials",element:a.jsx(ge,{children:a.jsx(lW,{})})}),a.jsx(oe,{path:"/stores/:state/:storeName/:slug",element:a.jsx(ge,{children:a.jsx(sW,{})})}),a.jsx(oe,{path:"/categories",element:a.jsx(ge,{children:a.jsx(cW,{})})}),a.jsx(oe,{path:"/campaigns",element:a.jsx(ge,{children:a.jsx(uW,{})})}),a.jsx(oe,{path:"/analytics",element:a.jsx(ge,{children:a.jsx(fW,{})})}),a.jsx(oe,{path:"/settings",element:a.jsx(ge,{children:a.jsx(pW,{})})}),a.jsx(oe,{path:"/changes",element:a.jsx(ge,{children:a.jsx(jW,{})})}),a.jsx(oe,{path:"/proxies",element:a.jsx(ge,{children:a.jsx(mW,{})})}),a.jsx(oe,{path:"/logs",element:a.jsx(ge,{children:a.jsx(xW,{})})}),a.jsx(oe,{path:"/scraper-tools",element:a.jsx(ge,{children:a.jsx(bW,{})})}),a.jsx(oe,{path:"/scraper-monitor",element:a.jsx(ge,{children:a.jsx(yW,{})})}),a.jsx(oe,{path:"/scraper-schedule",element:a.jsx(ge,{children:a.jsx(vW,{})})}),a.jsx(oe,{path:"/az-schedule",element:a.jsx(ge,{children:a.jsx(SW,{})})}),a.jsx(oe,{path:"/az",element:a.jsx(ge,{children:a.jsx(NW,{})})}),a.jsx(oe,{path:"/az/stores/:id",element:a.jsx(ge,{children:a.jsx(kW,{})})}),a.jsx(oe,{path:"/api-permissions",element:a.jsx(ge,{children:a.jsx(wW,{})})}),a.jsx(oe,{path:"/wholesale-analytics",element:a.jsx(ge,{children:a.jsx(_W,{})})}),a.jsx(oe,{path:"/users",element:a.jsx(ge,{children:a.jsx(PW,{})})}),a.jsx(oe,{path:"*",element:a.jsx(V1,{to:"/dashboard",replace:!0})})]})})}Td.createRoot(document.getElementById("root")).render(a.jsx(hs.StrictMode,{children:a.jsx(AW,{})})); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 66603e29..8b0709e5 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,8 +5,8 @@ Dutchie Menus Admin - - + +
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 79685970..3fb4c1f1 100755 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -24,6 +24,8 @@ import { DutchieAZSchedule } from './pages/DutchieAZSchedule'; import { DutchieAZStores } from './pages/DutchieAZStores'; import { DutchieAZStoreDetail } from './pages/DutchieAZStoreDetail'; import { WholesaleAnalytics } from './pages/WholesaleAnalytics'; +import { Users } from './pages/Users'; +import LandingPage from './pages/LandingPage'; import { PrivateRoute } from './components/PrivateRoute'; export default function App() { @@ -31,7 +33,8 @@ export default function App() { } /> - } /> + } /> + } /> } /> } /> } /> @@ -55,7 +58,8 @@ export default function App() { } /> } /> } /> - } /> + } /> + } /> ); diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index d01542ce..41127498 100755 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -19,7 +19,8 @@ import { Settings, LogOut, CheckCircle, - Key + Key, + Users } from 'lucide-react'; interface LayoutProps { @@ -126,10 +127,10 @@ export function Layout({ children }: LayoutProps) { diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 4972a8dd..03ad751a 100755 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -1035,6 +1035,35 @@ class ApiClient { method: 'POST', }); } + + // Users Management + async getUsers() { + return this.request<{ users: Array<{ id: number; email: string; role: string; created_at: string; updated_at: string }> }>('/api/users'); + } + + async getUser(id: number) { + return this.request<{ user: { id: number; email: string; role: string; created_at: string; updated_at: string } }>(`/api/users/${id}`); + } + + async createUser(data: { email: string; password: string; role?: string }) { + return this.request<{ user: { id: number; email: string; role: string; created_at: string; updated_at: string } }>('/api/users', { + method: 'POST', + body: JSON.stringify(data), + }); + } + + async updateUser(id: number, data: { email?: string; password?: string; role?: string }) { + return this.request<{ user: { id: number; email: string; role: string; created_at: string; updated_at: string } }>(`/api/users/${id}`, { + method: 'PUT', + body: JSON.stringify(data), + }); + } + + async deleteUser(id: number) { + return this.request<{ success: boolean }>(`/api/users/${id}`, { + method: 'DELETE', + }); + } } export const api = new ApiClient(API_URL); diff --git a/frontend/src/pages/DispensaryDetail.tsx b/frontend/src/pages/DispensaryDetail.tsx index d9b8b386..432e3baa 100644 --- a/frontend/src/pages/DispensaryDetail.tsx +++ b/frontend/src/pages/DispensaryDetail.tsx @@ -39,9 +39,13 @@ export function DispensaryDetail() { const date = new Date(dateStr); const now = new Date(); const diffMs = now.getTime() - date.getTime(); + const diffMinutes = Math.floor(diffMs / (1000 * 60)); + const diffHours = Math.floor(diffMs / (1000 * 60 * 60)); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); - if (diffDays === 0) return 'Today'; + if (diffMinutes < 1) return 'Just now'; + if (diffMinutes < 60) return `${diffMinutes}m ago`; + if (diffHours < 24) return `${diffHours}h ago`; if (diffDays === 1) return 'Yesterday'; if (diffDays < 7) return `${diffDays} days ago`; return date.toLocaleDateString(); diff --git a/frontend/src/pages/DutchieAZStoreDetail.tsx b/frontend/src/pages/DutchieAZStoreDetail.tsx index db0ddcc5..27f839a0 100644 --- a/frontend/src/pages/DutchieAZStoreDetail.tsx +++ b/frontend/src/pages/DutchieAZStoreDetail.tsx @@ -39,9 +39,13 @@ export function DutchieAZStoreDetail() { const date = new Date(dateStr); const now = new Date(); const diffMs = now.getTime() - date.getTime(); + const diffMinutes = Math.floor(diffMs / (1000 * 60)); + const diffHours = Math.floor(diffMs / (1000 * 60 * 60)); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); - if (diffDays === 0) return 'Today'; + if (diffMinutes < 1) return 'Just now'; + if (diffMinutes < 60) return `${diffMinutes}m ago`; + if (diffHours < 24) return `${diffHours}h ago`; if (diffDays === 1) return 'Yesterday'; if (diffDays < 7) return `${diffDays} days ago`; return date.toLocaleDateString(); diff --git a/frontend/src/pages/DutchieAZStores.tsx b/frontend/src/pages/DutchieAZStores.tsx index d6af7935..070faf32 100644 --- a/frontend/src/pages/DutchieAZStores.tsx +++ b/frontend/src/pages/DutchieAZStores.tsx @@ -134,6 +134,7 @@ export function DutchieAZStores() { Name City + Menu Type Platform ID Status Actions @@ -161,6 +162,22 @@ export function DutchieAZStores() { {store.city}, {store.state} + + {store.menu_type ? ( + + {store.menu_type} + + ) : ( + unknown + )} + {store.platform_dispensary_id ? ( {store.platform_dispensary_id} diff --git a/frontend/src/pages/LandingPage.tsx b/frontend/src/pages/LandingPage.tsx new file mode 100644 index 00000000..801d17b8 --- /dev/null +++ b/frontend/src/pages/LandingPage.tsx @@ -0,0 +1,103 @@ +import { Link } from 'react-router-dom'; + +export default function LandingPage() { + return ( +
+ {/* Hero Section */} +
+
+
+

Cannabrands Intelligence

+

+ Real-time cannabis menu data for dispensaries. Track products, prices, and availability + across your favorite stores with our powerful API. +

+ +
+
+
+ + {/* Features Section */} +
+
+

Why Choose Cannabrands Intelligence?

+ +
+
+
+
📊
+

Real-Time Data

+

Get up-to-date product information, prices, and stock levels directly from dispensary menus.

+
+
+ +
+
+
🔌
+

Easy Integration

+

Simple REST API and WordPress plugin make it easy to display menus on your website.

+
+
+ +
+
+
📈
+

Analytics Ready

+

Track price changes, brand performance, and market trends with historical data.

+
+
+
+
+
+ + {/* WordPress Plugin Section */} +
+
+

WordPress Integration

+

+ Display your dispensary menu directly on your WordPress site with our free plugin. + Features Elementor widgets and shortcode support for maximum flexibility. +

+
+
[cb_products limit="12" columns="3"]
+
[cb_product id="123"]
+
+ + Download Plugin v1.5.1 + +
+
+ + {/* CTA Section */} +
+
+

Ready to Get Started?

+

+ Contact us to get your API key and start integrating cannabis menu data into your applications. +

+ + Access Dashboard + +
+
+ + {/* Footer */} +
+
+

Cannabrands Intelligence

+

Powered by Creationshop

+
+
+
+ ); +} diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index 3e850c3f..a28c1c2c 100755 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -17,7 +17,7 @@ export function Login() { try { await login(email, password); - navigate('/'); + navigate('/dashboard'); } catch (err: any) { setError(err.message || 'Login failed'); } finally { @@ -41,7 +41,7 @@ export function Login() { width: '100%', maxWidth: '400px' }}> -

Dutchie Menus

+

Cannabrands Menus

Admin Dashboard

{error && ( diff --git a/frontend/src/pages/ScraperTools.tsx b/frontend/src/pages/ScraperTools.tsx index dbe3ac0e..1f1eae88 100644 --- a/frontend/src/pages/ScraperTools.tsx +++ b/frontend/src/pages/ScraperTools.tsx @@ -1,8 +1,25 @@ -import { useEffect, useState } from 'react'; +import { useEffect, useState, useCallback } from 'react'; import { Layout } from '../components/Layout'; import { api } from '../lib/api'; import { Toast } from '../components/Toast'; +interface ProcessInfo { + pid: number; + user: string; + cpu: string; + mem: string; + elapsed: string; + command: string; + pattern: string; +} + +interface StaleProcessStatus { + total: number; + processes: ProcessInfo[]; + summary: Record; + patterns: string[]; +} + const USER_AGENTS = { 'rotate-desktop': 'Desktop (Rotate)', 'rotate-mobile': 'Mobile (Rotate)', @@ -26,10 +43,94 @@ export function ScraperTools() { const [notification, setNotification] = useState<{ message: string; type: 'success' | 'error' | 'info' } | null>(null); const [loading, setLoading] = useState(true); + // Stale process monitor state + const [staleProcesses, setStaleProcesses] = useState(null); + const [loadingProcesses, setLoadingProcesses] = useState(false); + const [killingProcess, setKillingProcess] = useState(null); + const [cleaningAll, setCleaningAll] = useState(false); + useEffect(() => { loadDispensaries(); + loadStaleProcesses(); }, []); + const loadStaleProcesses = useCallback(async () => { + setLoadingProcesses(true); + try { + const response = await fetch('/api/stale-processes/status'); + if (response.ok) { + const data = await response.json(); + setStaleProcesses(data); + } + } catch (error) { + console.error('Failed to load stale processes:', error); + } finally { + setLoadingProcesses(false); + } + }, []); + + const handleKillProcess = async (pid: number) => { + setKillingProcess(pid); + try { + const response = await fetch(`/api/stale-processes/kill/${pid}`, { method: 'POST' }); + const data = await response.json(); + if (data.success) { + setNotification({ message: `Process ${pid} killed`, type: 'success' }); + loadStaleProcesses(); + } else { + setNotification({ message: data.error || 'Failed to kill process', type: 'error' }); + } + } catch (error: any) { + setNotification({ message: 'Failed to kill process: ' + error.message, type: 'error' }); + } finally { + setKillingProcess(null); + } + }; + + const handleKillPattern = async (pattern: string) => { + try { + const response = await fetch('/api/stale-processes/kill-pattern', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ pattern }) + }); + const data = await response.json(); + if (data.success) { + setNotification({ message: `Killed ${data.killed.length} processes matching "${pattern}"`, type: 'success' }); + loadStaleProcesses(); + } else { + setNotification({ message: data.error || 'Failed to kill processes', type: 'error' }); + } + } catch (error: any) { + setNotification({ message: 'Failed to kill processes: ' + error.message, type: 'error' }); + } + }; + + const handleCleanAll = async (dryRun: boolean = false) => { + setCleaningAll(true); + try { + const response = await fetch('/api/stale-processes/clean-all', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ dryRun }) + }); + const data = await response.json(); + if (data.success) { + const msg = dryRun + ? `Would kill ${data.totalKilled} processes` + : `Killed ${data.totalKilled} processes`; + setNotification({ message: msg, type: 'success' }); + if (!dryRun) loadStaleProcesses(); + } else { + setNotification({ message: data.error || 'Failed to clean processes', type: 'error' }); + } + } catch (error: any) { + setNotification({ message: 'Failed to clean processes: ' + error.message, type: 'error' }); + } finally { + setCleaningAll(false); + } + }; + const loadDispensaries = async () => { setLoading(true); try { @@ -202,6 +303,144 @@ export function ScraperTools() { + {/* Stale Process Monitor */} +
+
+
+

Stale Process Monitor

+
+ +
+
+

+ Monitor and clean up stale background processes from Claude Code sessions +

+ + {loadingProcesses && !staleProcesses ? ( +
+ +
+ ) : staleProcesses ? ( + <> + {/* Summary Stats */} +
+
+
Total Processes
+
0 ? 'text-warning' : 'text-success'}`}> + {staleProcesses.total} +
+
{staleProcesses.patterns.length} patterns monitored
+
+
+ + {/* Process Summary by Pattern */} + {Object.entries(staleProcesses.summary).length > 0 && ( +
+

Processes by Pattern

+
+ {Object.entries(staleProcesses.summary).map(([pattern, count]) => ( +
+ {pattern} + {count} + +
+ ))} +
+
+ )} + + {/* Process List */} + {staleProcesses.processes.length > 0 && ( +
+ + + + + + + + + + + + + + {staleProcesses.processes.map((proc) => ( + + + + + + + + + + ))} + +
PIDUserCPUMemElapsedCommand
{proc.pid}{proc.user}{proc.cpu}%{proc.mem}%{proc.elapsed} + {proc.command} + + +
+
+ )} + + {/* Actions */} +
+ + +
+ + ) : ( +
+ Failed to load stale processes +
+ )} +
+
+ {/* Quick Links */}
diff --git a/frontend/src/pages/Users.tsx b/frontend/src/pages/Users.tsx new file mode 100644 index 00000000..c2699d88 --- /dev/null +++ b/frontend/src/pages/Users.tsx @@ -0,0 +1,399 @@ +import { useState, useEffect } from 'react'; +import { Layout } from '../components/Layout'; +import { api } from '../lib/api'; +import { useAuthStore } from '../store/authStore'; +import { Users as UsersIcon, Plus, Pencil, Trash2, X, Check, AlertCircle } from 'lucide-react'; + +interface User { + id: number; + email: string; + role: string; + created_at: string; + updated_at: string; +} + +interface UserFormData { + email: string; + password: string; + role: string; +} + +export function Users() { + const { user: currentUser } = useAuthStore(); + const [users, setUsers] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [showCreateModal, setShowCreateModal] = useState(false); + const [editingUser, setEditingUser] = useState(null); + const [formData, setFormData] = useState({ email: '', password: '', role: 'viewer' }); + const [formError, setFormError] = useState(null); + const [saving, setSaving] = useState(false); + + const fetchUsers = async () => { + try { + setLoading(true); + const response = await api.getUsers(); + setUsers(response.users); + setError(null); + } catch (err: any) { + setError(err.message || 'Failed to fetch users'); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + fetchUsers(); + }, []); + + const handleCreate = async () => { + if (!formData.email || !formData.password) { + setFormError('Email and password are required'); + return; + } + + try { + setSaving(true); + setFormError(null); + await api.createUser(formData); + setShowCreateModal(false); + setFormData({ email: '', password: '', role: 'viewer' }); + fetchUsers(); + } catch (err: any) { + setFormError(err.message || 'Failed to create user'); + } finally { + setSaving(false); + } + }; + + const handleUpdate = async () => { + if (!editingUser) return; + + const updateData: Partial = {}; + if (formData.email && formData.email !== editingUser.email) { + updateData.email = formData.email; + } + if (formData.password) { + updateData.password = formData.password; + } + if (formData.role && formData.role !== editingUser.role) { + updateData.role = formData.role; + } + + if (Object.keys(updateData).length === 0) { + setEditingUser(null); + return; + } + + try { + setSaving(true); + setFormError(null); + await api.updateUser(editingUser.id, updateData); + setEditingUser(null); + setFormData({ email: '', password: '', role: 'viewer' }); + fetchUsers(); + } catch (err: any) { + setFormError(err.message || 'Failed to update user'); + } finally { + setSaving(false); + } + }; + + const handleDelete = async (user: User) => { + if (!confirm(`Are you sure you want to delete ${user.email}?`)) { + return; + } + + try { + await api.deleteUser(user.id); + fetchUsers(); + } catch (err: any) { + alert(err.message || 'Failed to delete user'); + } + }; + + const openEditModal = (user: User) => { + setEditingUser(user); + setFormData({ email: user.email, password: '', role: user.role }); + setFormError(null); + }; + + const closeModal = () => { + setShowCreateModal(false); + setEditingUser(null); + setFormData({ email: '', password: '', role: 'viewer' }); + setFormError(null); + }; + + const getRoleBadgeColor = (role: string) => { + switch (role) { + case 'superadmin': + return 'bg-purple-100 text-purple-800'; + case 'admin': + return 'bg-blue-100 text-blue-800'; + case 'analyst': + return 'bg-green-100 text-green-800'; + case 'viewer': + return 'bg-gray-100 text-gray-700'; + default: + return 'bg-gray-100 text-gray-700'; + } + }; + + const canModifyUser = (user: User) => { + // Can't modify yourself + if (currentUser?.id === user.id) return false; + // Only superadmin can modify superadmin users + if (user.role === 'superadmin' && currentUser?.role !== 'superadmin') return false; + return true; + }; + + return ( + +
+ {/* Header */} +
+
+ +
+

User Management

+

Manage system users and their roles

+
+
+ +
+ + {/* Error Message */} + {error && ( +
+ +

{error}

+
+ )} + + {/* Users Table */} +
+ {loading ? ( +
+
+

Loading users...

+
+ ) : users.length === 0 ? ( +
+ No users found +
+ ) : ( + + + + + + + + + + + {users.map((user) => ( + + + + + + + ))} + +
+ Email + + Role + + Created + + Actions +
+
+
+ + {user.email.charAt(0).toUpperCase()} + +
+
+

{user.email}

+ {currentUser?.id === user.id && ( +

(you)

+ )} +
+
+
+ + {user.role} + + + {new Date(user.created_at).toLocaleDateString()} + + {canModifyUser(user) ? ( +
+ + +
+ ) : ( + + )} +
+ )} +
+ + {/* Role Legend */} +
+

Role Permissions

+
+
+ + superadmin + +

Full system access

+
+
+ + admin + +

Manage users & settings

+
+
+ + analyst + +

View & analyze data

+
+
+ + viewer + +

Read-only access

+
+
+
+
+ + {/* Create/Edit Modal */} + {(showCreateModal || editingUser) && ( +
+
+
+

+ {editingUser ? 'Edit User' : 'Create New User'} +

+ +
+ +
+ {formError && ( +
+ +

{formError}

+
+ )} + +
+ + setFormData({ ...formData, email: e.target.value })} + className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" + placeholder="user@example.com" + /> +
+ +
+ + setFormData({ ...formData, password: e.target.value })} + className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" + placeholder={editingUser ? '••••••••' : 'Enter password'} + /> +
+ +
+ + +
+
+ +
+ + +
+
+
+ )} + + ); +} diff --git a/public/downloads/.gitkeep b/public/downloads/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/scripts/stale-process-monitor.sh b/scripts/stale-process-monitor.sh new file mode 100755 index 00000000..c97b5cb4 --- /dev/null +++ b/scripts/stale-process-monitor.sh @@ -0,0 +1,248 @@ +#!/bin/bash +# Stale Process Monitor +# Manages and cleans up stale background processes from Claude Code sessions + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Process patterns to monitor +STALE_PATTERNS=( + "kubectl port-forward" + "npm run dev" + "npx tsx" + "node dist/index.js" + "docker push" + "kubectl exec" +) + +# Maximum age in minutes before a process is considered stale +MAX_AGE_MINUTES=${MAX_AGE_MINUTES:-60} + +print_header() { + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} Stale Process Monitor${NC}" + echo -e "${BLUE}========================================${NC}" + echo "" +} + +list_processes() { + local pattern="$1" + local count=0 + + while IFS= read -r line; do + if [[ -n "$line" ]]; then + ((count++)) + local pid=$(echo "$line" | awk '{print $1}') + local start_time=$(ps -o lstart= -p "$pid" 2>/dev/null || echo "unknown") + local elapsed=$(ps -o etime= -p "$pid" 2>/dev/null | tr -d ' ' || echo "unknown") + local cmd=$(echo "$line" | awk '{$1=""; $2=""; print $0}' | sed 's/^ *//') + + echo -e " ${YELLOW}PID:${NC} $pid ${YELLOW}Elapsed:${NC} $elapsed" + echo -e " ${YELLOW}Cmd:${NC} ${cmd:0:80}..." + echo "" + fi + done < <(ps aux | grep -E "$pattern" | grep -v grep | grep -v "stale-process-monitor") + + return $count +} + +show_status() { + print_header + echo -e "${GREEN}Scanning for potentially stale processes...${NC}" + echo "" + + local total=0 + + for pattern in "${STALE_PATTERNS[@]}"; do + local matches=$(ps aux | grep -E "$pattern" | grep -v grep | grep -v "stale-process-monitor" | wc -l) + if [[ $matches -gt 0 ]]; then + echo -e "${YELLOW}[$pattern]${NC} - $matches process(es) found:" + echo "" + list_processes "$pattern" + ((total += matches)) + fi + done + + echo -e "${BLUE}----------------------------------------${NC}" + echo -e "${GREEN}Total potentially stale processes: $total${NC}" + echo "" + + if [[ $total -eq 0 ]]; then + echo -e "${GREEN}No stale processes detected.${NC}" + fi +} + +kill_pattern() { + local pattern="$1" + local dry_run="$2" + + # Get PIDs from the second column (proper PID column in ps aux) + local pids=$(ps aux | grep -E "$pattern" | grep -v grep | grep -v "stale-process-monitor" | awk '{print $2}') + + if [[ -z "$pids" ]]; then + echo -e "${YELLOW}No processes matching '$pattern'${NC}" + return 0 + fi + + for pid in $pids; do + # Validate that it's actually a number + if [[ "$pid" =~ ^[0-9]+$ ]]; then + if [[ "$dry_run" == "true" ]]; then + echo -e "${YELLOW}[DRY-RUN] Would kill PID $pid${NC}" + else + echo -e "${RED}Killing PID $pid...${NC}" + kill -9 "$pid" 2>/dev/null || echo -e "${YELLOW} (already dead)${NC}" + fi + fi + done +} + +clean_all() { + local dry_run="$1" + + print_header + + if [[ "$dry_run" == "true" ]]; then + echo -e "${YELLOW}DRY RUN MODE - No processes will be killed${NC}" + else + echo -e "${RED}CLEANING ALL STALE PROCESSES${NC}" + fi + echo "" + + for pattern in "${STALE_PATTERNS[@]}"; do + echo -e "${BLUE}Processing: $pattern${NC}" + kill_pattern "$pattern" "$dry_run" + echo "" + done + + echo -e "${GREEN}Cleanup complete.${NC}" +} + +clean_port_forwards() { + local dry_run="$1" + + print_header + echo -e "${BLUE}Cleaning kubectl port-forward processes...${NC}" + echo "" + + kill_pattern "kubectl port-forward" "$dry_run" + + echo "" + echo -e "${GREEN}Port-forward cleanup complete.${NC}" +} + +clean_dev_servers() { + local dry_run="$1" + + print_header + echo -e "${BLUE}Cleaning npm run dev processes...${NC}" + echo "" + + kill_pattern "npm run dev" "$dry_run" + kill_pattern "vite" "$dry_run" + kill_pattern "node.*dist/index.js" "$dry_run" + + echo "" + echo -e "${GREEN}Dev server cleanup complete.${NC}" +} + +interactive_menu() { + while true; do + print_header + echo "Options:" + echo " 1) Show status (list all stale processes)" + echo " 2) Clean all stale processes" + echo " 3) Clean all (dry-run)" + echo " 4) Clean port-forwards only" + echo " 5) Clean dev servers only" + echo " 6) Clean specific pattern" + echo " q) Quit" + echo "" + read -p "Select option: " choice + + case $choice in + 1) show_status ;; + 2) clean_all "false" ;; + 3) clean_all "true" ;; + 4) clean_port_forwards "false" ;; + 5) clean_dev_servers "false" ;; + 6) + read -p "Enter pattern to clean: " pattern + kill_pattern "$pattern" "false" + ;; + q|Q) exit 0 ;; + *) echo -e "${RED}Invalid option${NC}" ;; + esac + + echo "" + read -p "Press Enter to continue..." + done +} + +usage() { + echo "Usage: $0 [command]" + echo "" + echo "Commands:" + echo " status Show all potentially stale processes" + echo " clean Clean all stale processes" + echo " clean-dry Dry-run cleanup (show what would be killed)" + echo " ports Clean kubectl port-forward processes only" + echo " devs Clean dev server processes only" + echo " kill Kill processes matching pattern" + echo " interactive Interactive menu mode" + echo "" + echo "Environment variables:" + echo " MAX_AGE_MINUTES Maximum process age before considered stale (default: 60)" + echo "" + echo "Examples:" + echo " $0 status" + echo " $0 clean" + echo " $0 kill 'kubectl port-forward'" +} + +# Main +case "${1:-}" in + status) + show_status + ;; + clean) + clean_all "false" + ;; + clean-dry) + clean_all "true" + ;; + ports) + clean_port_forwards "false" + ;; + devs) + clean_dev_servers "false" + ;; + kill) + if [[ -z "${2:-}" ]]; then + echo "Error: Pattern required" + usage + exit 1 + fi + kill_pattern "$2" "false" + ;; + interactive|i) + interactive_menu + ;; + help|-h|--help) + usage + ;; + "") + show_status + ;; + *) + echo "Unknown command: $1" + usage + exit 1 + ;; +esac diff --git a/wordpress-plugin/build-plugin.sh b/wordpress-plugin/build-plugin.sh new file mode 100755 index 00000000..1bdf7b00 --- /dev/null +++ b/wordpress-plugin/build-plugin.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# WordPress Plugin Build Script +# Builds the plugin zip with the correct naming convention: cb-wpmenu-{version}.zip + +set -e + +# Get the version from the main plugin file +VERSION=$(grep -oP "Version:\s*\K[0-9.]+" crawlsy-menus.php) + +if [ -z "$VERSION" ]; then + echo "Error: Could not extract version from crawlsy-menus.php" + exit 1 +fi + +# Define paths +PLUGIN_DIR="$(cd "$(dirname "$0")" && pwd)" +OUTPUT_DIR="${PLUGIN_DIR}/../backend/public/downloads" +OUTPUT_FILE="cb-wpmenu-${VERSION}.zip" + +echo "Building WordPress plugin..." +echo " Version: ${VERSION}" +echo " Output: ${OUTPUT_DIR}/${OUTPUT_FILE}" + +# Ensure output directory exists +mkdir -p "${OUTPUT_DIR}" + +# Create the zip file (from the plugin directory) +cd "${PLUGIN_DIR}" +rm -f "${OUTPUT_DIR}/${OUTPUT_FILE}" +zip -r "${OUTPUT_DIR}/${OUTPUT_FILE}" . -x "*.git*" -x "build-plugin.sh" + +echo "" +echo "Build complete!" +echo " File: ${OUTPUT_DIR}/${OUTPUT_FILE}" +echo " Size: $(ls -lh "${OUTPUT_DIR}/${OUTPUT_FILE}" | awk '{print $5}')" +echo "" +echo "IMPORTANT: Update frontend/src/pages/LandingPage.tsx with the new version:" +echo " href=\"/downloads/cb-wpmenu-${VERSION}.zip\"" +echo " Download Plugin v${VERSION}" diff --git a/wordpress-plugin/crawlsy-menus.php b/wordpress-plugin/crawlsy-menus.php index d513f63f..67945a5e 100644 --- a/wordpress-plugin/crawlsy-menus.php +++ b/wordpress-plugin/crawlsy-menus.php @@ -3,7 +3,7 @@ * Plugin Name: Crawlsy Menus * Plugin URI: https://creationshop.io * Description: Display cannabis product menus from Crawlsy with Elementor integration - * Version: 1.5.0 + * Version: 1.5.1 * Author: Creationshop * Author URI: https://creationshop.io * License: GPL v2 or later @@ -15,7 +15,7 @@ if (!defined('ABSPATH')) { exit; // Exit if accessed directly } -define('CRAWLSY_MENUS_VERSION', '1.5.0'); +define('CRAWLSY_MENUS_VERSION', '1.5.1'); define('CRAWLSY_MENUS_API_URL', 'https://dispos.crawlsy.com/api/v1'); define('CRAWLSY_MENUS_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('CRAWLSY_MENUS_PLUGIN_URL', plugin_dir_url(__FILE__)); @@ -144,7 +144,7 @@ class Crawlsy_Menus_Plugin {

Test Connection

- +