{
  "version": 3,
  "sources": ["/cdn/shop/t/47/assets/book-a-demo-v2-jordanen.js?bm=20260509jordanen2"],
  "sourcesContent": ["\"use strict\";\n\n(function () {\n  if (customElements.get(\"book-a-demo-v2\")) return;\n\n  class BookADemoV2 extends HTMLElement {\n    // =================================================================\n    // CONFIGURATION\n    // =================================================================\n    static MODAL_RESIZE_DELAY = 200;\n    static DEFAULT_MAP_ZOOM = 5;\n    static LOCATION_FOCUS_ZOOM = 15;\n    static USER_LOCATION_ZOOM = 10;\n    static MARKER_CANVAS_SIZE = 40;\n    static DEFAULT_MAP_CENTER = { lat: 48.399, lng: 9.987 };\n\n    // =================================================================\n    // PRIVATE PROPERTIES\n    // =================================================================\n    #sectionId = null;\n    #locations = [];\n    #selectedDemoType = null;\n    #selectedLocationHandle = null;\n\n    // DOM Elements\n    #form = null;\n    #dataScript = null;\n    #submitBtn = null;\n    #demoTypeSelect = null;\n    #countrySelect = null;\n    #locationModal = null;\n    #locationRadios = null;\n    #locationCards = [];\n    #locationsList = null;\n    #noPhysicalLocationNotice = null;\n    #selectedLocationDisplay = null;\n    #mapContainer = null;\n    #useMyLocationBtn = null;\n    #mapSearchInput = null;\n\n    // Map Properties\n    #map = null;\n    #markers = [];\n    #userMarker = null;\n    #geocoder = null;\n    #mapInitialized = false;\n    #markerImageUrl = null;\n\n    #noPhysicalMsg = null;\n\n    constructor() {\n      super();\n      this.#sectionId = this.dataset.sectionId;\n      this.#markerImageUrl = this.dataset.markerImageUrl || null;\n      this.#noPhysicalMsg = this.dataset.noPhysicalMsg || \"No physical demo location is available for the selected region. Please choose a virtual demo instead.\";\n    }\n\n    // =================================================================\n    // LIFECYCLE METHODS\n    // =================================================================\n\n    /**\n     * Called when the element is added to the document's DOM.\n     */\n    connectedCallback() {\n      this.#setupElements();\n      this.#parseAndIndexLocations();\n      this.#renderCountryOptions();\n      this.#renderLocationCards();\n      this.#attachEventListeners();\n      this.#syncPhysicalAvailability();\n      this.#syncJordanEnglishOnlyLabels();\n      this.#filterLocationOptions();\n      this.#updateLocationDisplay();\n      this.#updateSubmitButtonState();\n    }\n\n    /**\n     * Called when the element is removed from the document's DOM.\n     */\n    disconnectedCallback() {\n      this.#detachEventListeners();\n    }\n\n    // =================================================================\n    // INITIALIZATION\n    // =================================================================\n\n    /**\n     * Queries and stores references to all necessary DOM elements.\n     */\n    #setupElements() {\n      const selector = (sel) => this.querySelector(sel);\n      const selectorAll = (sel) => this.querySelectorAll(sel);\n\n      this.#form = selector(\"form\");\n      this.#dataScript = selector(`#locations-${this.#sectionId}`);\n      this.#submitBtn = selector(\".bd-form__btn\");\n      this.#demoTypeSelect = selector(`#demoType-${this.#sectionId}`);\n      this.#countrySelect = selector(`#country-${this.#sectionId}`);\n      this.#locationModal = selector('[data-component=\"location-modal\"]');\n      this.#locationsList = selector(\".bd-modal__locations\");\n      this.#noPhysicalLocationNotice = selector(\n        '[data-component=\"no-physical-location\"]',\n      );\n      this.#selectedLocationDisplay = selector(\n        '[data-component=\"selected-location\"]',\n      );\n      this.#mapContainer = selector(\".bd-modal__map\");\n      this.#useMyLocationBtn = selector(\".bd-modal__location-btn\");\n      this.#mapSearchInput = selector(`#map-search-${this.#sectionId}`);\n      this.#locationRadios = selectorAll('input[name=\"location\"]');\n    }\n\n    /**\n     * Parses the location data from the JSON script tag embedded in the Liquid template.\n     */\n    #parseAndIndexLocations() {\n      if (!this.#dataScript?.textContent) return;\n      try {\n        const json = JSON.parse(this.#dataScript.textContent);\n        const rawLocations = json.locations || [];\n        this.#locations = rawLocations.map((location, index) => ({\n          ...location,\n          displayIndex: index + 1,\n          hasPhysical:\n            !!location.url_physical &&\n            !!String(location.address || \"\").trim() &&\n            !!String(location.name || \"\").trim(),\n        }));\n      } catch (e) {\n        console.error(\"Locations JSON parsing error:\", e);\n      }\n    }\n\n    #renderCountryOptions() {\n      if (!this.#countrySelect) return;\n\n      const currentValue = this.#countrySelect.value;\n      const options = this.#locations.map((location) => ({\n        value: location.country_handle,\n        label: location.country,\n      }));\n      const marketCountry = ((window.Shopify && window.Shopify.country) || window.SHOP_COUNTRY || \"\").toUpperCase();\n      const defaultCountryByMarket = {\n        FR: \"France\",\n        NL: \"Netherlands\",\n        BE: \"Belgium\",\n        AT: \"Austria\",\n        CH: \"Switzerland\",\n        IE: \"Ireland\",\n      };\n      const defaultCountryLabel = defaultCountryByMarket[marketCountry];\n      const defaultOption = defaultCountryLabel\n        ? options.find((option) => option.label === defaultCountryLabel)\n        : null;\n\n      this.#countrySelect.innerHTML =\n        '<option value=\"\" selected disabled>Select</option>' +\n        options\n          .map(\n            (option) =>\n              `<option value=\"${this.#escapeHtml(option.value)}\">${this.#escapeHtml(option.label)}</option>`,\n          )\n          .join(\"\");\n\n      if (currentValue && options.some((option) => option.value === currentValue)) {\n        this.#countrySelect.value = currentValue;\n      } else if (defaultOption) {\n        this.#countrySelect.value = defaultOption.value;\n      }\n    }\n\n    #renderLocationCards() {\n      if (!this.#locationsList) return;\n\n      const locationColorScheme = this.dataset.locationColorScheme || \"scheme-2\";\n      const physicalLocations = this.#locations.filter(\n        (location) => location.hasPhysical,\n      );\n\n      const cardsMarkup = physicalLocations\n        .map((location) => {\n          const imageMarkup = location.image_url\n            ? `\n              <div class=\"bd-location__media-wrapper\">\n                <div class=\"bd-locattion__media media media--custom\">\n                  <img src=\"${this.#escapeAttribute(location.image_url)}\" alt=\"${this.#escapeAttribute(location.name || \"Location image\")}\" width=\"1200\" height=\"1200\" sizes=\"100vw\">\n                </div>\n              </div>\n            `\n            : \"\";\n\n          return `\n            <div class=\"bd-location\" data-country=\"${this.#escapeAttribute(location.country)}\" data-country-handle=\"${this.#escapeAttribute(location.country_handle)}\">\n              <input\n                type=\"radio\"\n                name=\"location\"\n                id=\"location-${this.#escapeAttribute(location.country_handle)}\"\n                value=\"${this.#escapeAttribute(location.country_handle)}\"\n                class=\"visually-hidden\"\n              >\n              <label class=\"bd-location__wrapper color-${this.#escapeAttribute(locationColorScheme)}\" for=\"location-${this.#escapeAttribute(location.country_handle)}\">\n                <div class=\"bd-location__checkbox\">\n                  <span class=\"svg-wrapper\">\u2713</span>\n                </div>\n                ${imageMarkup}\n                <div class=\"bd-location__inner\">\n                  <div class=\"bd-location__name\">${this.#escapeHtml(location.name)}</div>\n                  <div class=\"bd-location__address\">${this.#escapeHtml(location.address)}</div>\n                </div>\n              </label>\n            </div>\n          `;\n        })\n        .join(\"\");\n\n      this.#locationsList.innerHTML = `\n        <div class=\"bd-modal__empty hidden\" data-component=\"no-physical-location\">\n          ${this.#noPhysicalMsg}\n        </div>\n        ${cardsMarkup}\n      `;\n\n      this.#noPhysicalLocationNotice = this.querySelector(\n        '[data-component=\"no-physical-location\"]',\n      );\n      this.#locationRadios = this.querySelectorAll('input[name=\"location\"]');\n      this.#locationCards = Array.from(this.querySelectorAll(\".bd-location\"));\n    }\n\n    /**\n     * Attaches all necessary event listeners to the component's elements.\n     */\n    #attachEventListeners() {\n      this.#demoTypeSelect?.addEventListener(\n        \"change\",\n        this.#handleDemoTypeChange,\n      );\n      this.#countrySelect?.addEventListener(\n        \"change\",\n        this.#handleCountryChange,\n      );\n      this.#form?.addEventListener(\"submit\", this.#handleFormSubmit);\n      this.#useMyLocationBtn?.addEventListener(\n        \"click\",\n        this.#handleUseMyLocation,\n      );\n\n      this.#locationRadios.forEach((radio) => {\n        radio.addEventListener(\"change\", this.#handleLocationChange);\n      });\n\n      // Add a click listener to the location container to check the inner radio button.\n      this.#locationCards.forEach((item) => {\n        item.addEventListener(\"click\", () => {\n          const radio = item.querySelector('input[type=\"radio\"]');\n          if (radio && !radio.checked) {\n            radio.checked = true;\n            radio.dispatchEvent(new Event(\"change\", { bubbles: true }));\n          }\n        });\n      });\n    }\n\n    /**\n     * Cleans up event listeners when the component is removed from the DOM.\n     */\n    #detachEventListeners() {\n      this.#demoTypeSelect?.removeEventListener(\n        \"change\",\n        this.#handleDemoTypeChange,\n      );\n      this.#countrySelect?.removeEventListener(\n        \"change\",\n        this.#handleCountryChange,\n      );\n      this.#form?.removeEventListener(\"submit\", this.#handleFormSubmit);\n      this.#useMyLocationBtn?.removeEventListener(\n        \"click\",\n        this.#handleUseMyLocation,\n      );\n      this.#locationRadios.forEach((radio) => {\n        radio.removeEventListener(\"change\", this.#handleLocationChange);\n      });\n    }\n\n    // =================================================================\n    // EVENT HANDLERS\n    // =================================================================\n\n    /**\n     * Handles changes to the \"Demo Type\" dropdown.\n     * @param {Event} e - The change event object.\n     */\n    #handleDemoTypeChange = (e) => {\n      this.#selectedDemoType = e.target.value;\n      this.#clearLocationSelection();\n      this.#filterLocationOptions();\n\n      if (this.#selectedDemoType === \"physical\") {\n        this.#showLocationModal();\n        this.#initMap(); // Initialize the map if not already done.\n      } else {\n        this.#hideLocationModal();\n      }\n      this.#updateSubmitButtonState();\n    };\n\n    /**\n     * Handles changes to the \"Country\" dropdown.\n     */\n    #handleCountryChange = () => {\n      this.#clearLocationSelection();\n      this.#syncPhysicalAvailability();\n      this.#syncJordanEnglishOnlyLabels();\n      this.#filterLocationOptions();\n      this.#updateSubmitButtonState();\n    };\n\n    /**\n     * Handles changes to the location radio buttons.\n     * @param {Event} e - The change event object.\n     */\n    #handleLocationChange = (e) => {\n      if (!e.target.checked) return;\n      this.#selectedLocationHandle = e.target.value;\n      this.#updateLocationDisplay();\n      this.#updateSubmitButtonState();\n\n      // Pan the map to the selected marker.\n      const marker = this.#markers.find(\n        (m) => m.country_handle === this.#selectedLocationHandle,\n      );\n      if (marker) {\n        this.#map.panTo(marker.getPosition());\n        this.#map.setZoom(BookADemoV2.LOCATION_FOCUS_ZOOM);\n        google.maps.event.trigger(marker, \"click\");\n      }\n    };\n\n    /**\n     * Handles the form submission, redirecting the user to the appropriate URL.\n     * @param {Event} e - The submit event object.\n     */\n    #handleFormSubmit = (e) => {\n      e.preventDefault();\n      if (!this.#isFormValid()) return;\n\n      const handle =\n        this.#selectedDemoType === \"physical\"\n          ? this.#selectedLocationHandle\n          : this.#countrySelect.value;\n\n      const location = this.#locations.find((l) => l.country_handle === handle);\n\n      let url;\n      if (this.#selectedDemoType === \"physical\") {\n        url = location?.url_physical;\n      } else if (this.#selectedDemoType === \"virtual\") {\n        url = location?.url_virtual;\n      } else if (this.#selectedDemoType === \"quick_qa\") {\n        url = location?.url_quick_qa;\n      } else if (this.#selectedDemoType === \"post_sale\") {\n        url = location?.url_post_sale;\n      }\n\n      if (url) {\n        window.location.href = url;\n      } else if (this.dataset.urlFallback) {\n        window.location.href = this.dataset.urlFallback;\n      }\n    };\n\n    /**\n     * Handles the \"Use my location\" button click.\n     */\n    #handleUseMyLocation = () => {\n      if (!navigator.geolocation) {\n        alert(\"Geolocation is not supported by your browser.\");\n        return;\n      }\n\n      navigator.geolocation.getCurrentPosition(\n        (position) => {\n          const userPos = {\n            lat: position.coords.latitude,\n            lng: position.coords.longitude,\n          };\n\n          this.#map.setCenter(userPos);\n          this.#map.setZoom(BookADemoV2.USER_LOCATION_ZOOM);\n          this.#userMarker?.setMap(null); // Remove old user marker.\n\n          this.#userMarker = new google.maps.Marker({\n            map: this.#map,\n            position: userPos,\n            icon: {\n              path: google.maps.SymbolPath.CIRCLE,\n              scale: 8,\n              fillColor: \"#4285F4\",\n              fillOpacity: 1,\n              strokeColor: \"#fff\",\n              strokeWeight: 2,\n            },\n          });\n          this.#selectNearestMarker(userPos);\n        },\n        () => {\n          alert(\"Unable to retrieve your location.\");\n        },\n      );\n    };\n\n    // =================================================================\n    // STATE & UI MANAGEMENT\n    // =================================================================\n\n    /**\n     * Updates the text display for the selected location.\n     */\n    #updateLocationDisplay() {\n      if (!this.#selectedLocationDisplay) return;\n\n      const radio = this.querySelector(\n        `input[value=\"${this.#selectedLocationHandle}\"]`,\n      );\n\n      if (!radio) {\n        this.#selectedLocationDisplay.textContent = \"\";\n        return;\n      }\n\n      const wrap = radio.closest(\".bd-location\");\n      const address =\n        wrap?.querySelector(\".bd-location__address\")?.textContent.trim() || \"\";\n      const name =\n        wrap?.querySelector(\".bd-location__name\")?.textContent.trim() || \"\";\n      this.#selectedLocationDisplay.textContent = address || name;\n    }\n\n    /**\n     * Enables or disables the submit button based on form validity.\n     */\n    #updateSubmitButtonState() {\n      if (!this.#submitBtn) return;\n      this.#submitBtn.disabled = !this.#isFormValid();\n    }\n\n    /**\n     * Checks if the form is valid for submission.\n     * @returns {boolean} True if the form is valid.\n     */\n    #isFormValid() {\n      if (!this.#selectedDemoType || !this.#countrySelect?.value) return false;\n      // Valid if virtual/quick_qa/post_sale is chosen, or if physical is chosen and a location is selected.\n      return (\n        this.#selectedDemoType === \"virtual\" ||\n        this.#selectedDemoType === \"quick_qa\" ||\n        this.#selectedDemoType === \"post_sale\" ||\n        (this.#selectedDemoType === \"physical\" &&\n          !!this.#selectedLocationHandle)\n      );\n    }\n\n    /**\n     * Shows the location modal.\n     */\n    #showLocationModal() {\n      this.#locationModal?.classList.remove(\"hidden\");\n      // Trigger a map resize after the modal animation to ensure correct rendering.\n      setTimeout(() => {\n        if (this.#map) {\n          google.maps.event.trigger(this.#map, \"resize\");\n        }\n      }, BookADemoV2.MODAL_RESIZE_DELAY);\n    }\n\n    /**\n     * Hides the location modal and clears the selected location display.\n     */\n    #hideLocationModal() {\n      this.#locationModal?.classList.add(\"hidden\");\n      if (this.#selectedLocationDisplay) {\n        this.#selectedLocationDisplay.textContent = \"\";\n      }\n    }\n\n    // =================================================================\n    // MAP LOGIC\n    // =================================================================\n\n    /**\n     * Initializes the Google Map instance.\n     */\n    #initMap() {\n      if (this.#mapInitialized || !window.google?.maps) return;\n      this.#mapInitialized = true;\n      this.#geocoder = new google.maps.Geocoder();\n\n      this.#map = new google.maps.Map(this.#mapContainer, {\n        center: BookADemoV2.DEFAULT_MAP_CENTER,\n        zoom: BookADemoV2.DEFAULT_MAP_ZOOM,\n        mapTypeControl: false,\n        streetViewControl: false,\n      });\n\n      // Use addListenerOnce to run setup logic only the *first* time the map is ready.\n      google.maps.event.addListenerOnce(this.#map, \"idle\", () => {\n        this.#initPlaceAutocomplete();\n        this.#plotAllMarkers();\n      });\n    }\n\n    /**\n     * Initializes the Google Places Autocomplete search input.\n     */\n    async #initPlaceAutocomplete() {\n      if (!this.#mapSearchInput || !window.google?.maps) return;\n\n      try {\n        await google.maps.importLibrary(\"places\");\n        const placeAutocomplete =\n          new google.maps.places.PlaceAutocompleteElement({});\n        placeAutocomplete.placeholder = \"Enter a postal code or address\";\n\n        this.#mapSearchInput.innerHTML = \"\";\n        this.#mapSearchInput.appendChild(placeAutocomplete);\n\n        placeAutocomplete.addEventListener(\"gmp-select\", async (event) => {\n          const placePrediction = event.placePrediction;\n          if (!placePrediction) return;\n\n          try {\n            const place = await placePrediction.toPlace();\n            await place.fetchFields({ fields: [\"location\", \"viewport\"] });\n\n            if (!place.location || !this.#map) return;\n\n            // Force the map to resize, then center and zoom on the selected location.\n            google.maps.event.trigger(this.#map, \"resize\");\n            this.#map.setCenter(place.location);\n            if (place.viewport) {\n              this.#map.fitBounds(place.viewport);\n            } else {\n              this.#map.setZoom(BookADemoV2.LOCATION_FOCUS_ZOOM);\n            }\n          } catch (error) {\n            console.error(\"Error processing selected place:\", error);\n          }\n        });\n      } catch (error) {\n        console.error(\"Failed to initialize PlaceAutocompleteElement:\", error);\n      }\n    }\n\n    /**\n     * Geocodes and plots markers for all store locations.\n     */\n    #plotAllMarkers() {\n      this.#locations.forEach((loc) => {\n        if (!loc.hasPhysical || !loc.address) return;\n\n        this.#geocoder.geocode(\n          { address: loc.address },\n          async (results, status) => {\n            if (status !== \"OK\" || !results?.[0]) {\n              console.error(`Geocode failed for \"${loc.address}\": ${status}`);\n              return;\n            }\n\n            const position = results[0].geometry.location;\n            const iconData = await this.#createNumberedMarkerIcon(\n              loc.displayIndex,\n            );\n\n            const marker = new google.maps.Marker({\n              map: this.#map,\n              position,\n              title: loc.name,\n              icon: iconData, // This will be null if no custom icon is used.\n            });\n            marker.country_handle = loc.country_handle; // Attach custom data.\n            marker.country = loc.country;\n\n            const infoWindow = new google.maps.InfoWindow({\n              content: `<strong>${loc.name}</strong><br>${loc.address}`,\n            });\n\n            marker.addListener(\"click\", () => {\n              infoWindow.open({ map: this.#map, anchor: marker });\n              // Sync the radio button selection with the marker click.\n              const radio = this.querySelector(\n                `#location-${loc.country_handle}`,\n              );\n              if (radio && !radio.checked) {\n                radio.checked = true;\n                radio.dispatchEvent(new Event(\"change\", { bubbles: true }));\n              }\n            });\n            this.#markers.push(marker);\n            this.#syncMarkerVisibility();\n          },\n        );\n      });\n    }\n\n    #clearLocationSelection() {\n      this.#selectedLocationHandle = null;\n      this.#locationRadios.forEach((radio) => {\n        radio.checked = false;\n      });\n      this.#updateLocationDisplay();\n    }\n\n    #getSelectedCountryHandle() {\n      return this.#countrySelect?.value || \"\";\n    }\n\n    #getPhysicalLocationsForSelectedCountry() {\n      const selectedCountryHandle = this.#getSelectedCountryHandle();\n      return this.#locations.filter((location) => {\n        if (!location.hasPhysical) return false;\n        if (!selectedCountryHandle) return true;\n        return location.country_handle === selectedCountryHandle;\n      });\n    }\n\n    #syncJordanEnglishOnlyLabels() {\n      if (!this.#demoTypeSelect || !this.#countrySelect) return;\n      const selectedCountryHandle = this.#getSelectedCountryHandle();\n      const selectedLocation = this.#locations.find(\n        (location) => location.country_handle === selectedCountryHandle,\n      );\n      const isNetherlands = selectedLocation?.country === \"Netherlands\";\n      const routesToJordan = /cal\\.futuremvmt\\.com\\/jordan\\//i.test(\n        `${selectedLocation?.url_virtual || \"\"} ${selectedLocation?.url_quick_qa || \"\"}`,\n      );\n      const shouldShowEnglishOnly = !!selectedLocation && routesToJordan && !isNetherlands;\n\n      [\"virtual\", \"quick_qa\"].forEach((value) => {\n        const option = this.#demoTypeSelect.querySelector(`option[value=\"${value}\"]`);\n        if (!option) return;\n        if (!option.dataset.baseLabel) option.dataset.baseLabel = option.textContent.trim();\n        option.textContent = shouldShowEnglishOnly\n          ? `${option.dataset.baseLabel} - English only`\n          : option.dataset.baseLabel;\n      });\n    }\n    #syncPhysicalAvailability() {\n      const physicalOption = this.#demoTypeSelect?.querySelector(\n        'option[value=\"physical\"]',\n      );\n      if (!physicalOption) return;\n\n      const hasPhysicalLocation = this.#getPhysicalLocationsForSelectedCountry()\n        .length > 0;\n      const selectedCountryHandle = this.#getSelectedCountryHandle();\n\n      // Only disable the physical option \u2014 virtual, quick_qa, and post_sale are always available.\n      physicalOption.disabled = !!selectedCountryHandle && !hasPhysicalLocation;\n\n      if (\n        this.#selectedDemoType === \"physical\" &&\n        selectedCountryHandle &&\n        !hasPhysicalLocation\n      ) {\n        this.#selectedDemoType = null;\n        this.#demoTypeSelect.value = \"\";\n        this.#hideLocationModal();\n      }\n    }\n\n    #filterLocationOptions() {\n      const selectedCountryHandle = this.#getSelectedCountryHandle();\n      let visibleCount = 0;\n\n      this.#locationCards.forEach((item) => {\n        const matches =\n          !selectedCountryHandle ||\n          item.dataset.countryHandle === selectedCountryHandle;\n        item.hidden = !matches;\n        item.classList.toggle(\"hidden\", !matches);\n        if (!matches) {\n          const radio = item.querySelector('input[type=\"radio\"]');\n          if (radio) radio.checked = false;\n        } else {\n          visibleCount += 1;\n        }\n      });\n\n      if (this.#noPhysicalLocationNotice) {\n        const shouldShowEmptyState =\n          !!selectedCountryHandle && visibleCount === 0;\n        this.#noPhysicalLocationNotice.hidden = !shouldShowEmptyState;\n        this.#noPhysicalLocationNotice.classList.toggle(\n          \"hidden\",\n          !shouldShowEmptyState,\n        );\n      }\n\n      this.#syncMarkerVisibility();\n    }\n\n    #syncMarkerVisibility() {\n      if (!this.#map || !this.#markers.length) return;\n\n      const selectedCountryHandle = this.#getSelectedCountryHandle();\n      const visibleMarkers = this.#markers.filter((marker) => {\n        return !selectedCountryHandle || marker.country_handle === selectedCountryHandle;\n      });\n\n      this.#markers.forEach((marker) => {\n        const isVisible =\n          !selectedCountryHandle || marker.country_handle === selectedCountryHandle;\n        marker.setVisible(isVisible);\n      });\n\n      if (!visibleMarkers.length) {\n        this.#map.setCenter(BookADemoV2.DEFAULT_MAP_CENTER);\n        this.#map.setZoom(BookADemoV2.DEFAULT_MAP_ZOOM);\n        return;\n      }\n\n      if (visibleMarkers.length === 1) {\n        this.#map.panTo(visibleMarkers[0].getPosition());\n        this.#map.setZoom(BookADemoV2.LOCATION_FOCUS_ZOOM);\n        return;\n      }\n\n      const bounds = new google.maps.LatLngBounds();\n      visibleMarkers.forEach((marker) => bounds.extend(marker.getPosition()));\n      this.#map.fitBounds(bounds, 48);\n    }\n\n    #escapeHtml(value) {\n      return String(value || \"\")\n        .replaceAll(\"&\", \"&amp;\")\n        .replaceAll(\"<\", \"&lt;\")\n        .replaceAll(\">\", \"&gt;\")\n        .replaceAll('\"', \"&quot;\")\n        .replaceAll(\"'\", \"&#39;\");\n    }\n\n    #escapeAttribute(value) {\n      return this.#escapeHtml(value);\n    }\n\n\n\n    /**\n     * Creates a custom marker icon using the Canvas API to draw a number on an image.\n     * @param {number} number - The number to draw on the marker.\n     * @returns {Promise<google.maps.Icon|null>} A promise that resolves with the marker icon object or null.\n     */\n    #createNumberedMarkerIcon(number) {\n      return new Promise((resolve) => {\n        if (!this.#markerImageUrl) return resolve(null);\n\n        const canvas = document.createElement(\"canvas\");\n        const size = BookADemoV2.MARKER_CANVAS_SIZE;\n        canvas.width = size;\n        canvas.height = size;\n        const context = canvas.getContext(\"2d\");\n        const image = new Image();\n        image.crossOrigin = \"Anonymous\";\n        image.src = this.#markerImageUrl;\n\n        image.onload = () => {\n          context.drawImage(image, 0, 0, size, size);\n          context.font = \"bold 10px Arial\";\n          context.fillStyle = \"white\";\n          context.textAlign = \"center\";\n          context.textBaseline = \"middle\";\n          context.fillText(number.toString(), size / 2, size / 2 + 1);\n\n          resolve({\n            url: canvas.toDataURL(),\n            scaledSize: new google.maps.Size(size, size),\n            anchor: new google.maps.Point(size / 2, size / 2),\n          });\n        };\n\n        image.onerror = () => {\n          console.error(\"Failed to load custom marker image.\");\n          resolve(null);\n        };\n      });\n    }\n\n    /**\n     * Finds and selects the nearest store marker to the user's current position.\n     * @param {{lat: number, lng: number}} userPos - The user's latitude and longitude.\n     */\n    #selectNearestMarker(userPos) {\n      if (this.#markers.length === 0) return;\n\n      const userLatLng = new google.maps.LatLng(userPos.lat, userPos.lng);\n\n      // Use reduce to find the marker with the minimum distance.\n      const closest = this.#markers.reduce(\n        (acc, marker) => {\n          const distance =\n            google.maps.geometry.spherical.computeDistanceBetween(\n              userLatLng,\n              marker.getPosition(),\n            );\n          return distance < acc.distance ? { distance, marker } : acc;\n        },\n        { distance: Infinity, marker: null },\n      );\n\n      if (closest.marker) {\n        google.maps.event.trigger(closest.marker, \"click\");\n      }\n    }\n  }\n\n  customElements.define(\"book-a-demo-v2\", BookADemoV2);\n})();\n"],
  "mappings": "cAEC,UAAY,CACX,GAAI,eAAe,IAAI,gBAAgB,EAAG,OAE1C,MAAM,oBAAoB,WAAY,CAIpC,OAAO,mBAAqB,IAC5B,OAAO,iBAAmB,EAC1B,OAAO,oBAAsB,GAC7B,OAAO,mBAAqB,GAC5B,OAAO,mBAAqB,GAC5B,OAAO,mBAAqB,CAAE,IAAK,OAAQ,IAAK,KAAM,EAKtD,WAAa,KACb,WAAa,CAAC,EACd,kBAAoB,KACpB,wBAA0B,KAG1B,MAAQ,KACR,YAAc,KACd,WAAa,KACb,gBAAkB,KAClB,eAAiB,KACjB,eAAiB,KACjB,gBAAkB,KAClB,eAAiB,CAAC,EAClB,eAAiB,KACjB,0BAA4B,KAC5B,yBAA2B,KAC3B,cAAgB,KAChB,kBAAoB,KACpB,gBAAkB,KAGlB,KAAO,KACP,SAAW,CAAC,EACZ,YAAc,KACd,UAAY,KACZ,gBAAkB,GAClB,gBAAkB,KAElB,eAAiB,KAEjB,aAAc,CACZ,MAAM,EACN,KAAK,WAAa,KAAK,QAAQ,UAC/B,KAAK,gBAAkB,KAAK,QAAQ,gBAAkB,KACtD,KAAK,eAAiB,KAAK,QAAQ,eAAiB,uGACtD,CASA,mBAAoB,CAClB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,CAChC,CAKA,sBAAuB,CACrB,KAAK,sBAAsB,CAC7B,CASA,gBAAiB,CACf,MAAM,SAAY,KAAQ,KAAK,cAAc,GAAG,EAC1C,YAAe,KAAQ,KAAK,iBAAiB,GAAG,EAEtD,KAAK,MAAQ,SAAS,MAAM,EAC5B,KAAK,YAAc,SAAS,cAAc,KAAK,UAAU,EAAE,EAC3D,KAAK,WAAa,SAAS,eAAe,EAC1C,KAAK,gBAAkB,SAAS,aAAa,KAAK,UAAU,EAAE,EAC9D,KAAK,eAAiB,SAAS,YAAY,KAAK,UAAU,EAAE,EAC5D,KAAK,eAAiB,SAAS,mCAAmC,EAClE,KAAK,eAAiB,SAAS,sBAAsB,EACrD,KAAK,0BAA4B,SAC/B,yCACF,EACA,KAAK,yBAA2B,SAC9B,sCACF,EACA,KAAK,cAAgB,SAAS,gBAAgB,EAC9C,KAAK,kBAAoB,SAAS,yBAAyB,EAC3D,KAAK,gBAAkB,SAAS,eAAe,KAAK,UAAU,EAAE,EAChE,KAAK,gBAAkB,YAAY,wBAAwB,CAC7D,CAKA,yBAA0B,CACxB,GAAK,KAAK,aAAa,YACvB,GAAI,CAEF,MAAM,aADO,KAAK,MAAM,KAAK,YAAY,WAAW,EAC1B,WAAa,CAAC,EACxC,KAAK,WAAa,aAAa,IAAI,CAAC,SAAU,SAAW,CACvD,GAAG,SACH,aAAc,MAAQ,EACtB,YACE,CAAC,CAAC,SAAS,cACX,CAAC,CAAC,OAAO,SAAS,SAAW,EAAE,EAAE,KAAK,GACtC,CAAC,CAAC,OAAO,SAAS,MAAQ,EAAE,EAAE,KAAK,CACvC,EAAE,CACJ,OAAS,EAAG,CACV,QAAQ,MAAM,gCAAiC,CAAC,CAClD,CACF,CAEA,uBAAwB,CACtB,GAAI,CAAC,KAAK,eAAgB,OAE1B,MAAM,aAAe,KAAK,eAAe,MACnC,QAAU,KAAK,WAAW,IAAK,WAAc,CACjD,MAAO,SAAS,eAChB,MAAO,SAAS,OAClB,EAAE,EACI,eAAkB,OAAO,SAAW,OAAO,QAAQ,SAAY,OAAO,cAAgB,IAAI,YAAY,EAStG,oBARyB,CAC7B,GAAI,SACJ,GAAI,cACJ,GAAI,UACJ,GAAI,UACJ,GAAI,cACJ,GAAI,SACN,EACmD,aAAa,EAC1D,cAAgB,oBAClB,QAAQ,KAAM,QAAW,OAAO,QAAU,mBAAmB,EAC7D,KAEJ,KAAK,eAAe,UAClB,qDACA,QACG,IACE,QACC,kBAAkB,KAAK,YAAY,OAAO,KAAK,CAAC,KAAK,KAAK,YAAY,OAAO,KAAK,CAAC,WACvF,EACC,KAAK,EAAE,EAER,cAAgB,QAAQ,KAAM,QAAW,OAAO,QAAU,YAAY,EACxE,KAAK,eAAe,MAAQ,aACnB,gBACT,KAAK,eAAe,MAAQ,cAAc,MAE9C,CAEA,sBAAuB,CACrB,GAAI,CAAC,KAAK,eAAgB,OAE1B,MAAM,oBAAsB,KAAK,QAAQ,qBAAuB,WAK1D,YAJoB,KAAK,WAAW,OACvC,UAAa,SAAS,WACzB,EAGG,IAAK,UAAa,CACjB,MAAM,YAAc,SAAS,UACzB;AAAA;AAAA;AAAA,8BAGgB,KAAK,iBAAiB,SAAS,SAAS,CAAC,UAAU,KAAK,iBAAiB,SAAS,MAAQ,gBAAgB,CAAC;AAAA;AAAA;AAAA,cAI3H,GAEJ,MAAO;AAAA,qDACoC,KAAK,iBAAiB,SAAS,OAAO,CAAC,0BAA0B,KAAK,iBAAiB,SAAS,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA,+BAIrI,KAAK,iBAAiB,SAAS,cAAc,CAAC;AAAA,yBACpD,KAAK,iBAAiB,SAAS,cAAc,CAAC;AAAA;AAAA;AAAA,yDAGd,KAAK,iBAAiB,mBAAmB,CAAC,mBAAmB,KAAK,iBAAiB,SAAS,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA,kBAIlJ,WAAW;AAAA;AAAA,mDAEsB,KAAK,YAAY,SAAS,IAAI,CAAC;AAAA,sDAC5B,KAAK,YAAY,SAAS,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,WAKhF,CAAC,EACA,KAAK,EAAE,EAEV,KAAK,eAAe,UAAY;AAAA;AAAA,YAE1B,KAAK,cAAc;AAAA;AAAA,UAErB,WAAW;AAAA,QAGf,KAAK,0BAA4B,KAAK,cACpC,yCACF,EACA,KAAK,gBAAkB,KAAK,iBAAiB,wBAAwB,EACrE,KAAK,eAAiB,MAAM,KAAK,KAAK,iBAAiB,cAAc,CAAC,CACxE,CAKA,uBAAwB,CACtB,KAAK,iBAAiB,iBACpB,SACA,KAAK,qBACP,EACA,KAAK,gBAAgB,iBACnB,SACA,KAAK,oBACP,EACA,KAAK,OAAO,iBAAiB,SAAU,KAAK,iBAAiB,EAC7D,KAAK,mBAAmB,iBACtB,QACA,KAAK,oBACP,EAEA,KAAK,gBAAgB,QAAS,OAAU,CACtC,MAAM,iBAAiB,SAAU,KAAK,qBAAqB,CAC7D,CAAC,EAGD,KAAK,eAAe,QAAS,MAAS,CACpC,KAAK,iBAAiB,QAAS,IAAM,CACnC,MAAM,MAAQ,KAAK,cAAc,qBAAqB,EAClD,OAAS,CAAC,MAAM,UAClB,MAAM,QAAU,GAChB,MAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,EAE9D,CAAC,CACH,CAAC,CACH,CAKA,uBAAwB,CACtB,KAAK,iBAAiB,oBACpB,SACA,KAAK,qBACP,EACA,KAAK,gBAAgB,oBACnB,SACA,KAAK,oBACP,EACA,KAAK,OAAO,oBAAoB,SAAU,KAAK,iBAAiB,EAChE,KAAK,mBAAmB,oBACtB,QACA,KAAK,oBACP,EACA,KAAK,gBAAgB,QAAS,OAAU,CACtC,MAAM,oBAAoB,SAAU,KAAK,qBAAqB,CAChE,CAAC,CACH,CAUA,sBAAyB,GAAM,CAC7B,KAAK,kBAAoB,EAAE,OAAO,MAClC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAExB,KAAK,oBAAsB,YAC7B,KAAK,mBAAmB,EACxB,KAAK,SAAS,GAEd,KAAK,mBAAmB,EAE1B,KAAK,yBAAyB,CAChC,EAKA,qBAAuB,IAAM,CAC3B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,CAChC,EAMA,sBAAyB,GAAM,CAC7B,GAAI,CAAC,EAAE,OAAO,QAAS,OACvB,KAAK,wBAA0B,EAAE,OAAO,MACxC,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAG9B,MAAM,OAAS,KAAK,SAAS,KAC1B,GAAM,EAAE,iBAAmB,KAAK,uBACnC,EACI,SACF,KAAK,KAAK,MAAM,OAAO,YAAY,CAAC,EACpC,KAAK,KAAK,QAAQ,YAAY,mBAAmB,EACjD,OAAO,KAAK,MAAM,QAAQ,OAAQ,OAAO,EAE7C,EAMA,kBAAqB,GAAM,CAEzB,GADA,EAAE,eAAe,EACb,CAAC,KAAK,aAAa,EAAG,OAE1B,MAAM,OACJ,KAAK,oBAAsB,WACvB,KAAK,wBACL,KAAK,eAAe,MAEpB,SAAW,KAAK,WAAW,KAAM,GAAM,EAAE,iBAAmB,MAAM,EAExE,IAAI,IACA,KAAK,oBAAsB,WAC7B,IAAM,UAAU,aACP,KAAK,oBAAsB,UACpC,IAAM,UAAU,YACP,KAAK,oBAAsB,WACpC,IAAM,UAAU,aACP,KAAK,oBAAsB,cACpC,IAAM,UAAU,eAGd,IACF,OAAO,SAAS,KAAO,IACd,KAAK,QAAQ,cACtB,OAAO,SAAS,KAAO,KAAK,QAAQ,YAExC,EAKA,qBAAuB,IAAM,CAC3B,GAAI,CAAC,UAAU,YAAa,CAC1B,MAAM,+CAA+C,EACrD,MACF,CAEA,UAAU,YAAY,mBACnB,UAAa,CACZ,MAAM,QAAU,CACd,IAAK,SAAS,OAAO,SACrB,IAAK,SAAS,OAAO,SACvB,EAEA,KAAK,KAAK,UAAU,OAAO,EAC3B,KAAK,KAAK,QAAQ,YAAY,kBAAkB,EAChD,KAAK,aAAa,OAAO,IAAI,EAE7B,KAAK,YAAc,IAAI,OAAO,KAAK,OAAO,CACxC,IAAK,KAAK,KACV,SAAU,QACV,KAAM,CACJ,KAAM,OAAO,KAAK,WAAW,OAC7B,MAAO,EACP,UAAW,UACX,YAAa,EACb,YAAa,OACb,aAAc,CAChB,CACF,CAAC,EACD,KAAK,qBAAqB,OAAO,CACnC,EACA,IAAM,CACJ,MAAM,mCAAmC,CAC3C,CACF,CACF,EASA,wBAAyB,CACvB,GAAI,CAAC,KAAK,yBAA0B,OAEpC,MAAM,MAAQ,KAAK,cACjB,gBAAgB,KAAK,uBAAuB,IAC9C,EAEA,GAAI,CAAC,MAAO,CACV,KAAK,yBAAyB,YAAc,GAC5C,MACF,CAEA,MAAM,KAAO,MAAM,QAAQ,cAAc,EACnC,QACJ,MAAM,cAAc,uBAAuB,GAAG,YAAY,KAAK,GAAK,GAChE,KACJ,MAAM,cAAc,oBAAoB,GAAG,YAAY,KAAK,GAAK,GACnE,KAAK,yBAAyB,YAAc,SAAW,IACzD,CAKA,0BAA2B,CACpB,KAAK,aACV,KAAK,WAAW,SAAW,CAAC,KAAK,aAAa,EAChD,CAMA,cAAe,CACb,MAAI,CAAC,KAAK,mBAAqB,CAAC,KAAK,gBAAgB,MAAc,GAGjE,KAAK,oBAAsB,WAC3B,KAAK,oBAAsB,YAC3B,KAAK,oBAAsB,aAC1B,KAAK,oBAAsB,YAC1B,CAAC,CAAC,KAAK,uBAEb,CAKA,oBAAqB,CACnB,KAAK,gBAAgB,UAAU,OAAO,QAAQ,EAE9C,WAAW,IAAM,CACX,KAAK,MACP,OAAO,KAAK,MAAM,QAAQ,KAAK,KAAM,QAAQ,CAEjD,EAAG,YAAY,kBAAkB,CACnC,CAKA,oBAAqB,CACnB,KAAK,gBAAgB,UAAU,IAAI,QAAQ,EACvC,KAAK,2BACP,KAAK,yBAAyB,YAAc,GAEhD,CASA,UAAW,CACL,KAAK,iBAAmB,CAAC,OAAO,QAAQ,OAC5C,KAAK,gBAAkB,GACvB,KAAK,UAAY,IAAI,OAAO,KAAK,SAEjC,KAAK,KAAO,IAAI,OAAO,KAAK,IAAI,KAAK,cAAe,CAClD,OAAQ,YAAY,mBACpB,KAAM,YAAY,iBAClB,eAAgB,GAChB,kBAAmB,EACrB,CAAC,EAGD,OAAO,KAAK,MAAM,gBAAgB,KAAK,KAAM,OAAQ,IAAM,CACzD,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,CACvB,CAAC,EACH,CAKA,KAAM,wBAAyB,CAC7B,GAAI,GAAC,KAAK,iBAAmB,CAAC,OAAO,QAAQ,MAE7C,GAAI,CACF,MAAM,OAAO,KAAK,cAAc,QAAQ,EACxC,MAAM,kBACJ,IAAI,OAAO,KAAK,OAAO,yBAAyB,CAAC,CAAC,EACpD,kBAAkB,YAAc,iCAEhC,KAAK,gBAAgB,UAAY,GACjC,KAAK,gBAAgB,YAAY,iBAAiB,EAElD,kBAAkB,iBAAiB,aAAc,MAAO,OAAU,CAChE,MAAM,gBAAkB,MAAM,gBAC9B,GAAK,gBAEL,GAAI,CACF,MAAM,MAAQ,MAAM,gBAAgB,QAAQ,EAG5C,GAFA,MAAM,MAAM,YAAY,CAAE,OAAQ,CAAC,WAAY,UAAU,CAAE,CAAC,EAExD,CAAC,MAAM,UAAY,CAAC,KAAK,KAAM,OAGnC,OAAO,KAAK,MAAM,QAAQ,KAAK,KAAM,QAAQ,EAC7C,KAAK,KAAK,UAAU,MAAM,QAAQ,EAC9B,MAAM,SACR,KAAK,KAAK,UAAU,MAAM,QAAQ,EAElC,KAAK,KAAK,QAAQ,YAAY,mBAAmB,CAErD,OAAS,MAAO,CACd,QAAQ,MAAM,mCAAoC,KAAK,CACzD,CACF,CAAC,CACH,OAAS,MAAO,CACd,QAAQ,MAAM,iDAAkD,KAAK,CACvE,CACF,CAKA,iBAAkB,CAChB,KAAK,WAAW,QAAS,KAAQ,CAC3B,CAAC,IAAI,aAAe,CAAC,IAAI,SAE7B,KAAK,UAAU,QACb,CAAE,QAAS,IAAI,OAAQ,EACvB,MAAO,QAAS,SAAW,CACzB,GAAI,SAAW,MAAQ,CAAC,UAAU,CAAC,EAAG,CACpC,QAAQ,MAAM,uBAAuB,IAAI,OAAO,MAAM,MAAM,EAAE,EAC9D,MACF,CAEA,MAAM,SAAW,QAAQ,CAAC,EAAE,SAAS,SAC/B,SAAW,MAAM,KAAK,0BAC1B,IAAI,YACN,EAEM,OAAS,IAAI,OAAO,KAAK,OAAO,CACpC,IAAK,KAAK,KACV,SACA,MAAO,IAAI,KACX,KAAM,QACR,CAAC,EACD,OAAO,eAAiB,IAAI,eAC5B,OAAO,QAAU,IAAI,QAErB,MAAM,WAAa,IAAI,OAAO,KAAK,WAAW,CAC5C,QAAS,WAAW,IAAI,IAAI,gBAAgB,IAAI,OAAO,EACzD,CAAC,EAED,OAAO,YAAY,QAAS,IAAM,CAChC,WAAW,KAAK,CAAE,IAAK,KAAK,KAAM,OAAQ,MAAO,CAAC,EAElD,MAAM,MAAQ,KAAK,cACjB,aAAa,IAAI,cAAc,EACjC,EACI,OAAS,CAAC,MAAM,UAClB,MAAM,QAAU,GAChB,MAAM,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,EAE9D,CAAC,EACD,KAAK,SAAS,KAAK,MAAM,EACzB,KAAK,sBAAsB,CAC7B,CACF,CACF,CAAC,CACH,CAEA,yBAA0B,CACxB,KAAK,wBAA0B,KAC/B,KAAK,gBAAgB,QAAS,OAAU,CACtC,MAAM,QAAU,EAClB,CAAC,EACD,KAAK,uBAAuB,CAC9B,CAEA,2BAA4B,CAC1B,OAAO,KAAK,gBAAgB,OAAS,EACvC,CAEA,yCAA0C,CACxC,MAAM,sBAAwB,KAAK,0BAA0B,EAC7D,OAAO,KAAK,WAAW,OAAQ,UACxB,SAAS,YACT,sBACE,SAAS,iBAAmB,sBADA,GADD,EAGnC,CACH,CAEA,8BAA+B,CAC7B,GAAI,CAAC,KAAK,iBAAmB,CAAC,KAAK,eAAgB,OACnD,MAAM,sBAAwB,KAAK,0BAA0B,EACvD,iBAAmB,KAAK,WAAW,KACtC,UAAa,SAAS,iBAAmB,qBAC5C,EACM,cAAgB,kBAAkB,UAAY,cAC9C,eAAiB,kCAAkC,KACvD,GAAG,kBAAkB,aAAe,EAAE,IAAI,kBAAkB,cAAgB,EAAE,EAChF,EACM,sBAAwB,CAAC,CAAC,kBAAoB,gBAAkB,CAAC,cAEvE,CAAC,UAAW,UAAU,EAAE,QAAS,OAAU,CACzC,MAAM,OAAS,KAAK,gBAAgB,cAAc,iBAAiB,KAAK,IAAI,EACvE,SACA,OAAO,QAAQ,YAAW,OAAO,QAAQ,UAAY,OAAO,YAAY,KAAK,GAClF,OAAO,YAAc,sBACjB,GAAG,OAAO,QAAQ,SAAS,kBAC3B,OAAO,QAAQ,UACrB,CAAC,CACH,CACA,2BAA4B,CAC1B,MAAM,eAAiB,KAAK,iBAAiB,cAC3C,0BACF,EACA,GAAI,CAAC,eAAgB,OAErB,MAAM,oBAAsB,KAAK,wCAAwC,EACtE,OAAS,EACN,sBAAwB,KAAK,0BAA0B,EAG7D,eAAe,SAAW,CAAC,CAAC,uBAAyB,CAAC,oBAGpD,KAAK,oBAAsB,YAC3B,uBACA,CAAC,sBAED,KAAK,kBAAoB,KACzB,KAAK,gBAAgB,MAAQ,GAC7B,KAAK,mBAAmB,EAE5B,CAEA,wBAAyB,CACvB,MAAM,sBAAwB,KAAK,0BAA0B,EAC7D,IAAI,aAAe,EAgBnB,GAdA,KAAK,eAAe,QAAS,MAAS,CACpC,MAAM,QACJ,CAAC,uBACD,KAAK,QAAQ,gBAAkB,sBAGjC,GAFA,KAAK,OAAS,CAAC,QACf,KAAK,UAAU,OAAO,SAAU,CAAC,OAAO,EACnC,QAIH,cAAgB,MAJJ,CACZ,MAAM,MAAQ,KAAK,cAAc,qBAAqB,EAClD,QAAO,MAAM,QAAU,GAC7B,CAGF,CAAC,EAEG,KAAK,0BAA2B,CAClC,MAAM,qBACJ,CAAC,CAAC,uBAAyB,eAAiB,EAC9C,KAAK,0BAA0B,OAAS,CAAC,qBACzC,KAAK,0BAA0B,UAAU,OACvC,SACA,CAAC,oBACH,CACF,CAEA,KAAK,sBAAsB,CAC7B,CAEA,uBAAwB,CACtB,GAAI,CAAC,KAAK,MAAQ,CAAC,KAAK,SAAS,OAAQ,OAEzC,MAAM,sBAAwB,KAAK,0BAA0B,EACvD,eAAiB,KAAK,SAAS,OAAQ,QACpC,CAAC,uBAAyB,OAAO,iBAAmB,qBAC5D,EAQD,GANA,KAAK,SAAS,QAAS,QAAW,CAChC,MAAM,UACJ,CAAC,uBAAyB,OAAO,iBAAmB,sBACtD,OAAO,WAAW,SAAS,CAC7B,CAAC,EAEG,CAAC,eAAe,OAAQ,CAC1B,KAAK,KAAK,UAAU,YAAY,kBAAkB,EAClD,KAAK,KAAK,QAAQ,YAAY,gBAAgB,EAC9C,MACF,CAEA,GAAI,eAAe,SAAW,EAAG,CAC/B,KAAK,KAAK,MAAM,eAAe,CAAC,EAAE,YAAY,CAAC,EAC/C,KAAK,KAAK,QAAQ,YAAY,mBAAmB,EACjD,MACF,CAEA,MAAM,OAAS,IAAI,OAAO,KAAK,aAC/B,eAAe,QAAS,QAAW,OAAO,OAAO,OAAO,YAAY,CAAC,CAAC,EACtE,KAAK,KAAK,UAAU,OAAQ,EAAE,CAChC,CAEA,YAAY,MAAO,CACjB,OAAO,OAAO,OAAS,EAAE,EACtB,WAAW,IAAK,OAAO,EACvB,WAAW,IAAK,MAAM,EACtB,WAAW,IAAK,MAAM,EACtB,WAAW,IAAK,QAAQ,EACxB,WAAW,IAAK,OAAO,CAC5B,CAEA,iBAAiB,MAAO,CACtB,OAAO,KAAK,YAAY,KAAK,CAC/B,CASA,0BAA0B,OAAQ,CAChC,OAAO,IAAI,QAAS,SAAY,CAC9B,GAAI,CAAC,KAAK,gBAAiB,OAAO,QAAQ,IAAI,EAE9C,MAAM,OAAS,SAAS,cAAc,QAAQ,EACxC,KAAO,YAAY,mBACzB,OAAO,MAAQ,KACf,OAAO,OAAS,KAChB,MAAM,QAAU,OAAO,WAAW,IAAI,EAChC,MAAQ,IAAI,MAClB,MAAM,YAAc,YACpB,MAAM,IAAM,KAAK,gBAEjB,MAAM,OAAS,IAAM,CACnB,QAAQ,UAAU,MAAO,EAAG,EAAG,KAAM,IAAI,EACzC,QAAQ,KAAO,kBACf,QAAQ,UAAY,QACpB,QAAQ,UAAY,SACpB,QAAQ,aAAe,SACvB,QAAQ,SAAS,OAAO,SAAS,EAAG,KAAO,EAAG,KAAO,EAAI,CAAC,EAE1D,QAAQ,CACN,IAAK,OAAO,UAAU,EACtB,WAAY,IAAI,OAAO,KAAK,KAAK,KAAM,IAAI,EAC3C,OAAQ,IAAI,OAAO,KAAK,MAAM,KAAO,EAAG,KAAO,CAAC,CAClD,CAAC,CACH,EAEA,MAAM,QAAU,IAAM,CACpB,QAAQ,MAAM,qCAAqC,EACnD,QAAQ,IAAI,CACd,CACF,CAAC,CACH,CAMA,qBAAqB,QAAS,CAC5B,GAAI,KAAK,SAAS,SAAW,EAAG,OAEhC,MAAM,WAAa,IAAI,OAAO,KAAK,OAAO,QAAQ,IAAK,QAAQ,GAAG,EAG5D,QAAU,KAAK,SAAS,OAC5B,CAAC,IAAK,SAAW,CACf,MAAM,SACJ,OAAO,KAAK,SAAS,UAAU,uBAC7B,WACA,OAAO,YAAY,CACrB,EACF,OAAO,SAAW,IAAI,SAAW,CAAE,SAAU,MAAO,EAAI,GAC1D,EACA,CAAE,SAAU,IAAU,OAAQ,IAAK,CACrC,EAEI,QAAQ,QACV,OAAO,KAAK,MAAM,QAAQ,QAAQ,OAAQ,OAAO,CAErD,CACF,CAEA,eAAe,OAAO,iBAAkB,WAAW,CACrD,GAAG",
  "names": []
}
