{
  "version": 3,
  "sources": ["../../../node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/@rails/actioncable/src/index.js", "../../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../javascript/controllers/application.js", "../../javascript/controllers/adr_tier_controller.js", "../../javascript/controllers/amenities_categories_controller.js", "../../javascript/controllers/amenities_chart_controller.js", "../../javascript/lib/insights_story_section.js", "../../javascript/controllers/amenities_dropdown_controller.js", "../../javascript/lib/amplitude_autocapture.js", "../../javascript/controllers/amplitude_controller.js", "../../javascript/lib/insights_mobile_filters_overlay.js", "../../javascript/controllers/application_controller.js", "../../javascript/controllers/auth_controller.js", "../../javascript/lib/merge_recent_searches.js", "../../javascript/lib/autocomplete_display.js", "../../javascript/lib/google_places_country.js", "../../javascript/lib/google_maps.js", "../../javascript/controllers/autocomplete_controller.js", "../../javascript/controllers/bedroom_count_chart_controller.js", "../../javascript/controllers/calendar_controller.js", "../../javascript/controllers/chart_controller.js", "../../javascript/controllers/comp_set_list_row_controller.js", "../../javascript/controllers/contact_form_controller.js", "../../javascript/controllers/daily_occupancy_chart_controller.js", "../../javascript/controllers/desktop_filters_controller.js", "../../javascript/controllers/detection_simulator_controller.js", "../../javascript/controllers/dropdown_controller.js", "../../javascript/controllers/email_exists_modal_controller.js", "../../javascript/lib/insights_filter_url.js", "../../javascript/controllers/filters_container_controller.js", "../../javascript/controllers/filters_explainer_controller.js", "../../javascript/controllers/gallery_controller.js", "../../javascript/controllers/google_ads_controller.js", "../../javascript/controllers/google_one_tap_controller.js", "../../javascript/controllers/google_places_controller.js", "../../javascript/controllers/image_fallback_controller.js", "../../javascript/controllers/insights_city_tracking_controller.js", "../../javascript/controllers/insights_csv_export_controller.js", "../../javascript/controllers/landing_page_tracking_controller.js", "../../javascript/controllers/landing_page_engagement_controller.js", "../../javascript/controllers/country_filter_controller.js", "../../javascript/controllers/link_interceptor_controller.js", "../../javascript/controllers/listings_chart_controller.js", "../../javascript/lib/safe_window_resize.js", "../../javascript/controllers/map_expand_controller.js", "../../javascript/lib/map_handoff.js", "../../javascript/controllers/map_modal_controller.js", "../../javascript/controllers/modal_tracking_controller.js", "../../javascript/controllers/map_switcher_controller.js", "../../javascript/controllers/metric_chart_switcher_controller.js", "../../javascript/controllers/minimal_chart_controller.js", "../../javascript/controllers/chart_year_selector_controller.js", "../../javascript/controllers/mobile_comp_set_filters_controller.js", "../../javascript/controllers/mobile_filters_controller.js", "../../javascript/lib/pricing_currency.js", "../../javascript/controllers/paddle_controller.js", "../../javascript/controllers/paywall_controller.js", "../../javascript/controllers/polygon_navigation_controller.js", "../../javascript/controllers/portfolio_controller.js", "../../javascript/controllers/pricing_controller.js", "../../javascript/controllers/pricing_modal_controller.js", "../../javascript/controllers/primary_intent_controller.js", "../../javascript/controllers/rating_count_distribution_chart_controller.js", "../../javascript/controllers/rating_distribution_chart_controller.js", "../../javascript/controllers/recent_searches_controller.js", "../../javascript/controllers/revenue_histogram_controller.js", "../../javascript/controllers/revenue_tier_controller.js", "../../javascript/controllers/scroll_reveal_controller.js", "../../javascript/controllers/signup_form_controller.js", "../../javascript/controllers/sortable_table_controller.js", "../../javascript/controllers/story_tabs_controller.js", "../../javascript/controllers/submarkets_controller.js", "../../javascript/controllers/subscription_modal_controller.js", "../../javascript/controllers/eager.js", "../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js", "../../javascript/application.js"],
  "sourcesContent": ["export default {\n  logger: typeof console !== \"undefined\" ? console : undefined,\n  WebSocket: typeof WebSocket !== \"undefined\" ? WebSocket : undefined,\n}\n", "import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n//   ActionCable.logger.enabled = true\n//\n//   Example:\n//\n//   import * as ActionCable from '@rails/actioncable'\n//\n//   ActionCable.logger.enabled = true\n//   ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n  log(...messages) {\n    if (this.enabled) {\n      messages.push(Date.now())\n      adapters.logger.log(\"[ActionCable]\", ...messages)\n    }\n  },\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nclass ConnectionMonitor {\n  constructor(connection) {\n    this.visibilityDidChange = this.visibilityDidChange.bind(this)\n    this.connection = connection\n    this.reconnectAttempts = 0\n  }\n\n  start() {\n    if (!this.isRunning()) {\n      this.startedAt = now()\n      delete this.stoppedAt\n      this.startPolling()\n      addEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`)\n    }\n  }\n\n  stop() {\n    if (this.isRunning()) {\n      this.stoppedAt = now()\n      this.stopPolling()\n      removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(\"ConnectionMonitor stopped\")\n    }\n  }\n\n  isRunning() {\n    return this.startedAt && !this.stoppedAt\n  }\n\n  recordMessage() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    delete this.disconnectedAt\n    logger.log(\"ConnectionMonitor recorded connect\")\n  }\n\n  recordDisconnect() {\n    this.disconnectedAt = now()\n    logger.log(\"ConnectionMonitor recorded disconnect\")\n  }\n\n  // Private\n\n  startPolling() {\n    this.stopPolling()\n    this.poll()\n  }\n\n  stopPolling() {\n    clearTimeout(this.pollTimeout)\n  }\n\n  poll() {\n    this.pollTimeout = setTimeout(() => {\n      this.reconnectIfStale()\n      this.poll()\n    }\n    , this.getPollInterval())\n  }\n\n  getPollInterval() {\n    const { staleThreshold, reconnectionBackoffRate } = this.constructor\n    const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10))\n    const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate\n    const jitter = jitterMax * Math.random()\n    return staleThreshold * 1000 * backoff * (1 + jitter)\n  }\n\n  reconnectIfStale() {\n    if (this.connectionIsStale()) {\n      logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n      this.reconnectAttempts++\n      if (this.disconnectedRecently()) {\n        logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`)\n      } else {\n        logger.log(\"ConnectionMonitor reopening\")\n        this.connection.reopen()\n      }\n    }\n  }\n\n  get refreshedAt() {\n    return this.pingedAt ? this.pingedAt : this.startedAt\n  }\n\n  connectionIsStale() {\n    return secondsSince(this.refreshedAt) > this.constructor.staleThreshold\n  }\n\n  disconnectedRecently() {\n    return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n  }\n\n  visibilityDidChange() {\n    if (document.visibilityState === \"visible\") {\n      setTimeout(() => {\n        if (this.connectionIsStale() || !this.connection.isOpen()) {\n          logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n          this.connection.reopen()\n        }\n      }\n      , 200)\n    }\n  }\n\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\nConnectionMonitor.reconnectionBackoffRate = 0.15\n\nexport default ConnectionMonitor\n", "export default {\n  \"message_types\": {\n    \"welcome\": \"welcome\",\n    \"disconnect\": \"disconnect\",\n    \"ping\": \"ping\",\n    \"confirmation\": \"confirm_subscription\",\n    \"rejection\": \"reject_subscription\"\n  },\n  \"disconnect_reasons\": {\n    \"unauthorized\": \"unauthorized\",\n    \"invalid_request\": \"invalid_request\",\n    \"server_restart\": \"server_restart\",\n    \"remote\": \"remote\"\n  },\n  \"default_mount_path\": \"/cable\",\n  \"protocols\": [\n    \"actioncable-v1-json\",\n    \"actioncable-unsupported\"\n  ]\n}\n", "import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n  constructor(consumer) {\n    this.open = this.open.bind(this)\n    this.consumer = consumer\n    this.subscriptions = this.consumer.subscriptions\n    this.monitor = new ConnectionMonitor(this)\n    this.disconnected = true\n  }\n\n  send(data) {\n    if (this.isOpen()) {\n      this.webSocket.send(JSON.stringify(data))\n      return true\n    } else {\n      return false\n    }\n  }\n\n  open() {\n    if (this.isActive()) {\n      logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n      return false\n    } else {\n      const socketProtocols = [...protocols, ...this.consumer.subprotocols || []]\n      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols)\n      this.installEventHandlers()\n      this.monitor.start()\n      return true\n    }\n  }\n\n  close({allowReconnect} = {allowReconnect: true}) {\n    if (!allowReconnect) { this.monitor.stop() }\n    // Avoid closing websockets in a \"connecting\" state due to Safari 15.1+ bug. See: https://github.com/rails/rails/issues/43835#issuecomment-1002288478\n    if (this.isOpen()) {\n      return this.webSocket.close()\n    }\n  }\n\n  reopen() {\n    logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n    if (this.isActive()) {\n      try {\n        return this.close()\n      } catch (error) {\n        logger.log(\"Failed to reopen WebSocket\", error)\n      }\n      finally {\n        logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n        setTimeout(this.open, this.constructor.reopenDelay)\n      }\n    } else {\n      return this.open()\n    }\n  }\n\n  getProtocol() {\n    if (this.webSocket) {\n      return this.webSocket.protocol\n    }\n  }\n\n  isOpen() {\n    return this.isState(\"open\")\n  }\n\n  isActive() {\n    return this.isState(\"open\", \"connecting\")\n  }\n\n  triedToReconnect() {\n    return this.monitor.reconnectAttempts > 0\n  }\n\n  // Private\n\n  isProtocolSupported() {\n    return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n  }\n\n  isState(...states) {\n    return indexOf.call(states, this.getState()) >= 0\n  }\n\n  getState() {\n    if (this.webSocket) {\n      for (let state in adapters.WebSocket) {\n        if (adapters.WebSocket[state] === this.webSocket.readyState) {\n          return state.toLowerCase()\n        }\n      }\n    }\n    return null\n  }\n\n  installEventHandlers() {\n    for (let eventName in this.events) {\n      const handler = this.events[eventName].bind(this)\n      this.webSocket[`on${eventName}`] = handler\n    }\n  }\n\n  uninstallEventHandlers() {\n    for (let eventName in this.events) {\n      this.webSocket[`on${eventName}`] = function() {}\n    }\n  }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n  message(event) {\n    if (!this.isProtocolSupported()) { return }\n    const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n    this.monitor.recordMessage()\n    switch (type) {\n      case message_types.welcome:\n        if (this.triedToReconnect()) {\n          this.reconnectAttempted = true\n        }\n        this.monitor.recordConnect()\n        return this.subscriptions.reload()\n      case message_types.disconnect:\n        logger.log(`Disconnecting. Reason: ${reason}`)\n        return this.close({allowReconnect: reconnect})\n      case message_types.ping:\n        return null\n      case message_types.confirmation:\n        this.subscriptions.confirmSubscription(identifier)\n        if (this.reconnectAttempted) {\n          this.reconnectAttempted = false\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: true})\n        } else {\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: false})\n        }\n      case message_types.rejection:\n        return this.subscriptions.reject(identifier)\n      default:\n        return this.subscriptions.notify(identifier, \"received\", message)\n    }\n  },\n\n  open() {\n    logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n    this.disconnected = false\n    if (!this.isProtocolSupported()) {\n      logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n      return this.close({allowReconnect: false})\n    }\n  },\n\n  close(event) {\n    logger.log(\"WebSocket onclose event\")\n    if (this.disconnected) { return }\n    this.disconnected = true\n    this.monitor.recordDisconnect()\n    return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n  },\n\n  error() {\n    logger.log(\"WebSocket onerror event\")\n  }\n}\n\nexport default Connection\n", "// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n//     connected() {\n//       // Called once the subscription has been successfully completed\n//     },\n//\n//     disconnected({ willAttemptReconnect: boolean }) {\n//       // Called when the client has disconnected with the server.\n//       // The object will have an `willAttemptReconnect` property which\n//       // says whether the client has the intention of attempting\n//       // to reconnect.\n//     },\n//\n//     appear() {\n//       this.perform('appear', {appearing_on: this.appearingOn()})\n//     },\n//\n//     away() {\n//       this.perform('away')\n//     },\n//\n//     appearingOn() {\n//       $('main').data('appearing-on')\n//     }\n//   })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n//   class AppearanceChannel < ApplicationActionCable::Channel\n//     def subscribed\n//       current_user.appear\n//     end\n//\n//     def unsubscribed\n//       current_user.disappear\n//     end\n//\n//     def appear(data)\n//       current_user.appear on: data['appearing_on']\n//     end\n//\n//     def away\n//       current_user.away\n//     end\n//   end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n  if (properties != null) {\n    for (let key in properties) {\n      const value = properties[key]\n      object[key] = value\n    }\n  }\n  return object\n}\n\nexport default class Subscription {\n  constructor(consumer, params = {}, mixin) {\n    this.consumer = consumer\n    this.identifier = JSON.stringify(params)\n    extend(this, mixin)\n  }\n\n  // Perform a channel action with the optional data passed as an attribute\n  perform(action, data = {}) {\n    data.action = action\n    return this.send(data)\n  }\n\n  send(data) {\n    return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n  }\n\n  unsubscribe() {\n    return this.consumer.subscriptions.remove(this)\n  }\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.\n// Internal class, not intended for direct user manipulation.\n\nclass SubscriptionGuarantor {\n  constructor(subscriptions) {\n    this.subscriptions = subscriptions\n    this.pendingSubscriptions = []\n  }\n\n  guarantee(subscription) {\n    if(this.pendingSubscriptions.indexOf(subscription) == -1){ \n      logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)\n      this.pendingSubscriptions.push(subscription) \n    }\n    else {\n      logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)\n    }\n    this.startGuaranteeing()\n  }\n\n  forget(subscription) {\n    logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)\n    this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))\n  }\n\n  startGuaranteeing() {\n    this.stopGuaranteeing()\n    this.retrySubscribing()\n  }\n  \n  stopGuaranteeing() {\n    clearTimeout(this.retryTimeout)\n  }\n\n  retrySubscribing() {\n    this.retryTimeout = setTimeout(() => {\n      if (this.subscriptions && typeof(this.subscriptions.subscribe) === \"function\") {\n        this.pendingSubscriptions.map((subscription) => {\n          logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)\n          this.subscriptions.subscribe(subscription)\n        })\n      }\n    }\n    , 500)\n  }\n}\n\nexport default SubscriptionGuarantor", "import logger from \"./logger\"\nimport Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n  constructor(consumer) {\n    this.consumer = consumer\n    this.guarantor = new SubscriptionGuarantor(this)\n    this.subscriptions = []\n  }\n\n  create(channelName, mixin) {\n    const channel = channelName\n    const params = typeof channel === \"object\" ? channel : {channel}\n    const subscription = new Subscription(this.consumer, params, mixin)\n    return this.add(subscription)\n  }\n\n  // Private\n\n  add(subscription) {\n    this.subscriptions.push(subscription)\n    this.consumer.ensureActiveConnection()\n    this.notify(subscription, \"initialized\")\n    this.subscribe(subscription)\n    return subscription\n  }\n\n  remove(subscription) {\n    this.forget(subscription)\n    if (!this.findAll(subscription.identifier).length) {\n      this.sendCommand(subscription, \"unsubscribe\")\n    }\n    return subscription\n  }\n\n  reject(identifier) {\n    return this.findAll(identifier).map((subscription) => {\n      this.forget(subscription)\n      this.notify(subscription, \"rejected\")\n      return subscription\n    })\n  }\n\n  forget(subscription) {\n    this.guarantor.forget(subscription)\n    this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n    return subscription\n  }\n\n  findAll(identifier) {\n    return this.subscriptions.filter((s) => s.identifier === identifier)\n  }\n\n  reload() {\n    return this.subscriptions.map((subscription) =>\n      this.subscribe(subscription))\n  }\n\n  notifyAll(callbackName, ...args) {\n    return this.subscriptions.map((subscription) =>\n      this.notify(subscription, callbackName, ...args))\n  }\n\n  notify(subscription, callbackName, ...args) {\n    let subscriptions\n    if (typeof subscription === \"string\") {\n      subscriptions = this.findAll(subscription)\n    } else {\n      subscriptions = [subscription]\n    }\n\n    return subscriptions.map((subscription) =>\n      (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n  }\n\n  subscribe(subscription) {\n    if (this.sendCommand(subscription, \"subscribe\")) {\n      this.guarantor.guarantee(subscription)\n    }\n  }\n\n  confirmSubscription(identifier) {\n    logger.log(`Subscription confirmed ${identifier}`)\n    this.findAll(identifier).map((subscription) =>\n      this.guarantor.forget(subscription))\n  }\n\n  sendCommand(subscription, command) {\n    const {identifier} = subscription\n    return this.consumer.send({command, identifier})\n  }\n}\n", "import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n//   App.cable.disconnect()\n//\n// and to restart the connection:\n//\n//   App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n  constructor(url) {\n    this._url = url\n    this.subscriptions = new Subscriptions(this)\n    this.connection = new Connection(this)\n    this.subprotocols = []\n  }\n\n  get url() {\n    return createWebSocketURL(this._url)\n  }\n\n  send(data) {\n    return this.connection.send(data)\n  }\n\n  connect() {\n    return this.connection.open()\n  }\n\n  disconnect() {\n    return this.connection.close({allowReconnect: false})\n  }\n\n  ensureActiveConnection() {\n    if (!this.connection.isActive()) {\n      return this.connection.open()\n    }\n  }\n\n  addSubProtocol(subprotocol) {\n    this.subprotocols = [...this.subprotocols, subprotocol]\n  }\n}\n\nexport function createWebSocketURL(url) {\n  if (typeof url === \"function\") {\n    url = url()\n  }\n\n  if (url && !/^wss?:/i.test(url)) {\n    const a = document.createElement(\"a\")\n    a.href = url\n    // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n    a.href = a.href // eslint-disable-line\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n", "import adapters from \"./adapters\"\nimport Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\nimport Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport Subscriptions from \"./subscriptions\"\n\nexport {\n  Connection,\n  ConnectionMonitor,\n  Consumer,\n  INTERNAL,\n  Subscription,\n  Subscriptions,\n  SubscriptionGuarantor,\n  adapters,\n  createWebSocketURL,\n  logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n  return new Consumer(url)\n}\n\nexport function getConfig(name) {\n  const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n  if (element) {\n    return element.getAttribute(\"content\")\n  }\n}\n", "/*\nStimulus 3.2.1\nCopyright \u00A9 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "import { Application } from \"@hotwired/stimulus\"\n\nconst application = Application.start()\n\n// Configure Stimulus development experience\napplication.debug = false\nwindow.Stimulus   = application\n\nexport { application }\n", "import { Controller } from \"@hotwired/stimulus\"\n\nString.prototype.capitalize = function() {\n  return this.replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n};\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    chartDataSeries: Object, // Object with multiple series { premium: [[date, value]], high_performing: [[date, value]], ... }\n    locale: String,\n    today: Number,\n    currencyCode: { type: String, default: 'USD' },\n    selectedTier: { type: String, default: 'mid_range' }\n  }\n  static activeClasses = ['bg-[#E4F0EA]', 'border-[#1F6F54]', 'text-[#0C1A14]', 'shadow-sm']\n  static inactiveClasses = ['bg-gray-50', 'border-gray-200', 'text-gray-500', 'shadow-sm', 'hover:shadow-md']\n\n  connect() {\n    this.chart = null\n    // Calculate global min/max across all tiers for fixed scale\n    this.calculateGlobalScale()\n    this.initializeChart()\n  }\n\n  calculateGlobalScale() {\n    let globalMax = -Infinity\n\n    // Iterate through all tier data series to find the maximum value\n    Object.values(this.chartDataSeriesValue).forEach(seriesData => {\n      if (Array.isArray(seriesData)) {\n        seriesData.forEach(([date, value]) => {\n          if (typeof value === 'number') {\n            globalMax = Math.max(globalMax, value)\n          }\n        })\n      }\n    })\n\n    // Always start at 0, add padding (5%) to the max\n    this.globalMin = 0\n    this.globalMax = globalMax * 1.05\n  }\n\n  selectTier(event) {\n    const tier = event.currentTarget.dataset.tier\n    if (tier === this.selectedTierValue) return\n\n    this.selectedTierValue = tier\n    this.updateActiveButton()\n    this.updateChart()\n  }\n\n  updateActiveButton() {\n    const buttons = this.element.querySelectorAll('.adr-tier-selector')\n    buttons.forEach(button => {\n      const buttonTier = button.dataset.tier\n      button.classList.remove(...this.constructor.activeClasses, ...this.constructor.inactiveClasses)\n      if (buttonTier === this.selectedTierValue) {\n        button.classList.add(...this.constructor.activeClasses)\n      } else {\n        button.classList.add(...this.constructor.inactiveClasses)\n      }\n    })\n  }\n\n  updateChart() {\n    const chartData = this.chartDataSeriesValue[this.selectedTierValue]\n    if (!chartData || !this.chart) return\n\n    // Update chart data\n    this.chart.data.labels = chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(this.localeValue, { month: 'short', timeZone: 'UTC' }).capitalize())\n    this.chart.data.datasets[0].data = chartData.map(([, value]) => value)\n\n    // Update tooltip title\n    this.chart.options.plugins.tooltip.callbacks.title = (tooltipItems) => {\n      const dataIndex = tooltipItems[0].dataIndex\n      const dateString = chartData[dataIndex][0]\n      const date = new Date(dateString + 'T00:00:00Z')\n      return date.toLocaleString(this.localeValue, {\n        month: 'long',\n        year: 'numeric',\n        timeZone: 'UTC'\n      })\n    }\n\n    this.chart.update()\n  }\n\n  initializeChart() {\n    const canvasElement = this.canvasTarget\n    const ctx = canvasElement.getContext('2d')\n    const chartData = this.chartDataSeriesValue[this.selectedTierValue] || this.chartDataSeriesValue['mid_range']\n    const dates = chartData.map(([date]) => new Date(date))\n    const todayValue = this.todayValue\n    const localeValue = this.localeValue\n    const currencyCodeValue = this.currencyCodeValue\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      type: 'line', // ADR chart is a line chart\n      data: {\n        labels: chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(localeValue, { month: 'short', timeZone: 'UTC' }).capitalize()),\n        datasets: [{\n          data: chartData.map(([, value]) => value),\n          tension: 0,\n          segment: {\n            borderDash: ctx => {\n              const currentDate = dates[ctx.p1DataIndex]\n              const now = new Date(todayValue)\n              return currentDate >= now ? [5, 5] : []\n            }\n          },\n          borderColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          },\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return\n            }\n            const gradient = getGradient(ctx, chartArea)\n            const currentDate = dates[context.dataIndex]\n            const now = new Date(todayValue)\n            if (currentDate >= now) {\n              return 'rgba(31, 111, 84, 0.3)'\n            }\n            return gradient\n          },\n          pointBackgroundColor: '#8FCBB0',\n          pointRadius: 2,\n          pointHoverRadius: 4\n        }]\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            callbacks: {\n              title: (tooltipItems) => {\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = chartData[dataIndex][0]\n                const date = new Date(dateString + 'T00:00:00Z')\n                return date.toLocaleString(localeValue, {\n                  month: 'long',\n                  year: 'numeric',\n                  timeZone: 'UTC'\n                })\n              },\n              label: (context) => {\n                const value = context.raw\n                return new Intl.NumberFormat(localeValue, {\n                  style: 'currency',\n                  currency: currencyCodeValue,\n                  minimumFractionDigits: 0,\n                  maximumFractionDigits: 0\n                }).format(value)\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            min: this.globalMin,\n            max: this.globalMax,\n            grid: {\n              drawOnChartArea: true\n            },\n            ticks: {\n              callback: (value) => {\n                return new Intl.NumberFormat(localeValue, {\n                  style: 'currency',\n                  currency: currencyCodeValue,\n                  minimumFractionDigits: 0,\n                  maximumFractionDigits: 0,\n                  notation: 'compact'\n                }).format(value)\n              }\n            }\n          }\n        }\n      }\n    })\n\n    // Set initial active button\n    this.updateActiveButton()\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"chip\", \"row\", \"chart\", \"table\"]\n  static values = { category: String }\n\n  disconnect() {\n    cancelAnimationFrame(this.heightSyncFrame)\n  }\n\n  select({ params: { category } }) {\n    this.categoryValue = category\n  }\n\n  categoryValueChanged() {\n    this.chipTargets.forEach(chip => {\n      chip.setAttribute(\"aria-pressed\", chip.dataset.category === this.categoryValue)\n    })\n    this.rowTargets.forEach(row => this.filterRow(row))\n    this.chartTargets.forEach(chart => this.filterChart(chart))\n    this.scheduleChartHeightSync()\n  }\n\n  rowTargetConnected(row) {\n    this.filterRow(row)\n    this.scheduleChartHeightSync()\n  }\n\n  chartTargetConnected(chart) {\n    this.filterChart(chart)\n    this.scheduleChartHeightSync()\n  }\n\n  scheduleChartHeightSync() {\n    cancelAnimationFrame(this.heightSyncFrame)\n    this.heightSyncFrame = requestAnimationFrame(() => this.syncChartHeight())\n  }\n\n  syncChartHeight() {\n    if (!this.hasTableTarget) return\n\n    const height = this.tableTarget.offsetHeight\n    if (!height) return\n\n    this.chartTargets.forEach(chart => {\n      chart.dataset.amenitiesChartHeightValue = height\n    })\n  }\n\n  filterRow(row) {\n    const categories = (row.dataset.categories || \"\").split(\" \")\n    row.classList.toggle(\"hidden\", !categories.includes(this.categoryValue))\n  }\n\n  filterChart(chart) {\n    chart.dataset.amenitiesChartCategoryValue = this.categoryValue\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"canvas\", \"container\"]\n  static values = {\n    labels: Array,\n    listingCounts: Array,\n    categories: Array,\n    category: String,\n    height: Number,\n    totalListings: Number\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  categoryValueChanged() {\n    if (!this.chart) return\n\n    const { labels, percentages } = this.chartData()\n    this.resizeContainer(labels.length)\n    this.chart.data.labels = labels\n    this.chart.data.datasets[0].data = percentages\n    this.chart.update()\n  }\n\n  heightValueChanged() {\n    if (this.chart) this.resizeContainer(this.chart.data.labels.length)\n  }\n\n  resizeContainer(barCount) {\n    if (!this.hasContainerTarget) return\n\n    const height = this.heightValue || Math.min(500, Math.max(160, barCount * 20 + 40))\n    this.containerTarget.style.height = `${height}px`\n  }\n\n  chartData() {\n    const indexes = this.labelsValue\n      .map((_, index) => index)\n      .filter(index => !this.categoryValue || (this.categoriesValue[index] || []).includes(this.categoryValue))\n\n    return {\n      labels: indexes.map(index => this.labelsValue[index]),\n      percentages: indexes.map(index =>\n        parseFloat(((this.listingCountsValue[index] / this.totalListingsValue) * 100).toFixed(1))\n      )\n    }\n  }\n\n  initializeChart() {\n    const canvas = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvas.getContext('2d')\n\n    const { labels, percentages } = this.chartData()\n    this.resizeContainer(labels.length)\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels,\n        datasets: [{\n          type: 'bar',\n          data: percentages,\n          barThickness: 8,\n          borderRadius: 4,\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const { ctx, chartArea } = chart\n\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          }\n        }]\n      },\n      options: {\n        indexAxis: 'y',\n        maintainAspectRatio: false,\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            callbacks: {\n              label: function(context) {\n                return `${context.parsed.x}%`\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            display: true,\n            grid: {\n              display: false\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%'\n              }\n            }\n          },\n          y: {\n            grid: {\n              display: false\n            }\n          }\n        }\n      }\n    })\n  }\n}\n\n", "export const VALID_STORY_SECTIONS = [\n  \"overview\",\n  \"listings\",\n  \"occupancy_analysis\",\n  \"pricing_revenue\",\n  \"supply_demand\",\n  \"submarkets\",\n  \"top_listings\",\n  \"related_markets\"\n]\n\nexport function getCurrentSectionFromPathname(pathname = window.location.pathname) {\n  const pathParts = pathname.split(\"/\").filter(Boolean)\n  const insightsIndex = pathParts.indexOf(\"insights\")\n\n  if (insightsIndex !== -1) {\n    const isCustomPolygon = pathParts[insightsIndex + 1] === \"custom\"\n\n    if (isCustomPolygon && pathParts.length >= insightsIndex + 4) {\n      const sectionPart = pathParts[insightsIndex + 3]\n      if (VALID_STORY_SECTIONS.includes(sectionPart)) {\n        return sectionPart\n      }\n    } else {\n      const lastPart = pathParts[pathParts.length - 1]\n      if (VALID_STORY_SECTIONS.includes(lastPart)) {\n        return lastPart\n      }\n    }\n  }\n\n  const urlParams = new URLSearchParams(window.location.search)\n  return urlParams.get(\"section\") || \"overview\"\n}\n\nexport function getCurrentSectionFromActiveTab() {\n  const activeTab = document.querySelector('a[role=\"tab\"][aria-selected=\"true\"][href*=\"/insights/\"]')\n  if (!activeTab) return null\n\n  const href = activeTab.getAttribute(\"href\")\n  if (!href || href === \"#\" || href === \"# \") return null\n\n  try {\n    const tabUrl = new URL(href, window.location.origin)\n    return getCurrentSectionFromPathname(tabUrl.pathname)\n  } catch {\n    return null\n  }\n}\n\nexport function getCurrentStorySection() {\n  const sectionFromPath = getCurrentSectionFromPathname()\n  if (sectionFromPath && sectionFromPath !== \"overview\") {\n    return sectionFromPath\n  }\n\n  const sectionFromTab = getCurrentSectionFromActiveTab()\n  if (sectionFromTab) return sectionFromTab\n\n  return sectionFromPath\n}\n\nexport function syncInsightsFormActionWithCurrentSection(form) {\n  const currentSection = getCurrentStorySection()\n  if (!currentSection) return false\n\n  const formAction = form.getAttribute(\"action\")\n  if (!formAction || !formAction.includes(\"/insights/\")) return false\n\n  try {\n    const formUrl = new URL(formAction, window.location.origin)\n    updateInsightsPathWithSection(formUrl, currentSection)\n    form.setAttribute(\"action\", formUrl.pathname + formUrl.search)\n    return true\n  } catch (e) {\n    console.warn(\"[insights-story-section] Error updating form action:\", e)\n    return false\n  }\n}\n\nexport function updateInsightsPathWithSection(url, currentSection) {\n  const pathParts = url.pathname.split(\"/\").filter(Boolean)\n  const insightsIndex = pathParts.indexOf(\"insights\")\n  if (insightsIndex === -1) return\n\n  const isCustomPolygon = pathParts[insightsIndex + 1] === \"custom\"\n\n  if (isCustomPolygon && pathParts.length >= insightsIndex + 4) {\n    pathParts[insightsIndex + 3] = currentSection\n    url.pathname = \"/\" + pathParts.join(\"/\")\n    return\n  }\n\n  const lastPart = pathParts[pathParts.length - 1]\n  if (VALID_STORY_SECTIONS.includes(lastPart)) {\n    pathParts[pathParts.length - 1] = currentSection\n  } else {\n    pathParts.push(currentSection)\n  }\n\n  url.pathname = \"/\" + pathParts.join(\"/\")\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { syncInsightsFormActionWithCurrentSection } from \"../lib/insights_story_section\"\n\nexport default class extends Controller {\n  static targets = [\"checkbox\", \"clearButton\"]\n\n  connect() {\n    this.submitting = false\n    this.wired = false\n    this.wireDropdownRetries = 0\n    this.form = this.element.querySelector(\"form\")\n    this.applyMethod = null\n\n    if (this.form) {\n      this.boundSubmit = () => {\n        this.submitting = true\n        this.trackFiltersApplied(this.applyMethod || \"apply_button\")\n        this.applyMethod = null\n        this.persistInitialCheckedState()\n      }\n      this.form.addEventListener(\"submit\", this.boundSubmit)\n    }\n\n    this.boundOpen = () => this.handleOpen()\n    this.boundClose = () => this.handleClose()\n    this.boundDocumentClick = this.handleDocumentClick.bind(this)\n\n    this.element.addEventListener(\"open.hs.dropdown\", this.boundOpen)\n    this.element.addEventListener(\"close.hs.dropdown\", this.boundClose)\n    document.addEventListener(\"click\", this.boundDocumentClick, true)\n\n    requestAnimationFrame(() => this.wireDropdownInstance())\n\n    if (this.hasClearButtonTarget) {\n      this.setupClearButton()\n    }\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"open.hs.dropdown\", this.boundOpen)\n    this.element.removeEventListener(\"close.hs.dropdown\", this.boundClose)\n    document.removeEventListener(\"click\", this.boundDocumentClick, true)\n\n    if (this.form && this.boundSubmit) {\n      this.form.removeEventListener(\"submit\", this.boundSubmit)\n    }\n  }\n\n  wireDropdownInstance() {\n    if (typeof HSDropdown === \"undefined\") {\n      if (++this.wireDropdownRetries < 20) {\n        requestAnimationFrame(() => this.wireDropdownInstance())\n      }\n      return\n    }\n\n    if (!window.$hsDropdownCollection) {\n      HSDropdown.autoInit()\n    }\n\n    let collectionItem = window.$hsDropdownCollection?.find(\n      item => item.element.el === this.element\n    )\n\n    if (!collectionItem) {\n      new HSDropdown(this.element)\n      collectionItem = window.$hsDropdownCollection?.find(\n        item => item.element.el === this.element\n      )\n    }\n\n    if (!collectionItem) {\n      if (++this.wireDropdownRetries < 20) {\n        requestAnimationFrame(() => this.wireDropdownInstance())\n      }\n      return\n    }\n\n    if (this.wired) return\n\n    this.wired = true\n    collectionItem.element.on(\"open\", this.boundOpen)\n    collectionItem.element.on(\"close\", this.boundClose)\n  }\n\n  handleOpen() {\n    this.submitting = false\n    this.applyMethod = null\n  }\n\n  handleClose() {\n    this.applyPendingChanges()\n  }\n\n  handleDocumentClick(event) {\n    if (!this.element.classList.contains(\"open\")) return\n    if (this.element.contains(event.target)) return\n\n    this.applyPendingChanges()\n  }\n\n  applyPendingChanges() {\n    if (this.submitting || !this.checkboxesDirty()) return\n\n    setTimeout(() => {\n      if (this.submitting || !this.checkboxesDirty()) return\n      this.submitForm()\n    }, 0)\n  }\n\n  setupClearButton() {\n    this.clearButtonTarget.addEventListener(\"click\", (e) => {\n      e.preventDefault()\n      this.checkboxTargets.forEach(checkbox => {\n        checkbox.checked = false\n      })\n      this.applyMethod = \"clear\"\n      this.submitForm()\n    })\n  }\n\n  persistInitialCheckedState() {\n    this.checkboxTargets.forEach(checkbox => {\n      checkbox.dataset.initialChecked = checkbox.checked ? \"true\" : \"false\"\n    })\n  }\n\n  isInitiallyChecked(checkbox) {\n    if (checkbox.hasAttribute(\"data-initial-checked\")) {\n      const value = checkbox.getAttribute(\"data-initial-checked\")\n      if (value === \"false\") return false\n\n      return true\n    }\n\n    return checkbox.defaultChecked\n  }\n\n  checkboxesDirty() {\n    return this.checkboxTargets.some(checkbox => {\n      return checkbox.checked !== this.isInitiallyChecked(checkbox)\n    })\n  }\n\n  submitForm() {\n    if (!this.form) return\n\n    if (!this.applyMethod) this.applyMethod = \"dropdown_close\"\n\n    if (this.form.dataset.turboFrame === \"filters-container\") {\n      syncInsightsFormActionWithCurrentSection(this.form)\n    }\n\n    this.submitting = true\n\n    if (typeof this.form.requestSubmit === \"function\") {\n      this.form.requestSubmit()\n    } else {\n      this.form.submit()\n    }\n  }\n\n  trackFiltersApplied(applyMethod) {\n    const changedFilters = this.changedFilters()\n    if (changedFilters.length === 0) return\n\n    this.trackEvent(\"Insights Filters Applied\", {\n      apply_method: applyMethod,\n      changed_filter_count: changedFilters.length,\n      changed_filters: changedFilters\n    })\n  }\n\n  changedFilters() {\n    return this.checkboxTargets\n      .filter((checkbox) => checkbox.checked !== this.isInitiallyChecked(checkbox))\n      .map((checkbox) => ({\n        filter_name: this.filterNameFor(checkbox),\n        filter_value: checkbox.value,\n        action: checkbox.checked ? \"enabled\" : \"disabled\",\n        filter_group: this.filterGroupFor(this.filterNameFor(checkbox))\n      }))\n  }\n\n  filterNameFor(checkbox) {\n    return (checkbox.name || \"\").replace(/\\[\\]$/, \"\")\n  }\n\n  filterGroupFor(filterName) {\n    if (filterName.startsWith(\"has_\")) return \"amenities\"\n\n    return filterName\n  }\n\n  trackEvent(name, properties = {}) {\n    this.dispatch(\"trackEvent\", {\n      prefix: null,\n      detail: { name, properties }\n    })\n  }\n}\n", "// Regions and elements covered by explicit manual Amplitude tracking.\n// Keep in sync with controllers/views that dispatch trackEvent.\n\nconst MANUALLY_TRACKED_INTERACTION_SELECTORS = [\n  // Declarative tracking via amplitude#track in views/helpers\n  '[data-analytics-event]',\n  '[data-action*=\"amplitude#track\"]',\n\n  // Gallery \u2014 Listing Gallery Opened / Listing Gallery Photo Changed\n  '[data-controller~=\"gallery\"]',\n  '[data-gallery-index]',\n  '.fslightbox-container',\n  '.fslightbox-slide-btn',\n\n  // Calendar \u2014 Calendar Month Changed\n  '[data-controller~=\"calendar\"]',\n  '.fc-button',\n\n  // Map \u2014 Map Zoom Changed, Map Legend Toggled, Map Marker Clicked\n  '[data-controller~=\"insights-map\"]',\n\n  // Modals \u2014 Modal Dismissed (Signup Modal Dismiss Attempted on calculator preview)\n  '[data-hs-overlay]',\n  '.hs-overlay',\n\n  // Insights filters \u2014 Insights Filters Applied (multi-value dropdown + mobile apply)\n  '[data-controller~=\"amenities-dropdown\"]',\n  '[data-controller~=\"mobile-filters\"]',\n\n  // Calculator landing \u2014 Calculator Filter Changed\n  '#calculator-bedrooms',\n  '#calculator-capacity'\n]\n\nexport function shouldAutocaptureElementInteraction(_actionType, element) {\n  if (!element?.closest) return true\n\n  return !MANUALLY_TRACKED_INTERACTION_SELECTORS.some((selector) => element.closest(selector))\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { shouldAutocaptureElementInteraction } from \"../lib/amplitude_autocapture\"\n\nexport default class extends Controller {\n  static values = {\n    apiKey: String,\n    userEmail: String,\n    plan: String,\n    primaryIntent: String,\n    trackEvents: Boolean\n  }\n\n  static SERVER_TRACKED_EVENTS = ['Signup Completed', 'Sign In Completed']\n\n  initialize() {\n    if (!this.trackEventsValue || !window.amplitude) {\n      return\n    }\n\n    if (!window.__amplitudeInitialized) {\n      if (window.sessionReplay) {\n        const plugin = window.sessionReplay.plugin({\n          sampleRate: 1\n        });\n        window.amplitude.add(plugin);\n      }\n\n      if (window.engagement) {\n        window.amplitude.add(window.engagement.plugin());\n      }\n\n      window.amplitude.init(this.apiKeyValue, {\n        autocapture: {\n          elementInteractions: {\n            shouldTrackEventResolver: shouldAutocaptureElementInteraction\n          }\n        }\n      })\n\n      window.__amplitudeInitialized = true\n    }\n\n    // Set user properties if available\n    if (this.hasUserEmailValue) {\n      window.amplitude.setUserId(this.userEmailValue)\n    }\n\n    if (this.hasPlanValue) {\n      this.trackUserProperty('plan', this.planValue)\n    }\n\n    // Set primary intent user property if available\n    if (this.hasPrimaryIntentValue && this.primaryIntentValue) {\n      this.trackUserProperty('user_primary_intent', this.primaryIntentValue)\n    }\n\n    this.trackUserProperty('user_agent', this.getUserAgent())\n  }\n\n  connect() {\n    // Listen for track events from other controllers\n    this.element.addEventListener('trackEvent', (event) => {\n      const { name, properties } = event.detail;\n      if (this.constructor.SERVER_TRACKED_EVENTS.includes(name)) return\n\n      this.trackEvent(name, properties)\n    })\n\n    this.element.addEventListener('trackUserProperty', (event) => {\n      const { name, value } = event.detail;\n      this.trackUserProperty(name, value)\n    })\n  }\n\n  trackUserProperty(name, value) {\n    if (this.isServerTrackedAuthEvent(name)) return\n\n    if (this.trackEventsValue && typeof window.amplitude !== 'undefined') {\n      const identifyEvent = new window.amplitude.Identify();\n      identifyEvent.set(name, value)\n      window.amplitude.identify(identifyEvent)\n    } else {\n      console.log(\"[Amplitude DEBUG - User Property]\", name, value)\n    }\n  }\n\n  // Track custom events\n  track(event) {\n    const eventName = event.currentTarget.dataset.analyticsEvent\n    const eventProperties = this.parseEventProperties(event.currentTarget.dataset.analyticsProps)\n    this.trackEvent(eventName, eventProperties)\n  }\n\n  // Track form submission with form values\n  trackFormSubmit(event) {\n    const eventName = event.currentTarget.dataset.analyticsEvent || 'Form Submitted'\n    const baseProperties = this.parseEventProperties(event.currentTarget.dataset.analyticsProps)\n\n    // Capture form values\n    const form = event.currentTarget\n    const formData = new FormData(form)\n    const formProperties = {}\n\n    // Extract specific fields we want to track\n    const subjectField = form.querySelector('#contact-subject')\n    const emailField = form.querySelector('#contact-email')\n    const messageField = form.querySelector('#contact-message')\n\n    if (subjectField) {\n      formProperties.subject = subjectField.value\n    }\n    if (emailField) {\n      formProperties.email_address = emailField.value\n    }\n    if (messageField) {\n      formProperties.body = messageField.value\n    }\n\n    // Merge base properties with form properties\n    const allProperties = { ...baseProperties, ...formProperties }\n\n    this.trackEvent(eventName, allProperties)\n  }\n\n  trackEventFromDetail(event) {\n    const { name, properties } = event.detail || {}\n    if (this.constructor.SERVER_TRACKED_EVENTS.includes(name)) return\n    if (name) this.trackEvent(name, properties)\n  }\n\n  // Helper method to track events\n  trackEvent(eventName, eventProperties = {}) {\n    if (this.isServerTrackedAuthEvent(eventName)) return\n\n    if (this.trackEventsValue && typeof window.amplitude !== 'undefined') {\n      window.amplitude.track(eventName, eventProperties)\n    } else {\n      console.log(\"[Amplitude DEBUG]\", eventName, eventProperties)\n    }\n  }\n\n  // Helper method to parse event properties from data attribute\n  parseEventProperties(propsString) {\n    if (!propsString) return {}\n    try {\n      return JSON.parse(propsString)\n    } catch (e) {\n      console.error('Invalid analytics properties format:', e)\n      return {}\n    }\n  }\n\n  getUserAgent() {\n    return navigator.userAgent\n  }\n\n  isServerTrackedAuthEvent(name) {\n    return this.constructor.SERVER_TRACKED_EVENTS.includes(name)\n  }\n}\n", "export function getMobileFiltersOverlayElement() {\n  return document.getElementById(\"mobile-filters\")\n}\n\nexport function cleanupMobileFiltersOverlayState() {\n  document.querySelectorAll(\".hs-overlay-backdrop\").forEach((backdrop) => backdrop.remove())\n\n  document.body.classList.remove(\"overflow-hidden\", \"hs-overlay-open\")\n  document.body.style.removeProperty(\"overflow\")\n}\n\nexport function closeMobileFiltersOverlay() {\n  const overlay = getMobileFiltersOverlayElement()\n  if (!overlay) return\n\n  if (typeof HSOverlay !== \"undefined\") {\n    HSOverlay.close(overlay)\n  }\n\n  overlay.classList.add(\"hidden\")\n  overlay.classList.remove(\"open\", \"hs-overlay-open\")\n  cleanupMobileFiltersOverlayState()\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport {\n  cleanupMobileFiltersOverlayState,\n  getMobileFiltersOverlayElement\n} from \"../lib/insights_mobile_filters_overlay\"\n\nexport default class extends Controller {\n  static targets = [\"mobileSearchContainer\", \"autocomplete\", \"pricingModal\", \"filtersExplainerModal\"]\n\n  static values = {\n    cityName: String,\n    source: String,\n    polygonId: String,\n    countryName: String\n  }\n\n  toggleMobileSearch() {\n    this.mobileSearchContainerTarget.classList.toggle(\"hidden\");\n    $(this.autocompleteTarget).focus();\n  }\n\n  openPricingModal(event) {\n    event.preventDefault()\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Pricing Modal Opened',\n      }\n    })\n    HSOverlay.open(this.pricingModalTarget)\n  }\n\n  openMobileFilters(event) {\n    event.preventDefault()\n\n    cleanupMobileFiltersOverlayState()\n\n    const overlay = getMobileFiltersOverlayElement()\n    if (!overlay) return\n\n    const formRoot = document.getElementById(\"mobile-filters-form\")\n    const mobileFiltersController = formRoot\n      ? this.application.getControllerForElementAndIdentifier(formRoot, \"mobile-filters\")\n      : null\n    const form = overlay.querySelector(\"form\")\n\n    if (mobileFiltersController && form) {\n      mobileFiltersController.prepareFormForOpen(form)\n    }\n\n    if (typeof HSStaticMethods !== \"undefined\" && HSStaticMethods.autoInit) {\n      HSStaticMethods.autoInit()\n    }\n\n    if (typeof HSOverlay !== \"undefined\") {\n      HSOverlay.open(overlay)\n    } else {\n      overlay.classList.remove(\"hidden\")\n    }\n  }\n\n  openFiltersExplainerModal(event) {\n    event.preventDefault()\n\n    // Get city name from data attribute or controller value\n    const cityName = event.currentTarget?.dataset?.cityName || this.cityNameValue || null\n\n    // Track Filter Locked Clicked event\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Filter Locked Clicked',\n        properties: {\n          city_name: cityName\n        }\n      }\n    })\n\n    // Open the filters explainer modal\n    const filtersExplainerModal = document.querySelector('#filters-explainer-modal')\n    if (filtersExplainerModal) {\n      HSOverlay.open(filtersExplainerModal)\n    } else {\n      // Fallback to pricing modal if explainer modal doesn't exist\n      HSOverlay.open(this.pricingModalTarget)\n    }\n  }\n\n  openSignupModal(event) {\n    event?.preventDefault?.()\n    const authSource = event?.params?.authSource || event?.detail?.authSource || null\n    HSOverlay.open('#hs-modal-signup')\n    window.dispatchEvent(new CustomEvent('signup-modal:opened', {\n      detail: { authSource }\n    }))\n  }\n\n  openSignupModalFromMap(event) {\n    if (event.detail?.opensSignupModal === false) return\n\n    this.openSignupModal(event)\n  }\n\n  smoothScrollTo(event) {\n    event.preventDefault()\n    const target = event.currentTarget.href.split('#')[1]\n    const targetElement = document.querySelector(`#${target}`)\n\n    // Scroll and then highlight\n    const scrollPromise = new Promise((resolve) => {\n      targetElement.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })\n      targetElement.classList.add('ring-2', 'ring-primary', 'transition-shadow', 'duration-1000')\n\n      // Since scrollIntoView doesn't return a promise, we'll wait a bit to ensure scroll completes\n      setTimeout(resolve, 5000)\n    })\n\n    scrollPromise.then(() => {\n      targetElement.classList.remove('ring-2', 'ring-primary', 'transition-shadow')\n    })\n  }\n\n  connect() {\n    // Auto-dismiss flash messages after 5 seconds if this controller is on the flash container\n    if (this.element.querySelector('[data-flash-message=\"true\"]')) {\n      this.autoDismissFlashMessages()\n    }\n\n    if (this.element !== document.body) return\n\n    this.onSignupModalOpened = this.trackSignupModalOpened.bind(this)\n    window.addEventListener('signup-modal:opened', this.onSignupModalOpened)\n  }\n\n  disconnect() {\n    if (!this.onSignupModalOpened) return\n\n    window.removeEventListener('signup-modal:opened', this.onSignupModalOpened)\n    this.onSignupModalOpened = null\n  }\n\n  trackSignupModalOpened(event) {\n    const authSource = event.detail?.authSource || null\n    if (authSource) {\n      sessionStorage.setItem('signup_modal_source', authSource)\n    }\n\n    const properties = { source: authSource }\n    if (authSource === 'auto_open') {\n      properties.trigger = 'auto_open'\n    } else if (authSource) {\n      properties.trigger = 'user_click'\n    }\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Signup Modal Opened',\n        properties\n      }\n    })\n  }\n\n  switchSection(event) {\n    event.preventDefault()\n    const sectionName = event.params.sectionName\n    const url = event.params.url\n\n    // Dispatch the event using Stimulus dispatch, which will bubble to window\n    this.dispatch('switch-section', {\n      detail: { sectionName, url },\n      prefix: 'story-tabs'\n    })\n  }\n\n  switchStoryTab(event) {\n    event.preventDefault()\n    const sectionId = event.params.sectionId\n\n    // Dispatch the event to switch tabs\n    window.dispatchEvent(new CustomEvent('story:switchTab', {\n      detail: { sectionId: sectionId }\n    }))\n  }\n\n  autoDismissFlashMessages() {\n    const flashMessages = this.element.querySelectorAll('[data-flash-message=\"true\"]')\n    flashMessages.forEach((message) => {\n      setTimeout(() => {\n        this.removeFlashMessage(message)\n      }, 5000)\n    })\n  }\n\n  dismissFlash(event) {\n    event.preventDefault()\n    const button = event.currentTarget\n    const flashMessage = button.closest('[data-flash-message=\"true\"]')\n    if (flashMessage) {\n      this.removeFlashMessage(flashMessage)\n    }\n  }\n\n  removeFlashMessage(flashMessage) {\n    flashMessage.style.transition = 'opacity 0.3s ease-out'\n    flashMessage.style.opacity = '0'\n    setTimeout(() => {\n      flashMessage.remove()\n      // If no flash messages remain, remove the container\n      const container = flashMessage.closest('.fixed.left-0.right-0.z-50')\n      if (container && container.querySelectorAll('[data-flash-message=\"true\"]').length === 0) {\n        container.remove()\n      }\n    }, 300)\n  }\n\n  trackCustomAreaButtonClick(event) {\n    const source = this.hasSourceValue ? this.sourceValue : 'unknown'\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Create Custom Area Button Clicked',\n        properties: {\n          source: source\n        }\n      }\n    })\n  }\n\n  trackViewInsightsClick(event) {\n    const polygonId = this.hasPolygonIdValue ? this.polygonIdValue : null\n    const countryName = this.hasCountryNameValue ? this.countryNameValue : null\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'View Insights Clicked',\n        properties: {\n          polygon_id: polygonId,\n          country_name: countryName\n        }\n      }\n    })\n  }\n\n  trackEditCustomAreaClick(event) {\n    const polygonId = this.hasPolygonIdValue ? this.polygonIdValue : null\n    const countryName = this.hasCountryNameValue ? this.countryNameValue : null\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Edit Custom Area Clicked',\n        properties: {\n          polygon_id: polygonId,\n          country_name: countryName\n        }\n      }\n    })\n  }\n\n  trackCustomAreaFormSubmit(event) {\n    const form = event.currentTarget\n\n    // Determine if this is create or update based on form action\n    const isCreate = form.action.includes('/custom-areas') && form.method === 'post'\n    const eventName = isCreate ? 'Custom Area Form Submitted' : 'Custom Area Update Form Submitted'\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: eventName\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    locale: String,\n    action: String\n  }\n\n  initialize() {\n    this.element.addEventListener('pricing:toggleBillingType', this.toggleBillingType.bind(this))\n\n    if (this.hasActionValue) {\n      const actionValue = this.actionValue\n\n      if (actionValue !== 'signup_completed' && actionValue !== 'signin_completed') return\n\n      delete this.element.dataset.authActionValue\n\n      setTimeout(() => {\n        if (actionValue == 'signup_completed') {\n          const source = sessionStorage.getItem('signup_modal_source')\n          const properties = {}\n          if (source) properties.source = source\n\n          this.dispatch('trackEvent', {\n            prefix: null,\n            detail: {\n              name: 'Signup Completed',\n              properties\n            }\n          });\n        } else if (actionValue == 'signin_completed') {\n          this.dispatch('trackEvent', {\n            prefix: null,\n            detail: {\n              name: 'Sign In Completed'\n            }\n          });\n        }\n      }, 500)\n    }\n  }\n\n  toggleBillingType(event) {\n    const { billingType } = event.detail;\n    $(\"[data-auth-billing-type-param]\").attr('data-auth-billing-type-param', billingType);\n  }\n\n  signup(event) {\n    event.preventDefault()\n\n    const { action, planId, billingType, source, returnToPage } = event.params;\n\n    // Create a hidden form and submit it\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = '/auth/auth0'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').content\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n\n    // Add screen_hint param\n    const screenHintInput = document.createElement('input')\n    screenHintInput.type = 'hidden'\n    screenHintInput.name = 'screen_hint'\n    screenHintInput.value = 'signup'\n\n    // Add ui_locales param\n    const localeInput = document.createElement('input')\n    localeInput.type = 'hidden'\n    localeInput.name = 'ui_locales'\n    localeInput.value = this.localeValue\n\n    if (action) {\n      const originInput = document.createElement('input')\n      originInput.type = 'hidden'\n      originInput.name = 'origin'\n      const url = new URL(window.location.href);\n      url.searchParams.append('action', action);\n      url.searchParams.append('planId', planId);\n      url.searchParams.append('billingType', billingType);\n      originInput.value = url.toString();\n      form.appendChild(originInput);\n    }\n\n    if (returnToPage) {\n      window.sessionStorage.setItem('returnToPage', returnToPage)\n    }\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Signup Clicked',\n        properties: {\n          action,\n          planId,\n          billingType,\n          source\n        }\n      }\n    });\n\n    form.appendChild(csrfInput)\n    form.appendChild(screenHintInput)\n    form.appendChild(localeInput)\n\n    document.body.appendChild(form)\n    form.submit()\n  }\n\n  login(event) {\n    event.preventDefault()\n\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = '/auth/auth0'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').content\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n\n    // Add screen_hint param\n    const screenHintInput = document.createElement('input')\n    screenHintInput.type = 'hidden'\n    screenHintInput.name = 'screen_hint'\n    screenHintInput.value = 'signin'\n\n    // Add ui_locales param\n    const localeInput = document.createElement('input')\n    localeInput.type = 'hidden'\n    localeInput.name = 'ui_locales'\n    localeInput.value = this.localeValue\n\n    // Add origin param for redirecting back\n    const originInput = document.createElement('input')\n    originInput.type = 'hidden'\n    originInput.name = 'origin'\n    originInput.value = window.location.href\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Sign In Clicked'\n      }\n    });\n\n    form.appendChild(csrfInput)\n    form.appendChild(screenHintInput)\n    form.appendChild(localeInput)\n    form.appendChild(originInput)\n\n    document.body.appendChild(form)\n    form.submit()\n  }\n}\n", "function parseSearchedAt(value) {\n  if (value == null || value === \"\") return null\n  const parsed = typeof value === \"number\" ? value : Date.parse(value)\n  return Number.isFinite(parsed) ? parsed : null\n}\n\n// Insights stored before searched_at existed: keep array order but don't treat as \"just now\".\nconst LEGACY_INSIGHTS_OFFSET_MS = 30 * 24 * 60 * 60 * 1000\n\nfunction insightSearchedAt(item, index, total) {\n  const parsed = parseSearchedAt(item.searched_at)\n  if (parsed != null) return parsed\n\n  return Date.now() - LEGACY_INSIGHTS_OFFSET_MS - (total - 1 - index) * 60_000\n}\n\nexport function mergeRecentSearches({ insights = [], calculator = [], limit = null }) {\n  const normalizedInsights = insights.map((item, index) => ({\n    ...item,\n    type: \"insights\",\n    name: item.name || item.label || \"\",\n    searched_at: insightSearchedAt(item, index, insights.length)\n  }))\n\n  const normalizedCalculator = calculator.map((item) => ({\n    ...item,\n    type: \"calculator\",\n    name: item.label || item.name || \"\",\n    searched_at: parseSearchedAt(item.searched_at) ?? 0\n  }))\n\n  const merged = [...normalizedInsights, ...normalizedCalculator]\n    .sort((a, b) => b.searched_at - a.searched_at)\n\n  return limit ? merged.slice(0, limit) : merged\n}\n\nexport function filterRecentSearches(items, query) {\n  const normalizedQuery = query.toLowerCase()\n\n  return items.filter((item) => {\n    if (item.type === \"calculator\") {\n      return (item.name || \"\").toLowerCase().includes(normalizedQuery) ||\n        (item.subtitle || \"\").toLowerCase().includes(normalizedQuery)\n    }\n\n    return (item.name || \"\").toLowerCase().includes(normalizedQuery) ||\n      (item.name_en && item.name_en.toLowerCase().includes(normalizedQuery)) ||\n      (item.locality_name && item.locality_name.toLowerCase().includes(normalizedQuery)) ||\n      (item.locality_name_en && item.locality_name_en.toLowerCase().includes(normalizedQuery)) ||\n      (item.region_name && item.region_name.toLowerCase().includes(normalizedQuery)) ||\n      (item.region_name_en && item.region_name_en.toLowerCase().includes(normalizedQuery))\n  })\n}\n", "const CJK_SCRIPT_PATTERN = /[\\u3040-\\u30ff\\u3400-\\u9fff\\uac00-\\ud7af]/u\n\nexport function normalizePlaceToken(value) {\n  return (value || \"\")\n    .toLowerCase()\n    .normalize(\"NFD\")\n    .replace(/\\p{M}/gu, \"\")\n    .replace(/[\\s\\-']/g, \"\")\n}\n\nexport function placeNameMatchStrength(query, label) {\n  const q = normalizePlaceToken(query)\n  const l = normalizePlaceToken(label)\n  if (!q || !l) return 0\n  if (q === l) return 3\n  if (l.startsWith(q)) return 2\n  if (q.startsWith(l)) return 1\n  return 0\n}\n\nexport function isLatinQuery(query) {\n  const trimmed = (query || \"\").trim()\n  if (!trimmed) return true\n\n  const latinChars = (trimmed.match(/[A-Za-z]/g) || []).length\n  const cjkChars = (trimmed.match(CJK_SCRIPT_PATTERN) || []).length\n  const totalChars = trimmed.replace(/\\s/g, \"\").length\n\n  if (cjkChars > 0 && latinChars === 0) return false\n  if (latinChars >= 2) return true\n  if (totalChars === 0) return true\n\n  return latinChars / totalChars >= 0.5\n}\n\nfunction preferEnglishLabels(query, nativeValue, englishValue) {\n  const nativeStrength = placeNameMatchStrength(query, nativeValue)\n  const englishStrength = placeNameMatchStrength(query, englishValue)\n\n  if (englishStrength !== nativeStrength) {\n    return englishStrength > nativeStrength\n  }\n\n  if (nativeStrength > 0) {\n    return isLatinQuery(query)\n  }\n\n  return isLatinQuery(query)\n}\n\nexport function displayPlaceName(data, query, { preferNativeWhenNoQuery = false } = {}) {\n  const trimmed = (query || \"\").trim()\n  if (preferNativeWhenNoQuery && !trimmed) return data.name\n\n  if (preferEnglishLabels(query, data.name, data.name_en)) {\n    return data.name_en || data.name\n  }\n\n  return data.name\n}\n\nexport function displayParentName(data, field, query, { preferNativeWhenNoQuery = false } = {}) {\n  const trimmed = (query || \"\").trim()\n  const nativeValue = data[field]\n  const englishValue = data[`${field}_en`]\n\n  if (preferNativeWhenNoQuery && !trimmed) return nativeValue\n\n  if (preferEnglishLabels(query, nativeValue, englishValue)) {\n    return englishValue || nativeValue\n  }\n\n  return nativeValue\n}\n\nexport function autocompleteInputLabel(data, query, options = {}) {\n  if (data?.type === \"calculator\") return data.name || \"\"\n\n  return formatAutocompleteSuggestion(data, query, options).title\n}\n\nexport function formatAutocompleteSuggestion(data, query, options = {}) {\n  const name = displayPlaceName(data, query, options)\n  const localityName = displayParentName(data, \"locality_name\", query, options)\n  const regionName = displayParentName(data, \"region_name\", query, options)\n  const crawlingAreaName = displayParentName(data, \"crawling_area_name\", query, options)\n  const countryName = displayParentName(data, \"country_name\", query, options)\n\n  if (data.t === \"country\") {\n    return {\n      title: name,\n      subtitle: \"Country\"\n    }\n  }\n\n  if (data.t === \"n\" && localityName) {\n    return {\n      title: `${name}, ${localityName}`,\n      subtitle: [regionName, countryName].filter(Boolean).join(\", \")\n    }\n  }\n\n  return {\n    title: regionName ? `${name}, ${regionName}` : name,\n    subtitle: [crawlingAreaName, countryName].filter(Boolean).join(\", \")\n  }\n}\n", "/**\n * ISO 3166-1 alpha-2 from Google Places (new API) or Geocoder (legacy address_components).\n */\nexport function countryCodeFromPlace(place) {\n  const components = place?.addressComponents\n  if (!components?.length) return null\n\n  for (const component of components) {\n    const types = component.types || []\n    if (types.includes(\"country\")) {\n      const code = component.shortText || component.short_name\n      return code ? String(code).trim().toUpperCase() : null\n    }\n  }\n\n  return null\n}\n\nexport function countryCodeFromGeocoderResult(result) {\n  const components = result?.address_components\n  if (!components?.length) return null\n\n  for (const component of components) {\n    const types = component.types || []\n    if (types.includes(\"country\")) {\n      const code = component.short_name || component.shortText\n      return code ? String(code).trim().toUpperCase() : null\n    }\n  }\n\n  return null\n}\n", "let mapsLoadPromise = null\n\nexport function resolvedGoogleMapsApiKey() {\n  return (\n    document.querySelector('meta[name=\"google-maps-api-key\"]')?.getAttribute(\"content\")?.trim() || \"\"\n  )\n}\n\n// Google's dynamic library import bootstrap \u2014 script onload is not enough with loading=async.\nfunction ensureGoogleMapsBootstrap(options) {\n  if (window.google?.maps?.importLibrary) return\n\n  ;((g) => {\n    let h\n    const p = \"The Google Maps JavaScript API\"\n    const c = \"google\"\n    const l = \"importLibrary\"\n    const q = \"__ib__\"\n    const m = document\n    let b = window\n    b = b[c] || (b[c] = {})\n    const d = b.maps || (b.maps = {})\n    const r = new Set()\n    const e = new URLSearchParams()\n    const u = () =>\n      h ||\n      (h = new Promise((resolve, reject) => {\n        const a = m.createElement(\"script\")\n        e.set(\"libraries\", [...r] + \"\")\n        for (const k in g) {\n          e.set(k.replace(/[A-Z]/g, (t) => `_${t[0].toLowerCase()}`), g[k])\n        }\n        e.set(\"callback\", `${c}.maps.${q}`)\n        a.src = `https://maps.${c}apis.com/maps/api/js?${e}`\n        d[q] = resolve\n        a.onerror = () => reject(new Error(`${p} could not load.`))\n        a.nonce = m.querySelector(\"script[nonce]\")?.nonce || \"\"\n        m.head.append(a)\n      }))\n\n    if (d[l]) {\n      console.warn(`${p} only loads once. Ignoring:`, g)\n      return\n    }\n\n    d[l] = (lib, ...args) => r.add(lib) && u().then(() => d[l](lib, ...args))\n  })(options)\n}\n\nexport function loadGoogleMaps(apiKey, language) {\n  if (!apiKey) return Promise.reject(new Error(\"Missing Google Maps API key\"))\n\n  if (!mapsLoadPromise) {\n    mapsLoadPromise = (async () => {\n      const options = { key: apiKey, v: \"weekly\" }\n      if (language) options.language = language\n\n      ensureGoogleMapsBootstrap(options)\n      await window.google.maps.importLibrary(\"places\")\n      return window.google.maps\n    })().catch((error) => {\n      mapsLoadPromise = null\n      throw error\n    })\n  }\n\n  return mapsLoadPromise\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { mergeRecentSearches, filterRecentSearches } from \"../lib/merge_recent_searches\"\nimport { autocompleteInputLabel, formatAutocompleteSuggestion } from \"../lib/autocomplete_display\"\nimport { countryCodeFromPlace } from \"../lib/google_places_country\"\nimport { loadGoogleMaps, resolvedGoogleMapsApiKey } from \"../lib/google_maps\"\n\nexport default class extends Controller {\n  static targets = [\"input\"]\n  static values = {\n    path: String,\n    suffix: String,\n    noResultsMessage: String,\n    noAddressesMessage: String,\n    recentHeader: String,\n    noRecentSearchesMessage: String,\n    startSearchingMessage: String,\n    searchResultsHeader: String,\n    searchUrl: String,\n    useStartUrl: Boolean,\n    disableNavigation: Boolean,\n    calculatorRecentSearches: { type: Array, default: [] },\n    calculatorStartUrl: String,\n    calculatorAddressCta: String,\n    calculatorDefaultBedrooms: { type: Number, default: 2 },\n    calculatorDefaultCapacity: { type: Number, default: 4 }\n  }\n\n  connect() {\n    // Initialize storage for original icon content\n    this.originalIconContent = null;\n\n    if (!this.hasInputTarget) return;\n\n    if (!this.hasRecentHeaderValue || !this.hasNoRecentSearchesMessageValue || !this.hasStartSearchingMessageValue || !this.hasSearchResultsHeaderValue) {\n      throw new Error('autocomplete_controller: missing required translation values')\n    }\n\n    const recentHeader = this.recentHeaderValue\n    const noRecentSearchesMessage = this.noRecentSearchesMessageValue\n    const startSearchingMessage = this.startSearchingMessageValue\n    const searchResultsHeader = this.searchResultsHeaderValue\n\n    // Get recent activity for display (insights localStorage + calculator from server)\n    const recentActivity = this.getMergedRecentActivity(3);\n\n    const suggestionInputLabel = (suggestion) => {\n      const query = this.inputTarget.value\n      const options = query.trim().length === 0 ? { preferNativeWhenNoQuery: true } : {}\n      return autocompleteInputLabel(suggestion, query, options)\n    }\n\n    var locations = new Bloodhound({\n      datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),\n      queryTokenizer: Bloodhound.tokenizers.whitespace,\n      identify: function(obj) { return obj.id; },\n      indexRemote: true,\n      remote: {\n        url: this.autocompleteSearchUrl(),\n        wildcard: '%QUERY'\n      },\n    });\n\n    locations.initialize();\n\n    const datasets = [];\n\n    // Add recent searches dataset if there are any\n    if (recentActivity.length > 0) {\n      datasets.push({\n        name: 'recent',\n        display: suggestionInputLabel,\n        source: function(query, syncCallback) {\n          // Show recent searches when query is empty or short\n          if (query.length <= 1) {\n            syncCallback(recentActivity);\n          } else {\n            // Filter recent searches by query\n            const filtered = filterRecentSearches(recentActivity, query);\n            syncCallback(filtered);\n          }\n        },\n        templates: {\n          header: `<div class=\"px-4 py-2 text-xs font-semibold text-gray-500 uppercase border-b border-gray-200\">${recentHeader}</div>`,\n          empty: function(context) {\n            // Only show empty state if we're showing recent searches (query length <= 1)\n            if (context.query.length <= 1) {\n              return `\n                <div class=\"px-4 py-6 text-center text-gray-400\">\n                  <div class=\"iconify mdi--clock-outline text-2xl mb-2 mx-auto\"></div>\n                  <div class=\"text-sm\">${noRecentSearchesMessage}</div>\n                  <div class=\"text-xs text-gray-300 mt-1\">${startSearchingMessage}</div>\n                </div>\n              `;\n            }\n            return '';\n          },\n          suggestion: (data) => this.recentSuggestionTemplate(data)\n        }\n      });\n    }\n\n    // Add main search dataset\n    datasets.push({\n      name: 'locations',\n      display: suggestionInputLabel,\n      source: function(query, syncCallback, asyncCallback) {\n        // Only search if there's an actual query (length > 1 to match original minLength behavior)\n        if (query.length >= 2) {\n          locations.ttAdapter()(query, syncCallback, asyncCallback);\n        } else {\n          // Return empty results for short queries\n          syncCallback([]);\n        }\n      },\n      limit: 12,\n      templates: {\n        header: recentActivity.length > 0 ? `<div class=\"px-4 py-2 text-xs font-semibold text-gray-500 uppercase border-b border-gray-200\">${searchResultsHeader}</div>` : null,\n        empty: (context) => {\n          const query = context.query;\n          // Only show \"no results\" message if we actually searched (query length >= 2)\n          if (query.length >= 2) {\n            if (this.looksLikeAddress(query) && this.hasCalculatorStartUrlValue) {\n              return this.calculatorAddressSuggestionTemplate(query);\n            }\n\n            return `\n              <div class=\"p-4 text-sm text-gray-500\" data-no-results>\n                ${this.noResultsMessageValue}\n              </div>\n            `;\n          }\n          return '';\n        },\n        suggestion: (data) => {\n          const query = this.inputTarget.value\n          const { title, subtitle } = formatAutocompleteSuggestion(data, query)\n\n          return `\n            <div>\n              <div class='title'>${title}</div>\n              <div class='subtitle'>${subtitle}</div>\n            </div>\n          `\n        }\n      }\n    });\n\n    $(this.inputTarget).typeahead({\n        hint: false,\n        highlight: false,\n        minLength: recentActivity.length > 0 ? 0 : 2,\n      }, ...datasets).on('typeahead:selected', (ev, suggestion) => {\n      if (suggestion.type === 'calculator') {\n        if (this.hasDisableNavigationValue && this.disableNavigationValue) {\n          return\n        }\n\n        window.location.href = suggestion.url\n        return\n      }\n\n      // Dispatch custom event for admin controllers to listen to\n      this.dispatch('autocompleteSelected', { \n        bubbles: true, \n        detail: { suggestion: suggestion } \n      })\n\n      // Track autocomplete selection in Amplitude\n      this.trackAutocompleteSelection(suggestion);\n\n      // Store the clicked result in localStorage\n      this.storeClickedResult(suggestion);\n\n      // Only navigate if navigation is not disabled\n      if (this.hasDisableNavigationValue && this.disableNavigationValue) {\n        // Navigation is disabled, stop here and let custom handlers take over\n        return;\n      }\n\n      // Show loading state - try new method first, fallback to old method\n      this.showLoadingState();\n\n      // Replace current subdomain with 'app' subdomain\n      const currentHost = window.location.host;\n      let targetHost;\n\n      // Check if host already has a subdomain\n      if (currentHost.includes('.')) {\n        // Host has a domain with subdomain\n        targetHost = currentHost.replace(/^[^.]*\\./, 'app.');\n      } else {\n        // Host is localhost without subdomain\n        targetHost = `app.${currentHost}`;\n      }\n\n      const protocol = window.location.protocol;\n      let targetUrl;\n\n      // Use dashboard_url with market_id if useStartUrl is true and safe_uuid is available\n      if (this.useStartUrlValue && suggestion.safe_uuid) {\n        targetUrl = `${protocol}//${targetHost}/dashboard?market_id=${suggestion.safe_uuid}`;\n      } else {\n        const path = this.pathValue && this.pathValue !== '' ? this.pathValue : 'insights';\n        const suffix = this.suffixValue && this.suffixValue !== '' ? `/${this.suffixValue}` : '';\n        targetUrl = `${protocol}//${targetHost}/${path}/${suggestion.slug}${suffix}`;\n      }\n\n      if (currentHost === targetHost) {\n        window.history.pushState({}, '', targetUrl);\n      }\n\n      window.location.href = targetUrl;\n    }).on('typeahead:render', (e, suggestion) => {\n      if (suggestion) {\n        var searchTerm = e.currentTarget.value;\n        $(e.currentTarget).siblings(\".tt-menu\").find('.title').mark(searchTerm);\n      }\n      this.bindCalculatorAddressClicks();\n    }).on('keyup', (e) => {\n      if (e.which === 13) {\n        const $menu = $(this.inputTarget).siblings('.tt-menu');\n        const isMenuVisible = $menu.hasClass('tt-open');\n        const $firstSuggestion = $menu.find('.tt-dataset-locations .tt-suggestion:first, .tt-dataset-recent .tt-suggestion:first');\n        const $calculatorCta = $menu.find('[data-calculator-address]').first();\n\n        // If menu is visible and has suggestions, but none is selected\n        if (isMenuVisible && !$menu.find('.tt-suggestion.tt-cursor').length) {\n          if ($firstSuggestion.length > 0) {\n            e.preventDefault();\n            e.stopPropagation();\n            $firstSuggestion.trigger('click');\n            return;\n          }\n\n          if ($calculatorCta.length > 0) {\n            e.preventDefault();\n            e.stopPropagation();\n            const raw = $calculatorCta.attr('data-calculator-address') || '';\n            this.navigateToCalculatorFromAddress(decodeURIComponent(raw));\n          }\n        }\n      }\n    });\n\n    this.bindCalculatorAddressClicks();\n\n    // Show recent searches on focus if input is empty\n    if (recentActivity.length > 0) {\n      $(this.inputTarget).on('focus', (e) => {\n        if (e.target.value.length === 0) {\n          $(e.target).typeahead('val', ' ').typeahead('val', '');\n        }\n      });\n    }\n  }\n\n  looksLikeAddress(query) {\n    return /\\d{2,}/.test(query);\n  }\n\n  calculatorAddressSuggestionTemplate(query) {\n    const escapedAddress = this.escapeHtml(query);\n    const message = (this.calculatorAddressCtaValue || \"\")\n      .replace(\"%{address}\", `<strong>${escapedAddress}</strong>`);\n\n    return `\n      <button type=\"button\" class=\"w-full text-left px-4 py-3 text-sm text-gray-700 hover:bg-[#E4F0EA] transition-colors\" data-calculator-address=\"${encodeURIComponent(query)}\">\n        <span class=\"iconify mdi--calculator text-[#1F6F54] inline-block align-middle mr-2\"></span>\n        <span>${message}</span>\n        <span class=\"iconify mdi--arrow-right inline-block align-middle text-[#1F6F54] ml-1\"></span>\n      </button>\n    `;\n  }\n\n  bindCalculatorAddressClicks() {\n    const $menu = $(this.inputTarget).siblings('.tt-menu');\n    $menu.find('[data-calculator-address]').off('click.calculatorAddress').on('click.calculatorAddress', (event) => {\n      event.preventDefault();\n      const raw = $(event.currentTarget).attr('data-calculator-address') || '';\n      this.navigateToCalculatorFromAddress(decodeURIComponent(raw));\n    });\n  }\n\n  async navigateToCalculatorFromAddress(address) {\n    if (!this.hasCalculatorStartUrlValue) return;\n    if (this.hasDisableNavigationValue && this.disableNavigationValue) return;\n\n    const query = (address || \"\").trim();\n    if (!query) return;\n\n    this.showLoadingState();\n\n    try {\n      const apiKey = resolvedGoogleMapsApiKey();\n      if (!apiKey) throw new Error(\"Missing Google Maps API key\");\n\n      const language = (document.documentElement.lang || \"en\").split(\"-\")[0] || \"en\";\n      const maps = await loadGoogleMaps(apiKey, language);\n      const { AutocompleteSuggestion, AutocompleteSessionToken } = await maps.importLibrary(\"places\");\n\n      const { suggestions } = await AutocompleteSuggestion.fetchAutocompleteSuggestions({\n        input: query,\n        sessionToken: new AutocompleteSessionToken(),\n        includedPrimaryTypes: [\"street_address\", \"premise\", \"subpremise\", \"route\"],\n        language\n      });\n\n      const placePrediction = suggestions?.[0]?.placePrediction;\n      if (!placePrediction) throw new Error(\"No place suggestions\");\n\n      const place = placePrediction.toPlace();\n      await place.fetchFields({ fields: [\"formattedAddress\", \"location\", \"addressComponents\"] });\n\n      const location = place.location;\n      const lat = location?.lat?.();\n      const lng = location?.lng?.();\n      if (!Number.isFinite(lat) || !Number.isFinite(lng)) throw new Error(\"Invalid coordinates\");\n\n      const params = new URLSearchParams({\n        lat: String(lat),\n        lng: String(lng),\n        address: place.formattedAddress || placePrediction.text?.toString?.() || query,\n        bedrooms: String(this.calculatorDefaultBedroomsValue),\n        capacity: String(this.calculatorDefaultCapacityValue)\n      });\n\n      const country = countryCodeFromPlace(place);\n      if (country) params.set(\"country\", country);\n\n      window.location.href = `${this.calculatorStartUrlValue}?${params.toString()}`;\n    } catch (error) {\n      console.error(\"Calculator address Places resolve failed:\", error);\n      this.hideLoadingState();\n\n      const params = new URLSearchParams({ address: query });\n      window.location.href = `${this.calculatorStartUrlValue}?${params.toString()}`;\n    }\n  }\n\n  escapeHtml(text) {\n    const div = document.createElement(\"div\");\n    div.textContent = text;\n    return div.innerHTML;\n  }\n\n  showLoadingState() {\n    // Try to find icon containers within the controller element in order of priority\n    const $controller = $(this.element);\n    const $iconContainer = $controller.find('#search-icon-container');\n    const $headerIconContainer = $controller.find('#header-search-icon-container');\n    const $mobileIconContainer = $controller.find('#mobile-search-icon-container');\n\n    if ($iconContainer.length) {\n      // Store original content before replacing\n      this.originalIconContent = $iconContainer.html();\n      $iconContainer.html(`\n        <svg class=\"animate-spin w-7 h-7 text-[#8FCBB0]\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n        </svg>\n      `);\n\n      // After 10 seconds, restore the original icon content if still present\n      setTimeout(() => {\n        // Only restore if the loading spinner is still present and originalIconContent is set\n        if (this.originalIconContent && $iconContainer.length) {\n          $iconContainer.html(this.originalIconContent);\n          this.originalIconContent = null;\n        }\n      }, 10000);\n    } else if ($headerIconContainer.length) {\n      // Store original content before replacing\n      this.originalIconContent = $headerIconContainer.html();\n      $headerIconContainer.html(`\n        <svg class=\"animate-spin flex-shrink-0 size-4 text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n        </svg>\n      `);\n    } else if ($mobileIconContainer.length) {\n      // Store original content before replacing\n      this.originalIconContent = $mobileIconContainer.html();\n      $mobileIconContainer.html(`\n        <svg class=\"animate-spin flex-shrink-0 size-4 text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n        </svg>\n      `);\n    } else {\n      // Fallback to original loading indicator method for other autocomplete instances\n      const $input = $(this.inputTarget);\n      const $container = $input.parent();\n\n      this.cleanupOriginalLoadingIndicator();\n\n      // Create and append the loading indicator\n      const $loadingIndicator = $('<div class=\"loading-indicator absolute right-3 top-1/2 -translate-y-1/2\"><svg class=\"animate-spin h-5 w-5 text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"><circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle><path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path></svg></div>');\n      $container.append($loadingIndicator);\n\n      // Add right padding to input to prevent text overlap with loading indicator\n      $input.addClass('pr-10');\n    }\n  }\n\n  hideLoadingState() {\n    // Only restore if we have stored original content\n    if (!this.originalIconContent) {\n      // Fallback to original cleanup method for other autocomplete instances\n      this.cleanupOriginalLoadingIndicator();\n      return;\n    }\n\n    // Try to restore icons within the controller element in order of priority\n    const $controller = $(this.element);\n    const $iconContainer = $controller.find('#search-icon-container');\n    const $headerIconContainer = $controller.find('#header-search-icon-container');\n    const $mobileIconContainer = $controller.find('#mobile-search-icon-container');\n\n    if ($iconContainer.length) {\n      $iconContainer.html(this.originalIconContent);\n    } else if ($headerIconContainer.length) {\n      $headerIconContainer.html(this.originalIconContent);\n    } else if ($mobileIconContainer.length) {\n      $mobileIconContainer.html(this.originalIconContent);\n    }\n\n    // Clear the stored content\n    this.originalIconContent = null;\n  }\n\n  cleanupOriginalLoadingIndicator() {\n    if (!this.hasInputTarget) return;\n\n    const $input = $(this.inputTarget);\n    const $container = $input.parent();\n    $container.find('.loading-indicator').remove();\n    $input.removeClass('pr-10');\n  }\n\n  cleanupLoadingIndicator() {\n    // This method is kept for compatibility and now handles both cases\n    this.hideLoadingState();\n  }\n\n  storeClickedResult(suggestion) {\n    // Store the complete suggestion object for later use in recent activity\n    const storageItemKey = 'recentAutocompleteActivity';\n    let recentActivity = [];\n\n    try {\n      const stored = localStorage.getItem(storageItemKey);\n      if (stored) {\n        recentActivity = JSON.parse(stored);\n        // Ensure it's an array\n        if (!Array.isArray(recentActivity)) {\n          recentActivity = [];\n        }\n      }\n    } catch (e) {\n      console.error('Error parsing stored recent activity:', e);\n      recentActivity = [];\n    }\n\n    // Store all the data that's displayed in the autocomplete\n    const activityItem = {\n      name: suggestion.name,\n      name_en: suggestion.name_en,\n      locality_name: suggestion.locality_name,\n      locality_name_en: suggestion.locality_name_en,\n      region_name: suggestion.region_name,\n      region_name_en: suggestion.region_name_en,\n      crawling_area_name: suggestion.crawling_area_name,\n      crawling_area_name_en: suggestion.crawling_area_name_en,\n      country_name: suggestion.country_name,\n      country_name_en: suggestion.country_name_en,\n      slug: suggestion.slug,\n      t: suggestion.t, // polygon type\n      safe_uuid: suggestion.safe_uuid, // safe_uuid for start_url\n      searched_at: Date.now()\n    };\n\n    // Remove any existing entry with the same slug to avoid duplicates\n    recentActivity = recentActivity.filter(item => item.slug !== suggestion.slug);\n\n    // Add the new item at the beginning (most recent first)\n    recentActivity.unshift(activityItem);\n\n    // Limit the stored items to prevent localStorage from growing too large (e.g., keep last 50)\n    const maxItems = 50;\n    if (recentActivity.length > maxItems) {\n      recentActivity = recentActivity.slice(0, maxItems);\n    }\n\n    // Store back to localStorage\n    try {\n      localStorage.setItem(storageItemKey, JSON.stringify(recentActivity));\n      console.log(`Stored recent activity for: ${suggestion.name}`);\n\n      // Dispatch a custom event to notify other controllers\n      window.dispatchEvent(new CustomEvent('recentSearchesUpdated', {\n        detail: { suggestion: activityItem }\n      }));\n    } catch (e) {\n      console.error('Error storing recent activity:', e);\n      // If storage fails due to quota, try removing oldest items\n      if (e.name === 'QuotaExceededError' && recentActivity.length > 10) {\n        try {\n          recentActivity = recentActivity.slice(0, 10);\n          localStorage.setItem(storageItemKey, JSON.stringify(recentActivity));\n        } catch (retryError) {\n          console.error('Error storing recent activity even after reducing size:', retryError);\n        }\n      }\n    }\n  }\n\n  getMergedRecentActivity(limit) {\n    return mergeRecentSearches({\n      insights: this.getRecentActivity(null),\n      calculator: this.calculatorRecentSearchesItems(),\n      limit\n    })\n  }\n\n  calculatorRecentSearchesItems() {\n    const value = this.calculatorRecentSearchesValue\n    if (Array.isArray(value)) return value\n    if (typeof value === \"string\" && value.length > 0) {\n      try {\n        const parsed = JSON.parse(value)\n        return Array.isArray(parsed) ? parsed : []\n      } catch {\n        return []\n      }\n    }\n    return []\n  }\n\n  recentSuggestionTemplate(data) {\n    if (data.type === 'calculator') {\n      return `\n        <div>\n          <div class='title'>${data.name}</div>\n          <div class='subtitle'>${data.subtitle || ''}</div>\n        </div>\n      `\n    }\n\n    const { title, subtitle } = formatAutocompleteSuggestion(data, null, { preferNativeWhenNoQuery: true })\n\n    return `\n      <div>\n        <div class='title'>${title}</div>\n        <div class='subtitle'>${subtitle}</div>\n      </div>\n    `\n  }\n\n  // Instance method to get recent activity for use within the controller\n  getRecentActivity(limit = 10) {\n    const storageItemKey = 'recentAutocompleteActivity';\n    try {\n      const stored = localStorage.getItem(storageItemKey);\n      const activity = stored ? JSON.parse(stored) : [];\n      const normalized = activity.map((item, index) => ({\n        ...item,\n        searched_at: item.searched_at ?? null\n      }));\n      return limit ? normalized.slice(0, limit) : normalized;\n    } catch (e) {\n      console.error('Error retrieving recent activity:', e);\n      return [];\n    }\n  }\n\n  // Utility method to get recent activity (can be called from browser console or used in autocomplete)\n  static getRecentActivity(limit = 10) {\n    const storageItemKey = 'recentAutocompleteActivity';\n    try {\n      const stored = localStorage.getItem(storageItemKey);\n      const activity = stored ? JSON.parse(stored) : [];\n      const normalized = activity.map((item) => ({\n        ...item,\n        searched_at: item.searched_at ?? null\n      }));\n      return limit ? normalized.slice(0, limit) : normalized;\n    } catch (e) {\n      console.error('Error retrieving recent activity:', e);\n      return [];\n    }\n  }\n\n  // Utility method to clear recent activity (can be called from browser console)\n  static clearRecentActivity() {\n    const storageItemKey = 'recentAutocompleteActivity';\n    try {\n      localStorage.removeItem(storageItemKey);\n      console.log('Cleared recent autocomplete activity');\n    } catch (e) {\n      console.error('Error clearing recent activity:', e);\n    }\n  }\n\n  // Utility method to remove a specific item from recent activity\n  static removeFromRecentActivity(slug) {\n    const storageItemKey = 'recentAutocompleteActivity';\n    try {\n      const stored = localStorage.getItem(storageItemKey);\n      if (stored) {\n        let recentActivity = JSON.parse(stored);\n        recentActivity = recentActivity.filter(item => item.slug !== slug);\n        localStorage.setItem(storageItemKey, JSON.stringify(recentActivity));\n        console.log(`Removed ${slug} from recent activity`);\n      }\n    } catch (e) {\n      console.error('Error removing item from recent activity:', e);\n    }\n  }\n\n  trackAutocompleteSelection(suggestion) {\n    // Dispatch event to amplitude controller (which is attached to body element)\n    const event = new CustomEvent('trackEvent', {\n      detail: {\n        name: 'Autocomplete Item Selected',\n        properties: {\n          autocomplete_name: suggestion.name,\n          autocomplete_slug: suggestion.slug,\n          autocomplete_type: suggestion.t,\n          locality_name: suggestion.locality_name || null,\n          region_name: suggestion.region_name || null,\n          country_name: suggestion.country_name || null,\n          crawling_area_name: suggestion.crawling_area_name || null\n        }\n      },\n      bubbles: true\n    });\n    document.body.dispatchEvent(event);\n  }\n\n  autocompleteSearchUrl() {\n    if (this.hasSearchUrlValue && this.searchUrlValue) {\n      return this.searchUrlValue;\n    }\n\n    return '/search/autocomplete?q=%QUERY';\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    labels: Array,\n    counts: Array\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initializeChart() {\n    const canvas = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvas.getContext('2d')\n\n    // Calculate total and percentages\n    const total = this.countsValue.reduce((sum, value) => sum + value, 0)\n    const percentages = this.countsValue.map(count =>\n      parseFloat(((count / total) * 100).toFixed(1))\n    )\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: this.labelsValue,\n        datasets: [{\n          type: 'bar',\n          data: percentages,\n          barThickness: 12,\n          borderRadius: 4,\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const { ctx, chartArea } = chart\n\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          }\n        }]\n      },\n      options: {\n        indexAxis: 'y',\n        maintainAspectRatio: false,\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            callbacks: {\n              label: function(context) {\n                return `${context.parsed.x}%`\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            display: true,\n            grid: {\n              display: false\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%'\n              }\n            }\n          },\n          y: {\n            grid: {\n              display: false\n            }\n          }\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    events: Array,\n    listingId: String\n  }\n\n  connect() {\n    this.initializeCalendar()\n  }\n\n  initializeCalendar() {\n    this.calendar = new FullCalendar.Calendar(this.element, {\n      headerToolbar: {\n        left: 'today',\n        center: 'title',\n        right: 'prev,next'\n      },\n      displayEventTime: false,\n      events: this.eventsValue,\n      eventDidMount: this.eventDidMount,\n      dayCellDidMount: this.dayCellDidMount,\n      datesSet: (info) => this.trackMonthChange(info)\n    })\n\n    this.calendar.render()\n  }\n\n  trackMonthChange(info) {\n    const startDate = info.startStr?.slice(0, 10)\n    const endDate = info.endStr?.slice(0, 10)\n\n    if (!this.lastCalendarRange) {\n      this.lastCalendarRange = { startDate, endDate }\n      return\n    }\n\n    if (this.lastCalendarRange.startDate === startDate && this.lastCalendarRange.endDate === endDate) {\n      return\n    }\n\n    const previousStart = this.lastCalendarRange.startDate\n    const direction = startDate > previousStart ? 'next' : 'prev'\n    this.lastCalendarRange = { startDate, endDate }\n\n    const properties = {\n      direction,\n      visible_start: startDate,\n      visible_end: endDate\n    }\n\n    if (this.hasListingIdValue && this.listingIdValue) {\n      properties.listing_id = this.listingIdValue\n    }\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Calendar Month Changed',\n        properties\n      }\n    })\n  }\n\n  eventDidMount = (info) => {\n    let blocking_reason = ''\n    let review = ''\n    let discount = ''\n\n    if (info.event.extendedProps.blocking_reason) {\n      blocking_reason = `\n        <div class=\"flex justify-between py-1\">\n          <dt>Blocking reason</dt>\n          <dd>${info.event.extendedProps.blocking_reason}</dd>\n        </div>\n      `\n    }\n\n    if (info.event.extendedProps.review) {\n      review = `\n        <div class=\"flex justify-between py-1\">\n          <dt>Review</dt>\n          <dd>${info.event.extendedProps.review}</dd>\n        </div>\n      `\n    }\n\n    if (info.event.extendedProps.discount) {\n      discount = `\n        <div class=\"flex justify-between py-1\">\n          <dt>Discount</dt>\n          <dd>${info.event.extendedProps.discount}%</dd>\n        </div>\n      `\n    }\n\n    let tooltip = `\n      <div class=\"divide-y divide-gray-100 bg-white shadow-sm border w-80 px-2 rounded-lg text-sm\">\n        <div class=\"flex justify-between py-2\" style=\"z-index: 238293\">\n          <dt>Created at</dt>\n          <dd>${info.event.extendedProps.created_at}</dd>\n        </div>\n        ${blocking_reason}\n        ${review}\n        <div class=\"flex justify-between py-1\">\n          <dt>Lead days</dt>\n          <dd>${info.event.extendedProps.lead_days}</dd>\n        </div>\n        <div class=\"flex justify-between py-1\">\n          <dt>Duration</dt>\n          <dd>${info.event.extendedProps.booking_duration}</dd>\n        </div>\n        <div class=\"flex justify-between py-1\">\n          <dt>ADR</dt>\n          <dd>${info.event.extendedProps.adr}</dd>\n        </div>\n        ${discount}\n      </div>\n    `\n    if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip) {\n      new bootstrap.Tooltip(info.el, { html: true, customClass: 'tooltip-class', title: tooltip })\n    } else {\n      info.el.setAttribute('title', tooltip.replace(/<[^>]*>/g, ''))\n    }\n  }\n\n  dayCellDidMount = (dateObj) => {\n    const date = dateObj.date\n\n    const isBlocking = this.eventsValue.find((e) => {\n      return e.type == 'blocking' &&\n        new Date(`${e.start} 00:00`) < date &&\n        new Date(`${e.end} 00:00`) >= date\n    })\n\n    if (isBlocking) {\n      $(dateObj.el).addClass('fc-day-blocking')\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nString.prototype.capitalize = function() {\n  return this.replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n};\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    chartData: Array,\n    chartDataSeries: Object, // Optional: object with multiple series { p25: [[date, value]], p50: [[date, value]], ... }\n    dottedFutureMonths: Boolean,\n    today: Number,\n    locale: String,\n    chartType: { type: String, default: 'line' },\n    dataType: { type: String, default: 'number' }, // 'currency', 'percentage', 'number'\n    currencyCode: { type: String, default: 'USD' },\n    showLegend: { type: Boolean, default: false },\n    unitLabel: { type: String, default: '' }, // Optional unit label to append to values (e.g., \"listings\", \"bookings\")\n    legendPadding: { type: Number, default: 30 }, // Legend padding, can be reduced for mobile\n    tierLabels: Object, // Optional: object mapping tier keys to translated labels { entry_level: \"Entry Level\", ... }\n    tension: { type: Number, default: 0 },\n    sortByCalendarMonth: { type: Boolean, default: false },\n    tooltipMonthOnly: { type: Boolean, default: false },\n    areaFill: { type: Boolean, default: false },\n    // Optional palette overrides (SEO landings keep pre-redesign violet bars).\n    gradientFrom: { type: String, default: '#1F6F54' },\n    gradientTo: { type: String, default: '#8FCBB0' },\n    futureFill: { type: String, default: 'rgba(31, 111, 84, 0.3)' },\n    pointColor: { type: String, default: '#8FCBB0' }\n  }\n\n  connect() {\n    this.chart = null\n    this.seriesKeyMap = {\n      'entry_level': 'p25',\n      'average': 'p50',\n      'high_performing': 'p75',\n      'premium': 'p90'\n    }\n    // Reverse mapping: percentile keys to tier keys\n    this.percentileToTierMap = {\n      'p25': 'entry_level',\n      'p50': 'average',\n      'p75': 'high_performing',\n      'p90': 'premium'\n    }\n    // Tier label mapping (will be used in tooltip) - use provided labels or fallback to English\n    this.tierLabels = this.hasTierLabelsValue ? this.tierLabelsValue : {\n      'entry_level': 'Entry Level',\n      'average': 'Market Median',\n      'high_performing': 'High Performing Properties',\n      'premium': 'Most Booked Properties'\n    }\n    this.datasetIndexMap = {} // Map series keys to dataset indices\n    this.initializeChart()\n  }\n\n  toggleSeries(event) {\n    if (!this.chart) return\n\n    const tierKey = event.currentTarget.dataset.tier\n    const seriesKey = this.seriesKeyMap[tierKey]\n\n    if (!seriesKey || this.datasetIndexMap[seriesKey] === undefined) return\n\n    const datasetIndex = this.datasetIndexMap[seriesKey]\n    const meta = this.chart.getDatasetMeta(datasetIndex)\n    meta.hidden = !meta.hidden\n    this.chart.update()\n\n    // Update all button styles based on their series visibility\n    this.updateAllButtonStyles()\n  }\n\n  updateAllButtonStyles() {\n    if (!this.chart) return\n\n    // Find all tier buttons\n    const buttons = this.element.querySelectorAll('.occupancy-tier-selector')\n\n    buttons.forEach(button => {\n      const tierKey = button.dataset.tier\n      const seriesKey = this.seriesKeyMap[tierKey]\n\n      if (!seriesKey || this.datasetIndexMap[seriesKey] === undefined) return\n\n      const datasetIndex = this.datasetIndexMap[seriesKey]\n      const meta = this.chart.getDatasetMeta(datasetIndex)\n\n      // Find label text element\n      const labelText = button.querySelector('span.text-gray-700, span.text-gray-400')\n\n      // Update visual state\n      if (meta.hidden) {\n        // Hidden state - lighter text\n        if (labelText) {\n          labelText.classList.remove('text-gray-700')\n          labelText.classList.add('text-gray-400')\n        }\n      } else {\n        // Visible state - darker text\n        if (labelText) {\n          labelText.classList.remove('text-gray-400')\n          labelText.classList.add('text-gray-700')\n        }\n      }\n    })\n  }\n\n  initializeChart() {\n    const canvasElement = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvasElement.getContext('2d')\n\n    // Check if we have multiple series or single series\n    const hasMultipleSeries = this.hasChartDataSeriesValue && Object.keys(this.chartDataSeriesValue).length > 0\n    let chartData = hasMultipleSeries ? Object.values(this.chartDataSeriesValue)[0] : [...this.chartDataValue]\n    if (this.sortByCalendarMonthValue) {\n      chartData.sort((a, b) => {\n        return new Date(a[0] + 'T00:00:00Z').getUTCMonth() - new Date(b[0] + 'T00:00:00Z').getUTCMonth()\n      })\n    }\n    const dates = chartData.map(([date]) => new Date(date))\n    const now = new Date(this.todayValue)\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, this.gradientFromValue)\n        gradient.addColorStop(1, this.gradientToValue)\n      }\n      return gradient\n    }\n\n    // Build datasets - either multiple series or single series\n    let datasets = []\n    if (hasMultipleSeries) {\n      // Define colors for percentile series\n      const seriesConfig = {\n        p25: { color: '#A7D4C2', borderDash: [] },\n        p50: { color: '#1F6F54', borderDash: [] },\n        p75: { color: '#8FCBB0', borderDash: [] },\n        p90: { color: '#1A5F48', borderDash: [] }\n      }\n\n      Object.entries(this.chartDataSeriesValue).forEach(([key, data], index) => {\n        const config = seriesConfig[key] || { color: '#1F6F54', borderDash: [] }\n        this.datasetIndexMap[key] = index // Store mapping for toggle functionality\n        // Generate colors for bedroom count series if not in seriesConfig\n        let seriesColor = config.color\n        if (!seriesConfig[key] && this.showLegendValue) {\n          // Use a color palette for bedroom counts\n          const bedroomColors = ['#1F6F54', '#1A5F48', '#8FCBB0', '#0C1A14', '#F59E0B', '#10B981', '#166348']\n          seriesColor = bedroomColors[index % bedroomColors.length]\n        }\n        // Use tier label if available, otherwise use the key\n        const tierKey = this.percentileToTierMap[key]\n        const displayLabel = tierKey && this.tierLabels[tierKey] ? this.tierLabels[tierKey] : key\n        datasets.push({\n          type: this.chartTypeValue,\n          label: displayLabel, // Always set label for tooltip, even if legend is hidden\n          data: data.map(([, value]) => value),\n          tension: this.tensionValue,\n          fill: this.areaFillValue,\n          borderColor: seriesColor,\n          backgroundColor: this.areaFillValue ? seriesColor + '20' : 'transparent',\n          pointBackgroundColor: seriesColor,\n          borderDash: config.borderDash,\n          pointRadius: 2,\n          pointHoverRadius: 4\n        })\n      })\n    } else {\n      // Single series (original behavior)\n      const futureFill = this.futureFillValue\n      const pointColor = this.pointColorValue\n      datasets = [{\n        type: this.chartTypeValue,\n        data: chartData.map(([, value]) => value),\n        tension: this.tensionValue,\n        segment: {\n          borderDash: ctx => {\n            if (!this.dottedFutureMonthsValue) {\n              return []\n            }\n            const currentDate = dates[ctx.p1DataIndex]\n            return currentDate >= now ? [5, 5] : []\n          }\n        },\n        borderColor: function(context) {\n          const chart = context.chart\n          const {ctx, chartArea} = chart\n          if (!chartArea) {\n            return\n          }\n          return getGradient(ctx, chartArea)\n        },\n        backgroundColor: function(context) {\n          const chart = context.chart\n          const {ctx, chartArea} = chart\n          if (!chartArea) {\n            return\n          }\n          const gradient = getGradient(ctx, chartArea)\n\n          const currentDate = dates[context.dataIndex]\n          if (currentDate >= now) {\n            return futureFill\n          }\n          return gradient\n        },\n        pointBackgroundColor: pointColor,\n      }]\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(this.localeValue, { month: 'short', timeZone: 'UTC' }).capitalize()),\n        datasets: datasets\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: this.showLegendValue, // Show legend if showLegend is true\n            position: 'bottom', // Position legend at the bottom\n            labels: {\n              padding: this.legendPaddingValue,\n              usePointStyle: true, // Use dots instead of squares\n              boxWidth: window.innerWidth < 640 ? 8 : 12,\n              font: {\n                size: window.innerWidth < 640 ? 10 : 12\n              }\n            },\n            onHover: (e, legendItem) => {\n              e.native.target.style.cursor = 'pointer'\n            },\n            onLeave: (e, legendItem) => {\n              e.native.target.style.cursor = 'default'\n            }\n          },\n          tooltip: {\n            mode: 'index',\n            intersect: false,\n            callbacks: {\n              title: (tooltipItems) => {\n                // Get the date from the chartData array\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = chartData[dataIndex][0]\n                const date = new Date(dateString + 'T00:00:00Z')\n\n                const titleOptions = { month: 'long', timeZone: 'UTC' }\n                if (!this.tooltipMonthOnlyValue) {\n                  titleOptions.year = 'numeric'\n                }\n                return date.toLocaleString(this.localeValue, titleOptions)\n              },\n              label: (context) => {\n                const value = context.raw\n                const datasetLabel = context.dataset.label || ''\n\n                let formattedValue\n                switch (this.dataTypeValue) {\n                  case 'currency':\n                    formattedValue = new Intl.NumberFormat(this.localeValue, {\n                      style: 'currency',\n                      currency: this.currencyCodeValue,\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0\n                    }).format(value)\n                    break\n                  case 'percentage':\n                    formattedValue = `${Math.round(value)}%`\n                    break\n                  case 'days':\n                    formattedValue = `${new Intl.NumberFormat(this.localeValue, {\n                      minimumFractionDigits: 1,\n                      maximumFractionDigits: 1\n                    }).format(value)} days`\n                    break\n                  case 'number':\n                  default:\n                    formattedValue = new Intl.NumberFormat(this.localeValue, {\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0\n                    }).format(value)\n                }\n\n                // Append unit label if provided\n                if (this.unitLabelValue && this.unitLabelValue.trim() !== '') {\n                  formattedValue = `${formattedValue} ${this.unitLabelValue}`\n                }\n\n                return datasetLabel ? `${datasetLabel}: ${formattedValue}` : formattedValue\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            grid: {\n              drawOnChartArea: true\n            },\n            ticks: {\n              callback: (value) => {\n                if (this.dataTypeValue === 'percentage') {\n                  return `${Math.round(value)}%`\n                }\n                return value\n              }\n            }\n          }\n        },\n      }\n    })\n\n    // Initialize button styles after chart is created (for multiple series)\n    if (hasMultipleSeries) {\n      setTimeout(() => {\n        this.updateAllButtonStyles()\n      }, 100)\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  open(event) {\n    if (event.target.closest(\"[data-comp-set-pro-badge]\")) return\n\n    const url = event.currentTarget.dataset.compSetListRowUrlValue\n    if (!url) return\n\n    window.open(url, \"_blank\", \"noopener,noreferrer\")\n  }\n\n  stop(event) {\n    event.stopPropagation()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    email: String\n  }\n\n  preventSubmit(event) {\n    event.preventDefault()\n  }\n\n  open(event) {\n    event.preventDefault()\n\n    if (!this.element.checkValidity()) {\n      this.element.reportValidity()\n      return\n    }\n\n    this.trackAnalytics()\n    this.openMailto()\n  }\n\n  openMailto() {\n    const name = this.element.querySelector(\"#contact-name\")?.value?.trim() || \"\"\n    const replyTo = this.element.querySelector(\"#contact-email\")?.value?.trim() || \"\"\n    const subject = this.element.querySelector(\"#contact-subject\")?.value?.trim() || \"\"\n    const message = this.element.querySelector(\"#contact-message\")?.value?.trim() || \"\"\n\n    const bodyParts = []\n    if (name) bodyParts.push(`Name: ${name}`)\n    if (replyTo) bodyParts.push(`Email: ${replyTo}`)\n    if (bodyParts.length) bodyParts.push(\"\")\n    bodyParts.push(message)\n\n    const body = bodyParts.join(\"\\n\")\n    const params = []\n    if (subject) params.push(`subject=${encodeURIComponent(subject)}`)\n    if (body) params.push(`body=${encodeURIComponent(body)}`)\n\n    const mailto = params.length\n      ? `mailto:${this.emailValue}?${params.join(\"&\")}`\n      : `mailto:${this.emailValue}`\n\n    const link = document.createElement(\"a\")\n    link.href = mailto\n    link.rel = \"noopener\"\n    document.body.appendChild(link)\n    link.click()\n    link.remove()\n  }\n\n  trackAnalytics() {\n    const eventName = this.element.dataset.analyticsEvent\n    if (!eventName) return\n\n    const baseProperties = this.parseEventProperties(this.element.dataset.analyticsProps)\n    const properties = { ...baseProperties }\n\n    const subject = this.element.querySelector(\"#contact-subject\")?.value\n    const email = this.element.querySelector(\"#contact-email\")?.value\n    const message = this.element.querySelector(\"#contact-message\")?.value\n\n    if (subject) properties.subject = subject\n    if (email) properties.email_address = email\n    if (message) properties.body = message\n\n    this.element.dispatchEvent(new CustomEvent(\"trackEvent\", {\n      bubbles: true,\n      detail: { name: eventName, properties }\n    }))\n  }\n\n  parseEventProperties(propsString) {\n    if (!propsString) return {}\n    try {\n      return JSON.parse(propsString)\n    } catch {\n      return {}\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    labels: Array,\n    occupancyData: Array,\n    bookedNights: Array,\n    availableColor: { type: String, default: \"#F8A5A5\" },\n    bookedColor: { type: String, default: \"#b9d7b8\" },\n    todayAvailableColor: { type: String, default: \"#F8A5A5\" },\n    todayBookedColor: { type: String, default: \"#b9d7b8\" },\n    percentageScale: Boolean\n  }\n\n  connect() {\n    Chart.defaults.color = 'rgb(120, 113, 108)'\n    this.initChart()\n  }\n\n  initChart() {\n    const ctx = this.element.getContext('2d')\n\n    // Convert dates to consistent format for comparison\n    const formattedBookedNights = this.bookedNightsValue.map(date => this.formatDate(date))\n\n    // Get today's date in the same format as the chart data\n    const today = this.formatDate(new Date())\n\n    // Find index of today's date in the labels array\n    const todayIndex = this.labelsValue.findIndex(date => this.formatDate(date) === today)\n\n    // Generate colors array based on whether each night is booked\n    const barColors = this.labelsValue.map(date => {\n      const formattedDate = this.formatDate(date)\n      const isBooked = formattedBookedNights.includes(formattedDate)\n      const isToday = formattedDate === today\n\n      if (isToday) {\n        return isBooked ? this.todayBookedColorValue : this.todayAvailableColorValue\n      }\n      return isBooked ? this.bookedColorValue : this.availableColorValue\n    })\n\n    // Create an array of booked status for tooltip reference\n    const bookedStatus = this.labelsValue.map(date => {\n      const formattedDate = this.formatDate(date)\n      return formattedBookedNights.includes(formattedDate)\n    })\n\n    // Create an array to track which dates are today\n    const isTodayArray = this.labelsValue.map(date => {\n      return this.formatDate(date) === today\n    })\n\n    new Chart(ctx, {\n      type: 'bar',\n      data: {\n        labels: this.labelsValue.map(date => {\n          // Format date for display\n          const dateObj = new Date(date)\n          return dateObj.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n        }),\n        datasets: [{\n          data: this.occupancyDataValue,\n          backgroundColor: barColors,\n          barPercentage: 1.1,\n          borderRadius: 3,\n          borderWidth: 0,\n          // Store metadata in dataset for tooltip access\n          bookedStatus: bookedStatus,\n          isTodayArray: isTodayArray\n        }]\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: false // Hide the legend\n          },\n          tooltip: {\n            callbacks: {\n              title: function(context) {\n                // Access the raw label directly from the chart data\n                const index = context[0].dataIndex;\n                // Get the displayed label which is already formatted as \"Month Day\"\n                const displayedLabel = context[0].chart.data.labels[index];\n\n                // Create a date from the parts (current year and displayed \"Month Day\")\n                const currentYear = new Date().getFullYear();\n                const date = new Date(`${displayedLabel}, ${currentYear}`);\n\n                // Format the date with day name\n                return date.toLocaleDateString('en-US', { weekday: 'long' }) + \", \" + displayedLabel;\n              },\n              label: function(context) {\n                const isBooked = context.dataset.bookedStatus[context.dataIndex];\n                const isToday = context.dataset.isTodayArray[context.dataIndex];\n\n                let label = context.parsed.y + '%';\n\n                if (isToday && isBooked) {\n                  label += ' (Today, Booked)';\n                } else if (isToday) {\n                  label += ' (Today)';\n                } else if (isBooked) {\n                  label += ' (Booked)';\n                }\n\n                return label;\n              }\n            }\n          },\n          annotation: todayIndex >= 0 ? {\n            annotations: {\n              todayLine: {\n                type: 'line',\n                xMin: todayIndex,\n                xMax: todayIndex,\n                yMin: 0,\n                yMax: 100,\n                borderColor: 'rgba(75, 85, 99, 0.7)',\n                borderWidth: 2,\n                borderDash: [5, 3]\n              },\n              todayLabel: {\n                type: 'label',\n                xValue: todayIndex,\n                yValue: 93,\n                backgroundColor: '#4B5563',\n                content: 'Today',\n                color: 'white',\n                font: {\n                  size: 12,\n                  weight: 'bold'\n                },\n                padding: {\n                  top: 4,\n                  bottom: 4,\n                  left: 8,\n                  right: 8\n                },\n                borderRadius: 4,\n                position: 'top'\n              }\n            }\n          } : {}\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            beginAtZero: true,\n            grid: {\n              drawOnChartArea: true\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%';\n              }\n            },\n            max: this.percentageScaleValue ? 100 : undefined\n          }\n        }\n      }\n    })\n  }\n\n  // Helper to normalize date format for comparison\n  formatDate(dateString) {\n    // Handle both Date objects and strings\n    const date = typeof dateString === 'string' ? new Date(dateString) : dateString\n    return date.toISOString().split('T')[0] // Returns YYYY-MM-DD format\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\n// Shows every advanced filter inline when the row fits; otherwise collapses\n// inactive advanced filters into the More menu.\nexport default class extends Controller {\n  static targets = [\"row\", \"collapsibleItem\", \"more\"]\n\n  connect() {\n    this.boundLayout = () => this.scheduleLayout()\n    this.scheduleLayout()\n\n    if (typeof ResizeObserver !== \"undefined\") {\n      this.resizeObserver = new ResizeObserver(this.boundLayout)\n      this.resizeObserver.observe(this.element)\n      if (this.hasRowTarget) this.resizeObserver.observe(this.rowTarget)\n    }\n\n    window.addEventListener(\"resize\", this.boundLayout)\n  }\n\n  disconnect() {\n    if (this.layoutFrame) cancelAnimationFrame(this.layoutFrame)\n    if (this.resizeObserver) this.resizeObserver.disconnect()\n    window.removeEventListener(\"resize\", this.boundLayout)\n  }\n\n  scheduleLayout() {\n    if (this.layoutFrame) cancelAnimationFrame(this.layoutFrame)\n    this.layoutFrame = requestAnimationFrame(() => this.layout())\n  }\n\n  layout() {\n    if (!this.hasRowTarget || !this.hasMoreTarget) return\n\n    // Measure with all collapsible items visible and More hidden.\n    this.collapsibleItemTargets.forEach((el) => el.classList.remove(\"hidden\"))\n    this.moreTarget.classList.add(\"hidden\")\n\n    if (!this.overflows()) return\n\n    // Not enough room: park inactive advanced filters behind More.\n    this.collapsibleItemTargets.forEach((el) => el.classList.add(\"hidden\"))\n    this.moreTarget.classList.remove(\"hidden\")\n  }\n\n  overflows() {\n    const row = this.rowTarget\n    return row.scrollWidth > row.clientWidth + 1\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [ \"stepButton\", \"dayPanel\", \"explanation\" ]\n\n  connect() {\n    this.showStep(0)\n  }\n\n  changeStep(event) {\n    const step = parseInt(event.currentTarget.dataset.stepIndex, 10)\n    this.showStep(step)\n  }\n\n  showStep(activeStep) {\n    // Update active button state\n    this.stepButtonTargets.forEach((button, index) => {\n      if (index === activeStep) {\n        button.classList.add(\"bg-[#1F6F54]\", \"text-white\")\n        button.classList.remove(\"bg-white\", \"text-gray-700\", \"hover:bg-gray-50\", \"border-gray-200\")\n      } else {\n        button.classList.remove(\"bg-[#1F6F54]\", \"text-white\")\n        button.classList.add(\"bg-white\", \"text-gray-700\", \"hover:bg-gray-50\", \"border-gray-200\")\n      }\n    })\n\n    // Show active day calendar panel\n    this.dayPanelTargets.forEach((panel, index) => {\n      if (index === activeStep) {\n        panel.classList.remove(\"hidden\")\n        panel.classList.add(\"animate-fade-in\")\n      } else {\n        panel.classList.add(\"hidden\")\n        panel.classList.remove(\"animate-fade-in\")\n      }\n    })\n\n    // Show active explanation text\n    this.explanationTargets.forEach((exp, index) => {\n      if (index === activeStep) {\n        exp.classList.remove(\"hidden\")\n      } else {\n        exp.classList.add(\"hidden\")\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"menu\"]\n\n  connect() {\n    this.isOpen = false\n    // Store bound function reference for addEventListener/removeEventListener\n    this.boundCloseOnOutsideClick = this.closeOnOutsideClick.bind(this)\n    this.close()\n  }\n\n  toggle(event) {\n    event.stopPropagation()\n    if (this.isOpen) {\n      this.close()\n    } else {\n      this.open()\n    }\n  }\n\n  select(event) {\n    event.stopPropagation()\n    const range = event.currentTarget.dataset.range\n    const months = event.currentTarget.dataset.months\n    const label = event.currentTarget.dataset.label\n\n    // Update the button label\n    const labelElement = this.element.querySelector('.time-range-label')\n    if (labelElement) {\n      labelElement.textContent = label\n    }\n\n    // Update the button data attributes\n    const button = this.element.querySelector('.time-range-selector')\n    if (button) {\n      button.dataset.range = range\n      button.dataset.months = months\n    }\n\n    this.close()\n  }\n\n  open() {\n    this.menuTarget.classList.remove('hidden')\n    this.isOpen = true\n    // Close on outside click\n    setTimeout(() => {\n      document.addEventListener('click', this.boundCloseOnOutsideClick)\n    }, 0)\n  }\n\n  close() {\n    this.menuTarget.classList.add('hidden')\n    this.isOpen = false\n    document.removeEventListener('click', this.boundCloseOnOutsideClick)\n  }\n\n  closeOnOutsideClick(event) {\n    if (!this.element.contains(event.target)) {\n      this.close()\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Opens #hs-modal-email-exists. Turbo replaces #email-exists-trigger with email +\n// sign-in URL for the \"email already registered\" signup flow. For OmniAuth\n// failures, a separate trigger passes openSignupOnClose: closing the modal\n// (X, backdrop, or continue) then opens the signup modal.\nexport default class extends Controller {\n  static values = {\n    email: String,\n    signInUrl: String,\n    useGoogleSignIn: { type: Boolean, default: false },\n    openSignupOnClose: { type: Boolean, default: false },\n  }\n\n  connect() {\n    const emailDisplay = document.getElementById(\"email-exists-email-display\")\n    if (emailDisplay && this.hasEmailValue && this.emailValue) {\n      emailDisplay.textContent = this.emailValue\n    }\n\n    this._configureSignInAction()\n    this._wireDifferentEmailButton()\n\n    if (this.openSignupOnCloseValue) {\n      const modal = document.getElementById(\"hs-modal-email-exists\")\n      if (modal) {\n        this._onModalClose = this._onModalClose.bind(this)\n        modal.addEventListener(\"close.hs.overlay\", this._onModalClose)\n      }\n    }\n\n    // Auth-error flow: inline script in _signup_modal opens after Preline loads.\n    if (!this.openSignupOnCloseValue) {\n      this._openModalWhenReady()\n    }\n  }\n\n  _openModal() {\n    if (typeof HSOverlay === \"undefined\") return false\n\n    const modal = document.getElementById(\"hs-modal-email-exists\")\n    if (!modal) return false\n\n    HSOverlay.open(modal)\n    return true\n  }\n\n  _openModalWhenReady(attempt = 0) {\n    if (this._openModal()) return\n    if (attempt >= 100) return\n\n    setTimeout(() => this._openModalWhenReady(attempt + 1), 50)\n  }\n\n  disconnect() {\n    if (this.openSignupOnCloseValue && this._onModalClose) {\n      const modal = document.getElementById(\"hs-modal-email-exists\")\n      if (modal) {\n        modal.removeEventListener(\"close.hs.overlay\", this._onModalClose)\n      }\n    }\n  }\n\n  _configureSignInAction() {\n    const google = document.getElementById(\"email-exists-signin-google\")\n    const password = document.getElementById(\"email-exists-signin-password\")\n    const signinLink = document.getElementById(\"email-exists-signin-link\")\n\n    if (this.useGoogleSignInValue) {\n      google?.classList.remove(\"hidden\")\n      password?.classList.add(\"hidden\")\n      return\n    }\n\n    google?.classList.add(\"hidden\")\n    password?.classList.remove(\"hidden\")\n\n    if (signinLink && this.hasSignInUrlValue && this.signInUrlValue) {\n      signinLink.setAttribute(\"href\", this.signInUrlValue)\n    }\n  }\n\n  _wireDifferentEmailButton() {\n    const button = document.getElementById(\"email-exists-different-email\")\n    if (!button || button.dataset.emailExistsWired === \"true\") return\n\n    button.dataset.emailExistsWired = \"true\"\n    button.addEventListener(\"click\", (event) => {\n      event.preventDefault()\n      if (typeof HSOverlay === \"undefined\") return\n\n      HSOverlay.close(\"#hs-modal-email-exists\")\n      if (!this.openSignupOnCloseValue) {\n        HSOverlay.open(\"#hs-modal-signup\")\n        window.dispatchEvent(\n          new CustomEvent(\"signup-modal:opened\", {\n            detail: { authSource: \"email_exists_different_email\" },\n          }),\n        )\n      }\n    })\n  }\n\n  _onModalClose() {\n    if (typeof HSOverlay === \"undefined\") return\n\n    HSOverlay.open(\"#hs-modal-signup\")\n    window.dispatchEvent(\n      new CustomEvent(\"signup-modal:opened\", {\n        detail: { authSource: \"email_exists_modal_dismissed\" },\n      }),\n    )\n  }\n}\n", "import {\n  getCurrentSectionFromPathname,\n  updateInsightsPathWithSection\n} from \"./insights_story_section\"\n\nconst NON_FILTER_PARAMS = new Set([\"section\", \"controller\", \"action\"])\n\nfunction normalizeFilterParamKey(key) {\n  return key.endsWith(\"[]\") ? key.slice(0, -2) : key\n}\n\nfunction isMeaningfulFilterValue(value) {\n  return value && value !== \"null\" && value !== \"undefined\" && value !== \"\"\n}\n\nexport function buildFilterParamsFromForm(form) {\n  const params = new Map()\n\n  new FormData(form).forEach((value, key) => {\n    if (!isMeaningfulFilterValue(value) || key === \"section\") return\n\n    const normalizedKey = normalizeFilterParamKey(key)\n\n    if (key.endsWith(\"[]\")) {\n      const current = params.get(normalizedKey)\n      params.set(normalizedKey, current ? `${current},${value}` : String(value))\n    } else {\n      params.set(normalizedKey, value)\n    }\n  })\n\n  return params\n}\n\nexport function buildInsightsFilterUrlFromForm(form) {\n  const formAction = form.getAttribute(\"action\")\n  if (!formAction) return null\n\n  const formUrl = new URL(formAction, window.location.origin)\n  formUrl.search = \"\"\n\n  buildFilterParamsFromForm(form).forEach((value, key) => {\n    formUrl.searchParams.set(key, value)\n  })\n\n  return formUrl\n}\n\nexport function updateInsightsBrowserUrl(sourceUrl, form = null) {\n  const currentUrl = new URL(window.location.href)\n\n  if (sourceUrl.pathname.includes(\"/insights/\")) {\n    const sectionFromSource = getCurrentSectionFromPathname(sourceUrl.pathname)\n    if (sectionFromSource) {\n      updateInsightsPathWithSection(currentUrl, sectionFromSource)\n    }\n  }\n\n  const allFilterKeys = new Set()\n\n  currentUrl.searchParams.forEach((value, key) => {\n    if (!NON_FILTER_PARAMS.has(key)) {\n      allFilterKeys.add(normalizeFilterParamKey(key))\n    }\n  })\n\n  sourceUrl.searchParams.forEach((value, key) => {\n    if (!NON_FILTER_PARAMS.has(key)) {\n      allFilterKeys.add(normalizeFilterParamKey(key))\n    }\n  })\n\n  if (form) {\n    form.querySelectorAll('input[type=\"checkbox\"][name^=\"has_\"]').forEach((checkbox) => {\n      allFilterKeys.add(checkbox.name)\n    })\n    form.querySelectorAll('input[type=\"checkbox\"][name$=\"[]\"]').forEach((checkbox) => {\n      allFilterKeys.add(normalizeFilterParamKey(checkbox.name))\n    })\n    form.querySelectorAll('input[type=\"hidden\"][name^=\"has_\"]').forEach((input) => {\n      allFilterKeys.add(input.name)\n    })\n  }\n\n  allFilterKeys.forEach((key) => {\n    currentUrl.searchParams.delete(key)\n  })\n\n  sourceUrl.searchParams.forEach((value, key) => {\n    if (!NON_FILTER_PARAMS.has(key) && isMeaningfulFilterValue(value)) {\n      currentUrl.searchParams.set(key, value)\n    }\n  })\n\n  window.history.pushState({}, \"\", currentUrl.toString())\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport {\n  buildFilterParamsFromForm,\n  updateInsightsBrowserUrl\n} from \"../lib/insights_filter_url\"\nimport { closeMobileFiltersOverlay } from \"../lib/insights_mobile_filters_overlay\"\nimport {\n  getCurrentStorySection,\n  syncInsightsFormActionWithCurrentSection,\n  updateInsightsPathWithSection\n} from \"../lib/insights_story_section\"\n\nlet loadingTimeoutId = null\nlet streamHideDebounceId = null\nlet streamHideFallbackId = null\nlet filtersLoadingVisible = false\nlet documentLoadingListenersAttached = false\n\nfunction showFiltersLoadingOverlay() {\n  filtersLoadingVisible = true\n\n  const existingOverlay = document.getElementById(\"filters-loading-overlay\")\n  if (existingOverlay) {\n    existingOverlay.remove()\n  }\n\n  const loadingOverlay = document.createElement(\"div\")\n  loadingOverlay.id = \"filters-loading-overlay\"\n  loadingOverlay.className = \"fixed inset-0 bg-[#F7F6F3] bg-opacity-75 z-40 flex items-center justify-center\"\n  loadingOverlay.innerHTML = `\n    <div class=\"bg-white rounded-xl shadow-lg p-8 flex flex-col items-center gap-4\">\n      <div class=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600\"></div>\n      <div class=\"text-gray-600 text-sm font-medium\">Updating filters...</div>\n    </div>\n  `\n  document.body.appendChild(loadingOverlay)\n\n  clearFiltersLoadingTimers()\n  loadingTimeoutId = setTimeout(() => {\n    hideFiltersLoadingOverlay()\n  }, 60000)\n}\n\nfunction clearFiltersLoadingTimers() {\n  if (loadingTimeoutId) {\n    clearTimeout(loadingTimeoutId)\n    loadingTimeoutId = null\n  }\n\n  if (streamHideDebounceId) {\n    clearTimeout(streamHideDebounceId)\n    streamHideDebounceId = null\n  }\n\n  if (streamHideFallbackId) {\n    clearTimeout(streamHideFallbackId)\n    streamHideFallbackId = null\n  }\n}\n\nfunction hideFiltersLoadingOverlay() {\n  filtersLoadingVisible = false\n  clearFiltersLoadingTimers()\n\n  const loadingOverlay = document.getElementById(\"filters-loading-overlay\")\n  if (loadingOverlay) {\n    loadingOverlay.remove()\n  }\n}\n\nfunction hideFiltersLoadingOverlayAfterPaint() {\n  requestAnimationFrame(() => {\n    requestAnimationFrame(() => {\n      hideFiltersLoadingOverlay()\n    })\n  })\n}\n\nfunction waitForPendingTurboStreams(callback) {\n  const check = () => {\n    if (document.documentElement.querySelector(\":scope > turbo-stream\")) {\n      requestAnimationFrame(check)\n      return\n    }\n\n    callback()\n  }\n\n  requestAnimationFrame(check)\n}\n\nfunction scheduleHideAfterFilterStreams() {\n  if (!filtersLoadingVisible) return\n\n  clearTimeout(streamHideDebounceId)\n  streamHideDebounceId = setTimeout(() => {\n    waitForPendingTurboStreams(hideFiltersLoadingOverlayAfterPaint)\n  }, 0)\n}\n\nfunction scheduleHideFallback(delayMs = 3000) {\n  if (!filtersLoadingVisible) return\n\n  clearTimeout(streamHideFallbackId)\n  streamHideFallbackId = setTimeout(hideFiltersLoadingOverlayAfterPaint, delayMs)\n}\n\nfunction attachFiltersLoadingListeners() {\n  if (documentLoadingListenersAttached) return\n\n  documentLoadingListenersAttached = true\n\n  // turbo:submit-end fires before turbo-stream responses are applied to the DOM.\n  // Wait for stream renders (or a fallback) so the overlay stays until content updates.\n  document.addEventListener(\"turbo:submit-end\", (event) => {\n    const form = event.detail?.formSubmission?.formElement\n    if (!form || form.dataset.turboFrame !== \"filters-container\") return\n\n    scheduleHideFallback()\n  })\n\n  document.addEventListener(\"turbo:frame-load\", (event) => {\n    if (!filtersLoadingVisible) return\n    if (event.target.id !== \"filters-container\") return\n\n    scheduleHideFallback()\n  })\n\n  document.addEventListener(\"turbo:before-stream-render\", () => {\n    if (!filtersLoadingVisible) return\n\n    clearTimeout(streamHideFallbackId)\n    streamHideFallbackId = null\n    scheduleHideAfterFilterStreams()\n  })\n\n  document.addEventListener(\"turbo:after-stream-render\", () => {\n    if (!filtersLoadingVisible) return\n\n    scheduleHideAfterFilterStreams()\n  })\n\n  document.addEventListener(\"turbo:fetch-request-error\", () => {\n    if (filtersLoadingVisible) hideFiltersLoadingOverlay()\n  })\n}\n\nexport default class extends Controller {\n  connect() {\n    attachFiltersLoadingListeners()\n\n    // Dispatch event to trigger Preline initialization\n    this.dispatch(\"filtersLoaded\", { bubbles: true })\n\n    HSDropdown.autoInit()\n\n    // Intercept clicks on filter links to update the section parameter\n    // Listen at document level to catch links outside the container (like clear filters button)\n    this.boundHandleClick = this.handleClick.bind(this)\n    document.addEventListener(\"click\", this.boundHandleClick, true)\n\n    // Sync form action in capture phase before Turbo reads the submission URL\n    this.boundHandleSubmitCapture = this.handleSubmitCapture.bind(this)\n    this.element.addEventListener(\"submit\", this.boundHandleSubmitCapture, true)\n\n    // Intercept Turbo form submissions to update the section (all filter forms)\n    this.boundHandleTurboSubmitStart = this.handleTurboSubmitStart.bind(this)\n    this.element.addEventListener(\"turbo:submit-start\", this.boundHandleTurboSubmitStart)\n\n    this.boundShowLoading = () => this.showLoading()\n    this.element.addEventListener(\"filters-container:show-loading\", this.boundShowLoading)\n  }\n\n  disconnect() {\n    document.removeEventListener(\"click\", this.boundHandleClick, true)\n    this.element.removeEventListener(\"submit\", this.boundHandleSubmitCapture, true)\n    this.element.removeEventListener(\"turbo:submit-start\", this.boundHandleTurboSubmitStart)\n    this.element.removeEventListener(\"filters-container:show-loading\", this.boundShowLoading)\n  }\n\n  showLoading() {\n    showFiltersLoadingOverlay()\n  }\n\n  hideLoading() {\n    hideFiltersLoadingOverlay()\n  }\n\n  handleClick(event) {\n    // Find the closest filter link (includes filter dropdowns and reset button)\n    const link = event.target.closest('a[href*=\"/insights/\"]')\n    if (!link || !link.href || link.href === \"#\" || link.href === \"# \") return\n\n    // Check if link has data-filter-action attribute (for links outside the container, like clear filters)\n    const isFilterAction = link.dataset.filterAction === \"clear\" || link.dataset.filterAction === \"reset\"\n\n    // Ensure the clicked link is within this controller's element OR has filter-action attribute\n    if (!this.element.contains(link) && !isFilterAction) return\n\n    if (isFilterAction && link.closest(\"#mobile-filters\")) {\n      closeMobileFiltersOverlay()\n    }\n\n    try {\n      const linkUrl = new URL(link.href, window.location.origin)\n\n      // Check if this is an insights filter link (contains /insights/ in path)\n      if (!linkUrl.pathname.includes(\"/insights/\")) return\n\n      // Get current section from URL pathname\n      const currentSection = getCurrentStorySection()\n      if (!currentSection) return\n\n      // Update the section in the path (not query parameter)\n      updateInsightsPathWithSection(linkUrl, currentSection)\n\n      link.href = linkUrl.toString()\n\n      // Show loading indicator and update URL\n      // This works for both filter dropdown links, reset button, and clear filters button\n      this.showLoading()\n      updateInsightsBrowserUrl(linkUrl)\n    } catch (e) {\n      // Invalid URL, skip\n      console.warn(\"[filters-container] Invalid URL in filter link:\", e)\n    }\n  }\n\n  handleSubmitCapture(event) {\n    const form = event.target\n    if (!form || form.tagName !== \"FORM\" || !this.element.contains(form)) return\n    if (form.dataset.turboFrame !== \"filters-container\") return\n\n    syncInsightsFormActionWithCurrentSection(form)\n  }\n\n  handleTurboSubmitStart(event) {\n    const form = event.target\n    if (!form || form.tagName !== \"FORM\" || !this.element.contains(form)) return\n    if (form.dataset.turboFrame !== \"filters-container\") return\n\n    try {\n      syncInsightsFormActionWithCurrentSection(form)\n\n      const formAction = form.getAttribute(\"action\")\n      if (!formAction || !formAction.includes(\"/insights/\")) return\n\n      const formUrl = new URL(formAction, window.location.origin)\n      formUrl.search = \"\"\n      buildFilterParamsFromForm(form).forEach((value, key) => {\n        formUrl.searchParams.set(key, value)\n      })\n\n      this.showLoading()\n      updateInsightsBrowserUrl(formUrl, form)\n    } catch (e) {\n      console.warn(\"[filters-container] Error updating form action:\", e)\n    }\n  }\n\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    cityName: String,\n    pricingTitle: { type: String, default: \"Choose a plan to unlock filters\" },\n    pricingSubtitle: { type: String, default: \"Filter by bedrooms, capacity and more to get accurate market insights\" }\n  }\n\n  connect() {\n    // Listen for when the modal opens to track the view event\n    this.element.addEventListener('open.hs.overlay', this.trackModalViewed.bind(this))\n  }\n\n  disconnect() {\n    this.element.removeEventListener('open.hs.overlay', this.trackModalViewed.bind(this))\n  }\n\n  trackModalViewed() {\n    this.dispatchTrackEvent('Filters Explainer Modal Viewed', {\n      city_name: this.cityNameValue || null\n    })\n  }\n\n  openPricingModal(event) {\n    event.preventDefault()\n\n    // Track Unlock Filters Clicked event\n    this.dispatchTrackEvent('Unlock Filters Clicked', {\n      city_name: this.cityNameValue || null\n    })\n\n    // Track Pricing Modal Viewed From Filters event\n    this.dispatchTrackEvent('Pricing Modal Viewed From Filters', {\n      city_name: this.cityNameValue || null\n    })\n\n    // Close this modal\n    HSOverlay.close(this.element)\n\n    // Set contextual title/subtitle for pricing modal\n    document.dispatchEvent(new CustomEvent('pricing-modal:set-context', {\n      detail: {\n        title: this.pricingTitleValue,\n        subtitle: this.pricingSubtitleValue\n      }\n    }))\n\n    // Open the pricing modal\n    const pricingModal = document.querySelector('#pricing-modal')\n    if (pricingModal) {\n      HSOverlay.open(pricingModal)\n    }\n  }\n\n  dispatchTrackEvent(eventName, properties = {}) {\n    // Dispatch event for amplitude controller to pick up\n    document.body.dispatchEvent(new CustomEvent('trackEvent', {\n      bubbles: true,\n      detail: {\n        name: eventName,\n        properties: properties\n      }\n    }))\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    images: Array,\n    listingId: String\n  }\n\n  connect() {\n    this.lightbox = null\n    this.sources = []\n    this.sourcesChanged = false\n    this.galleryOpen = false\n    this.lastTrackedGalleryIndex = null\n\n    this.progressivelyValidate(this.imagesValue)\n  }\n\n  // FsLightbox builds its slides from props.sources on first open and never\n  // rebuilds them (refreshFsLightbox only covers declarative instances), so a\n  // fresh instance is needed whenever the validated sources have changed.\n  buildLightbox() {\n    this.lightbox = new FsLightbox()\n    this.lightbox.props.sources = [...this.sources]\n    this.lightbox.props.onShow = () => this.handleGalleryShow()\n    this.lightbox.props.onClose = () => this.handleGalleryClose()\n    this.sourcesChanged = false\n  }\n\n  openGallery(event) {\n    event.preventDefault()\n    let index = parseInt(event.currentTarget.dataset.galleryIndex, 10)\n\n    const img = event.currentTarget.querySelector('img')\n    if (img && this.sources && this.sources.length) {\n      const mappedIndex = this.sources.indexOf(img.src)\n      if (mappedIndex >= 0) index = mappedIndex\n    }\n\n    if (!this.sources.length) return\n    if (!(index >= 0 && index < this.sources.length)) index = 0\n    if (!this.lightbox || this.sourcesChanged) this.buildLightbox()\n\n    this.galleryOpen = true\n    this.lastTrackedGalleryIndex = index\n    this.trackGalleryEvent('Listing Gallery Opened', {\n      photo_index: index,\n      photo_count: this.sources.length\n    })\n\n    this.lightbox.open(index)\n  }\n\n  handleGalleryShow() {\n    if (!this.galleryOpen) return\n\n    const index = this.lightbox?.stageIndexes?.current\n    if (index === undefined || index === null) return\n    if (index === this.lastTrackedGalleryIndex) return\n\n    const direction = index > this.lastTrackedGalleryIndex ? 'next' : 'prev'\n    this.lastTrackedGalleryIndex = index\n\n    this.trackGalleryEvent('Listing Gallery Photo Changed', {\n      photo_index: index,\n      photo_count: this.sources.length,\n      direction\n    })\n  }\n\n  handleGalleryClose() {\n    this.galleryOpen = false\n    this.lastTrackedGalleryIndex = null\n  }\n\n  trackGalleryEvent(name, properties = {}) {\n    if (this.hasListingIdValue && this.listingIdValue) {\n      properties.listing_id = this.listingIdValue\n    }\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: { name, properties }\n    })\n  }\n\n  progressivelyValidate(urls) {\n    const NO_PHOTO_URL = 'https://a0.muscache.com/airbnb/static/packages/assets/frontend/pdp-platform-shared/images/preview-no-photo.9af7e28e52b828cedae1c1a221ffc7e9.png'\n    let foundAny = false\n    let pending = urls.length\n\n    const maybeFinalizeIfNone = () => {\n      if (pending === 0 && !foundAny) {\n        this.sources = [NO_PHOTO_URL]\n        this.sourcesChanged = true\n      }\n    }\n\n    urls.forEach((url) => {\n      this.probe(url).then((ok) => {\n        pending -= 1\n        if (ok) {\n          if (!this.sources.includes(url)) {\n            this.sources.push(url)\n            this.sourcesChanged = true\n          }\n          foundAny = true\n        }\n      }).finally(maybeFinalizeIfNone)\n    })\n\n    setTimeout(maybeFinalizeIfNone, 1500)\n  }\n\n  probe(url) {\n    return new Promise((resolve) => {\n      const img = new Image()\n      img.onload = () => resolve(true)\n      img.onerror = () => resolve(false)\n      img.src = url\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = []\n\n  initialize() {\n    this.environment = window.gtag ? 'production' : 'development'\n\n    this.element.addEventListener('paddle:checkoutCompleted', (event) => {\n      const value = {\n        value: event.detail.data.totals.total,\n        currency: event.detail.data.currency_code,\n        transaction_id: event.detail.data.transaction_id\n      }\n      this.track('AW-11529458479/mzN4CPXYnosaEK-m1vkq', value)\n    })\n\n    this.element.addEventListener('trackEvent', (event) => {\n      const { name } = event.detail;\n\n      switch (name) {\n        case 'Pricing Modal Opened':\n          this.track('AW-11529458479/0h26CO3LqoQaEK-m1vkq')\n          break\n        case 'Signup Completed':\n          this.track('AW-11529458479/eG1WCOrLqoQaEK-m1vkq')\n          break\n        case 'Billing Type Changed':\n          this.track('AW-11529458479/fYJlCO3FiYwaEK-m1vkq')\n          break\n      }\n    })\n  }\n\n  track(goal, value) {\n    let payload = { 'send_to': goal }\n\n    if (this.environment === 'production') {\n      if (value) {\n        payload = { ...payload, ...value }\n      }\n      window.gtag('event', 'conversion', payload);\n    } else {\n      console.log('[Google Ads] Tracking event:', payload)\n    }\n  }\n\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    clientId: String,\n    callbackUrl: String,\n    promptOnConnectDelay: { type: Number, default: 0 }\n  }\n\n  connect() {\n    // Wait for Google Identity Services to load\n    const onReady = () => {\n      this.initializeOneTap()\n      if (this.promptOnConnectDelayValue > 0) {\n        setTimeout(() => this.openPrompt(), this.promptOnConnectDelayValue)\n      }\n    }\n\n    if (window.google && window.google.accounts) {\n      onReady()\n    } else {\n      window.addEventListener('load', () => {\n        if (window.google && window.google.accounts) {\n          onReady()\n        }\n      })\n    }\n  }\n\n  initializeOneTap() {\n    if (!this.hasClientIdValue) {\n      console.error('Google One Tap: client_id is required')\n      return\n    }\n\n    // Initialize One Tap; prompt will be triggered when signup modal opens\n    if (window.google && window.google.accounts) {\n      window.google.accounts.id.initialize({\n        client_id: this.clientIdValue,\n        callback: this.handleCredentialResponse.bind(this),\n        auto_select: false,\n        cancel_on_tap_outside: true,\n        // Additional configuration for better compatibility\n        use_fedcm_for_prompt: true,\n        // Allow prompt to show even if user dismissed before\n        itp_support: true\n      })\n    }\n  }\n\n  openPrompt(event) {\n    if (event && typeof event.preventDefault === 'function') {\n      event.preventDefault()\n    }\n\n    if (window.google && window.google.accounts && this.hasClientIdValue) {\n      // Small delay to let modal animation start\n      setTimeout(() => {\n        window.google.accounts.id.prompt((notification) => {\n          // Handle notification if needed\n          if (notification.isSkippedMoment()) {\n            const skippedReason = notification.getSkippedReason()\n            console.log('One Tap skipped:', skippedReason)\n          } else if (notification.isDismissedMoment()) {\n            const dismissedReason = notification.getDismissedReason()\n            console.log('One Tap dismissed:', dismissedReason)\n          }\n        })\n      }, 300)\n    }\n  }\n\n  handleCredentialResponse(response) {\n    // Create a form to submit the credential to a custom endpoint\n    // that will set it in the flash and redirect to the callback\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = '/auth/auth0/google_one_tap'\n    form.style.display = 'none'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]')\n\n    if (csrfToken) {\n      const csrfInput = document.createElement('input')\n      csrfInput.type = 'hidden'\n      csrfInput.name = 'authenticity_token'\n      csrfInput.value = csrfToken.content\n      form.appendChild(csrfInput)\n    }\n\n    // Add the credential (id_token)\n    const credentialInput = document.createElement('input')\n    credentialInput.type = 'hidden'\n    credentialInput.name = 'credential'\n    credentialInput.value = response.credential\n    form.appendChild(credentialInput)\n\n    // Add return URL to return to the current page after sign-in\n    const returnUrlInput = document.createElement('input')\n    returnUrlInput.type = 'hidden'\n    returnUrlInput.name = 'return_url'\n    returnUrlInput.value = window.location.href\n    form.appendChild(returnUrlInput)\n\n    // Add Turbo data attribute to prevent Turbo from intercepting\n    form.setAttribute('data-turbo', 'false')\n\n    document.body.appendChild(form)\n    sessionStorage.setItem(\"signup_modal_source\", \"google_one_tap\")\n    form.submit()\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { loadGoogleMaps, resolvedGoogleMapsApiKey } from \"../lib/google_maps\"\nimport { countryCodeFromPlace } from \"../lib/google_places_country\"\n\n/**\n * Google PlaceAutocompleteElement widget.\n * Dispatches google-places:select with { lat, lng, label, country } on this.element (bubbles).\n */\nexport default class extends Controller {\n  static values = {\n    apiKey: String,\n    placeholder: { type: String, default: \"Search for an address\u2026\" },\n    initialQuery: { type: String, default: \"\" },\n    lang: { type: String, default: \"\" }\n  }\n\n  resolvedApiKey() {\n    const fromValue = (this.apiKeyValue || \"\").trim()\n    if (fromValue) return fromValue\n    return resolvedGoogleMapsApiKey()\n  }\n\n  requestLang() {\n    const v = this.langValue && this.langValue.trim()\n    if (v) return v\n    return (document.documentElement.lang || \"en\").split(\"-\")[0] || \"en\"\n  }\n\n  connect() {\n    this.onSelect = this.onSelect.bind(this)\n    this.initWidget()\n  }\n\n  async initWidget() {\n    this.element.classList.add(\"relative\")\n    this.showLoadingPlaceholder()\n\n    const apiKey = this.resolvedApiKey()\n    if (!apiKey) {\n      this.showMissingKeyMessage()\n      return\n    }\n\n    try {\n      const maps = await loadGoogleMaps(apiKey, this.requestLang())\n      const { PlaceAutocompleteElement } = await maps.importLibrary(\"places\")\n\n      this.widget = new PlaceAutocompleteElement({\n        includedPrimaryTypes: [\"street_address\", \"premise\", \"subpremise\", \"route\"],\n        noInputIcon: true\n      })\n      this.widget.id = \"property-address\"\n      this.widget.placeholder = this.placeholderValue\n      this.widget.className = \"block w-full\"\n\n      const q = (this.initialQueryValue || \"\").trim()\n      if (q) this.widget.value = q\n\n      this.widget.addEventListener(\"gmp-select\", this.onSelect)\n      this.element.replaceChildren()\n      this.element.appendChild(this.widget)\n    } catch (e) {\n      console.error(\"Google Places widget error:\", e)\n      this.showMissingKeyMessage(\"Unable to load address search\")\n    }\n  }\n\n  showLoadingPlaceholder() {\n    this.element.replaceChildren()\n    const input = document.createElement(\"input\")\n    input.type = \"text\"\n    input.disabled = true\n    input.placeholder = this.placeholderValue\n    input.setAttribute(\"aria-busy\", \"true\")\n    input.className =\n      \"block w-full rounded-lg border-2 border-[#E4F0EA] bg-white py-3 pl-3 pr-3 text-sm text-slate-400 shadow-sm\"\n    this.element.appendChild(input)\n  }\n\n  showMissingKeyMessage(message = \"Missing Google Maps API key (set GOOGLE_MAPS_API_KEY)\") {\n    const input = document.createElement(\"input\")\n    input.id = \"property-address\"\n    input.type = \"text\"\n    input.disabled = true\n    input.placeholder = message\n    input.className =\n      \"block w-full rounded-lg border border-slate-300 bg-slate-100 py-2.5 pl-3 pr-3 text-sm text-slate-500\"\n    this.element.appendChild(input)\n  }\n\n  async onSelect(event) {\n    const placePrediction = event.placePrediction\n    if (!placePrediction) return\n\n    try {\n      const place = placePrediction.toPlace()\n      await place.fetchFields({ fields: [\"formattedAddress\", \"location\", \"addressComponents\"] })\n\n      const location = place.location\n      if (!location) return\n\n      const lat = location.lat()\n      const lng = location.lng()\n      if (!Number.isFinite(lat) || !Number.isFinite(lng)) return\n\n      const label = place.formattedAddress || this.widget?.value || \"\"\n      const country = countryCodeFromPlace(place)\n\n      this.element.dispatchEvent(\n        new CustomEvent(\"google-places:select\", {\n          bubbles: true,\n          detail: { lat, lng, label, country }\n        })\n      )\n    } catch (e) {\n      console.error(\"Google Places selection error:\", e)\n    }\n  }\n\n  disconnect() {\n    if (this.widget) {\n      this.widget.removeEventListener(\"gmp-select\", this.onSelect)\n      this.widget = null\n    }\n    this.element.replaceChildren()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    urls: Array\n  }\n\n  // Airbnb's no photo placeholder URL\n  NO_PHOTO_URL = 'https://a0.muscache.com/airbnb/static/packages/assets/frontend/pdp-platform-shared/images/preview-no-photo.9af7e28e52b828cedae1c1a221ffc7e9.png'\n\n  connect() {\n    // Defer heavy initialization to avoid blocking Turbo events\n    // Use requestIdleCallback if available, otherwise setTimeout\n    if (window.requestIdleCallback) {\n      requestIdleCallback(() => this.initialize(), { timeout: 100 })\n    } else {\n      setTimeout(() => this.initialize(), 0)\n    }\n  }\n\n  initialize() {\n    // Track failed URLs globally to avoid infinite loops\n    this.failedUrls = new Set()\n    // Track attempts per image element using WeakMap\n    this.attempts = new WeakMap()\n    // Track displayed URLs to avoid duplicates (for gallery mode)\n    this.displayedUrls = new Set()\n    // Track images that are showing placeholder to prevent further error handling\n    this.placeholderImages = new WeakSet()\n    // Track listing UUIDs that we've already attempted to refresh\n    this.refreshedListings = new Set()\n\n    // If this is a parent container, listen to child image errors\n    // If this is an image element, set up error handling directly\n    if (this.element.tagName === 'IMG') {\n      this.setupImageErrorHandler(this.element)\n      // Track this image's initial URL as displayed\n      this.displayedUrls.add(this.element.src)\n      // If the image already finished loading with an error before handlers were attached,\n      // naturalWidth will be 0. Handle it immediately.\n      if (this.element.complete && this.element.naturalWidth === 0) {\n        // Defer error handling to avoid blocking\n        setTimeout(() => this.handleErrorForImage(this.element), 0)\n      }\n    } else {\n      // Parent mode: track all initially displayed images to avoid duplicates\n      // Process images in batches to avoid blocking\n      const images = Array.from(this.element.querySelectorAll('img'))\n      this.processImagesInBatches(images)\n      // Listen to child image errors\n      this.element.addEventListener('error', this.handleError.bind(this), true)\n    }\n  }\n\n  processImagesInBatches(images, batchSize = 10) {\n    let index = 0\n\n    const processBatch = () => {\n      const batch = images.slice(index, index + batchSize)\n      batch.forEach(img => {\n        if (img.src) {\n          this.displayedUrls.add(img.src)\n        }\n        // Attach error handler to each existing image\n        this.setupImageErrorHandler(img)\n        // If any image already failed before we attached, fix it now\n        if (img.complete && img.naturalWidth === 0) {\n          this.handleErrorForImage(img)\n        }\n      })\n\n      index += batchSize\n      if (index < images.length) {\n        // Use requestIdleCallback for next batch if available\n        if (window.requestIdleCallback) {\n          requestIdleCallback(processBatch, { timeout: 50 })\n        } else {\n          setTimeout(processBatch, 0)\n        }\n      }\n    }\n\n    processBatch()\n  }\n\n  disconnect() {\n    if (this.element.tagName !== 'IMG') {\n      this.element.removeEventListener('error', this.handleError, true)\n    }\n  }\n\n  setupImageErrorHandler(img) {\n    img.addEventListener('error', (event) => {\n      this.handleErrorForImage(event.target)\n    })\n  }\n\n  handleError(event) {\n    // Only handle errors from child img elements\n    if (event.target.tagName === 'IMG') {\n      this.handleErrorForImage(event.target)\n    }\n  }\n\n  handleErrorForImage(img) {\n    // Skip if this image is already showing placeholder\n    if (this.placeholderImages.has(img)) {\n      return\n    }\n\n    const currentSrc = img.src\n\n    // Initialize attempt counter for this image element\n    if (!this.attempts.has(img)) {\n      this.attempts.set(img, 0)\n    }\n\n    const attempts = this.attempts.get(img)\n\n    // Limit to 3 fallback attempts (original + 3 fallbacks = 4 total attempts max)\n    if (attempts >= 3) {\n      this.usePlaceholderImage(img)\n      return\n    }\n\n    // Mark current URL as failed\n    this.failedUrls.add(currentSrc)\n\n    // Get fallback URLs - use urls-value if available, otherwise try to read from gallery controller\n    let fallbackUrls = this.urlsValue || []\n\n    // If in parent mode and no urls-value, try to get from gallery controller\n    if (this.element.tagName !== 'IMG' && !fallbackUrls.length) {\n      const galleryController = this.application.getControllerForElementAndIdentifier(\n        this.element,\n        'gallery'\n      )\n      if (galleryController && galleryController.imagesValue) {\n        fallbackUrls = galleryController.imagesValue\n      }\n    }\n\n    // Filter out URLs that are already displayed to avoid duplicates\n    // Also filter out the current source and failed URLs\n    const availableUrls = fallbackUrls.filter(url => {\n      return url !== currentSrc &&\n             !this.failedUrls.has(url) &&\n             !this.displayedUrls.has(url)\n    })\n\n    // Find next available URL that hasn't been tried (limit to 3 fallback URLs)\n    const nextUrl = availableUrls.slice(0, 3 - attempts)[0]\n\n    if (nextUrl) {\n      this.attempts.set(img, attempts + 1)\n      // Mark the new URL as displayed to avoid using it for another image\n      this.displayedUrls.add(nextUrl)\n      img.src = nextUrl\n    } else {\n      // No more fallbacks available, use placeholder image\n      this.usePlaceholderImage(img)\n    }\n  }\n\n  usePlaceholderImage(img) {\n    // Mark this image as using placeholder to prevent further error handling\n    this.placeholderImages.add(img)\n    // Use Airbnb's no photo placeholder instead of hiding\n    img.src = this.NO_PHOTO_URL\n\n    // Request image refresh from backend (defer to avoid blocking)\n    setTimeout(() => this.requestImageRefresh(), 0)\n  }\n\n  requestImageRefresh() {\n    const listingUuid = this.getListingUuid()\n    if (!listingUuid) return\n\n    // Skip if we've already requested refresh for this listing on this page\n    if (this.refreshedListings.has(listingUuid)) return\n\n    // Mark as attempted\n    this.refreshedListings.add(listingUuid)\n\n    // Fire and forget - don't block on this request\n    fetch(`/listings/${listingUuid}/refresh_images`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute('content') || '',\n        'X-Requested-With': 'XMLHttpRequest'\n      },\n      credentials: 'same-origin'\n    }).catch(error => {\n      // Silently fail - just log to console for debugging\n      console.error('Failed to request image refresh:', error)\n    })\n  }\n\n  getListingUuid() {\n    // 1) Try to extract from current URL path (show page)\n    const pathMatch = window.location.pathname.match(/\\/listings\\/([a-f0-9-]{36})/)\n    if (pathMatch) return pathMatch[1]\n\n    // 2) Try to extract from closest parent link's href of the IMG element (thumbnail cards)\n    if (this.element && this.element.tagName === 'IMG') {\n      const anchor = this.element.closest('a[href]')\n      const href = anchor ? anchor.getAttribute('href') : null\n      if (href) {\n        const hrefMatch = href.match(/\\/listings\\/([a-f0-9-]{36})/)\n        if (hrefMatch) return hrefMatch[1]\n      }\n    }\n\n    return null\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nconst STORAGE_KEY = \"insights_last_polygon_id\"\n\nexport default class extends Controller {\n  static values = {\n    polygonId: String,\n    polygonName: String,\n    polygonType: String,\n    polygonSlug: String,\n    countryName: String,\n    regionName: String,\n    section: String,\n    source: String\n  }\n\n  connect() {\n    this.boundTrack = () => this.scheduleTrack()\n    document.addEventListener(\"turbo:load\", this.boundTrack)\n    this.scheduleTrack()\n  }\n\n  disconnect() {\n    document.removeEventListener(\"turbo:load\", this.boundTrack)\n  }\n\n  polygonIdValueChanged() {\n    this.scheduleTrack()\n  }\n\n  scheduleTrack() {\n    requestAnimationFrame(() => this.trackIfCityChanged())\n  }\n\n  trackIfCityChanged() {\n    if (!this.polygonIdValue) return\n\n    const previousPolygonId = sessionStorage.getItem(STORAGE_KEY)\n    const isCityChange = previousPolygonId !== this.polygonIdValue\n\n    sessionStorage.setItem(STORAGE_KEY, this.polygonIdValue)\n\n    if (!isCityChange) return\n\n    const properties = {\n      polygon_id: this.polygonIdValue,\n      polygon_name: this.polygonNameValue,\n      polygon_type: this.polygonTypeValue,\n      polygon_slug: this.polygonSlugValue || null,\n      country_name: this.countryNameValue || null,\n      region_name: this.regionNameValue || null,\n      section: this.sectionValue || null,\n      previous_polygon_id: previousPolygonId || null\n    }\n\n    if (this.hasSourceValue && this.sourceValue) {\n      properties.source = this.sourceValue\n    }\n\n    const amplitude = this.application.getControllerForElementAndIdentifier(\n      document.body,\n      \"amplitude\"\n    )\n\n    if (amplitude) {\n      amplitude.trackEvent(\"Insights City Changed\", properties)\n      return\n    }\n\n    this.dispatch(\"trackEvent\", {\n      prefix: null,\n      bubbles: true,\n      detail: {\n        name: \"Insights City Changed\",\n        properties\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"link\", \"warning\"]\n  static values = {\n    truncatedMessage: String\n  }\n\n  async download(event) {\n    event.preventDefault()\n\n    const link = this.linkTarget\n    const response = await fetch(link.href, {\n      credentials: \"same-origin\",\n      headers: { Accept: \"text/csv\" }\n    })\n\n    if (!response.ok) {\n      window.location.href = link.href\n      return\n    }\n\n    this.trackExport(link)\n\n    const blob = await response.blob()\n    const filename = this.filenameFromResponse(response) || \"export.csv\"\n    this.triggerDownload(blob, filename)\n\n    if (response.headers.get(\"X-GF-CSV-Truncated\") === \"true\") {\n      const exported = response.headers.get(\"X-GF-CSV-Exported-Count\")\n      const total = response.headers.get(\"X-GF-CSV-Total-Count\")\n      this.showWarning(exported, total)\n    } else {\n      this.hideWarning()\n    }\n  }\n\n  trackExport(link) {\n    const eventName = link.dataset.analyticsEvent\n    if (!eventName) return\n\n    let properties = {}\n    if (link.dataset.analyticsProps) {\n      try {\n        properties = JSON.parse(link.dataset.analyticsProps)\n      } catch (_error) {\n        properties = {}\n      }\n    }\n\n    document.body.dispatchEvent(new CustomEvent(\"trackEvent\", {\n      bubbles: true,\n      detail: { name: eventName, properties }\n    }))\n  }\n\n  filenameFromResponse(response) {\n    const disposition = response.headers.get(\"Content-Disposition\")\n    if (!disposition) return null\n\n    const match = disposition.match(/filename\\*?=(?:UTF-8''|\")?([^\";]+)/i)\n    return match ? decodeURIComponent(match[1].replace(/\"/g, \"\")) : null\n  }\n\n  triggerDownload(blob, filename) {\n    const url = window.URL.createObjectURL(blob)\n    const anchor = document.createElement(\"a\")\n    anchor.href = url\n    anchor.download = filename\n    anchor.style.display = \"none\"\n    document.body.appendChild(anchor)\n    anchor.click()\n    anchor.remove()\n    window.URL.revokeObjectURL(url)\n  }\n\n  showWarning(exported, total) {\n    if (!this.hasWarningTarget) return\n\n    const message = this.truncatedMessageValue\n      .replace(\"__EXPORTED__\", this.formatCount(exported))\n      .replace(\"__TOTAL__\", this.formatCount(total))\n\n    this.warningTarget.textContent = message\n    this.warningTarget.classList.remove(\"hidden\")\n  }\n\n  hideWarning() {\n    if (!this.hasWarningTarget) return\n\n    this.warningTarget.textContent = \"\"\n    this.warningTarget.classList.add(\"hidden\")\n  }\n\n  formatCount(value) {\n    const number = Number(value)\n    if (Number.isNaN(number)) return value\n\n    return number.toLocaleString()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    eventName: String,\n    eventProperties: String\n  }\n\n  connect() {\n    // Dispatch event to amplitude controller\n    const properties = this.eventPropertiesValue ? JSON.parse(this.eventPropertiesValue) : {}\n\n    const event = new CustomEvent('trackEvent', {\n      detail: {\n        name: this.eventNameValue,\n        properties: properties\n      },\n      bubbles: true\n    })\n\n    this.element.dispatchEvent(event)\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nconst MOUSE_MOVE_THRESHOLD = 2\n\nexport default class extends Controller {\n  static values = {\n    eventProperties: String\n  }\n\n  connect() {\n    this.pageLoadTime = performance.now()\n    this.hadWebdriver = Boolean(navigator.webdriver)\n    this.viewed = false\n    this.mouseMoveCount = 0\n    this.lastMouseX = null\n    this.lastMouseY = null\n\n    const attributionReason = this.attributionGateReason()\n    if (attributionReason) {\n      this.fireLandingPageViewed(attributionReason)\n      return\n    }\n\n    this.boundOnPointer = () => this.fireLandingPageViewed(\"pointer\")\n    this.boundOnMouseMove = (event) => this.checkMouseMove(event)\n\n    document.addEventListener(\"pointerdown\", this.boundOnPointer, { passive: true })\n    document.addEventListener(\"touchstart\", this.boundOnPointer, { passive: true })\n    document.addEventListener(\"keydown\", this.boundOnPointer, { passive: true })\n    document.addEventListener(\"mousemove\", this.boundOnMouseMove, { passive: true })\n  }\n\n  disconnect() {\n    this.cleanup()\n  }\n\n  attributionGateReason() {\n    const params = new URLSearchParams(window.location.search)\n    const utmSource = params.get(\"utm_source\")?.trim()\n    if (utmSource) return \"utm\"\n\n    const referrer = document.referrer?.trim()\n    if (referrer) return \"referrer\"\n\n    return null\n  }\n\n  checkMouseMove(event) {\n    if (this.viewed) return\n\n    if (this.lastMouseX !== null && this.lastMouseY !== null) {\n      const moved =\n        event.clientX !== this.lastMouseX || event.clientY !== this.lastMouseY\n\n      if (moved) {\n        this.mouseMoveCount += 1\n      }\n    }\n\n    this.lastMouseX = event.clientX\n    this.lastMouseY = event.clientY\n\n    if (this.mouseMoveCount >= MOUSE_MOVE_THRESHOLD) {\n      this.fireLandingPageViewed(\"mousemove\")\n    }\n  }\n\n  gfReferrerProperties() {\n    const rawReferrer = document.referrer?.trim()\n    if (!rawReferrer) return {}\n\n    try {\n      const url = new URL(rawReferrer)\n      const pathname = url.pathname || \"/\"\n      return {\n        gf_referrer: `${url.origin}${pathname}`,\n        gf_referrer_domain: url.hostname\n      }\n    } catch {\n      return {}\n    }\n  }\n\n  fireLandingPageViewed(gateReason) {\n    if (this.viewed) return\n\n    this.viewed = true\n    this.cleanup()\n\n    const baseProperties = this.eventPropertiesValue ? JSON.parse(this.eventPropertiesValue) : {}\n    const properties = {\n      ...baseProperties,\n      ...this.gfReferrerProperties(),\n      gate_reason: gateReason,\n      ms_to_engage: Math.round(performance.now() - this.pageLoadTime),\n      had_webdriver: this.hadWebdriver\n    }\n\n    this.element.dispatchEvent(\n      new CustomEvent(\"trackEvent\", {\n        detail: {\n          name: \"Landing Page Viewed\",\n          properties\n        },\n        bubbles: true\n      })\n    )\n  }\n\n  cleanup() {\n    if (!this.boundOnPointer) return\n\n    document.removeEventListener(\"pointerdown\", this.boundOnPointer)\n    document.removeEventListener(\"touchstart\", this.boundOnPointer)\n    document.removeEventListener(\"keydown\", this.boundOnPointer)\n    document.removeEventListener(\"mousemove\", this.boundOnMouseMove)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Filters the countries index table by continent and name. Every row stays in the\n// server-rendered HTML; filtering only toggles visibility.\nexport default class extends Controller {\n  static targets = [\"chip\", \"row\", \"search\", \"empty\"]\n\n  connect() {\n    this.continent = \"all\"\n    this.query = \"\"\n  }\n\n  selectContinent(event) {\n    this.continent = event.currentTarget.dataset.continent\n    this.chipTargets.forEach((chip) => {\n      chip.setAttribute(\"aria-pressed\", chip === event.currentTarget ? \"true\" : \"false\")\n    })\n    this.apply()\n  }\n\n  search() {\n    this.query = this.normalize(this.searchTarget.value)\n    this.apply()\n  }\n\n  apply() {\n    let visible = 0\n\n    this.rowTargets.forEach((row) => {\n      const matchesContinent = this.continent === \"all\" || row.dataset.continent === this.continent\n      const matchesQuery = this.query === \"\" || row.dataset.searchName.includes(this.query)\n      const show = matchesContinent && matchesQuery\n\n      row.hidden = !show\n      if (show) visible += 1\n    })\n\n    if (this.hasEmptyTarget) this.emptyTarget.hidden = visible > 0\n  }\n\n  normalize(value) {\n    return value.normalize(\"NFD\").replace(/[\u0300-\u036F]/g, \"\").toLowerCase().trim()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  intercept(event) {\n    const link = event.target.closest('a')\n    if (!link) return\n\n    const startUrl = link.dataset.startUrl\n    if (startUrl) {\n      event.preventDefault()\n      if (link.dataset.sameTab === 'true') {\n        window.location.href = startUrl\n      } else {\n        window.open(startUrl)\n      }\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    labels: Array,\n    listingData: { type: Array, default: [] },\n    compData: Array,\n    barColor: { type: String, default: \"#546463\" },\n    lineColors: Array,\n    maxValue: Number,\n    percentageScale: Boolean,\n    listingLabel: { type: String, default: \"\" },\n    top50Label: { type: String, default: \"\" },\n    top25Label: { type: String, default: \"\" },\n    top10Label: { type: String, default: \"\" },\n    showBars: { type: Boolean, default: true }\n  }\n\n  connect() {\n    Chart.defaults.color = 'rgb(120, 113, 108)'\n\n    this.initChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initChart() {\n    const ctx = this.element.getContext('2d')\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: this.labelsValue,\n        datasets: this.buildDatasets()\n      },\n      options: this.getChartOptions(),\n      plugins: [this.legendMargin()]\n    })\n  }\n\n  buildDatasets() {\n    const lineLabel = (fallback, value) => {\n      if (typeof value === \"string\" && value.trim()) return value.trim()\n      return fallback\n    }\n\n    const lines = [\n      {\n        type: 'line',\n        fill: true,\n        label: lineLabel('Top 50%', this.top50LabelValue),\n        data: this.getPercentileData(0),\n        backgroundColor: this.lineColorsValue[0],\n        borderDash: [5, 5],\n        tension: 0.5,\n        borderWidth: 0\n      },\n      {\n        type: 'line',\n        fill: true,\n        label: lineLabel('Top 25%', this.top25LabelValue),\n        data: this.getPercentileData(1),\n        backgroundColor: this.lineColorsValue[1],\n        tension: 0.5,\n        borderWidth: 0\n      },\n      {\n        type: 'line',\n        fill: true,\n        label: lineLabel('Top 10%', this.top10LabelValue),\n        data: this.getPercentileData(2),\n        backgroundColor: this.lineColorsValue[2],\n        tension: 0.5,\n        borderWidth: 0\n      }\n    ]\n\n    if (!this.showBarsValue) {\n      return lines\n    }\n\n    return [\n      {\n        type: 'bar',\n        label: this.listingLabelValue,\n        data: this.listingDataValue,\n        backgroundColor: this.barColorValue,\n        barPercentage: 0.3,\n        borderRadius: 3,\n        borderWidth: 0\n      },\n      ...lines\n    ]\n  }\n\n  getPercentileData(index) {\n    const data = this.compDataValue.map(item => item[index])\n\n    // For percentage scale, multiply by 100\n    if (this.hasPercentageScaleValue && this.percentageScaleValue) {\n      return data.map(value => value * 100)\n    }\n\n    return data\n  }\n\n  getChartOptions() {\n    const baseOptions = {\n      maintainAspectRatio: false,\n      interaction: {\n        mode: 'index',\n      },\n      plugins: {\n        legend: {\n          align: 'start',\n          labels: {\n            usePointStyle: true,\n            padding: 8,\n            font: {\n              size: 10\n            }\n          }\n        }\n      },\n      scales: {\n        x: {\n          grid: {\n            display: false\n          }\n        },\n        y: {\n          beginAtZero: true,\n          grid: {\n            drawOnChartArea: true\n          }\n        }\n      }\n    }\n\n    // Add max value if specified\n    if (this.hasMaxValueValue && this.maxValueValue > 0) {\n      baseOptions.scales.y.max = this.maxValueValue\n    }\n\n    // Add percentage scale options if needed\n    if (this.hasPercentageScaleValue && this.percentageScaleValue) {\n      baseOptions.scales.y.ticks = {\n        callback: function (value, index, values) {\n          if (value <= 100) {\n            return value\n          } else {\n            return ''\n          }\n        }\n      }\n    }\n\n    return baseOptions\n  }\n\n  legendMargin() {\n    return {\n      id: 'legendMargin',\n      beforeInit(chart, legend, options) {\n        const fitValue = chart.legend.fit\n        chart.legend.fit = function fit() {\n          fitValue.bind(chart.legend)()\n          return this.height += 24\n        }\n      }\n    }\n  }\n}\n", "/**\n * Preline registers a global window \"resize\" listener before its window \"load\"\n * handler runs HSOverlay.autoInit(), which sets window.$hsOverlayCollection.\n * Several resize handlers read $hsOverlayCollection.length without guarding\n * against undefined, so a synthetic resize during that gap throws.\n */\nexport function ensurePrelineOverlayCollection() {\n  if (typeof window === \"undefined\") return\n  if (typeof window.$hsOverlayCollection === \"undefined\") {\n    window.$hsOverlayCollection = []\n  }\n}\n\nexport function dispatchWindowResize() {\n  ensurePrelineOverlayCollection()\n  window.dispatchEvent(new Event(\"resize\"))\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { dispatchWindowResize } from \"../lib/safe_window_resize\"\n\nexport default class extends Controller {\n  static targets = [\"mapContainer\", \"overlay\", \"openTrigger\", \"closeTrigger\"]\n\n  connect() {\n    this.expanded = false\n    this.boundEscape = (e) => {\n      if (e.key === \"Escape\" && this.expanded) this.toggle()\n    }\n    document.addEventListener(\"keydown\", this.boundEscape)\n  }\n\n  backdropDismiss(event) {\n    if (!this.expanded || !this.hasOverlayTarget) return\n    if (event.target !== this.overlayTarget) return\n    this.toggle()\n  }\n\n  toggle() {\n    this.expanded = !this.expanded\n    const leafletContainer = this.mapContainerTarget.querySelector(\".leaflet-container\")\n\n    if (this.expanded) {\n      this.mapContainerTarget.classList.add(\"map-expanded-panel\")\n      this.mapContainerTarget.classList.remove(\"col-span-2\", \"min-h-96\", \"h-96\", \"flex-1\")\n\n      leafletContainer?.classList.add(\"rounded-lg\")\n\n      if (this.hasOverlayTarget) this.overlayTarget.classList.remove(\"hidden\")\n      if (this.hasOpenTriggerTarget) this.openTriggerTarget.classList.add(\"hidden\")\n      if (this.hasCloseTriggerTarget) this.closeTriggerTarget.classList.remove(\"hidden\")\n\n      document.body.style.overflow = \"hidden\"\n    } else {\n      this.mapContainerTarget.classList.remove(\"map-expanded-panel\")\n      this.mapContainerTarget.classList.add(\"col-span-2\", \"min-h-96\")\n      if (this.mapContainerTarget.classList.contains(\"flex-1\") || this.element.classList.contains(\"flex-1\")) {\n        this.mapContainerTarget.classList.add(\"flex-1\")\n      } else {\n        this.mapContainerTarget.classList.add(\"h-96\")\n      }\n\n      leafletContainer?.classList.remove(\"rounded-lg\")\n\n      if (this.hasOverlayTarget) this.overlayTarget.classList.add(\"hidden\")\n      if (this.hasOpenTriggerTarget) this.openTriggerTarget.classList.remove(\"hidden\")\n      if (this.hasCloseTriggerTarget) this.closeTriggerTarget.classList.add(\"hidden\")\n\n      document.body.style.overflow = \"\"\n    }\n\n    this.dispatch(this.expanded ? \"expand\" : \"collapse\")\n    this.trackMapExpanded(this.expanded)\n\n    setTimeout(() => {\n      dispatchWindowResize()\n    }, 200)\n  }\n\n  disconnect() {\n    document.removeEventListener(\"keydown\", this.boundEscape)\n    document.body.style.overflow = \"\"\n  }\n\n  trackMapExpanded(expanded) {\n    const mapEl = this.mapContainerTarget?.querySelector('[data-controller~=\"insights-map\"]')\n    if (!mapEl) return\n\n    const pageType = mapEl.dataset.insightsMapAnalyticsPageTypeValue\n    if (!pageType) return\n\n    const mapController = this.application.getControllerForElementAndIdentifier(mapEl, \"insights-map\")\n    const properties = {\n      page_type: pageType,\n      expanded,\n      metric: mapController?.currentMetric || \"adr\",\n      zoom: mapController?.map?.getZoom?.() ?? null\n    }\n\n    if (pageType === \"listing\") {\n      const focalListingId = mapEl.dataset.insightsMapListingUuidValue\n      if (focalListingId) properties.focal_listing_id = focalListingId\n    }\n\n    this.dispatch(\"trackEvent\", {\n      prefix: null,\n      detail: {\n        name: \"Map Expanded\",\n        properties\n      }\n    })\n  }\n}\n", "// Carries the map view across a Turbo visit to another market, so the next page's map\n// starts where the user was looking (and in the full-screen modal if it was open).\nconst STORAGE_KEY = \"insights_map_handoff\"\nconst MAX_AGE_MS = 30000\n\nexport function saveMapHandoff(url, state) {\n  try {\n    const path = new URL(url, window.location.origin).pathname\n    sessionStorage.setItem(STORAGE_KEY, JSON.stringify({ ...state, path, at: Date.now() }))\n  } catch (_e) {\n    // Storage blocked: the next map simply opens on its own market.\n  }\n}\n\n// The handoff meant for this page, if any. It stays stored until clearMapHandoff().\nexport function readMapHandoff() {\n  try {\n    const handoff = JSON.parse(sessionStorage.getItem(STORAGE_KEY) || \"null\")\n    if (!handoff) return null\n    if (Date.now() - (handoff.at || 0) > MAX_AGE_MS) {\n      clearMapHandoff()\n      return null\n    }\n    return samePage(handoff.path, window.location.pathname) ? handoff : null\n  } catch (_e) {\n    return null\n  }\n}\n\n// The dashboard may land on a section of the market it was asked for (\"\u2026/palermo\" \u2192 \"\u2026/palermo/overview\").\nfunction samePage(saved, current) {\n  const strip = (path) => path.replace(/\\/+$/, \"\")\n  const a = strip(saved)\n  const b = strip(current)\n  return a === b || b.startsWith(`${a}/`) || a.startsWith(`${b}/`)\n}\n\nexport function clearMapHandoff() {\n  try {\n    sessionStorage.removeItem(STORAGE_KEY)\n  } catch (_e) {\n    // Nothing stored.\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { dispatchWindowResize } from \"../lib/safe_window_resize\"\nimport { readMapHandoff } from \"../lib/map_handoff\"\n\nexport default class extends Controller {\n  static targets = [\"modalMapContainer\", \"loadingIndicator\"]\n\n  connect() {\n    this.boundHandleOpen = this.handleOpen.bind(this)\n    this.boundHandleClose = this.handleClose.bind(this)\n    this.boundHandleFrameLoad = this.handleFrameLoad.bind(this)\n\n    // Try to find the map container initially (may not exist if overview hasn't loaded)\n    this.findMapContainer()\n\n    // Listen for turbo-frame loads to update map container reference\n    document.addEventListener('turbo:frame-load', this.boundHandleFrameLoad)\n\n    // Listen for Turbo Stream updates to refresh map container reference if DOM changed\n    this.boundHandleStreamRender = this.handleStreamRender.bind(this)\n    document.addEventListener('turbo:after-stream-render', this.boundHandleStreamRender)\n\n    // Wait for Preline to be ready (scripts load asynchronously)\n    this.waitForPreline(() => {\n      const result = HSOverlay.getInstance(this.element, true)\n      // const { element } = HSOverlay.getInstance(this.element, true)\n      const element = result.element\n      this.overlayElement = element\n      element.on('open', this.boundHandleOpen)\n      element.on('close', this.boundHandleClose)\n      // Switched market from the full-screen map: keep it full screen on the new page.\n      if (readMapHandoff()?.modal) HSOverlay.open(this.element)\n    })\n  }\n\n  disconnect() {\n    document.removeEventListener('turbo:frame-load', this.boundHandleFrameLoad)\n    document.removeEventListener('turbo:after-stream-render', this.boundHandleStreamRender)\n  }\n\n  findMapContainer() {\n    // Find the overview map container (the one we'll move)\n    this.overviewMapContainer = document.querySelector('#map-overview-container')\n\n    // Store original position if map container exists\n    if (this.overviewMapContainer) {\n      this.storeOriginalPosition()\n    }\n\n    return this.overviewMapContainer\n  }\n\n  handleFrameLoad(event) {\n    // If the market-overview frame loaded, try to find the map container\n    if (event.target && event.target.id === 'market-overview') {\n      // Wait a bit for the map to be rendered inside the frame\n      setTimeout(() => {\n        if (!this.overviewMapContainer || !this.overviewMapContainer.isConnected) {\n          this.findMapContainer()\n        }\n      }, 100)\n    }\n  }\n\n  handleStreamRender(event) {\n    // If Turbo Streams updated the DOM, check if our map container reference is still valid\n    if (this.overviewMapContainer && !this.overviewMapContainer.isConnected) {\n      // Map container was replaced by Turbo Streams, re-find it\n      this.findMapContainer()\n    }\n  }\n\n  storeOriginalPosition() {\n    if (!this.overviewMapContainer) return\n\n    // Verify the container is still connected to the DOM\n    if (!this.overviewMapContainer.isConnected || !this.overviewMapContainer.parentNode) {\n      // Map container was removed from DOM (e.g., by Turbo Streams), re-find it\n      this.findMapContainer()\n      if (!this.overviewMapContainer) return\n    }\n\n    this.originalParent = this.overviewMapContainer.parentNode\n    this.originalNextSibling = this.overviewMapContainer.nextSibling\n\n    // Also find the heading that comes before the map (for reliable restoration)\n    const parent = this.originalParent\n    if (parent) {\n      const mapIndex = Array.from(parent.children).indexOf(this.overviewMapContainer)\n      this.originalHeading = mapIndex > 0 ? parent.children[mapIndex - 1] : null\n    } else {\n      this.originalHeading = null\n    }\n\n    // Store the overview frame reference for later use\n    const overviewFrame = document.getElementById('market-overview')\n    if (overviewFrame && overviewFrame.contains(this.overviewMapContainer)) {\n      this.originalFrame = overviewFrame\n    } else {\n      this.originalFrame = null\n    }\n  }\n\n  waitForPreline(callback) {\n    const checkReady = () => {\n      if (typeof HSOverlay !== 'undefined' && window.$hsOverlayCollection) {\n        // Check if this element is in the overlay collection\n        const instance = HSOverlay.getInstance(this.element, true)\n        if (instance && instance.element) {\n          return true\n        }\n      }\n      return false\n    }\n\n    if (checkReady()) {\n      callback()\n    } else {\n      // Check every 50ms, up to 2 seconds\n      let attempts = 0\n      const checkInterval = setInterval(() => {\n        attempts++\n        if (checkReady()) {\n          clearInterval(checkInterval)\n          callback()\n        } else if (attempts >= 40) {\n          clearInterval(checkInterval)\n          console.warn('Preline overlay not initialized for element after waiting')\n        }\n      }, 50)\n    }\n  }\n\n  handleOpen() {\n    // Try to find the map container if we don't have it yet\n    if (!this.overviewMapContainer) {\n      this.findMapContainer()\n    }\n\n    // Verify the container is still connected to the DOM (might have been replaced by Turbo Streams)\n    if (this.overviewMapContainer && !this.overviewMapContainer.isConnected) {\n      // Map container reference is stale, re-find it\n      this.findMapContainer()\n    }\n\n    // If still not found, show loading indicator and ensure overview section loads first\n    if (!this.overviewMapContainer) {\n      this.showLoading()\n      const overviewFrame = document.getElementById('market-overview')\n\n      if (overviewFrame) {\n        // Check if frame has src but hasn't loaded yet (lazy-loaded)\n        if (overviewFrame.hasAttribute('src') && !overviewFrame.hasAttribute('complete')) {\n          // Overview frame exists but hasn't loaded, trigger it to load\n          // Remove lazy loading and force eager load\n          overviewFrame.removeAttribute('loading')\n          overviewFrame.setAttribute('loading', 'eager')\n\n          // Also listen for the frame load event\n          const onFrameLoad = () => {\n            // Wait a bit for the map to render inside the frame\n            setTimeout(() => {\n              this.findMapContainer()\n              if (this.overviewMapContainer) {\n                this.proceedWithOpen()\n              } else {\n                // Still not found, keep loading indicator\n                this.showLoading()\n              }\n            }, 150)\n            overviewFrame.removeEventListener('turbo:frame-load', onFrameLoad)\n          }\n          overviewFrame.addEventListener('turbo:frame-load', onFrameLoad)\n\n          // Trigger the frame to load\n          overviewFrame.reload()\n        } else if (!overviewFrame.hasAttribute('src')) {\n          // Frame exists but has no src - might be server-rendered but map not found\n          // This shouldn't happen, but handle it anyway\n          console.warn('[MapModal] Overview frame exists but has no src attribute')\n        }\n      }\n\n      // Wait for map container with retries (fallback if frame load event doesn't fire)\n      let attempts = 0\n      const maxAttempts = 30 // 3 seconds max wait\n      const waitForMap = () => {\n        attempts++\n        this.findMapContainer()\n        if (this.overviewMapContainer) {\n          // Found it, continue with opening\n          this.proceedWithOpen()\n        } else if (attempts < maxAttempts) {\n          setTimeout(waitForMap, 100)\n        } else {\n          console.warn('[MapModal] Map container not found after waiting, cannot open modal')\n          this.hideLoading()\n        }\n      }\n      waitForMap()\n      return // Exit early, will proceed when map is found\n    }\n\n    this.proceedWithOpen()\n  }\n\n  showLoading() {\n    if (this.hasLoadingIndicatorTarget) {\n      this.loadingIndicatorTarget.classList.remove('hidden')\n    }\n  }\n\n  hideLoading() {\n    if (this.hasLoadingIndicatorTarget) {\n      this.loadingIndicatorTarget.classList.add('hidden')\n    }\n  }\n\n  proceedWithOpen() {\n    if (!this.overviewMapContainer) return\n\n    // Verify the container is still connected to the DOM\n    if (!this.overviewMapContainer.isConnected || !this.overviewMapContainer.parentNode) {\n      // Map container was removed from DOM, re-find it\n      this.findMapContainer()\n      if (!this.overviewMapContainer) {\n        console.warn('[MapModal] Map container not found, cannot open modal')\n        this.hideLoading()\n        return\n      }\n    }\n\n    // Clean up any existing placeholder first (in case of previous incomplete close)\n    this.cleanupPlaceholder()\n\n    // Re-store position in case DOM changed\n    this.storeOriginalPosition()\n    this.hadFixedHeight = this.overviewMapContainer.classList.contains('h-[600px]')\n    this.hadFullHeight = this.overviewMapContainer.classList.contains('h-full')\n\n    // Get computed dimensions before moving\n    const rect = this.overviewMapContainer.getBoundingClientRect()\n    const computedStyle = window.getComputedStyle(this.overviewMapContainer)\n\n    // Store original dimensions\n    this.originalWidth = rect.width\n    this.originalHeight = rect.height\n    this.originalMarginBottom = computedStyle.marginBottom\n    this.originalMarginTop = computedStyle.marginTop\n\n    // Create placeholder to preserve space (also used as restore anchor on close)\n    this.placeholder = document.createElement('div')\n    this.placeholder.id = 'map-overview-placeholder'\n    this.placeholder.style.width = `${this.originalWidth}px`\n    this.placeholder.style.height = `${this.originalHeight}px`\n    this.placeholder.style.marginTop = this.originalMarginTop\n    this.placeholder.style.marginBottom = this.originalMarginBottom\n    this.placeholder.style.visibility = 'hidden'\n    this.placeholder.style.pointerEvents = 'none'\n\n    // Insert placeholder where map container was\n    if (this.originalNextSibling && this.originalNextSibling.parentNode === this.originalParent) {\n      this.originalParent.insertBefore(this.placeholder, this.originalNextSibling)\n    } else if (this.originalHeading && this.originalHeading.parentNode === this.originalParent) {\n      if (this.originalHeading.nextSibling) {\n        this.originalParent.insertBefore(this.placeholder, this.originalHeading.nextSibling)\n      } else {\n        this.originalParent.appendChild(this.placeholder)\n      }\n    } else {\n      this.originalParent.appendChild(this.placeholder)\n    }\n\n    // Modal needs a fill-height map; story stage already uses h-full\n    this.overviewMapContainer.classList.remove('h-[600px]')\n    this.overviewMapContainer.classList.add('h-full')\n\n    // Move map container to modal\n    const modalMapContainer = this.modalMapContainerTarget\n\n    // Clean up any existing content in modal container (shouldn't happen, but just in case)\n    const existingPlaceholder = modalMapContainer.querySelector('#map-overview-placeholder')\n    if (existingPlaceholder) {\n      existingPlaceholder.remove()\n    }\n\n    modalMapContainer.appendChild(this.overviewMapContainer)\n\n    // Hide loading indicator now that map is loaded\n    this.hideLoading()\n\n    // Dispatch event for map to resize\n    setTimeout(() => {\n      const mapElement = this.overviewMapContainer.querySelector('#map-overview')\n      if (mapElement) {\n        mapElement.dispatchEvent(new CustomEvent('map:invalidate-size'))\n      }\n      this.dispatch('modalOpened', { detail: { modal: this.element } })\n    }, 100)\n  }\n\n  cleanupPlaceholder() {\n    // Remove placeholder if it exists anywhere in the DOM\n    if (this.placeholder && this.placeholder.parentNode) {\n      this.placeholder.parentNode.removeChild(this.placeholder)\n      this.placeholder = null\n    }\n\n    // Also check for any orphaned placeholders by ID\n    const orphanedPlaceholder = document.getElementById('map-overview-placeholder')\n    if (orphanedPlaceholder) {\n      orphanedPlaceholder.remove()\n    }\n  }\n\n  handleClose() {\n    if (!this.overviewMapContainer) return\n\n    // Restore into the placeholder slot first (keeps story stage wrapper + sizing)\n    const placeholder =\n      (this.placeholder && this.placeholder.parentNode && this.placeholder) ||\n      document.getElementById('map-overview-placeholder')\n\n    if (placeholder && placeholder.parentNode) {\n      placeholder.parentNode.insertBefore(this.overviewMapContainer, placeholder)\n      this.originalParent = placeholder.parentNode\n      placeholder.remove()\n      this.placeholder = null\n    } else {\n      this.cleanupPlaceholder()\n\n      let targetParent = this.originalParent\n      if (!targetParent || !targetParent.isConnected) {\n        const stage = document.getElementById('map-overview-stage')\n        const overviewFrame = document.getElementById('market-overview')\n        targetParent = stage || overviewFrame || document.body\n      }\n\n      if (this.originalNextSibling && this.originalNextSibling.parentNode === targetParent) {\n        targetParent.insertBefore(this.overviewMapContainer, this.originalNextSibling)\n      } else {\n        targetParent.appendChild(this.overviewMapContainer)\n      }\n      this.originalParent = targetParent\n    }\n\n    // Restore the height class the map had before opening (stage = h-full, legacy = h-[600px])\n    this.overviewMapContainer.classList.remove('h-full', 'h-[600px]')\n    if (this.hadFixedHeight) {\n      this.overviewMapContainer.classList.add('h-[600px]')\n    } else {\n      this.overviewMapContainer.classList.add('h-full')\n    }\n\n    // Ensure container is visible\n    this.overviewMapContainer.style.display = ''\n    this.overviewMapContainer.style.visibility = ''\n\n    // Dispatch event for map to resize\n    setTimeout(() => {\n      const mapElement = this.overviewMapContainer.querySelector('#map-overview')\n      if (mapElement) {\n        mapElement.dispatchEvent(new CustomEvent('map:invalidate-size'))\n      }\n\n      dispatchWindowResize()\n      if (mapElement) {\n        mapElement.dispatchEvent(new CustomEvent('map:invalidate-size'))\n      }\n    }, 150)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.pendingDismiss = null\n    this.wiredModals = new WeakSet()\n\n    this.onDocumentClick = this.handleDocumentClick.bind(this)\n    this.onKeyDown = this.handleKeyDown.bind(this)\n\n    document.addEventListener(\"click\", this.onDocumentClick, true)\n    document.addEventListener(\"keydown\", this.onKeyDown, true)\n\n    this.observeModals()\n  }\n\n  disconnect() {\n    document.removeEventListener(\"click\", this.onDocumentClick, true)\n    document.removeEventListener(\"keydown\", this.onKeyDown, true)\n    this.modalObserver?.disconnect()\n  }\n\n  observeModals() {\n    document.querySelectorAll(\".hs-overlay\").forEach((modal) => this.wireModal(modal))\n\n    this.modalObserver = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        mutation.addedNodes.forEach((node) => {\n          if (node.nodeType !== Node.ELEMENT_NODE) return\n\n          if (node.matches?.(\".hs-overlay\")) this.wireModal(node)\n          node.querySelectorAll?.(\".hs-overlay\").forEach((element) => this.wireModal(element))\n        })\n      })\n    })\n\n    this.modalObserver.observe(document.body, { childList: true, subtree: true })\n  }\n\n  wireModal(modal) {\n    if (this.wiredModals.has(modal)) return\n\n    this.wiredModals.add(modal)\n    modal.addEventListener(\"close.hs.overlay\", () => this.handleModalClosed(modal))\n  }\n\n  handleModalClosed(modal) {\n    const dismissMethod = this.pendingDismiss?.modal === modal\n      ? this.pendingDismiss.method\n      : \"unknown\"\n\n    this.pendingDismiss = null\n\n    this.trackEvent(\"Modal Dismissed\", {\n      modal_type: this.modalTypeFor(modal),\n      modal_id: modal.id || null,\n      dismiss_method: dismissMethod\n    })\n  }\n\n  handleDocumentClick(event) {\n    const closeTrigger = event.target.closest(\"[data-hs-overlay]\")\n    if (closeTrigger) {\n      const selector = closeTrigger.getAttribute(\"data-hs-overlay\")\n      const modal = selector ? document.querySelector(selector) : null\n\n      if (modal && this.isModalOpen(modal)) {\n        this.pendingDismiss = { modal, method: \"close_button\" }\n      }\n      return\n    }\n\n    const modal = event.target.closest(\".hs-overlay\")\n    if (modal && event.target === modal && this.isModalOpen(modal)) {\n      this.pendingDismiss = { modal, method: \"backdrop_click\" }\n    }\n  }\n\n  handleKeyDown(event) {\n    if (event.key !== \"Escape\") return\n\n    const openModal = document.querySelector(\".hs-overlay.open, .hs-overlay.hs-overlay-open\")\n    if (openModal && this.isModalOpen(openModal)) {\n      this.pendingDismiss = { modal: openModal, method: \"escape_key\" }\n    }\n  }\n\n  isModalOpen(modal) {\n    return modal.classList.contains(\"open\") || modal.classList.contains(\"hs-overlay-open\")\n  }\n\n  modalTypeFor(modal) {\n    if (modal.dataset.modalTrackingType) return modal.dataset.modalTrackingType\n\n    const id = modal.id || \"\"\n    return id.replace(/^hs-/, \"\").replace(/-/g, \"_\") || \"unknown\"\n  }\n\n  trackEvent(name, properties = {}) {\n    this.dispatch(\"trackEvent\", {\n      prefix: null,\n      detail: { name, properties }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"map\", \"insightsTab\", \"attributeSelect\", \"toggleButtons\", \"metricSelect\"]\n  static values = {\n    isSubscribed: Boolean\n  }\n\n  connect() {\n    this.activeType = null\n    this.getMapController()\n  }\n\n  getMapController() {\n    if (this.hasMapTarget) {\n      this.mapController = this.application.getControllerForElementAndIdentifier(\n        this.mapTarget,\n        'insights-map'\n      )\n    }\n\n    if (!this.mapController) {\n      setTimeout(() => this.getMapController(), 50)\n      return\n    }\n\n    if (this.activeType !== 'insights') {\n      this.switchToMapType('insights', false)\n    }\n  }\n\n  switchToInsights() {\n    this.switchToMapType('insights', true)\n  }\n\n  switchToMapType(type, savePreference = true) {\n    if (this.activeType === type || !this.mapController) return\n\n    // Listings layer only \u2014 heatmap toggle removed from UI.\n    type = 'insights'\n    this.activeType = type\n\n    if (savePreference) {\n      localStorage.setItem('mapModalType', type)\n    }\n\n    this.mapController.showInsightsLayer()\n    if (this.hasInsightsTabTarget) {\n      this.insightsTabTarget.classList.add('active')\n      this.insightsTabTarget.classList.remove('text-gray-700')\n      this.insightsTabTarget.style.backgroundColor = '#E4F0EA'\n      this.insightsTabTarget.style.color = '#1F6F54'\n    }\n    if (this.hasAttributeSelectTarget) {\n      this.attributeSelectTarget.classList.add('hidden')\n    }\n    if (this.hasMetricSelectTarget) {\n      this.metricSelectTarget.classList.remove('hidden')\n    }\n\n    setTimeout(() => {\n      this.mapTarget.dispatchEvent(new CustomEvent('map:invalidate-size'))\n    }, 100)\n  }\n\n  switchMetric(event) {\n    if (!this.mapController) this.getMapController()\n    if (!this.mapController) return\n\n    const select = event.target.closest('select') || event.target\n    this.mapController.changeMetric(select.value)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nString.prototype.capitalize = function() {\n  return this.replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n};\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    durationData: Array,\n    leadDaysData: Array,\n    locale: String,\n    today: Number,\n    dataType: { type: String, default: 'days' },\n    tension: { type: Number, default: 0 }\n  }\n\n  connect() {\n    this.chart = null\n    // Default to duration if available, otherwise lead_days\n    this.currentMetric = this.hasDurationDataValue && this.durationDataValue.length > 0 ? 'duration' : 'lead_days'\n    this.initializeChart()\n  }\n\n  switchChart(event) {\n    const metric = event.currentTarget.dataset.metric\n    if (metric === this.currentMetric) return\n\n    this.currentMetric = metric\n    this.updateActiveCard()\n    this.updateChart()\n  }\n\n  updateActiveCard() {\n    const cards = this.element.querySelectorAll('.metric-chart-switcher-metric-card')\n    cards.forEach(card => {\n      const cardMetric = card.dataset.metric\n      if (cardMetric === this.currentMetric) {\n        card.classList.add('border-primary', 'bg-[#E4F0EA]')\n        card.classList.remove('border-gray-200', 'bg-gradient-to-br')\n      } else {\n        card.classList.remove('border-primary', 'bg-[#E4F0EA]')\n        card.classList.add('border-gray-200', 'bg-gradient-to-br')\n      }\n    })\n  }\n\n  updateChart() {\n    const chartData = this.currentMetric === 'duration' ? this.durationDataValue : this.leadDaysDataValue\n    const dates = chartData.map(([date]) => new Date(date))\n\n    // Update chart data\n    this.chart.data.labels = chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(this.localeValue, { month: 'short', timeZone: 'UTC' }).capitalize())\n    this.chart.data.datasets[0].data = chartData.map(([, value]) => value)\n\n    // Update tooltip title based on metric\n    this.chart.options.plugins.tooltip.callbacks.title = (tooltipItems) => {\n      const dataIndex = tooltipItems[0].dataIndex\n      const dateString = chartData[dataIndex][0]\n      const date = new Date(dateString + 'T00:00:00Z')\n      return date.toLocaleString(this.localeValue, {\n        month: 'long',\n        year: 'numeric',\n        timeZone: 'UTC'\n      })\n    }\n\n    this.chart.update()\n  }\n\n  initializeChart() {\n    const canvasElement = this.canvasTarget\n    const ctx = canvasElement.getContext('2d')\n    const chartData = this.currentMetric === 'duration' ? this.durationDataValue : this.leadDaysDataValue\n    const dates = chartData.map(([date]) => new Date(date))\n    const todayValue = this.todayValue\n    const localeValue = this.localeValue\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(localeValue, { month: 'short', timeZone: 'UTC' }).capitalize()),\n        datasets: [{\n          type: 'line',\n          data: chartData.map(([, value]) => value),\n          tension: this.tensionValue,\n          segment: {\n            borderDash: ctx => {\n              const currentDate = dates[ctx.p1DataIndex]\n              const now = new Date(todayValue)\n              return currentDate >= now ? [5, 5] : []\n            }\n          },\n          borderColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          },\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return\n            }\n            const gradient = getGradient(ctx, chartArea)\n            const currentDate = dates[context.dataIndex]\n            const now = new Date(todayValue)\n            if (currentDate >= now) {\n              return 'rgba(31, 111, 84, 0.3)'\n            }\n            return gradient\n          },\n          pointBackgroundColor: '#8FCBB0',\n          pointRadius: 2,\n          pointHoverRadius: 4\n        }]\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            callbacks: {\n              title: (tooltipItems) => {\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = chartData[dataIndex][0]\n                const date = new Date(dateString + 'T00:00:00Z')\n                return date.toLocaleString(this.localeValue, {\n                  month: 'long',\n                  year: 'numeric',\n                  timeZone: 'UTC'\n                })\n              },\n              label: (context) => {\n                const value = context.raw\n                if (this.dataTypeValue === 'days') {\n                  return `${new Intl.NumberFormat(this.localeValue, {\n                    minimumFractionDigits: 1,\n                    maximumFractionDigits: 1\n                  }).format(value)} days`\n                }\n                return value\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            grid: {\n              drawOnChartArea: true\n            }\n          }\n        }\n      }\n    })\n\n    // Set initial active card\n    this.updateActiveCard()\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    chartData: Array,\n    locale: String,\n    dataType: { type: String, default: 'number' },\n    currencyCode: { type: String, default: 'USD' },\n    lineColor: { type: String, default: 'rgba(59, 130, 246, 0.6)' }, // Subtle blue\n    chartType: { type: String, default: 'line' },\n    showXAxis: { type: Boolean, default: false },\n    showYAxis: { type: Boolean, default: false },\n    unitLabel: { type: String, default: '' } // Optional unit label to append to values (e.g., \"listings\", \"bookings\")\n  }\n\n  connect() {\n    this.chart = null\n    this.dates = []\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  chartDataValueChanged() {\n    if (this.chart) {\n      this.updateChartData(this.chartDataValue)\n    }\n  }\n\n  updateChartData(chartData) {\n    if (!this.chart || !chartData || chartData.length === 0) return\n\n    this.dates = chartData.map(([date]) => date)\n    this.chart.data.labels = this.formatLabels(chartData)\n    this.chart.data.datasets[0].data = chartData.map(([, value]) => value)\n    this.chart.update()\n  }\n\n  formatLabels(chartData) {\n    if (!this.showXAxisValue) return chartData.map(() => '')\n\n    return chartData.map(([date]) => {\n      const dateObj = new Date(date + 'T00:00:00Z')\n      return dateObj.toLocaleString(this.localeValue, {\n        month: 'short',\n        timeZone: 'UTC'\n      })\n    })\n  }\n\n  initializeChart() {\n    const ctx = this.element.getContext('2d')\n    const chartData = this.chartDataValue\n\n    if (!chartData || chartData.length === 0) return\n\n    this.dates = chartData.map(([date]) => date)\n\n    const labels = this.formatLabels(chartData)\n\n    const isBarChart = this.chartTypeValue === 'bar'\n    const dataset = isBarChart ? {\n      type: 'bar',\n      data: chartData.map(([, value]) => value),\n      backgroundColor: this.lineColorValue,\n      borderColor: this.lineColorValue,\n      borderWidth: 0,\n      borderRadius: 3,\n      barPercentage: 0.7\n    } : {\n      type: 'line',\n      data: chartData.map(([, value]) => value),\n      tension: 0.4,\n      cubicInterpolationMode: 'monotone',\n      borderColor: this.lineColorValue,\n      backgroundColor: 'transparent',\n      pointRadius: 0,\n      pointHoverRadius: 3,\n      borderWidth: 2.5,\n      fill: false\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: labels,\n        datasets: [dataset]\n      },\n      options: {\n        maintainAspectRatio: false,\n        responsive: true,\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            enabled: true,\n            backgroundColor: 'rgba(0, 0, 0, 0.8)',\n            padding: 8,\n            cornerRadius: 4,\n            displayColors: false,\n            callbacks: {\n              title: (tooltipItems) => {\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = this.dates[dataIndex]\n                const date = new Date(dateString + 'T00:00:00Z')\n\n                // Format as \"Month Year\" (e.g., \"January 2024\")\n                const formattedDate = date.toLocaleString(this.localeValue, {\n                  month: 'long',\n                  year: 'numeric',\n                  timeZone: 'UTC'\n                })\n\n                // Capitalize first letter\n                return formattedDate.charAt(0).toUpperCase() + formattedDate.slice(1)\n              },\n              label: (context) => {\n                const value = context.raw\n                let formattedValue\n\n                switch (this.dataTypeValue) {\n                  case 'currency':\n                    formattedValue = new Intl.NumberFormat(this.localeValue, {\n                      style: 'currency',\n                      currency: this.currencyCodeValue,\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0\n                    }).format(value)\n                    break\n                  case 'percentage':\n                    formattedValue = `${Math.round(value)}%`\n                    break\n                  case 'number':\n                  default:\n                    formattedValue = new Intl.NumberFormat(this.localeValue, {\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0\n                    }).format(value)\n                }\n\n                // Append unit label if provided\n                if (this.unitLabelValue && this.unitLabelValue.trim() !== '') {\n                  formattedValue = `${formattedValue} ${this.unitLabelValue}`\n                }\n\n                return formattedValue\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            display: this.showXAxisValue,\n            grid: {\n              display: false\n            },\n            ticks: {\n              display: this.showXAxisValue,\n              maxRotation: 0,\n              minRotation: 0,\n              font: {\n                size: 10\n              },\n              color: 'rgba(107, 114, 128, 0.6)',\n              callback: (value, index) => {\n                if (!this.showXAxisValue) return ''\n                const dateString = this.dates[index]\n                if (!dateString) return ''\n                const date = new Date(dateString + 'T00:00:00Z')\n                // Format as \"MMM\" (e.g., \"Jan\", \"Feb\")\n                return date.toLocaleString(this.localeValue, {\n                  month: 'short',\n                  timeZone: 'UTC'\n                })\n              }\n            }\n          },\n          y: {\n            display: this.showYAxisValue,\n            position: 'right',\n            grid: {\n              display: false\n            },\n            ticks: {\n              display: this.showYAxisValue,\n              font: {\n                size: 10\n              },\n              color: 'rgba(107, 114, 128, 0.6)',\n              callback: (value) => {\n                if (!this.showYAxisValue) return ''\n                // Format based on data type\n                switch (this.dataTypeValue) {\n                  case 'currency':\n                    return new Intl.NumberFormat(this.localeValue, {\n                      style: 'currency',\n                      currency: this.currencyCodeValue,\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0,\n                      notation: 'compact'\n                    }).format(value)\n                  case 'percentage':\n                    return `${Math.round(value)}%`\n                  case 'number':\n                  default:\n                    return new Intl.NumberFormat(this.localeValue, {\n                      minimumFractionDigits: 0,\n                      maximumFractionDigits: 0,\n                      notation: 'compact'\n                    }).format(value)\n                }\n              }\n            }\n          }\n        },\n        interaction: {\n          intersect: false,\n          mode: 'index',\n          axis: 'x'\n        },\n        onHover: (event, activeElements) => {\n          event.native.target.style.cursor = activeElements.length > 0 ? 'pointer' : 'default'\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"select\"]\n  static values = {\n    chartDataByPeriod: Object\n  }\n\n  changePeriod() {\n    const endYear = this.selectTarget.value\n    const chartData = this.chartDataByPeriodValue[endYear]\n    if (!chartData) return\n\n    const chartElement = this.element.querySelector('[data-controller~=\"minimal-chart\"]')\n    if (!chartElement) return\n\n    const chartController = this.application.getControllerForElementAndIdentifier(chartElement, \"minimal-chart\")\n    if (!chartController) return\n\n    chartController.chartDataValue = chartData\n    chartController.updateChartData(chartData)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n\n  applyFilters(event) {\n    event.preventDefault()\n    const form = event.target.closest('form')\n    const formData = new FormData(form)\n\n    const compSet = formData.get('comp_set')\n    const bedrooms = formData.get('bedrooms')\n    const capacity = formData.get('capacity')\n\n    let params = new URLSearchParams(window.location.search)\n\n    if (compSet.startsWith('nearby_')) {\n      params.set('comp_set', 'nearby')\n      params.set('radius', compSet.split('_')[1])\n    } else {\n      params.set('comp_set', compSet)\n      params.delete('radius')\n    }\n\n    params.set('bedrooms', bedrooms || 'all')\n\n    if (capacity) {\n      params.set('capacity', capacity)\n    }\n\n    window.location.search = params.toString()\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\nimport {\n  buildInsightsFilterUrlFromForm,\n  updateInsightsBrowserUrl\n} from \"../lib/insights_filter_url\"\nimport { closeMobileFiltersOverlay } from \"../lib/insights_mobile_filters_overlay\"\nimport {\n  getCurrentStorySection,\n  syncInsightsFormActionWithCurrentSection,\n  updateInsightsPathWithSection\n} from \"../lib/insights_story_section\"\n\nexport default class extends Controller {\n  static targets = [\"amenities\", \"showMoreButton\"];\n\n  connect() {\n    this.selectedAmenities = [];\n\n    this.boundHandleClick = this.handleClick.bind(this)\n    this.boundHandleSubmitStart = this.handleSubmitStart.bind(this)\n    this.element.addEventListener(\"click\", this.boundHandleClick, true)\n\n    this.form = this.element.querySelector(\"form\")\n    if (this.form) {\n      this.form.addEventListener(\"turbo:submit-start\", this.boundHandleSubmitStart)\n    }\n\n    const urlParams = new URLSearchParams(window.location.search);\n\n    // Move selected amenities HTML elements to the beginning\n    const amenitiesContainer = this.amenitiesTarget;\n\n    const selectedButtons = Array.from(amenitiesContainer.querySelectorAll('button'))\n      .filter(button => urlParams.get(button.name));\n\n    selectedButtons.forEach(button => {\n      amenitiesContainer.prepend(button)\n      $(button).removeClass('hidden');\n    });\n\n    for (const [key, value] of urlParams.entries()) {\n      if (value === '1' && key.startsWith('has_')) {\n        this.selectedAmenities.push(key);\n      }\n    }\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"click\", this.boundHandleClick, true)\n    if (this.form) {\n      this.form.removeEventListener(\"turbo:submit-start\", this.boundHandleSubmitStart)\n    }\n  }\n\n  toggleExtraAmenities() {\n    $('button', this.amenitiesTarget).show()\n    $(this.showMoreButtonTarget).hide()\n  }\n\n  toggleAmenity(event) {\n    const amenity = event.target.name;\n\n    const isSelected = this.selectedAmenities.includes(amenity);\n    if (!isSelected) {\n      this.selectedAmenities.push(amenity);\n    } else {\n      this.selectedAmenities = this.selectedAmenities.filter(item => item !== amenity);\n    }\n\n    $(event.target).toggleClass('bg-gray-600 bg-gray-200 text-white text-gray-700');\n  }\n\n  prepareFormForOpen(form) {\n    form.querySelectorAll(\"select\").forEach((select) => {\n      select.disabled = false\n    })\n\n    this.syncStorySectionInInsightsUrl(form)\n  }\n\n  prepareFilters(event) {\n    const form = event.currentTarget.closest(\"form\")\n    if (!form) return\n\n    this.syncStorySectionInInsightsUrl(form)\n    this.trackFiltersApplied(form)\n\n    form.querySelectorAll(\"select\").forEach((select) => {\n      select.disabled = false\n    })\n\n    // dont submit empty select fields\n    form.querySelectorAll(\"select\").forEach((select) => {\n      if (select.value === \"\") {\n        select.disabled = true\n      }\n    })\n\n    // Add selected amenities to the form\n    if (this.selectedAmenities.length > 0) {\n      form.querySelectorAll('input[name=\"amenities[]\"]').forEach((input) => input.remove())\n\n      this.selectedAmenities.forEach(amenity => {\n        const input = document.createElement(\"input\")\n        input.type = \"hidden\"\n        input.name = amenity\n        input.value = \"1\"\n        form.appendChild(input)\n      })\n    }\n  }\n\n  handleSubmitStart(event) {\n    const form = event.target\n    if (form?.tagName === \"FORM\") {\n      this.updateBrowserUrlFromForm(form)\n    }\n\n    this.showFiltersLoading()\n    this.closeOverlay()\n  }\n\n  updateBrowserUrlFromForm(form) {\n    const formUrl = buildInsightsFilterUrlFromForm(form)\n    if (formUrl) {\n      updateInsightsBrowserUrl(formUrl, form)\n    }\n  }\n\n  showFiltersLoading() {\n    const filtersContainer = document.getElementById(\"filters-content\")\n    if (!filtersContainer) return\n\n    filtersContainer.dispatchEvent(new CustomEvent(\"filters-container:show-loading\", { bubbles: true }))\n  }\n\n  closeOverlay() {\n    closeMobileFiltersOverlay()\n  }\n\n  handleReset(event) {\n    this.navigateFilterLink(event.currentTarget)\n  }\n\n  handleClick(event) {\n    const link = event.target.closest('a[data-filter-action=\"reset\"], a[href*=\"/insights/\"]')\n    if (!link || !this.element.contains(link)) return\n\n    this.navigateFilterLink(link)\n  }\n\n  navigateFilterLink(link) {\n    const isReset = link.dataset.filterAction === \"reset\"\n\n    if (isReset) {\n      this.showFiltersLoading()\n      this.closeOverlay()\n    }\n\n    const currentSection = getCurrentStorySection()\n    if (!currentSection) return\n\n    try {\n      const linkUrl = new URL(link.href, window.location.origin)\n      if (!linkUrl.pathname.includes(\"/insights/\")) return\n\n      updateInsightsPathWithSection(linkUrl, currentSection)\n      link.href = linkUrl.toString()\n      updateInsightsBrowserUrl(linkUrl)\n    } catch (e) {\n      console.warn(\"[mobile-filters] Invalid URL in filter link:\", e)\n      return\n    }\n\n    if (!isReset) {\n      this.showFiltersLoading()\n      this.closeOverlay()\n    }\n  }\n\n  syncStorySectionInInsightsUrl(form) {\n    syncInsightsFormActionWithCurrentSection(form)\n  }\n\n  trackFiltersApplied(form) {\n    const urlParams = new URLSearchParams(window.location.search)\n    const changedFilters = []\n\n    form.querySelectorAll(\"select\").forEach((select) => {\n      const filterName = this.normalizeFilterName(select.name)\n      const newValue = select.value === \"\" ? null : select.value\n      const oldValue = urlParams.get(filterName) || null\n\n      if (newValue === oldValue) return\n\n      changedFilters.push({\n        filter_name: filterName,\n        filter_value: newValue,\n        action: newValue ? \"enabled\" : \"disabled\",\n        filter_group: this.filterGroupFor(filterName)\n      })\n    })\n\n    const urlAmenities = [...urlParams.keys()].filter((key) => key.startsWith(\"has_\"))\n    const newAmenities = this.selectedAmenities\n\n    urlAmenities.forEach((amenity) => {\n      if (!newAmenities.includes(amenity)) {\n        changedFilters.push({\n          filter_name: amenity,\n          filter_value: \"1\",\n          action: \"disabled\",\n          filter_group: \"amenities\"\n        })\n      }\n    })\n\n    newAmenities.forEach((amenity) => {\n      if (!urlAmenities.includes(amenity)) {\n        changedFilters.push({\n          filter_name: amenity,\n          filter_value: \"1\",\n          action: \"enabled\",\n          filter_group: \"amenities\"\n        })\n      }\n    })\n\n    if (changedFilters.length === 0) return\n\n    document.body.dispatchEvent(new CustomEvent(\"trackEvent\", {\n      bubbles: true,\n      detail: {\n        name: \"Insights Filters Applied\",\n        properties: {\n          apply_method: \"mobile_apply\",\n          changed_filter_count: changedFilters.length,\n          changed_filters: changedFilters\n        }\n      }\n    }))\n  }\n\n  normalizeFilterName(name) {\n    if (name === \"min_nights_booked\") return \"nights_booked\"\n\n    return name\n  }\n\n  filterGroupFor(filterName) {\n    if (filterName.startsWith(\"has_\")) return \"amenities\"\n\n    return filterName\n  }\n}\n", "// Keep in sync with PricingCurrency::EUROZONE_COUNTRY_CODES and COUNTRY_CURRENCIES.\nexport const EUROZONE_COUNTRY_CODES = new Set([\n  \"AT\", \"BE\", \"BG\", \"CY\", \"DE\", \"EE\", \"ES\", \"FI\", \"FR\", \"GR\",\n  \"HR\", \"IE\", \"IT\", \"LT\", \"LU\", \"LV\", \"MT\", \"NL\", \"PT\", \"SI\", \"SK\"\n])\n\n// Countries that pay in their own currency. Every other country pays USD.\nexport const COUNTRY_CURRENCIES = {\n  ...Object.fromEntries([...EUROZONE_COUNTRY_CODES].map((code) => [code, \"EUR\"])),\n  BR: \"BRL\"\n}\n\nconst LOCAL_CURRENCIES = new Set(Object.values(COUNTRY_CURRENCIES))\n\nexport function isEurozone(countryCode) {\n  return EUROZONE_COUNTRY_CODES.has(String(countryCode || \"\").trim().toUpperCase())\n}\n\n// A known country maps to its currency. Blank means we have not detected a country yet.\nexport function currencyForCountry(countryCode) {\n  const code = String(countryCode || \"\").trim().toUpperCase()\n  if (!code) return null\n  return COUNTRY_CURRENCIES[code] || \"USD\"\n}\n\n// Country wins when we have one. Otherwise a EUR or BRL preview currency still selects it.\nexport function currencyForBuyer({ countryCode, currencyCode } = {}) {\n  const fromCountry = currencyForCountry(countryCode)\n  if (fromCountry) return fromCountry\n  const currency = String(currencyCode || \"\").toUpperCase()\n  if (LOCAL_CURRENCIES.has(currency)) return currency\n  return \"USD\"\n}\n\nexport function previewPayload(result) {\n  if (!result || typeof result !== \"object\") return null\n  if (result.currencyCode || result.currency_code || result.address) return result\n  if (result.data) return previewPayload(result.data)\n  return null\n}\n\n// Null when the preview has no country and no currency, so the page can keep\n// the server-rendered amount (geo header, otherwise USD).\nexport function displayCurrencyFromPreview(result) {\n  const data = previewPayload(result)\n  if (!data) return null\n\n  const country = data.address?.countryCode || data.address?.country_code || \"\"\n  const currency = data.currencyCode || data.currency_code || \"\"\n  if (!country && !currency) return null\n\n  return currencyForBuyer({ countryCode: country, currencyCode: currency })\n}\n\n// discountIds: { USD, EUR, BRL }. A blank id for the buyer's currency keeps the USD discount.\nexport function discountIdForBuyer({ countryCode, currencyCode, discountIds = {} } = {}) {\n  const currency = currencyForBuyer({ countryCode, currencyCode })\n  return discountIds[currency] || discountIds.USD || null\n}\n\nconst round2 = (n) => Math.round(n * 100) / 100\n\n// Paddle's checkout events carry net amounts (tax taken out) and no tax mode, and\n// PricePreview says \"account_setting\", so a\n// \u20AC199 tax-inclusive price arrives as 164.46 subtotal + 25.86 tax. When the total\n// matches a price we sell at, the tax is inside it: show list \u2212 discount = total.\n// expectedTotals: our configured prices in this currency (discounted and list).\nexport function checkoutSummary({ subtotal, discount = 0, tax = 0, total, taxMode, expectedTotals = [] } = {}) {\n  const [net, off, taxAmount, charged] = [subtotal, discount, tax, total].map((n) => Number(n || 0))\n  const matchesOurPrice = expectedTotals.some((p) => p != null && Math.abs(charged - Number(p)) < 0.01)\n  // \"account_setting\" (and no mode at all) depends on the Paddle account, so fall back to the amounts.\n  const explicit = taxMode === \"internal\" || taxMode === \"location\" ? true : taxMode === \"external\" ? false : null\n  const taxInclusive = explicit ?? (taxAmount > 0 && matchesOurPrice)\n\n  if (!taxInclusive) return { taxInclusive, subtotal: net, discount: off, tax: taxAmount, total: charged }\n\n  const afterDiscount = net - off\n  const gross = afterDiscount > 0 ? round2(net * charged / afterDiscount) : round2(net + taxAmount)\n  return { taxInclusive, subtotal: gross, discount: round2(gross - charged), tax: taxAmount, total: charged }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport {\n  checkoutSummary,\n  currencyForBuyer,\n  discountIdForBuyer,\n  displayCurrencyFromPreview,\n  previewPayload\n} from \"../lib/pricing_currency\"\n\n//TODO: dont refresh paddle checkout when there are changes\n\nexport default class extends Controller {\n  static values = {\n    userEmail: String,\n    accountId: Number,\n    pricingConfig: Object,\n    locale: String,\n    currencyCode: String,\n    countryCode: String,\n    billingType: String\n  }\n\n  static targets = [\n    \"amountDisplay\",\n    \"amountDueDisplay\",\n    \"priceDisplay\",\n    \"planNameDisplay\",\n    \"totalDisplay\",\n    \"disclaimer\",\n    \"discountDisplay\",\n    \"subtotalDisplay\",\n    \"taxDisplay\",\n    \"priceBreakdown\",\n    \"loadingIndicator\"\n  ];\n\n  connect() {\n    if (window.Paddle === undefined) {\n      return\n    }\n\n    // Updated from PricePreview / checkout so the currency matches what Paddle charges.\n    this.currencyCode = null\n    this.countryCode = this.countryCodeValue || null\n    this.explicitDiscountId = null\n    this.appliedCurrency = null\n    this.syncingDiscount = false\n\n    Paddle.Update({\n      eventCallback: function({name, data}) {\n        const billingType = this.billingTypeValue || '30_days'\n\n        switch(name) {\n          case 'checkout.loaded':\n          case 'checkout.updated':\n            this.updateSummaryFromCheckout(data, billingType)\n            break\n          case 'checkout.customer.updated':\n            this.countryCode = data.customer.address?.country_code || this.countryCode\n            this.syncCheckoutDiscount()\n\n            if (data.totals) {\n              this.updateSummaryFromCheckout(data, billingType)\n            }\n            break\n          case 'checkout.discount.applied':\n            this.discountId = data.discount.id\n            if (data.totals) {\n              this.updateSummaryFromCheckout(data, billingType)\n            }\n            break\n          case 'checkout.discount.removed':\n            this.discountId = null\n            if (data.totals) {\n              this.updateSummaryFromCheckout(data, billingType)\n            }\n            break\n          case 'checkout.completed':\n            this.dispatch('checkoutCompleted', {\n              detail: {\n                data\n              }\n            })\n\n            this.dispatch('trackEvent', {\n              prefix: null,\n              detail: {\n                name: 'Checkout Completed',\n                properties: {\n                  plan_id: this.planId,\n                  billing_type: billingType,\n                  discount_id: this.discountId,\n                  total: data.totals.total\n                }\n              }\n            })\n\n            setTimeout(() => {\n              window.location.href = window.sessionStorage.getItem('returnToPage') || this.getCookie('returnToPage') || 'https://app.guestfavorites.com/'\n            }, 2000)\n            break\n        }\n      }.bind(this)\n    });\n\n    const urlParams = new URLSearchParams(window.location.search);\n    this.explicitDiscountId = urlParams.get('discountId') || null\n\n    if (urlParams.get('paddle-action') === 'pay') {\n      // Get currency code from URL if available\n      if (urlParams.get('currencyCode')) {\n        this.currencyCode = urlParams.get('currencyCode');\n      }\n\n      const event = new Event('click');\n      event.params = {\n        planId: urlParams.get('planId'),\n        billingType: urlParams.get('billingType'),\n        discountId: urlParams.get('discountId'),\n        currencyCode: this.currencyCode\n      };\n      this.openCheckout(event);\n    }\n  }\n\n  getPriceOptions(event) {\n    const { planId, billingType, countryCode, currencyCode } = event.params;\n    const discountId = this.resolveDiscountId(planId, billingType, event.params.discountId);\n    const items = [{\n      priceId: this.getPaddleProductId(planId, billingType),\n      quantity: 1\n    }]\n\n    // PricePreview reads the country from top-level `address`, not `customer`.\n    const country = countryCode || this.countryCode || this.countryCodeValue || null\n\n    return {\n      items,\n      discountId,\n      ...(country ? { address: { countryCode: country } } : {}),\n      currencyCode: currencyCode || this.currencyCode || this.currencyCodeValue || 'USD'\n    }\n  }\n\n  async setValues(event) {\n    await this.ensureBuyerLocation(event)\n    const { planId, billingType, currencyCode } = event.params;\n    const discountId = this.resolveDiscountId(planId, billingType, event.params.discountId);\n    this.discountId = discountId\n    const price = this.pricingConfigValue[planId][billingType];\n\n    // Eurozone buyers use EUR, Brazil BRL. Everyone else stays on USD.\n    let currentCurrency = currencyCode || this.currencyCode || this.currencyCodeValue || 'USD';\n\n    // Get price information from the pricing config\n    const priceAmount = price['prices'][currentCurrency] || price['prices']['USD'];\n\n    // Show loading indicator\n    $(this.loadingIndicatorTargets).removeClass('hidden');\n\n    // Fetch accurate pricing information from Paddle including tax and discount\n    try {\n      const priceOptions = await Paddle.PricePreview(this.getPriceOptions(event));\n      const lineItem = priceOptions.data.details.lineItems[0];\n      const totals = lineItem.totals;\n\n      // Keep the buyer's currency when Paddle echoes a country. A missing address\n      // must not wipe the country we already detected.\n      const previewCountry = priceOptions.data.address?.countryCode\n      if (previewCountry) this.countryCode = previewCountry\n      this.currencyCode = currencyForBuyer({\n        countryCode: this.countryCode,\n        currencyCode: priceOptions.data.currencyCode\n      })\n      if (!event.params.discountId) {\n        this.discountId = this.resolveDiscountId(planId, billingType, null)\n      }\n\n      // Same rendering as the checkout events, so the summary does not change\n      // when the checkout loads. Preview amounts are in cents.\n      const amount = (value) => value != null ? parseFloat(value) / 100 : 0\n      this.updateSummaryFromCheckout({\n        currency_code: priceOptions.data.currencyCode || this.currencyCode,\n        items: [{ price: { tax_mode: lineItem.price?.taxMode } }],\n        totals: {\n          subtotal: amount(totals.subtotal),\n          discount: amount(totals.discount),\n          tax: amount(totals.tax),\n          total: amount(totals.total)\n        }\n      }, billingType, planId)\n    } catch (error) {\n      console.error('Error getting price options:', error);\n      // Fallback to the configured price if the preview fails\n      this.updateSummaryFromCheckout({\n        currency_code: currentCurrency,\n        totals: { subtotal: priceAmount, discount: 0, tax: 0, total: priceAmount }\n      }, billingType, planId)\n    }\n  }\n\n  updateSummaryFromCheckout(data, billingType, planId = this.planId) {\n    if (!data?.totals) return\n\n    const price = this.pricingConfigValue[planId]?.[billingType]\n    const currencyCode = data.currency_code || this.currencyCode || this.currencyCodeValue || 'USD'\n    const totals = data.totals\n    const lineItem = data.items?.[0]\n    const summary = checkoutSummary({\n      subtotal: totals.subtotal,\n      discount: totals.discount,\n      tax: totals.tax,\n      total: totals.total,\n      taxMode: lineItem?.price?.tax_mode || lineItem?.price?.taxMode,\n      expectedTotals: [price?.prices?.[currencyCode], price?.original_prices?.[currencyCode]]\n    })\n    const taxInclusive = summary.taxInclusive\n    const totalAmount = summary.total\n    const taxAmount = summary.tax\n    const discountAmount = summary.discount\n    // One line item, so the plan line is the subtotal before the discount.\n    const subtotalShown = summary.subtotal\n    const lineItemAmount = summary.subtotal\n\n    $(this.planNameDisplayTargets).text(price?.name || lineItem?.product?.name || '')\n\n    let priceText = this.formatCurrency(lineItemAmount, currencyCode) + (price?.suffix || '')\n    if (currencyCode === 'USD') {\n      priceText += ` (${currencyCode})`\n    }\n    $(this.priceDisplayTargets).text(priceText)\n\n    const formattedTotal = this.formatCurrency(totalAmount, currencyCode)\n    $(this.subtotalDisplayTargets).text(this.formatCurrency(subtotalShown, currencyCode))\n    $(this.totalDisplayTargets).text(formattedTotal)\n\n    let amountDueText = formattedTotal\n    if (currencyCode === 'USD') {\n      amountDueText += ` (${currencyCode})`\n    }\n    $(this.amountDueDisplayTargets).text(amountDueText)\n\n    if (!taxInclusive && taxAmount > 0) {\n      $(this.taxDisplayTargets).text(this.formatCurrency(taxAmount, currencyCode))\n      $(this.taxDisplayTargets).parent().removeClass('hidden')\n    } else {\n      $(this.taxDisplayTargets).parent().addClass('hidden')\n    }\n\n    if (discountAmount > 0) {\n      $(this.discountDisplayTargets).text(`-${this.formatCurrency(discountAmount, currencyCode)}`).parent().removeClass('hidden')\n    } else {\n      $(this.discountDisplayTargets).parent().addClass('hidden')\n    }\n\n    $(this.disclaimerTargets).children().addClass('hidden')\n    $(this.disclaimerTargets).find(`#${billingType}-disclaimer`).removeClass('hidden')\n    $(this.loadingIndicatorTargets).addClass('hidden')\n  }\n\n  // Helper method to format currency\n  formatCurrency(amount, currencyCode = 'USD') {\n    return new Intl.NumberFormat('en-US', {\n      style: 'currency',\n      currency: currencyCode,\n      minimumFractionDigits: 2\n    }).format(amount);\n  }\n\n  async checkForActiveSubscription() {\n    const response = await fetch('/payments/check_subscription_status')\n    if (response.status === 200) {\n      return false\n    }\n    return true\n  }\n\n  goToCheckoutPage(event) {\n    event.preventDefault();\n\n    let { planId, billingType } = event.params;\n\n    // Use billingType from params if provided, otherwise fall back to value\n    if (!billingType && this.hasBillingTypeValue) {\n      billingType = this.billingTypeValue;\n    }\n\n    // Store current page URL for later use after checkout\n    window.sessionStorage.setItem('returnToPage', window.location.href);\n    this.setCookie('returnToPage', window.location.href, 7); // Store for 7 days\n\n    window.location.href = `/checkout?planId=${planId}&billingType=${billingType}&paddle-action=pay`\n  }\n\n  async toggleBillingType(event) {\n    // This method is no longer used since checkbox was removed\n    // Keeping for backward compatibility but it won't be called\n    event.params = {\n      billingType: this.billingTypeValue || '30_days',\n      planId: this.planId,\n      discountId: this.discountId,\n      countryCode: this.countryCode,\n      currencyCode: this.currencyCode || this.currencyCodeValue\n    }\n\n    await this.setValues(event)\n\n    this.openCheckout(event)\n  }\n\n  async openCheckout(event) {\n    event.preventDefault()\n\n    let { planId, billingType } = event.params;\n    if (event.params.discountId) this.explicitDiscountId = event.params.discountId\n\n    // billingType is now passed as a value, no checkbox to update\n\n    this.planId = planId\n\n    // setValues learns the buyer country, then picks the discount in its currency.\n    await this.setValues(event)\n    const discountId = this.discountId\n    this.appliedCurrency = this.currencyCode || 'USD'\n    this.lastDiscountSync = `${this.appliedCurrency}:${discountId || \"\"}`\n\n    this.dispatch('trackEvent', {\n      prefix: null,\n      detail: {\n        name: 'Checkout Opened',\n        properties: {\n          planId,\n          billingType\n        }\n      }\n    })\n\n    // if (await this.checkForActiveSubscription()) {\n    //   alert('You already have an active subscription')\n    //   return\n    // }\n\n    try {\n      const items = [{\n        priceId: this.getPaddleProductId(planId, billingType),\n        quantity: 1\n      }]\n\n      const paddleOptions = {\n        items,\n        customData: {\n          account_id: this.accountIdValue,\n          email: this.userEmailValue\n        },\n        // No address: when Paddle accepts a prefilled country it hides the\n        // Country field and the buyer can no longer change it.\n        customer: {\n          email: this.userEmailValue\n        },\n        currencyCode: this.appliedCurrency || this.currencyCode || 'USD',\n        theme: 'light',\n        settings: {\n          locale: this.localeValue,\n          displayMode: 'inline',\n          variant: 'one-page',\n          frameTarget: 'checkout-container',\n          frameInitialHeight: \"450\",\n          frameStyle: \"width: 100%; min-width: 312px; background-color: transparent; border: none;\",\n          showAddTaxId: true,\n          showAddDiscounts: !discountId\n        },\n        discountId\n      }\n\n      const checkout = await Paddle.Checkout.open(paddleOptions)\n    } catch (error) {\n      console.error('Error opening Paddle checkout:', error)\n    }\n  }\n\n  getPaddleProductId(planId, billingType) {\n    return this.pricingConfigValue[planId][billingType]['paddle_id']\n  }\n\n  resolveDiscountId(planId, billingType, explicitDiscountId) {\n    if (explicitDiscountId) return explicitDiscountId\n\n    const tier = this.pricingConfigValue?.[planId]?.[billingType]\n    if (!tier) return null\n\n    return discountIdForBuyer({\n      countryCode: this.countryCode || this.countryCodeValue,\n      currencyCode: this.currencyCode,\n      discountIds: { USD: tier.discount_id, EUR: tier.eur_discount_id, BRL: tier.brl_discount_id }\n    })\n  }\n\n  async ensureBuyerLocation(event) {\n    const hinted = event?.params?.countryCode || this.countryCode || this.countryCodeValue\n    if (hinted) {\n      this.countryCode = hinted\n      this.currencyCode = currencyForBuyer({ countryCode: hinted })\n      return\n    }\n\n    if (typeof Paddle?.PricePreview !== \"function\" || !event?.params?.planId) {\n      this.currencyCode = \"USD\"\n      return\n    }\n\n    try {\n      const priceId = this.getPaddleProductId(event.params.planId, event.params.billingType)\n      const preview = await Paddle.PricePreview({ items: [{ priceId, quantity: 1 }] })\n      const data = previewPayload(preview)\n      const country = data?.address?.countryCode || data?.address?.country_code\n      if (country) this.countryCode = country\n      this.currencyCode = displayCurrencyFromPreview(preview) || \"USD\"\n    } catch (error) {\n      this.currencyCode = \"USD\"\n    }\n  }\n\n  syncCheckoutDiscount() {\n    if (this.syncingDiscount || !this.planId || this.explicitDiscountId) return\n\n    const billingType = this.billingTypeValue || \"30_days\"\n    const nextCurrency = currencyForBuyer({\n      countryCode: this.countryCode,\n      currencyCode: this.currencyCode\n    })\n    this.currencyCode = nextCurrency\n    const nextDiscount = this.resolveDiscountId(this.planId, billingType, null)\n    const signature = `${nextCurrency}:${nextDiscount || \"\"}`\n    if (signature === this.lastDiscountSync) return\n\n    this.discountId = nextDiscount\n    this.appliedCurrency = nextCurrency\n    this.lastDiscountSync = signature\n    if (typeof Paddle?.Checkout?.updateCheckout !== \"function\") return\n\n    // Paddle picks the checkout currency from the buyer country; only the\n    // discount needs swapping. updateCheckout requires items.\n    this.syncingDiscount = true\n    try {\n      Paddle.Checkout.updateCheckout({\n        items: [{ priceId: this.getPaddleProductId(this.planId, billingType), quantity: 1 }],\n        discountId: nextDiscount || null\n      })\n    } finally {\n      this.syncingDiscount = false\n    }\n  }\n\n  // Cookie helper methods\n  setCookie(name, value, days) {\n    const expires = new Date();\n    expires.setTime(expires.getTime() + (days * 24 * 60 * 60 * 1000));\n    document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/;domain=${window.location.hostname.split('.').slice(-2).join('.')};SameSite=Lax`;\n  }\n\n  getCookie(name) {\n    const nameEQ = name + \"=\";\n    const ca = document.cookie.split(';');\n    for(let i = 0; i < ca.length; i++) {\n      let c = ca[i];\n      while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n    }\n    return null;\n  }\n\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"modal\"]\n\n  connect() {\n    this.scrollThreshold = document.documentElement.scrollHeight * 0.3;\n    window.addEventListener('scroll', this.handleScroll.bind(this))\n  }\n\n  disconnect() {\n    window.removeEventListener('scroll', this.handleScroll.bind(this))\n  }\n\n  handleScroll() {\n    if (!this.modalShown && window.scrollY >= this.scrollThreshold) {\n      this.modalShown = true;\n      this.showModal();\n    }\n  }\n\n  showModal() {\n    new HSOverlay(this.modalTarget).open();\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    pageType: String,\n    defaultPolygon: String,\n    defaultPolygonSlug: String,\n    defaultPolygonName: String\n  }\n\n  polygonClicked(event) {\n    let { polygonUuid, polygonSlug, polygonName } = event.detail\n\n    polygonUuid = polygonUuid || this.defaultPolygonValue\n\n    if (polygonUuid) {\n      // Track Start Link Clicked via a bubbling event consumed by amplitude controller\n      this.dispatch('trackEvent', {\n        prefix: null,\n        detail: {\n          name: 'Start Link Clicked',\n          properties: {\n            button_location: 'map_polygon',\n            page_type: this.pageTypeValue,\n            market_id: polygonUuid,\n            polygon_slug: polygonSlug,\n            polygon_name: polygonName\n          }\n        }\n      })\n\n      // Construct the URL for the child polygon's occupancy landing page\n      const childUrl = `/start?market_id=${polygonUuid}`\n\n      // Open in a new tab\n      window.open(childUrl)\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"userIdsContainer\", \"userIdRow\", \"userIdInput\", \"readOnlyView\", \"editMode\", \"detailsRow\", \"expandButton\", \"listingRow\"]\n\n  connect() {\n    // Add input event listeners to each user ID input for URL parsing\n    this.userIdInputTargets.forEach(input => {\n      input.addEventListener('blur', this.parseUrlInput.bind(this))\n    })\n\n    // Track the currently expanded listing\n    this.currentlyExpandedId = null\n  }\n\n  // Parse Airbnb URL to extract user ID when input loses focus\n  parseUrlInput(event) {\n    const input = event.target\n    const value = input.value.trim()\n\n    if (value.includes('airbnb.com/users/show/') || value.includes('airbnb.com/users/')) {\n      try {\n        // Extract the numeric ID from the URL using a more flexible regex pattern\n        // This will handle multiple formats like:\n        // - https://www.airbnb.com/users/show/74885919\n        // - http://airbnb.com/users/show/74885919\n        // - airbnb.com/users/show/74885919\n        // - www.airbnb.com/users/show/74885919?s=abc\n        const matches = value.match(/airbnb\\.com\\/users(?:\\/show)?\\/(\\d+)(?:[?#].*)?$/)\n        if (matches && matches[1]) {\n          const userId = matches[1]\n          input.value = userId\n          console.log(`URL parsed: Extracted user ID ${userId} from ${value}`)\n        }\n      } catch (error) {\n        console.error(\"Error parsing Airbnb URL:\", error)\n      }\n    }\n  }\n\n  toggleEditMode(event) {\n    event.preventDefault()\n\n    if (this.readOnlyViewTarget.classList.contains('hidden')) {\n      // Switch to read-only mode\n      this.readOnlyViewTarget.classList.remove('hidden')\n      this.editModeTarget.classList.add('hidden')\n    } else {\n      // Switch to edit mode\n      this.readOnlyViewTarget.classList.add('hidden')\n      this.editModeTarget.classList.remove('hidden')\n    }\n  }\n\n  addUserId(event) {\n    event.preventDefault()\n\n    // Clone the first user ID row as a template\n    const template = this.userIdRowTargets[0].cloneNode(true)\n\n    // Clear the input value in the cloned template\n    template.querySelector('input').value = \"\"\n\n    // Append the new row to the container\n    this.userIdsContainerTarget.appendChild(template)\n\n    // Add event listener to the new input\n    const newInput = template.querySelector('input')\n    newInput.addEventListener('blur', this.parseUrlInput.bind(this))\n  }\n\n  removeUserId(event) {\n    event.preventDefault()\n\n    // Don't remove if it's the last row\n    if (this.userIdRowTargets.length <= 1) {\n      // Just clear the input instead\n      event.target.closest('[data-portfolio-target=\"userIdRow\"]').querySelector('input').value = \"\"\n      return\n    }\n\n    // Remove the row containing the clicked button\n    event.target.closest('[data-portfolio-target=\"userIdRow\"]').remove()\n  }\n\n  saveConfiguration(event) {\n    event.preventDefault()\n\n    // Process all inputs to ensure URLs are parsed\n    this.userIdInputTargets.forEach(input => {\n      const event = { target: input }\n      this.parseUrlInput(event)\n    })\n\n    // Gather all user IDs from the inputs\n    const userIds = this.userIdInputTargets.map(input => input.value.trim()).filter(id => id !== \"\")\n\n    // Get the form element\n    const form = event.target.closest('form')\n    const url = form.action\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').content\n\n    // Disable the submit button to prevent multiple submissions\n    const submitButton = form.querySelector('input[type=\"submit\"]')\n    if (submitButton) {\n      submitButton.disabled = true\n      submitButton.value = \"Saving...\"\n    }\n\n    // Send the data to the server\n    fetch(url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'X-CSRF-Token': csrfToken\n      },\n      body: JSON.stringify({ airbnb_user_ids: userIds })\n    })\n    .then(response => response.json())\n    .then(data => {\n      if (data.success) {\n        // Show success message\n        this.showNotification('Configuration saved successfully!', 'success')\n\n        // Close the modal using Preline's API\n        HSOverlay.close(document.querySelector('#configuration-modal'))\n      } else {\n        // Handle errors\n        this.showNotification(`Error: ${data.errors.join(', ')}`, 'error')\n\n        // Re-enable the submit button\n        if (submitButton) {\n          submitButton.disabled = false\n          submitButton.value = \"Save Configuration\"\n        }\n      }\n    })\n    .catch(error => {\n      console.error(\"Error saving configuration:\", error)\n      this.showNotification('An error occurred while saving the configuration.', 'error')\n\n      // Re-enable the submit button\n      if (submitButton) {\n        submitButton.disabled = false\n        submitButton.value = \"Save Configuration\"\n      }\n    })\n  }\n\n  showNotification(message, type = 'success') {\n    // Create notification element\n    const notification = document.createElement('div')\n    notification.className = `fixed top-4 right-4 px-4 py-3 rounded-md shadow-md ${type === 'success' ? 'bg-green-500' : 'bg-red-500'} text-white z-50`\n    notification.textContent = message\n\n    // Append to body\n    document.body.appendChild(notification)\n\n    // Remove after 3 seconds\n    setTimeout(() => {\n      notification.classList.add('opacity-0', 'transition-opacity', 'duration-500')\n      setTimeout(() => {\n        notification.remove()\n      }, 500)\n    }, 3000)\n  }\n\n  toggleDetails(event) {\n    event.preventDefault()\n\n    const button = event.currentTarget\n    const listingId = button.dataset.listingId\n    const detailsRow = this.detailsRowTargets.find(row => row.dataset.listingId === listingId)\n    const listingRow = this.listingRowTargets.find(row => row.dataset.listingId === listingId)\n\n    if (detailsRow) {\n      // Check if we're expanding a new row\n      const isExpanding = detailsRow.classList.contains('hidden')\n\n      // If expanding a new row and another row is already expanded, collapse the current one first\n      if (isExpanding && this.currentlyExpandedId && this.currentlyExpandedId !== listingId) {\n        this.collapseRow(this.currentlyExpandedId)\n      }\n\n      // Toggle visibility of the clicked row\n      if (isExpanding) {\n        // Show details\n        detailsRow.classList.remove('hidden')\n        button.querySelector('.expand-icon').classList.add('hidden')\n        button.querySelector('.collapse-icon').classList.remove('hidden')\n        button.setAttribute('aria-expanded', 'true')\n        this.currentlyExpandedId = listingId\n\n        // Highlight the listing row\n        if (listingRow) {\n          listingRow.classList.add('bg-indigo-50', 'border-l-4', 'border-indigo-500', 'shadow-sm')\n          listingRow.classList.remove('hover:bg-gray-50')\n\n          // Scroll to make sure the expanded content is visible with the listing row at the top\n          setTimeout(() => {\n            // Get the position of the listing row relative to the viewport\n            const rect = listingRow.getBoundingClientRect()\n            const scrollTop = window.pageYOffset || document.documentElement.scrollTop\n\n            // Calculate the target scroll position (position of the element + current scroll - desired offset)\n            // Use a smaller offset on mobile devices\n            const offset = window.innerWidth < 768 ? 10 : 20\n            const targetScrollPosition = rect.top + scrollTop - offset\n\n            // Scroll to the target position\n            window.scrollTo({\n              top: targetScrollPosition,\n              behavior: 'smooth'\n            })\n          }, 100)\n        }\n\n        // Get the turbo frame\n        const frame = detailsRow.querySelector('turbo-frame')\n\n        // If the frame hasn't loaded yet, trigger the load and show loading state\n        if (frame && !frame.hasAttribute('complete')) {\n          // Add loading state to button\n          button.classList.add('animate-pulse')\n          button.querySelector('.collapse-icon').textContent = 'Loading...'\n\n          // Listen for turbo:frame-load event to remove loading state\n          frame.addEventListener('turbo:frame-load', () => {\n            button.classList.remove('animate-pulse')\n            button.querySelector('.collapse-icon').textContent = 'Hide Details'\n          }, { once: true })\n\n          frame.setAttribute('loading', 'eager') // Force immediate loading\n          frame.reload()\n        }\n      } else {\n        // Hide details\n        detailsRow.classList.add('hidden')\n        button.querySelector('.expand-icon').classList.remove('hidden')\n        button.querySelector('.collapse-icon').classList.add('hidden')\n        button.setAttribute('aria-expanded', 'false')\n        this.currentlyExpandedId = null\n\n        // Remove highlight from the listing row\n        if (listingRow) {\n          listingRow.classList.remove('bg-indigo-50', 'border-l-4', 'border-indigo-500', 'shadow-sm')\n          listingRow.classList.add('hover:bg-gray-50')\n        }\n      }\n    }\n  }\n\n  collapseRow(listingId) {\n    const detailsRow = this.detailsRowTargets.find(row => row.dataset.listingId === listingId)\n    const button = this.expandButtonTargets.find(btn => btn.dataset.listingId === listingId)\n    const listingRow = this.listingRowTargets.find(row => row.dataset.listingId === listingId)\n\n    if (detailsRow && button) {\n      detailsRow.classList.add('hidden')\n      button.querySelector('.expand-icon').classList.remove('hidden')\n      button.querySelector('.collapse-icon').classList.add('hidden')\n      button.setAttribute('aria-expanded', 'false')\n\n      // Remove highlight from the listing row\n      if (listingRow) {\n        listingRow.classList.remove('bg-indigo-50', 'border-l-4', 'border-indigo-500', 'shadow-sm')\n        listingRow.classList.add('hover:bg-gray-50')\n      }\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nconst plans = [\"free\", \"lite\", \"pro\"];\nexport default class extends Controller {\n  static targets = [\"switch\", \"annually\", \"monthly\"];\n\n  connect() {\n    this.updatePrices()\n    if (window.matchMedia(\"(max-width: 639px)\").matches) {\n      this.showPlanColumn(plans[0])\n    }\n  }\n\n  toggle() {\n    this.dispatch(\"toggleBillingType\", { detail: { billingType: this.switchTarget.checked ? 'yearly' : 'monthly' } });\n    this.dispatch(\"trackEvent\", {\n      prefix: null,\n      detail: {\n        name: \"Billing Type Changed\",\n        properties: {\n          billing_type: this.switchTarget.checked ? 'yearly' : 'monthly'\n        }\n      }\n    });\n    this.updatePrices()\n  }\n\n  updatePrices() {\n    if (!this.hasSwitchTarget) return;\n    const displayAnnually = this.switchTarget.checked;\n\n    this.annuallyTargets.forEach((annuallyTarget) => {\n      annuallyTarget.classList.toggle(\"hidden\", !displayAnnually);\n    })\n\n    this.monthlyTargets.forEach((monthlyTarget) => {\n      monthlyTarget.classList.toggle(\"hidden\", displayAnnually);\n    })\n\n    if (this.billingTypeTarget) {\n      this.billingTypeTarget.dataset.authBillingTypeParam = displayAnnually ? 'yearly' : 'monthly';\n    }\n\n    $(this.element).find(\"#access-until\").toggleClass(\"hidden\", !displayAnnually)\n  }\n\n  selectPlan(event) {\n    const plan = event.params?.plan\n    if (!plan) return\n\n    this.showPlanColumn(plan)\n  }\n\n  showPlanColumn(plan) {\n    plans.forEach((id) => {\n      $(`.pricing-${id}`).addClass(\"hidden\");\n      $(`#plan-${id}`).removeClass(\"ring-2 ring-offset-2 ring-[#1F6F54]\");\n    });\n\n    $(`#plan-${plan}`).addClass(\"ring-2 ring-offset-2 ring-[#1F6F54]\");\n    $(`.pricing-${plan}`).removeClass(\"hidden\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Simple controller to handle contextual title/subtitle for the pricing modal\nexport default class extends Controller {\n  static targets = [\"title\", \"subtitle\"]\n  static values = {\n    defaultTitle: String\n  }\n\n  connect() {\n    // Listen for context updates\n    document.addEventListener('pricing-modal:set-context', this.setContext.bind(this))\n    \n    // Reset when modal closes\n    const modal = this.element.closest('.hs-overlay')\n    if (modal) {\n      modal.addEventListener('close.hs.overlay', this.resetContext.bind(this))\n    }\n  }\n\n  disconnect() {\n    document.removeEventListener('pricing-modal:set-context', this.setContext.bind(this))\n  }\n\n  setContext(event) {\n    const { title, subtitle } = event.detail || {}\n    \n    if (title && this.hasTitleTarget) {\n      this.titleTarget.textContent = title\n    }\n    \n    if (subtitle && this.hasSubtitleTarget) {\n      this.subtitleTarget.textContent = subtitle\n      this.subtitleTarget.classList.remove('hidden')\n    }\n  }\n\n  resetContext() {\n    if (this.hasTitleTarget) {\n      this.titleTarget.textContent = this.defaultTitleValue\n    }\n    \n    if (this.hasSubtitleTarget) {\n      this.subtitleTarget.textContent = ''\n      this.subtitleTarget.classList.add('hidden')\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\n    \"option\", \"step1\", \"step2\", \"step3\",\n    \"exploreOption\", \"otherInput\", \"backButton\",\n    \"step3BackButton\", \"step3DoneButton\"\n  ]\n  static values = {\n    updateUrl: String,\n    intentSet: Boolean,\n    showExploreFollowUpFirst: Boolean\n  }\n\n  static STORAGE_KEY = 'gf_primary_intent'\n\n  connect() {\n    // Check localStorage first as a safeguard\n    const storedIntent = this.getStoredIntent()\n\n    // Show modal only if intent is not set in backend AND not in localStorage\n    if (!this.intentSetValue && !storedIntent) {\n      this.show()\n      if (this.showExploreFollowUpFirstValue) {\n        this.showStep2()\n      }\n    }\n  }\n\n  show() {\n    this.element.classList.remove('hidden')\n    document.body.style.overflow = 'hidden'\n  }\n\n  hide() {\n    this.element.classList.add('hidden')\n    document.body.style.overflow = 'auto'\n  }\n\n  getStoredIntent() {\n    try {\n      return localStorage.getItem(this.constructor.STORAGE_KEY)\n    } catch (e) {\n      // localStorage might be unavailable (private browsing, etc.)\n      console.warn('localStorage unavailable:', e)\n      return null\n    }\n  }\n\n  storeIntent(intent) {\n    try {\n      localStorage.setItem(this.constructor.STORAGE_KEY, intent)\n    } catch (e) {\n      console.warn('Failed to store intent in localStorage:', e)\n    }\n  }\n\n  async selectIntent(event) {\n    const button = event.currentTarget\n    const intent = button.dataset.intent\n\n    // Store in localStorage immediately as safeguard\n    this.storeIntent(intent)\n\n    // Track the intent as a user property in Amplitude\n    this.trackUserProperty(intent)\n\n    // Hide modal immediately for better UX\n    this.hide()\n\n    // Add loading state to button (visual feedback before hiding)\n    button.disabled = true\n    button.classList.add('opacity-75')\n\n    // Attempt to save to backend (fire and forget - localStorage is our safeguard)\n    try {\n      const csrfToken = document.querySelector('meta[name=\"csrf-token\"]')?.content\n\n      const response = await fetch(this.updateUrlValue, {\n        method: 'PATCH',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRF-Token': csrfToken,\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({ primary_intent: intent })\n      })\n\n      if (!response.ok) {\n        const data = await response.json()\n        console.error('Failed to save intent to backend:', data.error)\n        // Intent is still saved in localStorage, so user won't be prompted again\n      }\n    } catch (error) {\n      console.error('Error saving intent to backend:', error)\n      // Intent is still saved in localStorage, so user won't be prompted again\n    }\n  }\n\n  trackUserProperty(intent, exploreMarketsIntent = null, exploreMarketsIntentOther = null) {\n    // Map intent keys to user-friendly values for Amplitude\n    const intentLabels = {\n      'buy_property': 'Buy an Airbnb property',\n      'list_property': 'List my property on Airbnb',\n      'explore_markets': 'Explore Airbnb markets'\n    }\n\n    // Dispatch to amplitude controller to set user property\n    this.dispatch('trackUserProperty', {\n      prefix: null,\n      detail: {\n        name: 'user_primary_intent',\n        value: intent\n      }\n    })\n\n    // Also set a more readable version\n    this.dispatch('trackUserProperty', {\n      prefix: null,\n      detail: {\n        name: 'user_primary_intent_label',\n        value: intentLabels[intent] || intent\n      }\n    })\n\n    if (exploreMarketsIntent) {\n      this.dispatch('trackUserProperty', {\n        prefix: null,\n        detail: {\n          name: 'user_explore_markets_intent',\n          value: exploreMarketsIntent\n        }\n      })\n    }\n\n    if (exploreMarketsIntentOther) {\n      this.dispatch('trackUserProperty', {\n        prefix: null,\n        detail: {\n          name: 'user_explore_markets_intent_other',\n          value: exploreMarketsIntentOther\n        }\n      })\n    }\n  }\n\n  showStep2() {\n    if (this.hasStep1Target) this.step1Target.classList.add('hidden')\n    if (this.hasStep2Target) this.step2Target.classList.remove('hidden')\n    if (this.hasStep3Target) this.step3Target.classList.add('hidden')\n  }\n\n  showStep3() {\n    if (this.hasStep1Target) this.step1Target.classList.add('hidden')\n    if (this.hasStep2Target) this.step2Target.classList.add('hidden')\n    if (this.hasStep3Target) {\n      this.step3Target.classList.remove('hidden')\n      if (this.hasOtherInputTarget) {\n        this.otherInputTarget.value = ''\n        this.otherInputTarget.focus()\n      }\n    }\n  }\n\n  hideStep2() {\n    if (this.hasStep1Target) this.step1Target.classList.remove('hidden')\n    if (this.hasStep2Target) this.step2Target.classList.add('hidden')\n    if (this.hasStep3Target) this.step3Target.classList.add('hidden')\n    if (this.hasOtherInputTarget) this.otherInputTarget.value = ''\n  }\n\n  showExploreMarketsFollowUp(event) {\n    event.preventDefault()\n    this.showStep2()\n  }\n\n  async submitExploreMarketsIntent(event) {\n    const button = event.currentTarget\n    const intent = button.dataset.exploreIntent\n    button.disabled = true\n    button.classList.add('opacity-75')\n    await this.submitExploreMarketsPayload(intent, null)\n  }\n\n  showOtherStep(event) {\n    event.preventDefault()\n    this.showStep3()\n  }\n\n  backToStep1() {\n    this.hideStep2()\n  }\n\n  backToStep2() {\n    if (this.hasStep2Target) this.step2Target.classList.remove('hidden')\n    if (this.hasStep3Target) this.step3Target.classList.add('hidden')\n    if (this.hasOtherInputTarget) this.otherInputTarget.value = ''\n  }\n\n  updateOtherDoneButton() {\n    if (!this.hasStep3DoneButtonTarget || !this.hasOtherInputTarget) return\n    const hasText = this.otherInputTarget.value.trim().length > 0\n    this.step3DoneButtonTarget.disabled = !hasText\n  }\n\n  submitOtherOnEnter(event) {\n    if (event.key === 'Enter') {\n      event.preventDefault()\n      this.submitOther(event)\n    }\n  }\n\n  async submitOther(event) {\n    event.preventDefault()\n    const text = this.hasOtherInputTarget ? this.otherInputTarget.value.trim() : ''\n    if (!text) return\n    if (this.hasStep3DoneButtonTarget) {\n      this.step3DoneButtonTarget.disabled = true\n      this.step3DoneButtonTarget.classList.add('opacity-75')\n    }\n    await this.submitExploreMarketsPayload('other', text)\n  }\n\n  async submitExploreMarketsPayload(exploreIntent, otherText = null) {\n    const payload = {\n      primary_intent: 'explore_markets',\n      explore_markets_intent: exploreIntent\n    }\n    if (exploreIntent === 'other' && otherText) {\n      payload.explore_markets_intent_other = otherText\n    }\n\n    this.storeIntent('explore_markets')\n    this.trackUserProperty('explore_markets', exploreIntent, exploreIntent === 'other' ? otherText : null)\n\n    try {\n      const csrfToken = document.querySelector('meta[name=\"csrf-token\"]')?.content\n      const response = await fetch(this.updateUrlValue, {\n        method: 'PATCH',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRF-Token': csrfToken,\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify(payload)\n      })\n\n      if (response.ok) {\n        this.hide()\n      } else {\n        const data = await response.json()\n        console.error('Failed to save explore markets intent:', data.error)\n        this.exploreOptionTargets?.forEach((el) => {\n          el.disabled = false\n          el.classList.remove('opacity-75')\n        })\n        if (this.hasStep3DoneButtonTarget) {\n          this.step3DoneButtonTarget.disabled = false\n          this.step3DoneButtonTarget.classList.remove('opacity-75')\n        }\n      }\n    } catch (error) {\n      console.error('Error saving explore markets intent:', error)\n      this.exploreOptionTargets?.forEach((el) => {\n        el.disabled = false\n        el.classList.remove('opacity-75')\n      })\n      if (this.hasStep3DoneButtonTarget) {\n        this.step3DoneButtonTarget.disabled = false\n        this.step3DoneButtonTarget.classList.remove('opacity-75')\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    labels: Array,\n    percentages: Array\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initializeChart() {\n    const canvas = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvas.getContext('2d')\n\n    // Ensure percentages are numbers\n    const percentages = this.percentagesValue.map(val => parseFloat(val))\n\n    let width, height, gradient\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, '#1F6F54')\n        gradient.addColorStop(1, '#8FCBB0')\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: this.labelsValue,\n        datasets: [{\n          type: 'bar',\n          data: percentages,\n          barThickness: 8,\n          borderRadius: 4,\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const { ctx, chartArea } = chart\n\n            if (!chartArea) {\n              return\n            }\n            return getGradient(ctx, chartArea)\n          }\n        }]\n      },\n      options: {\n        indexAxis: 'y',\n        maintainAspectRatio: false,\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            callbacks: {\n              label: function(context) {\n                return context.parsed.x.toFixed(1) + '%'\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            display: true,\n            grid: {\n              display: false\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%'\n              }\n            }\n          },\n          y: {\n            grid: {\n              display: false\n            }\n          }\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    labels: Array,\n    baseData: Array,\n    detailedRatings: Array\n  }\n\n  connect() {\n    this.chart = null\n    this.initializeChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  initializeChart() {\n    const canvas = this.hasCanvasTarget ? this.canvasTarget : this.element\n    const ctx = canvas.getContext('2d')\n\n    // Stacked 4.x segments: same primary as other stars \u2192 progressively lighter\n    const colors = ['#1F6F54', '#3D8A6E', '#5FA88A', '#8FCBB0', '#B5DEC9', '#D6EEE3']\n\n    // Create main dataset - ensure percentages are numbers\n    const datasets = [\n      {\n        label: 'Main',\n        data: this.baseDataValue.map(val => parseFloat(val)),\n        barThickness: 16,\n        borderRadius: 4,\n        backgroundColor: '#1F6F54'\n      }\n    ]\n\n    // Add detailed rating datasets (for 4.x star ratings)\n    this.detailedRatingsValue.forEach((ratingData, index) => {\n      const data = []\n      // The detailed ratings stack on the second label (index 1, which is the 4-star rating)\n      data[1] = parseFloat(ratingData.percentage)\n\n      datasets.push({\n        label: ratingData.rating.toString(),\n        data: data,\n        barThickness: 16,\n        borderRadius: 4,\n        backgroundColor: colors[Math.min(index + 1, colors.length - 1)]\n      })\n    })\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: {\n        labels: this.labelsValue,\n        datasets: datasets\n      },\n      options: {\n        indexAxis: 'y',\n        maintainAspectRatio: false,\n        plugins: {\n          legend: { display: false },\n          tooltip: {\n            callbacks: {\n              title: function([context]) {\n                if (context.label.startsWith('4')) {\n                  const stars = context.label.split(' ')[1]\n                  return context.datasetIndex === 0\n                    ? context.label\n                    : `${context.dataset.label} ${stars}`\n                } else {\n                  return context.label\n                }\n              },\n              label: function(context) {\n                return context.formattedValue + '%'\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            stacked: true,\n            grid: {\n              display: false\n            },\n            ticks: {\n              callback: function(value) {\n                return value + '%'\n              }\n            }\n          },\n          y: {\n            stacked: true,\n            grid: {\n              display: false\n            }\n          }\n        }\n      }\n    })\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\nimport AutocompleteController from \"controllers/autocomplete_controller\"\nimport { mergeRecentSearches } from \"../lib/merge_recent_searches\"\nimport { formatAutocompleteSuggestion } from \"../lib/autocomplete_display\"\n\nexport default class extends Controller {\n  static targets = [\"container\", \"empty\", \"clearButton\", \"calculatorPayload\"]\n  static values = {\n    calculator: { type: Array, default: [] }\n  }\n\n  connect() {\n    this.displayRecentSearches()\n\n    this.boundRefresh = this.refresh.bind(this)\n    window.addEventListener(\"recentSearchesUpdated\", this.boundRefresh)\n  }\n\n  disconnect() {\n    window.removeEventListener(\"recentSearchesUpdated\", this.boundRefresh)\n  }\n\n  calculatorItems() {\n    if (this.hasCalculatorPayloadTarget) {\n      try {\n        const parsed = JSON.parse(this.calculatorPayloadTarget.textContent)\n        if (Array.isArray(parsed)) return parsed\n      } catch {\n        // fall through\n      }\n    }\n\n    const value = this.calculatorValue\n    if (Array.isArray(value)) return value\n    if (typeof value === \"string\" && value.length > 0) {\n      try {\n        const parsed = JSON.parse(value)\n        return Array.isArray(parsed) ? parsed : []\n      } catch {\n        return []\n      }\n    }\n    return []\n  }\n\n  displayRecentSearches() {\n    const insights = AutocompleteController.getRecentActivity()\n    const calculator = this.calculatorItems()\n    const recentSearches = mergeRecentSearches({\n      insights,\n      calculator,\n      limit: 5\n    })\n\n    if (recentSearches.length === 0) {\n      if (this.hasEmptyTarget) {\n        this.emptyTarget.classList.remove(\"hidden\")\n      }\n      if (this.hasContainerTarget) {\n        this.containerTarget.classList.add(\"hidden\")\n      }\n      if (this.hasClearButtonTarget) {\n        this.clearButtonTarget.classList.add(\"hidden\")\n      }\n      return\n    }\n\n    if (this.hasEmptyTarget) {\n      this.emptyTarget.classList.add(\"hidden\")\n    }\n    if (this.hasClearButtonTarget) {\n      this.clearButtonTarget.classList.toggle(\"hidden\", insights.length === 0)\n    }\n    if (this.hasContainerTarget) {\n      this.containerTarget.classList.remove(\"hidden\")\n      this.containerTarget.innerHTML = \"\"\n\n      recentSearches.forEach((search, index) => {\n        const itemHtml = this.createSearchItemHtml(search, index === recentSearches.length - 1)\n        this.containerTarget.insertAdjacentHTML(\"beforeend\", itemHtml)\n      })\n    }\n  }\n\n  createSearchItemHtml(search, isLast) {\n    const borderClass = isLast ? \"\" : \"border-b border-gray-100\"\n    const rowClass = `flex w-full min-w-0 items-center justify-between overflow-hidden py-2.5 px-4 rounded-lg hover:bg-gray-50 transition-colors ${borderClass}`\n\n    if (search.type === \"calculator\") {\n      return `\n        <a href=\"${search.url}\" class=\"${rowClass}\" data-turbo=\"false\">\n          <div class=\"flex items-center flex-1 min-w-0\">\n            <div class=\"flex-shrink-0 w-7 h-7 bg-[#E4F0EA] rounded-lg flex items-center justify-center mr-2.5\">\n              <span class=\"iconify mdi--calculator text-primary w-3.5 h-3.5\"></span>\n            </div>\n            <div class=\"flex-1 min-w-0\">\n              <div class=\"text-sm font-medium text-gray-900 truncate\">${this.escapeHtml(search.name)}</div>\n              ${search.subtitle ? `<div class=\"text-xs text-gray-500 truncate\">${this.escapeHtml(search.subtitle)}</div>` : \"\"}\n            </div>\n          </div>\n          <span class=\"iconify mdi--chevron-right text-slate-400 flex-shrink-0 w-4 h-4\"></span>\n        </a>\n      `\n    }\n\n    const { title, subtitle } = formatAutocompleteSuggestion(search, null, { preferNativeWhenNoQuery: true })\n    const locationName = title\n\n    const icon = this.getPolygonTypeIcon(search.t)\n    const currentHost = window.location.host\n    let targetHost\n    if (currentHost.includes(\".\")) {\n      targetHost = currentHost.replace(/^[^.]*\\./, \"app.\")\n    } else {\n      targetHost = `app.${currentHost}`\n    }\n    const protocol = window.location.protocol\n    const targetUrl = `${protocol}//${targetHost}/insights/${search.slug}`\n\n    return `\n      <a href=\"${targetUrl}\" class=\"${rowClass}\">\n        <div class=\"flex items-center flex-1 min-w-0\">\n          <div class=\"flex-shrink-0 w-7 h-7 bg-[#E4F0EA] rounded-lg flex items-center justify-center mr-2.5\">\n            <span class=\"iconify ${icon} text-primary w-3.5 h-3.5\"></span>\n          </div>\n          <div class=\"flex-1 min-w-0\">\n            <div class=\"text-sm font-medium text-gray-900 truncate\">${this.escapeHtml(locationName)}</div>\n            ${subtitle ? `<div class=\"text-xs text-gray-500 truncate\">${this.escapeHtml(subtitle)}</div>` : \"\"}\n          </div>\n        </div>\n        <span class=\"iconify mdi--chevron-right text-slate-400 flex-shrink-0 w-4 h-4\"></span>\n      </a>\n    `\n  }\n\n  getPolygonTypeIcon(type) {\n    const icons = {\n      n: \"mdi--home-city-outline\",\n      l: \"mdi--map-marker-outline\",\n      ca: \"mdi--map-outline\",\n      r: \"mdi--earth\"\n    }\n    return icons[type] || \"mdi--map-marker-outline\"\n  }\n\n  escapeHtml(text) {\n    const div = document.createElement(\"div\")\n    div.textContent = text || \"\"\n    return div.innerHTML\n  }\n\n  refresh() {\n    this.displayRecentSearches()\n  }\n\n  clearAll(event) {\n    event.preventDefault()\n\n    if (confirm(\"Clear all recent searches?\")) {\n      AutocompleteController.clearRecentActivity()\n      this.displayRecentSearches()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    buckets: Array,\n    listingRevenue: Number,\n    color: String,\n    currencySymbol: String\n  }\n\n  connect() {\n    this.initChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n    }\n  }\n\n  initChart() {\n    const ctx = this.element.getContext('2d')\n\n    // Format bucket data for Chart.js\n    const buckets = this.bucketsValue\n    const data = []\n\n    // Create data points with x value as bucket center\n    buckets.forEach(bucket => {\n      data.push({\n        x: (bucket[0] + bucket[1]) / 2,\n        y: bucket[2],\n        min: bucket[0],\n        max: bucket[1]\n      })\n    })\n\n    const bucketSize = buckets[1][0] - buckets[0][0]\n\n    // Find which bucket contains our listing\n    const listingRevenue = this.listingRevenueValue\n\n    let highlightColors = Array(buckets.length).fill(this.colorValue + '80') // Default transparency\n\n    // Find which bucket this listing belongs to\n    const listingBucketIndex = buckets.findIndex(bucket =>\n      listingRevenue >= bucket[0] && listingRevenue < bucket[1]\n    )\n\n    // Highlight the bucket containing the current listing\n    if (listingBucketIndex >= 0) {\n      highlightColors[listingBucketIndex] = this.colorValue\n    }\n\n    const currencySymbol = this.currencySymbolValue\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: {\n        datasets: [{\n          label: 'Number of Listings',\n          data: data,\n          backgroundColor: highlightColors,\n          borderColor: this.colorValue,\n          borderWidth: 1,\n          barPercentage: 1,\n          categoryPercentage: 1,\n          borderRadius: 5\n        }]\n      },\n      options: {\n        responsive: true,\n        maintainAspectRatio: false,\n        interaction: {\n          intersect: false,\n          mode: 'index',\n        },\n        scales: {\n          y: {\n            beginAtZero: true,\n            title: {\n              display: true,\n              text: 'Number of Listings'\n            },\n            ticks: {\n              precision: 0 // Only show whole numbers\n            }\n          },\n          x: {\n            type: 'linear',\n            offset: false,\n            grid: {\n              offset: false\n            },\n            title: {\n              display: true,\n              text: 'Revenue Range'\n            },\n            ticks: {\n              stepSize: bucketSize\n            }\n          }\n        },\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            callbacks: {\n              title: function(tooltipItems) {\n                const item = tooltipItems[0]\n                const datapoint = item.dataset.data[item.dataIndex]\n                return `Revenue: ${currencySymbol}${datapoint.min} - ${currencySymbol}${datapoint.max}`\n              },\n              label: function(context) {\n                return `Listings: ${context.raw.y}`\n              },\n              afterLabel: function(context) {\n                const bucketIndex = context.dataIndex\n                return listingBucketIndex === bucketIndex ?\n                  `Your listing: ${currencySymbol}${listingRevenue}` : ''\n              }\n            }\n          }\n        }\n      }\n    })\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nString.prototype.capitalize = function() {\n  return this.replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n};\n\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    chartDataSeries: Object, // Object with multiple series { top_performers: [[date, value]], strong_performers: [[date, value]], ... }\n    locale: String,\n    today: Number,\n    currencyCode: { type: String, default: 'USD' },\n    selectedTier: { type: String, default: 'market_average' },\n    sortByCalendarMonth: { type: Boolean, default: false },\n    tooltipMonthOnly: { type: Boolean, default: false },\n    accentTheme: { type: String, default: 'blue' }\n  }\n\n  static accentClasses = {\n    blue: {\n      active: ['bg-[#E4F0EA]', 'border-[#1F6F54]', 'text-[#0C1A14]', 'shadow-sm'],\n      inactive: ['bg-gray-50', 'border-gray-200', 'text-gray-500', 'shadow-sm', 'hover:shadow-md']\n    },\n    teal: {\n      active: ['bg-secondary-light', 'border-slate-200', 'text-secondary-dark', 'shadow-sm'],\n      inactive: ['bg-gray-50', 'border-gray-200', 'text-gray-500', 'shadow-sm', 'hover:shadow-md']\n    }\n  }\n\n  static chartAccents = {\n    blue: { start: '#1F6F54', end: '#8FCBB0', border: '#1F6F54', future: 'rgba(31, 111, 84, 0.3)' },\n    teal: { start: '#0d9488', end: '#2dd4bf', border: '#14b8a6', future: 'rgba(45, 212, 191, 0.3)' }\n  }\n\n  connect() {\n    this.chart = null\n    this.chartDataSeries = this.buildChartDataSeries()\n    // Calculate global min/max across all tiers for fixed scale\n    this.calculateGlobalScale()\n    this.initializeChart()\n  }\n\n  buildChartDataSeries() {\n    const series = {}\n    Object.entries(this.chartDataSeriesValue).forEach(([key, data]) => {\n      series[key] = this.sortChartDataByCalendarMonth(data)\n    })\n    return series\n  }\n\n  sortChartDataByCalendarMonth(data) {\n    if (!this.sortByCalendarMonthValue || !Array.isArray(data)) return data\n    return [...data].sort((a, b) => {\n      return new Date(a[0] + 'T00:00:00Z').getUTCMonth() - new Date(b[0] + 'T00:00:00Z').getUTCMonth()\n    })\n  }\n\n  formatTooltipTitle(dateString) {\n    const date = new Date(dateString + 'T00:00:00Z')\n    const options = { month: 'long', timeZone: 'UTC' }\n    if (!this.tooltipMonthOnlyValue) {\n      options.year = 'numeric'\n    }\n    return date.toLocaleString(this.localeValue, options)\n  }\n\n  calculateGlobalScale() {\n    let globalMax = -Infinity\n\n    // Iterate through all tier data series to find the maximum value\n    Object.values(this.chartDataSeries).forEach(seriesData => {\n      if (Array.isArray(seriesData)) {\n        seriesData.forEach(([date, value]) => {\n          if (typeof value === 'number') {\n            globalMax = Math.max(globalMax, value)\n          }\n        })\n      }\n    })\n\n    // Always start at 0, add padding (5%) to the max\n    this.globalMin = 0\n    this.globalMax = globalMax * 1.05\n  }\n\n  selectTier(event) {\n    const tier = event.currentTarget.dataset.tier\n    if (tier === this.selectedTierValue) return\n\n    this.selectedTierValue = tier\n    this.updateActiveButton()\n    this.updateChart()\n  }\n\n  updateActiveButton() {\n    const theme = this.constructor.accentClasses[this.accentThemeValue] || this.constructor.accentClasses.blue\n    const buttons = this.element.querySelectorAll('.revenue-tier-selector')\n    buttons.forEach(button => {\n      const buttonTier = button.dataset.tier\n      button.classList.remove(...theme.active, ...theme.inactive)\n      if (buttonTier === this.selectedTierValue) {\n        button.classList.add(...theme.active)\n      } else {\n        button.classList.add(...theme.inactive)\n      }\n    })\n  }\n\n  updateChart() {\n    const chartData = this.chartDataSeries[this.selectedTierValue]\n    if (!chartData || !this.chart) return\n\n    // Update chart data\n    this.chart.data.labels = chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(this.localeValue, { month: 'short', timeZone: 'UTC' }).capitalize())\n    this.chart.data.datasets[0].data = chartData.map(([, value]) => value)\n\n    // Update tooltip title\n    this.chart.options.plugins.tooltip.callbacks.title = (tooltipItems) => {\n      const dataIndex = tooltipItems[0].dataIndex\n      const dateString = chartData[dataIndex][0]\n      return this.formatTooltipTitle(dateString)\n    }\n\n    this.chart.update()\n  }\n\n  initializeChart() {\n    const canvasElement = this.canvasTarget\n    const ctx = canvasElement.getContext('2d')\n    const chartData = this.chartDataSeries[this.selectedTierValue] || this.chartDataSeries['market_average']\n    const dates = chartData.map(([date]) => new Date(date))\n    const todayValue = this.todayValue\n    const localeValue = this.localeValue\n    const currencyCodeValue = this.currencyCodeValue\n\n    let width, height, gradient\n\n    const accent = this.constructor.chartAccents[this.accentThemeValue] || this.constructor.chartAccents.blue\n\n    const getGradient = (ctx, chartArea) => {\n      const chartWidth = chartArea.right - chartArea.left\n      const chartHeight = chartArea.bottom - chartArea.top\n      if (!gradient || width !== chartWidth || height !== chartHeight) {\n        width = chartWidth\n        height = chartHeight\n        gradient = ctx.createLinearGradient(chartArea.left, 0, chartArea.right, 0)\n        gradient.addColorStop(0, accent.start)\n        gradient.addColorStop(1, accent.end)\n      }\n      return gradient\n    }\n\n    this.chart = new Chart(ctx, {\n      data: {\n        labels: chartData.map(([date]) => new Date(date + 'T00:00:00Z').toLocaleString(localeValue, { month: 'short', timeZone: 'UTC' }).capitalize()),\n        datasets: [{\n          type: 'bar',\n          data: chartData.map(([, value]) => value),\n          backgroundColor: function(context) {\n            const chart = context.chart\n            const {ctx, chartArea} = chart\n            if (!chartArea) {\n              return accent.end\n            }\n            const gradient = getGradient(ctx, chartArea)\n            const currentDate = dates[context.dataIndex]\n            const now = new Date(todayValue)\n            if (currentDate >= now) {\n              return accent.future\n            }\n            return gradient\n          },\n          borderColor: accent.border,\n          borderWidth: 0,\n          borderRadius: 4,\n          borderSkipped: false\n        }]\n      },\n      options: {\n        maintainAspectRatio: false,\n        plugins: {\n          legend: {\n            display: false\n          },\n          tooltip: {\n            callbacks: {\n              title: (tooltipItems) => {\n                const dataIndex = tooltipItems[0].dataIndex\n                const dateString = chartData[dataIndex][0]\n                return this.formatTooltipTitle(dateString)\n              },\n              label: (context) => {\n                const value = context.raw\n                return new Intl.NumberFormat(localeValue, {\n                  style: 'currency',\n                  currency: currencyCodeValue,\n                  minimumFractionDigits: 0,\n                  maximumFractionDigits: 0\n                }).format(value)\n              }\n            }\n          }\n        },\n        scales: {\n          x: {\n            grid: {\n              display: false\n            }\n          },\n          y: {\n            min: this.globalMin,\n            max: this.globalMax,\n            grid: {\n              drawOnChartArea: true\n            },\n            ticks: {\n              callback: (value) => {\n                return new Intl.NumberFormat(localeValue, {\n                  style: 'currency',\n                  currency: currencyCodeValue,\n                  minimumFractionDigits: 0,\n                  maximumFractionDigits: 0,\n                  notation: 'compact'\n                }).format(value)\n              }\n            }\n          }\n        }\n      }\n    })\n\n    // Set initial active button\n    this.updateActiveButton()\n  }\n}\n", " import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    threshold: { type: Number, default: 0.1 },\n    rootMargin: { type: String, default: \"0px 0px -20px 0px\" }\n  }\n\n  connect() {\n    this.observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            entry.target.classList.add(\"sr-visible\")\n            this.observer.unobserve(entry.target)\n          }\n        })\n      },\n      { threshold: this.thresholdValue, rootMargin: this.rootMarginValue }\n    )\n\n    this.revealElements = this.element.querySelectorAll(\"[data-sr]\")\n    this.revealElements.forEach((el) => this.observer.observe(el))\n  }\n\n  disconnect() {\n    if (this.observer) this.observer.disconnect()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"submitButton\", \"emailInput\", \"passwordInput\", \"passwordFeedback\", \"errorContainer\", \"turnstile\"]\n  static values = { turnstileSiteKey: String }\n\n  connect() {\n    this.turnstileReady = !this.turnstileSiteKeyValue\n    this.turnstileWidgetId = null\n    this.validateForm()\n    if (this.turnstileSiteKeyValue) {\n      this.loadTurnstile()\n    }\n  }\n\n  loadTurnstile() {\n    if (window.turnstile) {\n      this.renderTurnstile()\n      return\n    }\n\n    if (document.querySelector('script[data-turnstile-api]')) {\n      document.addEventListener(\"turnstile-api-loaded\", () => this.renderTurnstile(), { once: true })\n      return\n    }\n\n    const script = document.createElement(\"script\")\n    script.src = \"https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit\"\n    script.async = true\n    script.defer = true\n    script.dataset.turnstileApi = \"true\"\n    script.onload = () => {\n      document.dispatchEvent(new CustomEvent(\"turnstile-api-loaded\"))\n      this.renderTurnstile()\n    }\n    document.head.appendChild(script)\n  }\n\n  renderTurnstile() {\n    if (!this.hasTurnstileTarget || this.turnstileWidgetId != null || !window.turnstile) return\n\n    this.turnstileWidgetId = window.turnstile.render(this.turnstileTarget, {\n      sitekey: this.turnstileSiteKeyValue,\n      callback: () => {\n        this.turnstileReady = true\n        this.validateForm()\n      },\n      \"expired-callback\": () => {\n        this.turnstileReady = false\n        this.validateForm()\n      },\n      \"error-callback\": () => {\n        this.turnstileReady = false\n        this.validateForm()\n      }\n    })\n  }\n\n  validatePassword() {\n    this.validateForm()\n  }\n\n  validateForm() {\n    if (!this.hasPasswordInputTarget || !this.hasSubmitButtonTarget) return\n\n    const currentLength = this.passwordInputTarget.value.length\n    const isPasswordValid = this.passwordInputTarget.validity.valid\n    const formValid = this.element.checkValidity()\n    const turnstileOk = this.turnstileReady\n    this.submitButtonTarget.disabled = !(formValid && turnstileOk)\n\n    if (!this.hasPasswordFeedbackTarget) return\n\n    if (currentLength === 0) {\n      this.passwordFeedbackTarget.textContent = \"\"\n      this.passwordFeedbackTarget.classList.remove(\"text-red-600\", \"text-green-600\")\n      return\n    }\n\n    const template = isPasswordValid\n      ? this.passwordFeedbackTarget.dataset.validTemplate\n      : this.passwordFeedbackTarget.dataset.invalidTemplate\n\n    this.passwordFeedbackTarget.textContent = template.replace(\"%{current}\", currentLength)\n    this.passwordFeedbackTarget.classList.toggle(\"text-red-600\", !isPasswordValid)\n    this.passwordFeedbackTarget.classList.toggle(\"text-green-600\", isPasswordValid)\n  }\n\n  submitOnEnter(event) {\n    if (event.key !== \"Enter\") return\n\n    event.preventDefault()\n    this.validateForm()\n\n    if (this.element.checkValidity()) {\n      this.element.requestSubmit()\n      return\n    }\n\n    this.element.reportValidity()\n  }\n\n  disableButton(event) {\n    this.validateForm()\n\n    if (!this.element.checkValidity() || !this.turnstileReady) {\n      event.preventDefault()\n      if (!this.element.checkValidity()) {\n        this.element.reportValidity()\n      }\n      return\n    }\n\n    // Disable the submit button to prevent multiple submissions\n    if (this.hasSubmitButtonTarget) {\n      this.submitButtonTarget.disabled = true\n\n      // Store original content\n      this.originalContent = this.submitButtonTarget.innerHTML\n\n      // Add loading spinner\n      this.submitButtonTarget.innerHTML = `\n        <svg class=\"animate-spin h-5 w-5 mr-2\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n        </svg>\n        Creating account...\n      `\n    }\n  }\n\n  handleSubmitEnd(event) {\n    if (event.detail.success) return\n    if (!this.hasSubmitButtonTarget) return\n\n    this.submitButtonTarget.disabled = false\n    if (this.originalContent) {\n      this.submitButtonTarget.innerHTML = this.originalContent\n    }\n    this.validateForm()\n  }\n\n  clearError() {\n    if (this.hasErrorContainerTarget && this.errorContainerTarget.textContent.trim().length > 0) {\n      this.errorContainerTarget.innerHTML = \"\"\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"header\", \"row\"]\n\n  connect() {\n    this.sortColumn = this.element.dataset.sortableTableDefaultSortValue || \"name\"\n    this.sortDirection = this.element.dataset.sortableTableDefaultDirectionValue || \"asc\"\n    this.updateHeaderIndicators()\n    this.sortRows()\n  }\n\n  sort(event) {\n    const column = event.currentTarget.dataset.sortKey\n    if (!column) return\n\n    if (this.sortColumn === column) {\n      this.sortDirection = this.sortDirection === \"asc\" ? \"desc\" : \"asc\"\n    } else {\n      this.sortColumn = column\n      this.sortDirection = column === \"name\" || column === \"continent\" ? \"asc\" : \"desc\"\n    }\n\n    this.sortRows()\n    this.updateHeaderIndicators()\n  }\n\n  sortRows() {\n    if (!this.hasRowTarget) return\n\n    const column = this.sortColumn\n    const direction = this.sortDirection === \"asc\" ? 1 : -1\n    const datasetKey = this.datasetKeyFor(column)\n    const tbody = this.rowTargets[0].parentNode\n\n    const rows = Array.from(this.rowTargets).sort((left, right) => {\n      const leftValue = left.dataset[datasetKey]\n      const rightValue = right.dataset[datasetKey]\n      const missingComparison = this.compareMissing(leftValue, rightValue)\n\n      if (missingComparison !== 0) return missingComparison\n\n      return this.compareValues(leftValue, rightValue, column) * direction\n    })\n\n    rows.forEach((row) => tbody.appendChild(row))\n  }\n\n  compareMissing(leftValue, rightValue) {\n    const leftMissing = this.isMissing(leftValue)\n    const rightMissing = this.isMissing(rightValue)\n\n    if (leftMissing && rightMissing) return 0\n    if (leftMissing) return 1\n    if (rightMissing) return -1\n\n    return 0\n  }\n\n  compareValues(leftValue, rightValue, column) {\n    if (column === \"name\" || Number.isNaN(Number(leftValue)) || Number.isNaN(Number(rightValue))) {\n      return leftValue.localeCompare(rightValue, undefined, { sensitivity: \"base\" })\n    }\n\n    return Number(leftValue) - Number(rightValue)\n  }\n\n  isMissing(value) {\n    return value === undefined || value === \"\"\n  }\n\n  datasetKeyFor(column) {\n    const suffix = column.replace(/_([a-z])/g, (_, char) => char.toUpperCase())\n    return `sort${suffix.charAt(0).toUpperCase()}${suffix.slice(1)}`\n  }\n\n  updateHeaderIndicators() {\n    this.headerTargets.forEach((header) => {\n      const isActive = header.dataset.sortKey === this.sortColumn\n      const icon = header.querySelector(\"[data-sort-icon]\")\n\n      header.classList.toggle(\"text-stone-600\", isActive)\n      header.classList.toggle(\"text-stone-400\", !isActive)\n\n      if (!icon) return\n\n      icon.classList.remove(\"mdi--unfold-more-horizontal\", \"mdi--arrow-up\", \"mdi--arrow-down\")\n      icon.classList.toggle(\"opacity-100\", isActive)\n      icon.classList.toggle(\"opacity-40\", !isActive)\n      icon.classList.add(this.iconForColumn(isActive))\n    })\n  }\n\n  iconForColumn(isActive) {\n    if (!isActive) return \"mdi--unfold-more-horizontal\"\n\n    return this.sortDirection === \"asc\" ? \"mdi--arrow-up\" : \"mdi--arrow-down\"\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    activeSection: String\n  }\n\n  static targets = [\"tab\"]\n\n  connect() {\n    // Prefer the URL section over server-rendered nav state after filter turbo streams\n    if (!this.syncTabFromUrl()) {\n      this.setInitialActiveTab()\n    }\n\n    // Intercept clicks on tab links to update the URL and tab state\n    this.boundHandleClick = this.handleClick.bind(this)\n    this.element.addEventListener('click', this.boundHandleClick, true)\n\n    // Scroll active tab into view (for mobile navigation)\n    // Use a small delay to ensure DOM is fully rendered\n    setTimeout(() => {\n      this.scrollActiveTabIntoView()\n    }, 150)\n\n    // Listen for turbo frame loads to scroll active tab when navigation updates\n    this.boundHandleFrameLoad = this.handleFrameLoad.bind(this)\n    document.addEventListener('turbo:frame-load', this.boundHandleFrameLoad)\n\n    // Listen for programmatic tab switch events\n    this.boundHandleTabSwitch = this.handleTabSwitch.bind(this)\n    window.addEventListener('story:switchTab', this.boundHandleTabSwitch)\n\n    // Listen for URL sync events (from popstate handler)\n    this.boundHandleSyncFromUrl = this.handleSyncFromUrl.bind(this)\n    window.addEventListener('story:syncFromUrl', this.boundHandleSyncFromUrl)\n  }\n\n  disconnect() {\n    this.element.removeEventListener('click', this.boundHandleClick, true)\n    if (this.boundHandleFrameLoad) {\n      document.removeEventListener('turbo:frame-load', this.boundHandleFrameLoad)\n    }\n    if (this.boundHandleTabSwitch) {\n      window.removeEventListener('story:switchTab', this.boundHandleTabSwitch)\n    }\n    if (this.boundHandleSyncFromUrl) {\n      window.removeEventListener('story:syncFromUrl', this.boundHandleSyncFromUrl)\n    }\n  }\n\n  setInitialActiveTab() {\n    // Find the active tab based on aria-selected or active class\n    const activeTab = this.tabTargets.find(tab =>\n      tab.getAttribute('aria-selected') === 'true' ||\n      tab.classList.contains('active')\n    )\n\n    if (activeTab) {\n      this.activateTab(activeTab)\n    } else {\n      console.warn('[story-tabs] No active tab found on initial load')\n    }\n  }\n\n  activateTab(tabElement) {\n    // Get the panel ID from the tab's aria-controls or data-turbo-frame\n    const panelId = tabElement.getAttribute('aria-controls') ||\n                    tabElement.getAttribute('data-turbo-frame')\n\n    if (!panelId) {\n      console.warn('[story-tabs] No panel ID found for tab:', tabElement.id)\n      return\n    }\n\n    // Get all panel IDs from tabs\n    const allPanelIds = this.tabTargets.map(tab =>\n      tab.getAttribute('aria-controls') || tab.getAttribute('data-turbo-frame')\n    ).filter(Boolean)\n\n    // Hide all panels (add hidden class)\n    allPanelIds.forEach(id => {\n      const panel = document.getElementById(id)\n      if (panel) {\n        panel.classList.add('hidden')\n        panel.classList.remove('active')\n      }\n    })\n\n    // Show the active panel (remove hidden class)\n    // The panel IS the turbo-frame element\n    const activePanel = document.getElementById(panelId)\n    if (activePanel) {\n      activePanel.classList.remove('hidden')\n      activePanel.classList.add('active')\n\n      // Load the frame content if needed\n      if (activePanel.tagName === 'TURBO-FRAME') {\n        // Check if frame has content (not just loading spinner)\n        const hasRealContent = activePanel.querySelector('section:not(.animate-spin)') ||\n                              activePanel.innerHTML.trim().length > 200 // Has substantial content\n\n        if (!hasRealContent) {\n          // Frame needs to load - get URL from the corresponding tab link\n          const tabLink = this.tabTargets.find(tab => {\n            const tabPanelId = tab.getAttribute('aria-controls')\n            return tabPanelId === panelId\n          })\n\n          if (tabLink && tabLink.href && tabLink.href !== '#' && tabLink.href !== '# ') {\n            // Set src to trigger frame load (Turbo will load it when frame becomes visible)\n            activePanel.src = tabLink.href\n          }\n        }\n      }\n    } else {\n      console.warn('[story-tabs] Panel not found:', panelId)\n    }\n\n    // Check if this is a mobile tab (by checking if ID contains '-mobile')\n    const isMobileTab = tabElement.id && tabElement.id.includes('-mobile')\n\n    // Deactivate all tabs\n    this.tabTargets.forEach(tab => {\n      tab.setAttribute('aria-selected', 'false')\n      const isTabMobile = tab.id && tab.id.includes('-mobile')\n\n      if (isTabMobile) {\n        tab.classList.remove('active', 'text-primary', 'border-primary')\n        tab.classList.add('text-slate-600', 'border-transparent')\n      } else {\n        tab.classList.remove('active', 'bg-blue-50', 'text-blue-600', 'font-semibold')\n        tab.classList.add('text-slate-600')\n        tab.style.backgroundColor = ''\n        tab.style.color = ''\n\n        const icon = tab.querySelector('.iconify')\n        if (icon) {\n          icon.classList.remove('text-blue-600')\n          icon.style.color = ''\n        }\n      }\n    })\n\n    // Activate the selected tab\n    tabElement.setAttribute('aria-selected', 'true')\n    if (isMobileTab) {\n      tabElement.classList.add('active', 'text-primary', 'border-primary')\n      tabElement.classList.remove('text-slate-600', 'border-transparent')\n\n      this.scrollTabIntoView(tabElement)\n    } else {\n      tabElement.classList.add('active', 'font-semibold')\n      tabElement.classList.remove('text-slate-600')\n      tabElement.style.backgroundColor = '#E4F0EA'\n      tabElement.style.color = '#1F6F54'\n\n      const icon = tabElement.querySelector('.iconify')\n      if (icon) {\n        icon.style.color = '#1F6F54'\n      }\n    }\n\n    // Handle map resize for market-overview\n    this.handleTabChanged(panelId)\n  }\n\n  handleClick(event) {\n    // Find the closest tab link\n    const link = event.target.closest('a[role=\"tab\"]')\n    // Use getAttribute so hash-only hrefs (\"#\") are skipped \u2014 link.href is a full URL\n    const href = link?.getAttribute('href')\n    if (!link || !href || href === '#' || href === '# ') {\n      return\n    }\n\n    // Ensure the clicked link is within this controller's element\n    if (!this.element.contains(link)) {\n      return\n    }\n\n    // Prevent default navigation - we'll handle it ourselves\n    event.preventDefault()\n    event.stopPropagation()\n\n    // Get the panel ID from the link\n    const panelId = link.getAttribute('aria-controls')\n    if (!panelId) {\n      console.warn('[story-tabs] No panel ID found for tab:', link.id)\n      return\n    }\n\n    // Activate the tab visually\n    this.activateTab(link)\n\n    // Update URL using the link's href (which already has the correct path)\n    try {\n      const linkUrl = new URL(link.href, window.location.origin)\n\n      // Update the browser URL without navigation\n      window.history.pushState({}, '', linkUrl.toString())\n\n      // Track tab change event\n      this.dispatch('trackEvent', {\n        prefix: null,\n        detail: {\n          name: 'Insights Tab Changed',\n          properties: {\n            section: panelId\n          }\n        }\n      })\n\n      // The activateTab method will handle loading the frame content\n      // We just need to ensure the URL is updated, which we did above\n    } catch (e) {\n      console.warn('[story-tabs] Error updating URL:', e)\n    }\n  }\n\n  handleTabChanged(panelId) {\n    // Dispatch event when market-overview tab is shown for map resize\n    if (panelId === 'market-overview') {\n      const marketOverviewFrame = document.getElementById('market-overview')\n\n      if (marketOverviewFrame) {\n        const triggerResize = () => {\n          // Dispatch custom event for map resize\n          this.dispatch('marketOverviewShown', { detail: { sectionId: 'market-overview' } })\n        }\n\n        // If frame is already loaded, trigger immediately\n        if (marketOverviewFrame.complete || marketOverviewFrame.classList.contains('active')) {\n          // Wait a bit to ensure tab transition is complete\n          setTimeout(triggerResize, 100)\n        } else {\n          // Wait for frame to load\n          marketOverviewFrame.addEventListener('turbo:frame-load', triggerResize, { once: true })\n        }\n      } else {\n        console.warn('[story-tabs] Market overview frame not found')\n      }\n    }\n  }\n\n  scrollTabIntoView(tabElement) {\n    // Find the scrollable container (parent with overflow-x-auto)\n    const scrollContainer = tabElement.closest('.overflow-x-auto')\n    if (!scrollContainer) {\n      return\n    }\n\n    // Calculate scroll position to center the tab\n    const containerRect = scrollContainer.getBoundingClientRect()\n    const tabRect = tabElement.getBoundingClientRect()\n    const containerScrollLeft = scrollContainer.scrollLeft\n    const containerWidth = containerRect.width\n    const tabLeft = tabRect.left - containerRect.left + containerScrollLeft\n    const tabWidth = tabRect.width\n    const tabCenter = tabLeft + tabWidth / 2\n    const scrollTarget = tabCenter - containerWidth / 2\n\n    // Smooth scroll to center the tab\n    scrollContainer.scrollTo({\n      left: scrollTarget,\n      behavior: 'smooth'\n    })\n  }\n\n  scrollActiveTabIntoView() {\n    // Find the active mobile tab\n    const activeMobileTab = this.tabTargets.find(tab => {\n      const isMobile = tab.id && tab.id.includes('-mobile')\n      const isActive = tab.getAttribute('aria-selected') === 'true' || tab.classList.contains('active')\n      return isMobile && isActive\n    })\n\n    if (activeMobileTab) {\n      this.scrollTabIntoView(activeMobileTab)\n    }\n  }\n\n  handleFrameLoad(event) {\n    // Check if the loaded frame is the mobile navigation frame\n    const mobileNavFrame = document.getElementById('story-nav-mobile')\n    if (mobileNavFrame && event.target === mobileNavFrame) {\n      // Navigation was updated, scroll active tab into view\n      setTimeout(() => {\n        this.scrollActiveTabIntoView()\n      }, 50)\n    }\n  }\n\n  handleTabSwitch(event) {\n    const { sectionId } = event.detail\n    if (!sectionId) {\n      console.warn('[story-tabs] No sectionId provided in switchTab event')\n      return\n    }\n\n    // Find the tab that corresponds to this section ID\n    // Tabs have data-turbo-frame attribute that matches the section ID\n    const targetTab = this.tabTargets.find(tab => {\n      const frameId = tab.getAttribute('data-turbo-frame') || tab.getAttribute('aria-controls')\n      return frameId === sectionId\n    })\n\n    if (targetTab) {\n      // Activate the tab (this will handle visual state and URL update)\n      this.activateTab(targetTab)\n\n      // If it's a link, we should also trigger navigation\n      if (targetTab.tagName === 'A' && targetTab.href && targetTab.href !== '#' && targetTab.href !== '# ') {\n        // Use Turbo to navigate to the tab's URL\n        Turbo.visit(targetTab.href)\n      }\n    } else {\n      console.warn('[story-tabs] Tab not found for section:', sectionId)\n    }\n  }\n\n  handleSyncFromUrl() {\n    this.syncTabFromUrl()\n  }\n\n  syncTabFromUrl() {\n    const pathParts = window.location.pathname.split('/').filter(Boolean)\n    const insightsIndex = pathParts.indexOf('insights')\n\n    if (insightsIndex === -1) {\n      return false\n    }\n\n    // Valid URL sections mapped to panel IDs\n    const urlSectionToPanelId = {\n      'overview': 'market-overview',\n      'listings': 'listings',\n      'occupancy_analysis': 'occupancy-demand',\n      'pricing_revenue': 'pricing-revenue',\n      'supply_demand': 'supply-demand',\n      'submarkets': 'submarkets',\n      'top_listings': 'top-listings',\n      'related_markets': 'related-markets'\n    }\n\n    const isCustomPolygon = pathParts[insightsIndex + 1] === 'custom'\n    const urlSection = isCustomPolygon && pathParts.length >= insightsIndex + 4\n      ? pathParts[insightsIndex + 3]\n      : pathParts[pathParts.length - 1]\n    const panelId = urlSectionToPanelId[urlSection]\n\n    if (!panelId) {\n      return false\n    }\n\n    const targetTab = this.tabTargets.find(tab => {\n      const frameId = tab.getAttribute('data-turbo-frame') || tab.getAttribute('aria-controls')\n      return frameId === panelId\n    })\n\n    if (targetTab) {\n      this.activateTab(targetTab)\n      return true\n    }\n\n    return false\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"buttonTemplate\"]\n  static values = {\n    selectedLocalityId: String\n  }\n\n  connect() {\n    if (this.selectedLocalityIdValue) {\n      this.showButton({ currentTarget: $(`[data-locality-id=\"${this.selectedLocalityIdValue}\"]`).addClass('bg-indigo-50').get(0) })\n    }\n  }\n\n  showButton(event) {\n    if (this.lastButton) {\n      this.lastButton.remove()\n      this.lastTarget.find('.lock-cell').show()\n    }\n\n    this.lastTarget = $(event.currentTarget)\n\n    const button = this.buttonTemplateTarget.firstElementChild.cloneNode(true)\n    button.classList.remove('hidden')\n\n    // Hide all locks\n    this.lastTarget.find('.lock-cell').hide()\n\n    this.lastButton = $('<td colspan=\"3\" class=\"button-cell\">').addClass($(event.currentTarget).find('td').first().attr('class')).append(button)\n\n    this.lastTarget.append(this.lastButton)\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"userId\", \"userEmail\"]\n\n  connect() {\n    // Listen for Preline modal open event\n    document.addEventListener('click', (event) => {\n      if (event.target.matches('[data-hs-overlay=\"#subscription-modal\"]') && event.target.dataset.userId) {\n        this.populateModal(event.target.dataset.userId, event.target.dataset.userEmail)\n      }\n    })\n  }\n\n  populateModal(userId, userEmail) {\n    this.userIdTarget.value = userId;\n    this.userEmailTarget.textContent = userEmail;\n  }\n}\n", "// Eager Stimulus controllers for the core application.js pack.\n// Map/heatmap controllers live in maps.js \u2014 do not import them here.\n// Admin controllers live in admin.js \u2014 do not import them here.\n// Calculator controllers live in calculator.js \u2014 do not import them here.\n//\n// When adding a controller: register it here unless it imports leaflet / h3 / wicket map deps.\n// Those belong in maps.js (see app/javascript/maps.js).\n\nimport { application } from \"./application\"\n\nimport AdrTierController from \"./adr_tier_controller\"\napplication.register(\"adr-tier\", AdrTierController)\n\nimport AmenitiesCategoriesController from \"./amenities_categories_controller\"\napplication.register(\"amenities-categories\", AmenitiesCategoriesController)\n\nimport AmenitiesChartController from \"./amenities_chart_controller\"\napplication.register(\"amenities-chart\", AmenitiesChartController)\n\nimport AmenitiesDropdownController from \"./amenities_dropdown_controller\"\napplication.register(\"amenities-dropdown\", AmenitiesDropdownController)\n\nimport AmplitudeController from \"./amplitude_controller\"\napplication.register(\"amplitude\", AmplitudeController)\n\nimport ApplicationController from \"./application_controller\"\napplication.register(\"application\", ApplicationController)\n\nimport AuthController from \"./auth_controller\"\napplication.register(\"auth\", AuthController)\n\nimport AutocompleteController from \"./autocomplete_controller\"\napplication.register(\"autocomplete\", AutocompleteController)\n\nimport BedroomCountChartController from \"./bedroom_count_chart_controller\"\napplication.register(\"bedroom-count-chart\", BedroomCountChartController)\n\nimport CalendarController from \"./calendar_controller\"\napplication.register(\"calendar\", CalendarController)\n\nimport ChartController from \"./chart_controller\"\napplication.register(\"chart\", ChartController)\n\nimport CompSetListRowController from \"./comp_set_list_row_controller\"\napplication.register(\"comp-set-list-row\", CompSetListRowController)\n\nimport ContactFormController from \"./contact_form_controller\"\napplication.register(\"contact-form\", ContactFormController)\n\nimport DailyOccupancyChartController from \"./daily_occupancy_chart_controller\"\napplication.register(\"daily-occupancy-chart\", DailyOccupancyChartController)\n\nimport DesktopFiltersController from \"./desktop_filters_controller\"\napplication.register(\"desktop-filters\", DesktopFiltersController)\n\nimport DetectionSimulatorController from \"./detection_simulator_controller\"\napplication.register(\"detection-simulator\", DetectionSimulatorController)\n\nimport DropdownController from \"./dropdown_controller\"\napplication.register(\"dropdown\", DropdownController)\n\nimport EmailExistsModalController from \"./email_exists_modal_controller\"\napplication.register(\"email-exists-modal\", EmailExistsModalController)\n\nimport FiltersContainerController from \"./filters_container_controller\"\napplication.register(\"filters-container\", FiltersContainerController)\n\nimport FiltersExplainerController from \"./filters_explainer_controller\"\napplication.register(\"filters-explainer\", FiltersExplainerController)\n\nimport GalleryController from \"./gallery_controller\"\napplication.register(\"gallery\", GalleryController)\n\nimport GoogleAdsController from \"./google_ads_controller\"\napplication.register(\"google-ads\", GoogleAdsController)\n\nimport GoogleOneTapController from \"./google_one_tap_controller\"\napplication.register(\"google-one-tap\", GoogleOneTapController)\n\nimport GooglePlacesController from \"./google_places_controller\"\napplication.register(\"google-places\", GooglePlacesController)\n\nimport ImageFallbackController from \"./image_fallback_controller\"\napplication.register(\"image-fallback\", ImageFallbackController)\n\nimport InsightsCityTrackingController from \"./insights_city_tracking_controller\"\napplication.register(\"insights-city-tracking\", InsightsCityTrackingController)\n\nimport InsightsCsvExportController from \"./insights_csv_export_controller\"\napplication.register(\"insights-csv-export\", InsightsCsvExportController)\n\nimport LandingPageTrackingController from \"./landing_page_tracking_controller\"\napplication.register(\"landing-page-tracking\", LandingPageTrackingController)\n\nimport LandingPageEngagementController from \"./landing_page_engagement_controller\"\napplication.register(\"landing-page-engagement\", LandingPageEngagementController)\n\nimport CountryFilterController from \"./country_filter_controller\"\napplication.register(\"country-filter\", CountryFilterController)\n\nimport LinkInterceptorController from \"./link_interceptor_controller\"\napplication.register(\"link-interceptor\", LinkInterceptorController)\n\nimport ListingsChartController from \"./listings_chart_controller\"\napplication.register(\"listings-chart\", ListingsChartController)\n\nimport MapExpandController from \"./map_expand_controller\"\napplication.register(\"map-expand\", MapExpandController)\n\nimport MapModalController from \"./map_modal_controller\"\napplication.register(\"map-modal\", MapModalController)\n\nimport ModalTrackingController from \"./modal_tracking_controller\"\napplication.register(\"modal-tracking\", ModalTrackingController)\n\nimport MapSwitcherController from \"./map_switcher_controller\"\napplication.register(\"map-switcher\", MapSwitcherController)\n\nimport MetricChartSwitcherController from \"./metric_chart_switcher_controller\"\napplication.register(\"metric-chart-switcher\", MetricChartSwitcherController)\n\nimport MinimalChartController from \"./minimal_chart_controller\"\napplication.register(\"minimal-chart\", MinimalChartController)\n\nimport ChartYearSelectorController from \"./chart_year_selector_controller\"\napplication.register(\"chart-year-selector\", ChartYearSelectorController)\n\nimport MobileCompSetFiltersController from \"./mobile_comp_set_filters_controller\"\napplication.register(\"mobile-comp-set-filters\", MobileCompSetFiltersController)\n\nimport MobileFiltersController from \"./mobile_filters_controller\"\napplication.register(\"mobile-filters\", MobileFiltersController)\n\nimport PaddleController from \"./paddle_controller\"\napplication.register(\"paddle\", PaddleController)\n\nimport PaywallController from \"./paywall_controller\"\napplication.register(\"paywall\", PaywallController)\n\nimport PolygonNavigationController from \"./polygon_navigation_controller\"\napplication.register(\"polygon-navigation\", PolygonNavigationController)\n\nimport PortfolioController from \"./portfolio_controller\"\napplication.register(\"portfolio\", PortfolioController)\n\nimport PricingController from \"./pricing_controller\"\napplication.register(\"pricing\", PricingController)\n\nimport PricingModalController from \"./pricing_modal_controller\"\napplication.register(\"pricing-modal\", PricingModalController)\n\nimport PrimaryIntentController from \"./primary_intent_controller\"\napplication.register(\"primary-intent\", PrimaryIntentController)\n\nimport RatingCountDistributionChartController from \"./rating_count_distribution_chart_controller\"\napplication.register(\"rating-count-distribution-chart\", RatingCountDistributionChartController)\n\nimport RatingDistributionChartController from \"./rating_distribution_chart_controller\"\napplication.register(\"rating-distribution-chart\", RatingDistributionChartController)\n\nimport RecentSearchesController from \"./recent_searches_controller\"\napplication.register(\"recent-searches\", RecentSearchesController)\n\nimport RevenueHistogramController from \"./revenue_histogram_controller\"\napplication.register(\"revenue-histogram\", RevenueHistogramController)\n\nimport RevenueTierController from \"./revenue_tier_controller\"\napplication.register(\"revenue-tier\", RevenueTierController)\n\nimport ScrollRevealController from \"./scroll_reveal_controller\"\napplication.register(\"scroll-reveal\", ScrollRevealController)\n\nimport SignupFormController from \"./signup_form_controller\"\napplication.register(\"signup-form\", SignupFormController)\n\nimport SortableTableController from \"./sortable_table_controller\"\napplication.register(\"sortable-table\", SortableTableController)\n\nimport StoryTabsController from \"./story_tabs_controller\"\napplication.register(\"story-tabs\", StoryTabsController)\n\nimport SubmarketsController from \"./submarkets_controller\"\napplication.register(\"submarkets\", SubmarketsController)\n\nimport SubscriptionModalController from \"./subscription_modal_controller\"\napplication.register(\"subscription-modal\", SubscriptionModalController)\n", "/*!\nTurbo 8.0.23\nCopyright \u00A9 2026 37signals LLC\n */\nconst FrameLoadingStyle = {\n  eager: \"eager\",\n  lazy: \"lazy\"\n};\n\n/**\n * Contains a fragment of HTML which is updated based on navigation within\n * it (e.g. via links or form submissions).\n *\n * @customElement turbo-frame\n * @example\n *   <turbo-frame id=\"messages\">\n *     <a href=\"/messages/expanded\">\n *       Show all expanded messages in this frame.\n *     </a>\n *\n *     <form action=\"/messages\">\n *       Show response from this form within this frame.\n *     </form>\n *   </turbo-frame>\n */\nclass FrameElement extends HTMLElement {\n  static delegateConstructor = undefined\n\n  loaded = Promise.resolve()\n\n  static get observedAttributes() {\n    return [\"disabled\", \"loading\", \"src\"]\n  }\n\n  constructor() {\n    super();\n    this.delegate = new FrameElement.delegateConstructor(this);\n  }\n\n  connectedCallback() {\n    this.delegate.connect();\n  }\n\n  disconnectedCallback() {\n    this.delegate.disconnect();\n  }\n\n  reload() {\n    return this.delegate.sourceURLReloaded()\n  }\n\n  attributeChangedCallback(name) {\n    if (name == \"loading\") {\n      this.delegate.loadingStyleChanged();\n    } else if (name == \"src\") {\n      this.delegate.sourceURLChanged();\n    } else if (name == \"disabled\") {\n      this.delegate.disabledChanged();\n    }\n  }\n\n  /**\n   * Gets the URL to lazily load source HTML from\n   */\n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  /**\n   * Sets the URL to lazily load source HTML from\n   */\n  set src(value) {\n    if (value) {\n      this.setAttribute(\"src\", value);\n    } else {\n      this.removeAttribute(\"src\");\n    }\n  }\n\n  /**\n   * Gets the refresh mode for the frame.\n   */\n  get refresh() {\n    return this.getAttribute(\"refresh\")\n  }\n\n  /**\n   * Sets the refresh mode for the frame.\n   */\n  set refresh(value) {\n    if (value) {\n      this.setAttribute(\"refresh\", value);\n    } else {\n      this.removeAttribute(\"refresh\");\n    }\n  }\n\n  get shouldReloadWithMorph() {\n    return this.src && this.refresh === \"morph\"\n  }\n\n  /**\n   * Determines if the element is loading\n   */\n  get loading() {\n    return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\")\n  }\n\n  /**\n   * Sets the value of if the element is loading\n   */\n  set loading(value) {\n    if (value) {\n      this.setAttribute(\"loading\", value);\n    } else {\n      this.removeAttribute(\"loading\");\n    }\n  }\n\n  /**\n   * Gets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  get disabled() {\n    return this.hasAttribute(\"disabled\")\n  }\n\n  /**\n   * Sets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  set disabled(value) {\n    if (value) {\n      this.setAttribute(\"disabled\", \"\");\n    } else {\n      this.removeAttribute(\"disabled\");\n    }\n  }\n\n  /**\n   * Gets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  get autoscroll() {\n    return this.hasAttribute(\"autoscroll\")\n  }\n\n  /**\n   * Sets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  set autoscroll(value) {\n    if (value) {\n      this.setAttribute(\"autoscroll\", \"\");\n    } else {\n      this.removeAttribute(\"autoscroll\");\n    }\n  }\n\n  /**\n   * Determines if the element has finished loading\n   */\n  get complete() {\n    return !this.delegate.isLoading\n  }\n\n  /**\n   * Gets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isActive() {\n    return this.ownerDocument === document && !this.isPreview\n  }\n\n  /**\n   * Sets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isPreview() {\n    return this.ownerDocument?.documentElement?.hasAttribute(\"data-turbo-preview\")\n  }\n}\n\nfunction frameLoadingStyleFromString(style) {\n  switch (style.toLowerCase()) {\n    case \"lazy\":\n      return FrameLoadingStyle.lazy\n    default:\n      return FrameLoadingStyle.eager\n  }\n}\n\nconst drive = {\n  enabled: true,\n  progressBarDelay: 500,\n  unvisitableExtensions: new Set(\n    [\n      \".7z\", \".aac\", \".apk\", \".avi\", \".bmp\", \".bz2\", \".css\", \".csv\", \".deb\", \".dmg\", \".doc\",\n      \".docx\", \".exe\", \".gif\", \".gz\", \".heic\", \".heif\", \".ico\", \".iso\", \".jpeg\", \".jpg\",\n      \".js\", \".json\", \".m4a\", \".mkv\", \".mov\", \".mp3\", \".mp4\", \".mpeg\", \".mpg\", \".msi\",\n      \".ogg\", \".ogv\", \".pdf\", \".pkg\", \".png\", \".ppt\", \".pptx\", \".rar\", \".rtf\",\n      \".svg\", \".tar\", \".tif\", \".tiff\", \".txt\", \".wav\", \".webm\", \".webp\", \".wma\", \".wmv\",\n      \".xls\", \".xlsx\", \".xml\", \".zip\"\n    ]\n  )\n};\n\nfunction activateScriptElement(element) {\n  if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n    return element\n  } else {\n    const createdScriptElement = document.createElement(\"script\");\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      createdScriptElement.nonce = cspNonce;\n    }\n    createdScriptElement.textContent = element.textContent;\n    createdScriptElement.async = false;\n    copyElementAttributes(createdScriptElement, element);\n    return createdScriptElement\n  }\n}\n\nfunction copyElementAttributes(destinationElement, sourceElement) {\n  for (const { name, value } of sourceElement.attributes) {\n    destinationElement.setAttribute(name, value);\n  }\n}\n\nfunction createDocumentFragment(html) {\n  const template = document.createElement(\"template\");\n  template.innerHTML = html;\n  return template.content\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n  const event = new CustomEvent(eventName, {\n    cancelable,\n    bubbles: true,\n    composed: true,\n    detail\n  });\n\n  if (target && target.isConnected) {\n    target.dispatchEvent(event);\n  } else {\n    document.documentElement.dispatchEvent(event);\n  }\n\n  return event\n}\n\nfunction cancelEvent(event) {\n  event.preventDefault();\n  event.stopImmediatePropagation();\n}\n\nfunction nextRepaint() {\n  if (document.visibilityState === \"hidden\") {\n    return nextEventLoopTick()\n  } else {\n    return nextAnimationFrame()\n  }\n}\n\nfunction nextAnimationFrame() {\n  return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction nextEventLoopTick() {\n  return new Promise((resolve) => setTimeout(() => resolve(), 0))\n}\n\nfunction parseHTMLDocument(html = \"\") {\n  return new DOMParser().parseFromString(html, \"text/html\")\n}\n\nfunction unindent(strings, ...values) {\n  const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n  const match = lines[0].match(/^\\s+/);\n  const indent = match ? match[0].length : 0;\n  return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nfunction interpolate(strings, values) {\n  return strings.reduce((result, string, i) => {\n    const value = values[i] == undefined ? \"\" : values[i];\n    return result + string + value\n  }, \"\")\n}\n\nfunction uuid() {\n  return Array.from({ length: 36 })\n    .map((_, i) => {\n      if (i == 8 || i == 13 || i == 18 || i == 23) {\n        return \"-\"\n      } else if (i == 14) {\n        return \"4\"\n      } else if (i == 19) {\n        return (Math.floor(Math.random() * 4) + 8).toString(16)\n      } else {\n        return Math.floor(Math.random() * 16).toString(16)\n      }\n    })\n    .join(\"\")\n}\n\nfunction getAttribute(attributeName, ...elements) {\n  for (const value of elements.map((element) => element?.getAttribute(attributeName))) {\n    if (typeof value == \"string\") return value\n  }\n\n  return null\n}\n\nfunction hasAttribute(attributeName, ...elements) {\n  return elements.some((element) => element && element.hasAttribute(attributeName))\n}\n\nfunction markAsBusy(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.setAttribute(\"busy\", \"\");\n    }\n    element.setAttribute(\"aria-busy\", \"true\");\n  }\n}\n\nfunction clearBusyState(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.removeAttribute(\"busy\");\n    }\n\n    element.removeAttribute(\"aria-busy\");\n  }\n}\n\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n  return new Promise((resolve) => {\n    const onComplete = () => {\n      element.removeEventListener(\"error\", onComplete);\n      element.removeEventListener(\"load\", onComplete);\n      resolve();\n    };\n\n    element.addEventListener(\"load\", onComplete, { once: true });\n    element.addEventListener(\"error\", onComplete, { once: true });\n    setTimeout(resolve, timeoutInMilliseconds);\n  })\n}\n\nfunction getHistoryMethodForAction(action) {\n  switch (action) {\n    case \"replace\":\n      return history.replaceState\n    case \"advance\":\n    case \"restore\":\n      return history.pushState\n  }\n}\n\nfunction isAction(action) {\n  return action == \"advance\" || action == \"replace\" || action == \"restore\"\n}\n\nfunction getVisitAction(...elements) {\n  const action = getAttribute(\"data-turbo-action\", ...elements);\n\n  return isAction(action) ? action : null\n}\n\nfunction getMetaElement(name) {\n  return document.querySelector(`meta[name=\"${name}\"]`)\n}\n\nfunction getMetaContent(name) {\n  const element = getMetaElement(name);\n  return element && element.content\n}\n\nfunction getCspNonce() {\n  const element = getMetaElement(\"csp-nonce\");\n\n  if (element) {\n    const { nonce, content } = element;\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nfunction setMetaContent(name, content) {\n  let element = getMetaElement(name);\n\n  if (!element) {\n    element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", name);\n\n    document.head.appendChild(element);\n  }\n\n  element.setAttribute(\"content\", content);\n\n  return element\n}\n\nfunction findClosestRecursively(element, selector) {\n  if (element instanceof Element) {\n    return (\n      element.closest(selector) || findClosestRecursively(element.assignedSlot || element.getRootNode()?.host, selector)\n    )\n  }\n}\n\nfunction elementIsFocusable(element) {\n  const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n\n  return !!element && element.closest(inertDisabledOrHidden) == null && typeof element.focus == \"function\"\n}\n\nfunction queryAutofocusableElement(elementOrDocumentFragment) {\n  return Array.from(elementOrDocumentFragment.querySelectorAll(\"[autofocus]\")).find(elementIsFocusable)\n}\n\nasync function around(callback, reader) {\n  const before = reader();\n\n  callback();\n\n  await nextAnimationFrame();\n\n  const after = reader();\n\n  return [before, after]\n}\n\nfunction doesNotTargetIFrame(name) {\n  if (name === \"_blank\") {\n    return false\n  } else if (name) {\n    for (const element of document.getElementsByName(name)) {\n      if (element instanceof HTMLIFrameElement) return false\n    }\n\n    return true\n  } else {\n    return true\n  }\n}\n\nfunction findLinkFromClickTarget(target) {\n  const link = findClosestRecursively(target, \"a[href], a[xlink\\\\:href]\");\n\n  if (!link) return null\n  if (link.href.startsWith(\"#\")) return null\n  if (link.hasAttribute(\"download\")) return null\n\n  const linkTarget = link.getAttribute(\"target\");\n  if (linkTarget && linkTarget !== \"_self\") return null\n\n  return link\n}\n\nfunction debounce(fn, delay) {\n  let timeoutId = null;\n\n  return (...args) => {\n    const callback = () => fn.apply(this, args);\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(callback, delay);\n  }\n}\n\nconst submitter = {\n  \"aria-disabled\": {\n    beforeSubmit: submitter => {\n      submitter.setAttribute(\"aria-disabled\", \"true\");\n      submitter.addEventListener(\"click\", cancelEvent);\n    },\n\n    afterSubmit: submitter => {\n      submitter.removeAttribute(\"aria-disabled\");\n      submitter.removeEventListener(\"click\", cancelEvent);\n    }\n  },\n\n  \"disabled\": {\n    beforeSubmit: submitter => submitter.disabled = true,\n    afterSubmit: submitter => submitter.disabled = false\n  }\n};\n\nclass Config {\n  #submitter = null\n\n  constructor(config) {\n    Object.assign(this, config);\n  }\n\n  get submitter() {\n    return this.#submitter\n  }\n\n  set submitter(value) {\n    this.#submitter = submitter[value] || value;\n  }\n}\n\nconst forms = new Config({\n  mode: \"on\",\n  submitter: \"disabled\"\n});\n\nconst config = {\n  drive,\n  forms\n};\n\nfunction expandURL(locatable) {\n  return new URL(locatable.toString(), document.baseURI)\n}\n\nfunction getAnchor(url) {\n  let anchorMatch;\n  if (url.hash) {\n    return url.hash.slice(1)\n    // eslint-disable-next-line no-cond-assign\n  } else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n    return anchorMatch[1]\n  }\n}\n\nfunction getAction$1(form, submitter) {\n  const action = submitter?.getAttribute(\"formaction\") || form.getAttribute(\"action\") || form.action;\n\n  return expandURL(action)\n}\n\nfunction getExtension(url) {\n  return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\"\n}\n\nfunction isPrefixedBy(baseURL, url) {\n  const prefix = addTrailingSlash(url.origin + url.pathname);\n  return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix)\n}\n\nfunction locationIsVisitable(location, rootLocation) {\n  return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location))\n}\n\nfunction getLocationForLink(link) {\n  return expandURL(link.getAttribute(\"href\") || \"\")\n}\n\nfunction getRequestURL(url) {\n  const anchor = getAnchor(url);\n  return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href\n}\n\nfunction toCacheKey(url) {\n  return getRequestURL(url)\n}\n\nfunction urlsAreEqual(left, right) {\n  return expandURL(left).href == expandURL(right).href\n}\n\nfunction getPathComponents(url) {\n  return url.pathname.split(\"/\").slice(1)\n}\n\nfunction getLastPathComponent(url) {\n  return getPathComponents(url).slice(-1)[0]\n}\n\nfunction addTrailingSlash(value) {\n  return value.endsWith(\"/\") ? value : value + \"/\"\n}\n\nclass FetchResponse {\n  constructor(response) {\n    this.response = response;\n  }\n\n  get succeeded() {\n    return this.response.ok\n  }\n\n  get failed() {\n    return !this.succeeded\n  }\n\n  get clientError() {\n    return this.statusCode >= 400 && this.statusCode <= 499\n  }\n\n  get serverError() {\n    return this.statusCode >= 500 && this.statusCode <= 599\n  }\n\n  get redirected() {\n    return this.response.redirected\n  }\n\n  get location() {\n    return expandURL(this.response.url)\n  }\n\n  get isHTML() {\n    return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/)\n  }\n\n  get statusCode() {\n    return this.response.status\n  }\n\n  get contentType() {\n    return this.header(\"Content-Type\")\n  }\n\n  get responseText() {\n    return this.response.clone().text()\n  }\n\n  get responseHTML() {\n    if (this.isHTML) {\n      return this.response.clone().text()\n    } else {\n      return Promise.resolve(undefined)\n    }\n  }\n\n  header(name) {\n    return this.response.headers.get(name)\n  }\n}\n\nclass LimitedSet extends Set {\n  constructor(maxSize) {\n    super();\n    this.maxSize = maxSize;\n  }\n\n  add(value) {\n    if (this.size >= this.maxSize) {\n      const iterator = this.values();\n      const oldestValue = iterator.next().value;\n      this.delete(oldestValue);\n    }\n    super.add(value);\n  }\n}\n\nconst recentRequests = new LimitedSet(20);\n\nfunction fetchWithTurboHeaders(url, options = {}) {\n  const modifiedHeaders = new Headers(options.headers || {});\n  const requestUID = uuid();\n  recentRequests.add(requestUID);\n  modifiedHeaders.append(\"X-Turbo-Request-Id\", requestUID);\n\n  return window.fetch(url, {\n    ...options,\n    headers: modifiedHeaders\n  })\n}\n\nfunction fetchMethodFromString(method) {\n  switch (method.toLowerCase()) {\n    case \"get\":\n      return FetchMethod.get\n    case \"post\":\n      return FetchMethod.post\n    case \"put\":\n      return FetchMethod.put\n    case \"patch\":\n      return FetchMethod.patch\n    case \"delete\":\n      return FetchMethod.delete\n  }\n}\n\nconst FetchMethod = {\n  get: \"get\",\n  post: \"post\",\n  put: \"put\",\n  patch: \"patch\",\n  delete: \"delete\"\n};\n\nfunction fetchEnctypeFromString(encoding) {\n  switch (encoding.toLowerCase()) {\n    case FetchEnctype.multipart:\n      return FetchEnctype.multipart\n    case FetchEnctype.plain:\n      return FetchEnctype.plain\n    default:\n      return FetchEnctype.urlEncoded\n  }\n}\n\nconst FetchEnctype = {\n  urlEncoded: \"application/x-www-form-urlencoded\",\n  multipart: \"multipart/form-data\",\n  plain: \"text/plain\"\n};\n\nclass FetchRequest {\n  abortController = new AbortController()\n  #resolveRequestPromise = (_value) => {}\n\n  constructor(delegate, method, location, requestBody = new URLSearchParams(), target = null, enctype = FetchEnctype.urlEncoded) {\n    const [url, body] = buildResourceAndBody(expandURL(location), method, requestBody, enctype);\n\n    this.delegate = delegate;\n    this.url = url;\n    this.target = target;\n    this.fetchOptions = {\n      credentials: \"same-origin\",\n      redirect: \"follow\",\n      method: method.toUpperCase(),\n      headers: { ...this.defaultHeaders },\n      body: body,\n      signal: this.abortSignal,\n      referrer: this.delegate.referrer?.href\n    };\n    this.enctype = enctype;\n  }\n\n  get method() {\n    return this.fetchOptions.method\n  }\n\n  set method(value) {\n    const fetchBody = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData();\n    const fetchMethod = fetchMethodFromString(value) || FetchMethod.get;\n\n    this.url.search = \"\";\n\n    const [url, body] = buildResourceAndBody(this.url, fetchMethod, fetchBody, this.enctype);\n\n    this.url = url;\n    this.fetchOptions.body = body;\n    this.fetchOptions.method = fetchMethod.toUpperCase();\n  }\n\n  get headers() {\n    return this.fetchOptions.headers\n  }\n\n  set headers(value) {\n    this.fetchOptions.headers = value;\n  }\n\n  get body() {\n    if (this.isSafe) {\n      return this.url.searchParams\n    } else {\n      return this.fetchOptions.body\n    }\n  }\n\n  set body(value) {\n    this.fetchOptions.body = value;\n  }\n\n  get location() {\n    return this.url\n  }\n\n  get params() {\n    return this.url.searchParams\n  }\n\n  get entries() {\n    return this.body ? Array.from(this.body.entries()) : []\n  }\n\n  cancel() {\n    this.abortController.abort();\n  }\n\n  async perform() {\n    const { fetchOptions } = this;\n    this.delegate.prepareRequest(this);\n    const event = await this.#allowRequestToBeIntercepted(fetchOptions);\n    try {\n      this.delegate.requestStarted(this);\n\n      if (event.detail.fetchRequest) {\n        this.response = event.detail.fetchRequest.response;\n      } else {\n        this.response = fetchWithTurboHeaders(this.url.href, fetchOptions);\n      }\n\n      const response = await this.response;\n      return await this.receive(response)\n    } catch (error) {\n      if (error.name !== \"AbortError\") {\n        if (this.#willDelegateErrorHandling(error)) {\n          this.delegate.requestErrored(this, error);\n        }\n        throw error\n      }\n    } finally {\n      this.delegate.requestFinished(this);\n    }\n  }\n\n  async receive(response) {\n    const fetchResponse = new FetchResponse(response);\n    const event = dispatch(\"turbo:before-fetch-response\", {\n      cancelable: true,\n      detail: { fetchResponse },\n      target: this.target\n    });\n    if (event.defaultPrevented) {\n      this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n    } else if (fetchResponse.succeeded) {\n      this.delegate.requestSucceededWithResponse(this, fetchResponse);\n    } else {\n      this.delegate.requestFailedWithResponse(this, fetchResponse);\n    }\n    return fetchResponse\n  }\n\n  get defaultHeaders() {\n    return {\n      Accept: \"text/html, application/xhtml+xml\"\n    }\n  }\n\n  get isSafe() {\n    return isSafe(this.method)\n  }\n\n  get abortSignal() {\n    return this.abortController.signal\n  }\n\n  acceptResponseType(mimeType) {\n    this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n  }\n\n  async #allowRequestToBeIntercepted(fetchOptions) {\n    const requestInterception = new Promise((resolve) => (this.#resolveRequestPromise = resolve));\n    const event = dispatch(\"turbo:before-fetch-request\", {\n      cancelable: true,\n      detail: {\n        fetchOptions,\n        url: this.url,\n        resume: this.#resolveRequestPromise\n      },\n      target: this.target\n    });\n    this.url = event.detail.url;\n    if (event.defaultPrevented) await requestInterception;\n\n    return event\n  }\n\n  #willDelegateErrorHandling(error) {\n    const event = dispatch(\"turbo:fetch-request-error\", {\n      target: this.target,\n      cancelable: true,\n      detail: { request: this, error: error }\n    });\n\n    return !event.defaultPrevented\n  }\n}\n\nfunction isSafe(fetchMethod) {\n  return fetchMethodFromString(fetchMethod) == FetchMethod.get\n}\n\nfunction buildResourceAndBody(resource, method, requestBody, enctype) {\n  const searchParams =\n    Array.from(requestBody).length > 0 ? new URLSearchParams(entriesExcludingFiles(requestBody)) : resource.searchParams;\n\n  if (isSafe(method)) {\n    return [mergeIntoURLSearchParams(resource, searchParams), null]\n  } else if (enctype == FetchEnctype.urlEncoded) {\n    return [resource, searchParams]\n  } else {\n    return [resource, requestBody]\n  }\n}\n\nfunction entriesExcludingFiles(requestBody) {\n  const entries = [];\n\n  for (const [name, value] of requestBody) {\n    if (value instanceof File) continue\n    else entries.push([name, value]);\n  }\n\n  return entries\n}\n\nfunction mergeIntoURLSearchParams(url, requestBody) {\n  const searchParams = new URLSearchParams(entriesExcludingFiles(requestBody));\n\n  url.search = searchParams.toString();\n\n  return url\n}\n\nclass AppearanceObserver {\n  started = false\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n    this.intersectionObserver = new IntersectionObserver(this.intersect);\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      this.intersectionObserver.observe(this.element);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      this.intersectionObserver.unobserve(this.element);\n    }\n  }\n\n  intersect = (entries) => {\n    const lastEntry = entries.slice(-1)[0];\n    if (lastEntry?.isIntersecting) {\n      this.delegate.elementAppearedInViewport(this.element);\n    }\n  }\n}\n\nclass StreamMessage {\n  static contentType = \"text/vnd.turbo-stream.html\"\n\n  static wrap(message) {\n    if (typeof message == \"string\") {\n      return new this(createDocumentFragment(message))\n    } else {\n      return message\n    }\n  }\n\n  constructor(fragment) {\n    this.fragment = importStreamElements(fragment);\n  }\n}\n\nfunction importStreamElements(fragment) {\n  for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n    const streamElement = document.importNode(element, true);\n\n    for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n      inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n    }\n\n    element.replaceWith(streamElement);\n  }\n\n  return fragment\n}\n\nconst identity = key => key;\n\nclass LRUCache {\n  keys = []\n  entries = {}\n  #toCacheKey\n\n  constructor(size, toCacheKey = identity) {\n    this.size = size;\n    this.#toCacheKey = toCacheKey;\n  }\n\n  has(key) {\n    return this.#toCacheKey(key) in this.entries\n  }\n\n  get(key) {\n    if (this.has(key)) {\n      const entry = this.read(key);\n      this.touch(key);\n      return entry\n    }\n  }\n\n  put(key, entry) {\n    this.write(key, entry);\n    this.touch(key);\n    return entry\n  }\n\n  clear() {\n    for (const key of Object.keys(this.entries)) {\n      this.evict(key);\n    }\n  }\n\n  // Private\n\n  read(key) {\n    return this.entries[this.#toCacheKey(key)]\n  }\n\n  write(key, entry) {\n    this.entries[this.#toCacheKey(key)] = entry;\n  }\n\n  touch(key) {\n    key = this.#toCacheKey(key);\n    const index = this.keys.indexOf(key);\n    if (index > -1) this.keys.splice(index, 1);\n    this.keys.unshift(key);\n    this.trim();\n  }\n\n  trim() {\n    for (const key of this.keys.splice(this.size)) {\n      this.evict(key);\n    }\n  }\n\n  evict(key) {\n    delete this.entries[key];\n  }\n}\n\nconst PREFETCH_DELAY = 100;\n\nclass PrefetchCache extends LRUCache {\n  #prefetchTimeout = null\n  #maxAges = {}\n\n  constructor(size = 1, prefetchDelay = PREFETCH_DELAY) {\n    super(size, toCacheKey);\n    this.prefetchDelay = prefetchDelay;\n  }\n\n  putLater(url, request, ttl) {\n    this.#prefetchTimeout = setTimeout(() => {\n      request.perform();\n      this.put(url, request, ttl);\n      this.#prefetchTimeout = null;\n    }, this.prefetchDelay);\n  }\n\n  put(url, request, ttl = cacheTtl) {\n    super.put(url, request);\n    this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl);\n  }\n\n  clear() {\n    super.clear();\n    if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout);\n  }\n\n  evict(key) {\n    super.evict(key);\n    delete this.#maxAges[key];\n  }\n\n  has(key) {\n    if (super.has(key)) {\n      const maxAge = this.#maxAges[toCacheKey(key)];\n\n      return maxAge && maxAge > Date.now()\n    } else {\n      return false\n    }\n  }\n}\n\nconst cacheTtl = 10 * 1000;\nconst prefetchCache = new PrefetchCache();\n\nconst FormSubmissionState = {\n  initialized: \"initialized\",\n  requesting: \"requesting\",\n  waiting: \"waiting\",\n  receiving: \"receiving\",\n  stopping: \"stopping\",\n  stopped: \"stopped\"\n};\n\nclass FormSubmission {\n  state = FormSubmissionState.initialized\n\n  static confirmMethod(message) {\n    return Promise.resolve(confirm(message))\n  }\n\n  constructor(delegate, formElement, submitter, mustRedirect = false) {\n    const method = getMethod(formElement, submitter);\n    const action = getAction(getFormAction(formElement, submitter), method);\n    const body = buildFormData(formElement, submitter);\n    const enctype = getEnctype(formElement, submitter);\n\n    this.delegate = delegate;\n    this.formElement = formElement;\n    this.submitter = submitter;\n    this.fetchRequest = new FetchRequest(this, method, action, body, formElement, enctype);\n    this.mustRedirect = mustRedirect;\n  }\n\n  get method() {\n    return this.fetchRequest.method\n  }\n\n  set method(value) {\n    this.fetchRequest.method = value;\n  }\n\n  get action() {\n    return this.fetchRequest.url.toString()\n  }\n\n  set action(value) {\n    this.fetchRequest.url = expandURL(value);\n  }\n\n  get body() {\n    return this.fetchRequest.body\n  }\n\n  get enctype() {\n    return this.fetchRequest.enctype\n  }\n\n  get isSafe() {\n    return this.fetchRequest.isSafe\n  }\n\n  get location() {\n    return this.fetchRequest.url\n  }\n\n  // The submission process\n\n  async start() {\n    const { initialized, requesting } = FormSubmissionState;\n    const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n\n    if (typeof confirmationMessage === \"string\") {\n      const confirmMethod = typeof config.forms.confirm === \"function\" ?\n        config.forms.confirm :\n        FormSubmission.confirmMethod;\n\n      const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter);\n      if (!answer) {\n        return\n      }\n    }\n\n    if (this.state == initialized) {\n      this.state = requesting;\n      return this.fetchRequest.perform()\n    }\n  }\n\n  stop() {\n    const { stopping, stopped } = FormSubmissionState;\n    if (this.state != stopping && this.state != stopped) {\n      this.state = stopping;\n      this.fetchRequest.cancel();\n      return true\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (!request.isSafe) {\n      const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n      if (token) {\n        request.headers[\"X-CSRF-Token\"] = token;\n      }\n    }\n\n    if (this.requestAcceptsTurboStreamResponse(request)) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    this.state = FormSubmissionState.waiting;\n    if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter);\n    this.setSubmitsWith();\n    markAsBusy(this.formElement);\n    dispatch(\"turbo:submit-start\", {\n      target: this.formElement,\n      detail: { formSubmission: this }\n    });\n    this.delegate.formSubmissionStarted(this);\n  }\n\n  requestPreventedHandlingResponse(request, response) {\n    prefetchCache.clear();\n\n    this.result = { success: response.succeeded, fetchResponse: response };\n  }\n\n  requestSucceededWithResponse(request, response) {\n    if (response.clientError || response.serverError) {\n      this.delegate.formSubmissionFailedWithResponse(this, response);\n      return\n    }\n\n    prefetchCache.clear();\n\n    if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n      const error = new Error(\"Form responses must redirect to another location\");\n      this.delegate.formSubmissionErrored(this, error);\n    } else {\n      this.state = FormSubmissionState.receiving;\n      this.result = { success: true, fetchResponse: response };\n      this.delegate.formSubmissionSucceededWithResponse(this, response);\n    }\n  }\n\n  requestFailedWithResponse(request, response) {\n    this.result = { success: false, fetchResponse: response };\n    this.delegate.formSubmissionFailedWithResponse(this, response);\n  }\n\n  requestErrored(request, error) {\n    this.result = { success: false, error };\n    this.delegate.formSubmissionErrored(this, error);\n  }\n\n  requestFinished(_request) {\n    this.state = FormSubmissionState.stopped;\n    if (this.submitter) config.forms.submitter.afterSubmit(this.submitter);\n    this.resetSubmitterText();\n    clearBusyState(this.formElement);\n    dispatch(\"turbo:submit-end\", {\n      target: this.formElement,\n      detail: { formSubmission: this, ...this.result }\n    });\n    this.delegate.formSubmissionFinished(this);\n  }\n\n  // Private\n\n  setSubmitsWith() {\n    if (!this.submitter || !this.submitsWith) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.originalSubmitText = this.submitter.innerHTML;\n      this.submitter.innerHTML = this.submitsWith;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      this.originalSubmitText = input.value;\n      input.value = this.submitsWith;\n    }\n  }\n\n  resetSubmitterText() {\n    if (!this.submitter || !this.originalSubmitText) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.submitter.innerHTML = this.originalSubmitText;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      input.value = this.originalSubmitText;\n    }\n  }\n\n  requestMustRedirect(request) {\n    return !request.isSafe && this.mustRedirect\n  }\n\n  requestAcceptsTurboStreamResponse(request) {\n    return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement)\n  }\n\n  get submitsWith() {\n    return this.submitter?.getAttribute(\"data-turbo-submits-with\")\n  }\n}\n\nfunction buildFormData(formElement, submitter) {\n  const formData = new FormData(formElement);\n  const name = submitter?.getAttribute(\"name\");\n  const value = submitter?.getAttribute(\"value\");\n\n  if (name) {\n    formData.append(name, value || \"\");\n  }\n\n  return formData\n}\n\nfunction getCookieValue(cookieName) {\n  if (cookieName != null) {\n    const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n    const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n    if (cookie) {\n      const value = cookie.split(\"=\").slice(1).join(\"=\");\n      return value ? decodeURIComponent(value) : undefined\n    }\n  }\n}\n\nfunction responseSucceededWithoutRedirect(response) {\n  return response.statusCode == 200 && !response.redirected\n}\n\nfunction getFormAction(formElement, submitter) {\n  const formElementAction = typeof formElement.action === \"string\" ? formElement.action : null;\n\n  if (submitter?.hasAttribute(\"formaction\")) {\n    return submitter.getAttribute(\"formaction\") || \"\"\n  } else {\n    return formElement.getAttribute(\"action\") || formElementAction || \"\"\n  }\n}\n\nfunction getAction(formAction, fetchMethod) {\n  const action = expandURL(formAction);\n\n  if (isSafe(fetchMethod)) {\n    action.search = \"\";\n  }\n\n  return action\n}\n\nfunction getMethod(formElement, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || formElement.getAttribute(\"method\") || \"\";\n  return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get\n}\n\nfunction getEnctype(formElement, submitter) {\n  return fetchEnctypeFromString(submitter?.getAttribute(\"formenctype\") || formElement.enctype)\n}\n\nclass Snapshot {\n  constructor(element) {\n    this.element = element;\n  }\n\n  get activeElement() {\n    return this.element.ownerDocument.activeElement\n  }\n\n  get children() {\n    return [...this.element.children]\n  }\n\n  hasAnchor(anchor) {\n    return this.getElementForAnchor(anchor) != null\n  }\n\n  getElementForAnchor(anchor) {\n    return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null\n  }\n\n  get isConnected() {\n    return this.element.isConnected\n  }\n\n  get firstAutofocusableElement() {\n    return queryAutofocusableElement(this.element)\n  }\n\n  get permanentElements() {\n    return queryPermanentElementsAll(this.element)\n  }\n\n  getPermanentElementById(id) {\n    return getPermanentElementById(this.element, id)\n  }\n\n  getPermanentElementMapForSnapshot(snapshot) {\n    const permanentElementMap = {};\n\n    for (const currentPermanentElement of this.permanentElements) {\n      const { id } = currentPermanentElement;\n      const newPermanentElement = snapshot.getPermanentElementById(id);\n      if (newPermanentElement) {\n        permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n      }\n    }\n\n    return permanentElementMap\n  }\n}\n\nfunction getPermanentElementById(node, id) {\n  return node.querySelector(`#${id}[data-turbo-permanent]`)\n}\n\nfunction queryPermanentElementsAll(node) {\n  return node.querySelectorAll(\"[id][data-turbo-permanent]\")\n}\n\nclass FormSubmitObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n      this.started = false;\n    }\n  }\n\n  submitCaptured = () => {\n    this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n    this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n  }\n\n  submitBubbled = (event) => {\n    if (!event.defaultPrevented) {\n      const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n      const submitter = event.submitter || undefined;\n\n      if (\n        form &&\n        submissionDoesNotDismissDialog(form, submitter) &&\n        submissionDoesNotTargetIFrame(form, submitter) &&\n        this.delegate.willSubmitForm(form, submitter)\n      ) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        this.delegate.formSubmitted(form, submitter);\n      }\n    }\n  }\n}\n\nfunction submissionDoesNotDismissDialog(form, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || form.getAttribute(\"method\");\n\n  return method != \"dialog\"\n}\n\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n  const target = submitter?.getAttribute(\"formtarget\") || form.getAttribute(\"target\");\n\n  return doesNotTargetIFrame(target)\n}\n\nclass View {\n  #resolveRenderPromise = (_value) => {}\n  #resolveInterceptionPromise = (_value) => {}\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  // Scrolling\n\n  scrollToAnchor(anchor) {\n    const element = this.snapshot.getElementForAnchor(anchor);\n    if (element) {\n      this.focusElement(element);\n      this.scrollToElement(element);\n    } else {\n      this.scrollToPosition({ x: 0, y: 0 });\n    }\n  }\n\n  scrollToAnchorFromLocation(location) {\n    this.scrollToAnchor(getAnchor(location));\n  }\n\n  scrollToElement(element) {\n    element.scrollIntoView();\n  }\n\n  focusElement(element) {\n    if (element instanceof HTMLElement) {\n      if (element.hasAttribute(\"tabindex\")) {\n        element.focus();\n      } else {\n        element.setAttribute(\"tabindex\", \"-1\");\n        element.focus();\n        element.removeAttribute(\"tabindex\");\n      }\n    }\n  }\n\n  scrollToPosition({ x, y }) {\n    this.scrollRoot.scrollTo(x, y);\n  }\n\n  scrollToTop() {\n    this.scrollToPosition({ x: 0, y: 0 });\n  }\n\n  get scrollRoot() {\n    return window\n  }\n\n  // Rendering\n\n  async render(renderer) {\n    const { isPreview, shouldRender, willRender, newSnapshot: snapshot } = renderer;\n\n    // A workaround to ignore tracked element mismatch reloads when performing\n    // a promoted Visit from a frame navigation\n    const shouldInvalidate = willRender;\n\n    if (shouldRender) {\n      try {\n        this.renderPromise = new Promise((resolve) => (this.#resolveRenderPromise = resolve));\n        this.renderer = renderer;\n        await this.prepareToRenderSnapshot(renderer);\n\n        const renderInterception = new Promise((resolve) => (this.#resolveInterceptionPromise = resolve));\n        const options = { resume: this.#resolveInterceptionPromise, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod };\n        const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n        if (!immediateRender) await renderInterception;\n\n        await this.renderSnapshot(renderer);\n        this.delegate.viewRenderedSnapshot(snapshot, isPreview, this.renderer.renderMethod);\n        this.delegate.preloadOnLoadLinksForView(this.element);\n        this.finishRenderingSnapshot(renderer);\n      } finally {\n        delete this.renderer;\n        this.#resolveRenderPromise(undefined);\n        delete this.renderPromise;\n      }\n    } else if (shouldInvalidate) {\n      this.invalidate(renderer.reloadReason);\n    }\n  }\n\n  invalidate(reason) {\n    this.delegate.viewInvalidated(reason);\n  }\n\n  async prepareToRenderSnapshot(renderer) {\n    this.markAsPreview(renderer.isPreview);\n    await renderer.prepareToRender();\n  }\n\n  markAsPreview(isPreview) {\n    if (isPreview) {\n      this.element.setAttribute(\"data-turbo-preview\", \"\");\n    } else {\n      this.element.removeAttribute(\"data-turbo-preview\");\n    }\n  }\n\n  markVisitDirection(direction) {\n    this.element.setAttribute(\"data-turbo-visit-direction\", direction);\n  }\n\n  unmarkVisitDirection() {\n    this.element.removeAttribute(\"data-turbo-visit-direction\");\n  }\n\n  async renderSnapshot(renderer) {\n    await renderer.render();\n  }\n\n  finishRenderingSnapshot(renderer) {\n    renderer.finishRendering();\n  }\n}\n\nclass FrameView extends View {\n  missing() {\n    this.element.innerHTML = `<strong class=\"turbo-frame-error\">Content missing</strong>`;\n  }\n\n  get snapshot() {\n    return new Snapshot(this.element)\n  }\n}\n\nclass LinkInterceptor {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  start() {\n    this.element.addEventListener(\"click\", this.clickBubbled);\n    document.addEventListener(\"turbo:click\", this.linkClicked);\n    document.addEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  stop() {\n    this.element.removeEventListener(\"click\", this.clickBubbled);\n    document.removeEventListener(\"turbo:click\", this.linkClicked);\n    document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  clickBubbled = (event) => {\n    if (this.clickEventIsSignificant(event)) {\n      this.clickEvent = event;\n    } else {\n      delete this.clickEvent;\n    }\n  }\n\n  linkClicked = (event) => {\n    if (this.clickEvent && this.clickEventIsSignificant(event)) {\n      if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n        this.clickEvent.preventDefault();\n        event.preventDefault();\n        this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n      }\n    }\n    delete this.clickEvent;\n  }\n\n  willVisit = (_event) => {\n    delete this.clickEvent;\n  }\n\n  clickEventIsSignificant(event) {\n    const target = event.composed ? event.target?.parentElement : event.target;\n    const element = findLinkFromClickTarget(target) || target;\n\n    return element instanceof Element && element.closest(\"turbo-frame, html\") == this.element\n  }\n}\n\nclass LinkClickObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n      this.started = false;\n    }\n  }\n\n  clickCaptured = () => {\n    this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n    this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n  }\n\n  clickBubbled = (event) => {\n    if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n      const target = (event.composedPath && event.composedPath()[0]) || event.target;\n      const link = findLinkFromClickTarget(target);\n      if (link && doesNotTargetIFrame(link.target)) {\n        const location = getLocationForLink(link);\n        if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n          event.preventDefault();\n          this.delegate.followedLinkToLocation(link, location);\n        }\n      }\n    }\n  }\n\n  clickEventIsSignificant(event) {\n    return !(\n      (event.target && event.target.isContentEditable) ||\n      event.defaultPrevented ||\n      event.which > 1 ||\n      event.altKey ||\n      event.ctrlKey ||\n      event.metaKey ||\n      event.shiftKey\n    )\n  }\n}\n\nclass FormLinkClickObserver {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.linkInterceptor = new LinkClickObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n  }\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return false\n  }\n\n  prefetchAndCacheRequestToLocation(link, location) {\n    return\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, originalEvent) {\n    return (\n      this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n      (link.hasAttribute(\"data-turbo-method\") || link.hasAttribute(\"data-turbo-stream\"))\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const form = document.createElement(\"form\");\n\n    const type = \"hidden\";\n    for (const [name, value] of location.searchParams) {\n      form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n    }\n\n    const action = Object.assign(location, { search: \"\" });\n    form.setAttribute(\"data-turbo\", \"true\");\n    form.setAttribute(\"action\", action.href);\n    form.setAttribute(\"hidden\", \"\");\n\n    const method = link.getAttribute(\"data-turbo-method\");\n    if (method) form.setAttribute(\"method\", method);\n\n    const turboFrame = link.getAttribute(\"data-turbo-frame\");\n    if (turboFrame) form.setAttribute(\"data-turbo-frame\", turboFrame);\n\n    const turboAction = getVisitAction(link);\n    if (turboAction) form.setAttribute(\"data-turbo-action\", turboAction);\n\n    const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n    if (turboConfirm) form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n\n    const turboStream = link.hasAttribute(\"data-turbo-stream\");\n    if (turboStream) form.setAttribute(\"data-turbo-stream\", \"\");\n\n    this.delegate.submittedFormLinkToLocation(link, location, form);\n\n    document.body.appendChild(form);\n    form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n    requestAnimationFrame(() => form.requestSubmit());\n  }\n}\n\nclass Bardo {\n  static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n    const bardo = new this(delegate, permanentElementMap);\n    bardo.enter();\n    await callback();\n    bardo.leave();\n  }\n\n  constructor(delegate, permanentElementMap) {\n    this.delegate = delegate;\n    this.permanentElementMap = permanentElementMap;\n  }\n\n  enter() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n      this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n      this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n    }\n  }\n\n  leave() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement] = this.permanentElementMap[id];\n      this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n      this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n      this.delegate.leavingBardo(currentPermanentElement);\n    }\n  }\n\n  replaceNewPermanentElementWithPlaceholder(permanentElement) {\n    const placeholder = createPlaceholderForPermanentElement(permanentElement);\n    permanentElement.replaceWith(placeholder);\n  }\n\n  replaceCurrentPermanentElementWithClone(permanentElement) {\n    const clone = permanentElement.cloneNode(true);\n    permanentElement.replaceWith(clone);\n  }\n\n  replacePlaceholderWithPermanentElement(permanentElement) {\n    const placeholder = this.getPlaceholderById(permanentElement.id);\n    placeholder?.replaceWith(permanentElement);\n  }\n\n  getPlaceholderById(id) {\n    return this.placeholders.find((element) => element.content == id)\n  }\n\n  get placeholders() {\n    return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")]\n  }\n}\n\nfunction createPlaceholderForPermanentElement(permanentElement) {\n  const element = document.createElement(\"meta\");\n  element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n  element.setAttribute(\"content\", permanentElement.id);\n  return element\n}\n\nclass Renderer {\n  #activeElement = null\n\n  static renderElement(currentElement, newElement) {\n    // Abstract method\n  }\n\n  constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n    this.currentSnapshot = currentSnapshot;\n    this.newSnapshot = newSnapshot;\n    this.isPreview = isPreview;\n    this.willRender = willRender;\n    this.renderElement = this.constructor.renderElement;\n    this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  get shouldAutofocus() {\n    return true\n  }\n\n  get reloadReason() {\n    return\n  }\n\n  prepareToRender() {\n    return\n  }\n\n  render() {\n    // Abstract method\n  }\n\n  finishRendering() {\n    if (this.resolvingFunctions) {\n      this.resolvingFunctions.resolve();\n      delete this.resolvingFunctions;\n    }\n  }\n\n  async preservingPermanentElements(callback) {\n    await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n  }\n\n  focusFirstAutofocusableElement() {\n    if (this.shouldAutofocus) {\n      const element = this.connectedSnapshot.firstAutofocusableElement;\n      if (element) {\n        element.focus();\n      }\n    }\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement) {\n    if (this.#activeElement) return\n\n    if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n      this.#activeElement = this.currentSnapshot.activeElement;\n    }\n  }\n\n  leavingBardo(currentPermanentElement) {\n    if (currentPermanentElement.contains(this.#activeElement) && this.#activeElement instanceof HTMLElement) {\n      this.#activeElement.focus();\n\n      this.#activeElement = null;\n    }\n  }\n\n  get connectedSnapshot() {\n    return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot\n  }\n\n  get currentElement() {\n    return this.currentSnapshot.element\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  get permanentElementMap() {\n    return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)\n  }\n\n  get renderMethod() {\n    return \"replace\"\n  }\n}\n\nclass FrameRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const destinationRange = document.createRange();\n    destinationRange.selectNodeContents(currentElement);\n    destinationRange.deleteContents();\n\n    const frameElement = newElement;\n    const sourceRange = frameElement.ownerDocument?.createRange();\n    if (sourceRange) {\n      sourceRange.selectNodeContents(frameElement);\n      currentElement.appendChild(sourceRange.extractContents());\n    }\n  }\n\n  constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n    super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n    this.delegate = delegate;\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  async render() {\n    await nextRepaint();\n    this.preservingPermanentElements(() => {\n      this.loadFrameElement();\n    });\n    this.scrollFrameIntoView();\n    await nextRepaint();\n    this.focusFirstAutofocusableElement();\n    await nextRepaint();\n    this.activateScriptElements();\n  }\n\n  loadFrameElement() {\n    this.delegate.willRenderFrame(this.currentElement, this.newElement);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  scrollFrameIntoView() {\n    if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n      const element = this.currentElement.firstElementChild;\n      const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n      const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n\n      if (element) {\n        element.scrollIntoView({ block, behavior });\n        return true\n      }\n    }\n    return false\n  }\n\n  activateScriptElements() {\n    for (const inertScriptElement of this.newScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  get newScriptElements() {\n    return this.currentElement.querySelectorAll(\"script\")\n  }\n}\n\nfunction readScrollLogicalPosition(value, defaultValue) {\n  if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\nfunction readScrollBehavior(value, defaultValue) {\n  if (value == \"auto\" || value == \"smooth\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\n/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set<string>} persistentIds\n * @property {Map<Node, Set<string>>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n\n  /**\n   * @typedef {object} MorphContext\n   *\n   * @property {Element} target\n   * @property {Element} newContent\n   * @property {ConfigInternal} config\n   * @property {ConfigInternal['morphStyle']} morphStyle\n   * @property {ConfigInternal['ignoreActive']} ignoreActive\n   * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n   * @property {ConfigInternal['restoreFocus']} restoreFocus\n   * @property {Map<Node, Set<string>>} idMap\n   * @property {Set<string>} persistentIds\n   * @property {ConfigInternal['callbacks']} callbacks\n   * @property {ConfigInternal['head']} head\n   * @property {HTMLDivElement} pantry\n   * @property {Element[]} activeElementAndParents\n   */\n\n  //=============================================================================\n  // AND NOW IT BEGINS...\n  //=============================================================================\n\n  const noOp = () => {};\n  /**\n   * Default configuration values, updatable by users now\n   * @type {ConfigInternal}\n   */\n  const defaults = {\n    morphStyle: \"outerHTML\",\n    callbacks: {\n      beforeNodeAdded: noOp,\n      afterNodeAdded: noOp,\n      beforeNodeMorphed: noOp,\n      afterNodeMorphed: noOp,\n      beforeNodeRemoved: noOp,\n      afterNodeRemoved: noOp,\n      beforeAttributeUpdated: noOp,\n    },\n    head: {\n      style: \"merge\",\n      shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n      shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n      shouldRemove: noOp,\n      afterHeadMorphed: noOp,\n    },\n    restoreFocus: true,\n  };\n\n  /**\n   * Core idiomorph function for morphing one DOM tree to another\n   *\n   * @param {Element | Document} oldNode\n   * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n   * @param {Config} [config]\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function morph(oldNode, newContent, config = {}) {\n    oldNode = normalizeElement(oldNode);\n    const newNode = normalizeParent(newContent);\n    const ctx = createMorphContext(oldNode, newNode, config);\n\n    const morphedNodes = saveAndRestoreFocus(ctx, () => {\n      return withHeadBlocking(\n        ctx,\n        oldNode,\n        newNode,\n        /** @param {MorphContext} ctx */ (ctx) => {\n          if (ctx.morphStyle === \"innerHTML\") {\n            morphChildren(ctx, oldNode, newNode);\n            return Array.from(oldNode.childNodes);\n          } else {\n            return morphOuterHTML(ctx, oldNode, newNode);\n          }\n        },\n      );\n    });\n\n    ctx.pantry.remove();\n    return morphedNodes;\n  }\n\n  /**\n   * Morph just the outerHTML of the oldNode to the newContent\n   * We have to be careful because the oldNode could have siblings which need to be untouched\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @returns {Node[]}\n   */\n  function morphOuterHTML(ctx, oldNode, newNode) {\n    const oldParent = normalizeParent(oldNode);\n    morphChildren(\n      ctx,\n      oldParent,\n      newNode,\n      // these two optional params are the secret sauce\n      oldNode, // start point for iteration\n      oldNode.nextSibling, // end point for iteration\n    );\n    // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n    return Array.from(oldParent.childNodes);\n  }\n\n  /**\n   * @param {MorphContext} ctx\n   * @param {Function} fn\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function saveAndRestoreFocus(ctx, fn) {\n    if (!ctx.config.restoreFocus) return fn();\n    let activeElement =\n      /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n        document.activeElement\n      );\n\n    // don't bother if the active element is not an input or textarea\n    if (\n      !(\n        activeElement instanceof HTMLInputElement ||\n        activeElement instanceof HTMLTextAreaElement\n      )\n    ) {\n      return fn();\n    }\n\n    const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n    const results = fn();\n\n    if (\n      activeElementId &&\n      activeElementId !== document.activeElement?.getAttribute(\"id\")\n    ) {\n      activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n      activeElement?.focus();\n    }\n    if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n      activeElement.setSelectionRange(selectionStart, selectionEnd);\n    }\n\n    return results;\n  }\n\n  const morphChildren = (function () {\n    /**\n     * This is the core algorithm for matching up children.  The idea is to use id sets to try to match up\n     * nodes as faithfully as possible.  We greedily match, which allows us to keep the algorithm fast, but\n     * by using id sets, we are able to better match up with content deeper in the DOM.\n     *\n     * Basic algorithm:\n     * - for each node in the new content:\n     *   - search self and siblings for an id set match, falling back to a soft match\n     *   - if match found\n     *     - remove any nodes up to the match:\n     *       - pantry persistent nodes\n     *       - delete the rest\n     *     - morph the match\n     *   - elsif no match found, and node is persistent\n     *     - find its match by querying the old root (future) and pantry (past)\n     *     - move it and its children here\n     *     - morph it\n     *   - else\n     *     - create a new node from scratch as a last result\n     *\n     * @param {MorphContext} ctx the merge context\n     * @param {Element} oldParent the old content that we are merging the new content into\n     * @param {Element} newParent the parent element of the new content\n     * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n     * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n     */\n    function morphChildren(\n      ctx,\n      oldParent,\n      newParent,\n      insertionPoint = null,\n      endPoint = null,\n    ) {\n      // normalize\n      if (\n        oldParent instanceof HTMLTemplateElement &&\n        newParent instanceof HTMLTemplateElement\n      ) {\n        // @ts-ignore we can pretend the DocumentFragment is an Element\n        oldParent = oldParent.content;\n        // @ts-ignore ditto\n        newParent = newParent.content;\n      }\n      insertionPoint ||= oldParent.firstChild;\n\n      // run through all the new content\n      for (const newChild of newParent.childNodes) {\n        // once we reach the end of the old parent content skip to the end and insert the rest\n        if (insertionPoint && insertionPoint != endPoint) {\n          const bestMatch = findBestMatch(\n            ctx,\n            newChild,\n            insertionPoint,\n            endPoint,\n          );\n          if (bestMatch) {\n            // if the node to morph is not at the insertion point then remove/move up to it\n            if (bestMatch !== insertionPoint) {\n              removeNodesBetween(ctx, insertionPoint, bestMatch);\n            }\n            morphNode(bestMatch, newChild, ctx);\n            insertionPoint = bestMatch.nextSibling;\n            continue;\n          }\n        }\n\n        // if the matching node is elsewhere in the original content\n        if (newChild instanceof Element) {\n          // we can pretend the id is non-null because the next `.has` line will reject it if not\n          const newChildId = /** @type {String} */ (\n            newChild.getAttribute(\"id\")\n          );\n          if (ctx.persistentIds.has(newChildId)) {\n            // move it and all its children here and morph\n            const movedChild = moveBeforeById(\n              oldParent,\n              newChildId,\n              insertionPoint,\n              ctx,\n            );\n            morphNode(movedChild, newChild, ctx);\n            insertionPoint = movedChild.nextSibling;\n            continue;\n          }\n        }\n\n        // last resort: insert the new node from scratch\n        const insertedNode = createNode(\n          oldParent,\n          newChild,\n          insertionPoint,\n          ctx,\n        );\n        // could be null if beforeNodeAdded prevented insertion\n        if (insertedNode) {\n          insertionPoint = insertedNode.nextSibling;\n        }\n      }\n\n      // remove any remaining old nodes that didn't match up with new content\n      while (insertionPoint && insertionPoint != endPoint) {\n        const tempNode = insertionPoint;\n        insertionPoint = insertionPoint.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n    }\n\n    /**\n     * This performs the action of inserting a new node while handling situations where the node contains\n     * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n     *\n     * @param {Element} oldParent\n     * @param {Node} newChild\n     * @param {Node|null} insertionPoint\n     * @param {MorphContext} ctx\n     * @returns {Node|null}\n     */\n    function createNode(oldParent, newChild, insertionPoint, ctx) {\n      if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n      if (ctx.idMap.has(newChild)) {\n        // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n        const newEmptyChild = document.createElement(\n          /** @type {Element} */ (newChild).tagName,\n        );\n        oldParent.insertBefore(newEmptyChild, insertionPoint);\n        morphNode(newEmptyChild, newChild, ctx);\n        ctx.callbacks.afterNodeAdded(newEmptyChild);\n        return newEmptyChild;\n      } else {\n        // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n        const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n        oldParent.insertBefore(newClonedChild, insertionPoint);\n        ctx.callbacks.afterNodeAdded(newClonedChild);\n        return newClonedChild;\n      }\n    }\n\n    //=============================================================================\n    // Matching Functions\n    //=============================================================================\n    const findBestMatch = (function () {\n      /**\n       * Scans forward from the startPoint to the endPoint looking for a match\n       * for the node. It looks for an id set match first, then a soft match.\n       * We abort softmatching if we find two future soft matches, to reduce churn.\n       * @param {Node} node\n       * @param {MorphContext} ctx\n       * @param {Node | null} startPoint\n       * @param {Node | null} endPoint\n       * @returns {Node | null}\n       */\n      function findBestMatch(ctx, node, startPoint, endPoint) {\n        let softMatch = null;\n        let nextSibling = node.nextSibling;\n        let siblingSoftMatchCount = 0;\n\n        let cursor = startPoint;\n        while (cursor && cursor != endPoint) {\n          // soft matching is a prerequisite for id set matching\n          if (isSoftMatch(cursor, node)) {\n            if (isIdSetMatch(ctx, cursor, node)) {\n              return cursor; // found an id set match, we're done!\n            }\n\n            // we haven't yet saved a soft match fallback\n            if (softMatch === null) {\n              // the current soft match will hard match something else in the future, leave it\n              if (!ctx.idMap.has(cursor)) {\n                // save this as the fallback if we get through the loop without finding a hard match\n                softMatch = cursor;\n              }\n            }\n          }\n          if (\n            softMatch === null &&\n            nextSibling &&\n            isSoftMatch(cursor, nextSibling)\n          ) {\n            // The next new node has a soft match with this node, so\n            // increment the count of future soft matches\n            siblingSoftMatchCount++;\n            nextSibling = nextSibling.nextSibling;\n\n            // If there are two future soft matches, block soft matching for this node to allow\n            // future siblings to soft match. This is to reduce churn in the DOM when an element\n            // is prepended.\n            if (siblingSoftMatchCount >= 2) {\n              softMatch = undefined;\n            }\n          }\n\n          // if the current node contains active element, stop looking for better future matches,\n          // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n          // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion\n          if (ctx.activeElementAndParents.includes(cursor)) break;\n\n          cursor = cursor.nextSibling;\n        }\n\n        return softMatch || null;\n      }\n\n      /**\n       *\n       * @param {MorphContext} ctx\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isIdSetMatch(ctx, oldNode, newNode) {\n        let oldSet = ctx.idMap.get(oldNode);\n        let newSet = ctx.idMap.get(newNode);\n\n        if (!newSet || !oldSet) return false;\n\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /**\n       *\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isSoftMatch(oldNode, newNode) {\n        // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        return (\n          oldElt.nodeType === newElt.nodeType &&\n          oldElt.tagName === newElt.tagName &&\n          // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n          // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n          // its not persistent, and new nodes can't have any hidden state.\n          // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment\n          (!oldElt.getAttribute?.(\"id\") ||\n            oldElt.getAttribute?.(\"id\") === newElt.getAttribute?.(\"id\"))\n        );\n      }\n\n      return findBestMatch;\n    })();\n\n    //=============================================================================\n    // DOM Manipulation Functions\n    //=============================================================================\n\n    /**\n     * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n     * - Persistent nodes will be moved to the pantry for later reuse\n     * - Other nodes will have their hooks called, and then are removed\n     * @param {MorphContext} ctx\n     * @param {Node} node\n     */\n    function removeNode(ctx, node) {\n      // are we going to id set match this later?\n      if (ctx.idMap.has(node)) {\n        // skip callbacks and move to pantry\n        moveBefore(ctx.pantry, node, null);\n      } else {\n        // remove for realsies\n        if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n        node.parentNode?.removeChild(node);\n        ctx.callbacks.afterNodeRemoved(node);\n      }\n    }\n\n    /**\n     * Remove nodes between the start and end nodes\n     * @param {MorphContext} ctx\n     * @param {Node} startInclusive\n     * @param {Node} endExclusive\n     * @returns {Node|null}\n     */\n    function removeNodesBetween(ctx, startInclusive, endExclusive) {\n      /** @type {Node | null} */\n      let cursor = startInclusive;\n      // remove nodes until the endExclusive node\n      while (cursor && cursor !== endExclusive) {\n        let tempNode = /** @type {Node} */ (cursor);\n        cursor = cursor.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n      return cursor;\n    }\n\n    /**\n     * Search for an element by id within the document and pantry, and move it using moveBefore.\n     *\n     * @param {Element} parentNode - The parent node to which the element will be moved.\n     * @param {string} id - The ID of the element to be moved.\n     * @param {Node | null} after - The reference node to insert the element before.\n     *                              If `null`, the element is appended as the last child.\n     * @param {MorphContext} ctx\n     * @returns {Element} The found element\n     */\n    function moveBeforeById(parentNode, id, after, ctx) {\n      const target =\n        /** @type {Element} - will always be found */\n        (\n          // ctx.target.id unsafe because of form input shadowing\n          // ctx.target could be a document fragment which doesn't have `getAttribute`\n          (ctx.target.getAttribute?.(\"id\") === id && ctx.target) ||\n            ctx.target.querySelector(`[id=\"${id}\"]`) ||\n            ctx.pantry.querySelector(`[id=\"${id}\"]`)\n        );\n      removeElementFromAncestorsIdMaps(target, ctx);\n      moveBefore(parentNode, target, after);\n      return target;\n    }\n\n    /**\n     * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n     * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n     * pantry rather than being deleted, preventing their removal hooks from being called.\n     *\n     * @param {Element} element - element to remove from its ancestors' id maps\n     * @param {MorphContext} ctx\n     */\n    function removeElementFromAncestorsIdMaps(element, ctx) {\n      // we know id is non-null String, because this function is only called on elements with ids\n      const id = /** @type {String} */ (element.getAttribute(\"id\"));\n      /** @ts-ignore - safe to loop in this way **/\n      while ((element = element.parentNode)) {\n        let idSet = ctx.idMap.get(element);\n        if (idSet) {\n          idSet.delete(id);\n          if (!idSet.size) {\n            ctx.idMap.delete(element);\n          }\n        }\n      }\n    }\n\n    /**\n     * Moves an element before another element within the same parent.\n     * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n     * This is essentialy a forward-compat wrapper.\n     *\n     * @param {Element} parentNode - The parent node containing the after element.\n     * @param {Node} element - The element to be moved.\n     * @param {Node | null} after - The reference node to insert `element` before.\n     *                              If `null`, `element` is appended as the last child.\n     */\n    function moveBefore(parentNode, element, after) {\n      // @ts-ignore - use proposed moveBefore feature\n      if (parentNode.moveBefore) {\n        try {\n          // @ts-ignore - use proposed moveBefore feature\n          parentNode.moveBefore(element, after);\n        } catch (e) {\n          // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n          parentNode.insertBefore(element, after);\n        }\n      } else {\n        parentNode.insertBefore(element, after);\n      }\n    }\n\n    return morphChildren;\n  })();\n\n  //=============================================================================\n  // Single Node Morphing Code\n  //=============================================================================\n  const morphNode = (function () {\n    /**\n     * @param {Node} oldNode root node to merge content into\n     * @param {Node} newContent new content to merge\n     * @param {MorphContext} ctx the merge context\n     * @returns {Node | null} the element that ended up in the DOM\n     */\n    function morphNode(oldNode, newContent, ctx) {\n      if (ctx.ignoreActive && oldNode === document.activeElement) {\n        // don't morph focused element\n        return null;\n      }\n\n      if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n        return oldNode;\n      }\n\n      if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (\n        oldNode instanceof HTMLHeadElement &&\n        ctx.head.style !== \"morph\"\n      ) {\n        // ok to cast: if newContent wasn't also a <head>, it would've got caught in the `!isSoftMatch` branch above\n        handleHeadElement(\n          oldNode,\n          /** @type {HTMLHeadElement} */ (newContent),\n          ctx,\n        );\n      } else {\n        morphAttributes(oldNode, newContent, ctx);\n        if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n          // @ts-ignore newContent can be a node here because .firstChild will be null\n          morphChildren(ctx, oldNode, newContent);\n        }\n      }\n      ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n      return oldNode;\n    }\n\n    /**\n     * syncs the oldNode to the newNode, copying over all attributes and\n     * inner element state from the newNode to the oldNode\n     *\n     * @param {Node} oldNode the node to copy attributes & state to\n     * @param {Node} newNode the node to copy attributes & state from\n     * @param {MorphContext} ctx the merge context\n     */\n    function morphAttributes(oldNode, newNode, ctx) {\n      let type = newNode.nodeType;\n\n      // if is an element type, sync the attributes from the\n      // new node into the new node\n      if (type === 1 /* element type */) {\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        const oldAttributes = oldElt.attributes;\n        const newAttributes = newElt.attributes;\n        for (const newAttribute of newAttributes) {\n          if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n            continue;\n          }\n          if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n            oldElt.setAttribute(newAttribute.name, newAttribute.value);\n          }\n        }\n        // iterate backwards to avoid skipping over items when a delete occurs\n        for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n          const oldAttribute = oldAttributes[i];\n\n          // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n          // e.g. custom element attribute callbacks can remove other attributes\n          if (!oldAttribute) continue;\n\n          if (!newElt.hasAttribute(oldAttribute.name)) {\n            if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n              continue;\n            }\n            oldElt.removeAttribute(oldAttribute.name);\n          }\n        }\n\n        if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n          syncInputValue(oldElt, newElt, ctx);\n        }\n      }\n\n      // sync text nodes\n      if (type === 8 /* comment */ || type === 3 /* text */) {\n        if (oldNode.nodeValue !== newNode.nodeValue) {\n          oldNode.nodeValue = newNode.nodeValue;\n        }\n      }\n    }\n\n    /**\n     * NB: many bothans died to bring us information:\n     *\n     *  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n     *  https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n     *\n     * @param {Element} oldElement the element to sync the input value to\n     * @param {Element} newElement the element to sync the input value from\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncInputValue(oldElement, newElement, ctx) {\n      if (\n        oldElement instanceof HTMLInputElement &&\n        newElement instanceof HTMLInputElement &&\n        newElement.type !== \"file\"\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n\n        // sync boolean attributes\n        syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n        syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n        if (!newElement.hasAttribute(\"value\")) {\n          if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n            oldElement.value = \"\";\n            oldElement.removeAttribute(\"value\");\n          }\n        } else if (oldValue !== newValue) {\n          if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n            oldElement.setAttribute(\"value\", newValue);\n            oldElement.value = newValue;\n          }\n        }\n        // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n        // did I break something?\n      } else if (\n        oldElement instanceof HTMLOptionElement &&\n        newElement instanceof HTMLOptionElement\n      ) {\n        syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n      } else if (\n        oldElement instanceof HTMLTextAreaElement &&\n        newElement instanceof HTMLTextAreaElement\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n        if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n          return;\n        }\n        if (newValue !== oldValue) {\n          oldElement.value = newValue;\n        }\n        if (\n          oldElement.firstChild &&\n          oldElement.firstChild.nodeValue !== newValue\n        ) {\n          oldElement.firstChild.nodeValue = newValue;\n        }\n      }\n    }\n\n    /**\n     * @param {Element} oldElement element to write the value to\n     * @param {Element} newElement element to read the value from\n     * @param {string} attributeName the attribute name\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n      // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n      const newLiveValue = newElement[attributeName],\n        // @ts-ignore ditto\n        oldLiveValue = oldElement[attributeName];\n      if (newLiveValue !== oldLiveValue) {\n        const ignoreUpdate = ignoreAttribute(\n          attributeName,\n          oldElement,\n          \"update\",\n          ctx,\n        );\n        if (!ignoreUpdate) {\n          // update attribute's associated DOM property\n          // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n          oldElement[attributeName] = newElement[attributeName];\n        }\n        if (newLiveValue) {\n          if (!ignoreUpdate) {\n            // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n            // this is the correct way to set a boolean attribute to \"true\"\n            oldElement.setAttribute(attributeName, \"\");\n          }\n        } else {\n          if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n            oldElement.removeAttribute(attributeName);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {string} attr the attribute to be mutated\n     * @param {Element} element the element that is going to be updated\n     * @param {\"update\" | \"remove\"} updateType\n     * @param {MorphContext} ctx the merge context\n     * @returns {boolean} true if the attribute should be ignored, false otherwise\n     */\n    function ignoreAttribute(attr, element, updateType, ctx) {\n      if (\n        attr === \"value\" &&\n        ctx.ignoreActiveValue &&\n        element === document.activeElement\n      ) {\n        return true;\n      }\n      return (\n        ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n        false\n      );\n    }\n\n    /**\n     * @param {Node} possibleActiveElement\n     * @param {MorphContext} ctx\n     * @returns {boolean}\n     */\n    function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n      return (\n        !!ctx.ignoreActiveValue &&\n        possibleActiveElement === document.activeElement &&\n        possibleActiveElement !== document.body\n      );\n    }\n\n    return morphNode;\n  })();\n\n  //=============================================================================\n  // Head Management Functions\n  //=============================================================================\n  /**\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @param {function} callback\n   * @returns {Node[] | Promise<Node[]>}\n   */\n  function withHeadBlocking(ctx, oldNode, newNode, callback) {\n    if (ctx.head.block) {\n      const oldHead = oldNode.querySelector(\"head\");\n      const newHead = newNode.querySelector(\"head\");\n      if (oldHead && newHead) {\n        const promises = handleHeadElement(oldHead, newHead, ctx);\n        // when head promises resolve, proceed ignoring the head tag\n        return Promise.all(promises).then(() => {\n          const newCtx = Object.assign(ctx, {\n            head: {\n              block: false,\n              ignore: true,\n            },\n          });\n          return callback(newCtx);\n        });\n      }\n    }\n    // just proceed if we not head blocking\n    return callback(ctx);\n  }\n\n  /**\n   *  The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n   *\n   * @param {Element} oldHead\n   * @param {Element} newHead\n   * @param {MorphContext} ctx\n   * @returns {Promise<void>[]}\n   */\n  function handleHeadElement(oldHead, newHead, ctx) {\n    let added = [];\n    let removed = [];\n    let preserved = [];\n    let nodesToAppend = [];\n\n    // put all new head elements into a Map, by their outerHTML\n    let srcToNewHeadNodes = new Map();\n    for (const newHeadChild of newHead.children) {\n      srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n    }\n\n    // for each elt in the current head\n    for (const currentHeadElt of oldHead.children) {\n      // If the current head element is in the map\n      let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n      let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n      let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n      if (inNewContent || isPreserved) {\n        if (isReAppended) {\n          // remove the current version and let the new version replace it and re-execute\n          removed.push(currentHeadElt);\n        } else {\n          // this element already exists and should not be re-appended, so remove it from\n          // the new content map, preserving it in the DOM\n          srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n          preserved.push(currentHeadElt);\n        }\n      } else {\n        if (ctx.head.style === \"append\") {\n          // we are appending and this existing element is not new content\n          // so if and only if it is marked for re-append do we do anything\n          if (isReAppended) {\n            removed.push(currentHeadElt);\n            nodesToAppend.push(currentHeadElt);\n          }\n        } else {\n          // if this is a merge, we remove this content since it is not in the new head\n          if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n            removed.push(currentHeadElt);\n          }\n        }\n      }\n    }\n\n    // Push the remaining new head elements in the Map into the\n    // nodes to append to the head tag\n    nodesToAppend.push(...srcToNewHeadNodes.values());\n\n    let promises = [];\n    for (const newNode of nodesToAppend) {\n      // TODO: This could theoretically be null, based on type\n      let newElt = /** @type {ChildNode} */ (\n        document.createRange().createContextualFragment(newNode.outerHTML)\n          .firstChild\n      );\n      if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n        if (\n          (\"href\" in newElt && newElt.href) ||\n          (\"src\" in newElt && newElt.src)\n        ) {\n          /** @type {(result?: any) => void} */ let resolve;\n          let promise = new Promise(function (_resolve) {\n            resolve = _resolve;\n          });\n          newElt.addEventListener(\"load\", function () {\n            resolve();\n          });\n          promises.push(promise);\n        }\n        oldHead.appendChild(newElt);\n        ctx.callbacks.afterNodeAdded(newElt);\n        added.push(newElt);\n      }\n    }\n\n    // remove all removed elements, after we have appended the new elements to avoid\n    // additional network requests for things like style sheets\n    for (const removedElement of removed) {\n      if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n        oldHead.removeChild(removedElement);\n        ctx.callbacks.afterNodeRemoved(removedElement);\n      }\n    }\n\n    ctx.head.afterHeadMorphed(oldHead, {\n      added: added,\n      kept: preserved,\n      removed: removed,\n    });\n    return promises;\n  }\n\n  //=============================================================================\n  // Create Morph Context Functions\n  //=============================================================================\n  const createMorphContext = (function () {\n    /**\n     *\n     * @param {Element} oldNode\n     * @param {Element} newContent\n     * @param {Config} config\n     * @returns {MorphContext}\n     */\n    function createMorphContext(oldNode, newContent, config) {\n      const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n      const mergedConfig = mergeDefaults(config);\n      const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n      if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n        throw `Do not understand how to morph style ${morphStyle}`;\n      }\n\n      return {\n        target: oldNode,\n        newContent: newContent,\n        config: mergedConfig,\n        morphStyle: morphStyle,\n        ignoreActive: mergedConfig.ignoreActive,\n        ignoreActiveValue: mergedConfig.ignoreActiveValue,\n        restoreFocus: mergedConfig.restoreFocus,\n        idMap: idMap,\n        persistentIds: persistentIds,\n        pantry: createPantry(),\n        activeElementAndParents: createActiveElementAndParents(oldNode),\n        callbacks: mergedConfig.callbacks,\n        head: mergedConfig.head,\n      };\n    }\n\n    /**\n     * Deep merges the config object and the Idiomorph.defaults object to\n     * produce a final configuration object\n     * @param {Config} config\n     * @returns {ConfigInternal}\n     */\n    function mergeDefaults(config) {\n      let finalConfig = Object.assign({}, defaults);\n\n      // copy top level stuff into final config\n      Object.assign(finalConfig, config);\n\n      // copy callbacks into final config (do this to deep merge the callbacks)\n      finalConfig.callbacks = Object.assign(\n        {},\n        defaults.callbacks,\n        config.callbacks,\n      );\n\n      // copy head config into final config  (do this to deep merge the head)\n      finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n      return finalConfig;\n    }\n\n    /**\n     * @returns {HTMLDivElement}\n     */\n    function createPantry() {\n      const pantry = document.createElement(\"div\");\n      pantry.hidden = true;\n      document.body.insertAdjacentElement(\"afterend\", pantry);\n      return pantry;\n    }\n\n    /**\n     * @param {Element} oldNode\n     * @returns {Element[]}\n     */\n    function createActiveElementAndParents(oldNode) {\n      /** @type {Element[]} */\n      let activeElementAndParents = [];\n      let elt = document.activeElement;\n      if (elt?.tagName !== \"BODY\" && oldNode.contains(elt)) {\n        while (elt) {\n          activeElementAndParents.push(elt);\n          if (elt === oldNode) break;\n          elt = elt.parentElement;\n        }\n      }\n      return activeElementAndParents;\n    }\n\n    /**\n     * Returns all elements with an ID contained within the root element and its descendants\n     *\n     * @param {Element} root\n     * @returns {Element[]}\n     */\n    function findIdElements(root) {\n      let elements = Array.from(root.querySelectorAll(\"[id]\"));\n      // root could be a document fragment which doesn't have `getAttribute`\n      if (root.getAttribute?.(\"id\")) {\n        elements.push(root);\n      }\n      return elements;\n    }\n\n    /**\n     * A bottom-up algorithm that populates a map of Element -> IdSet.\n     * The idSet for a given element is the set of all IDs contained within its subtree.\n     * As an optimzation, we filter these IDs through the given list of persistent IDs,\n     * because we don't need to bother considering IDed elements that won't be in the new content.\n     *\n     * @param {Map<Node, Set<string>>} idMap\n     * @param {Set<string>} persistentIds\n     * @param {Element} root\n     * @param {Element[]} elements\n     */\n    function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n      for (const elt of elements) {\n        // we can pretend id is non-null String, because the .has line will reject it immediately if not\n        const id = /** @type {String} */ (elt.getAttribute(\"id\"));\n        if (persistentIds.has(id)) {\n          /** @type {Element|null} */\n          let current = elt;\n          // walk up the parent hierarchy of that element, adding the id\n          // of element to the parent's id set\n          while (current) {\n            let idSet = idMap.get(current);\n            // if the id set doesn't exist, create it and insert it in the map\n            if (idSet == null) {\n              idSet = new Set();\n              idMap.set(current, idSet);\n            }\n            idSet.add(id);\n\n            if (current === root) break;\n            current = current.parentElement;\n          }\n        }\n      }\n    }\n\n    /**\n     * This function computes a map of nodes to all ids contained within that node (inclusive of the\n     * node).  This map can be used to ask if two nodes have intersecting sets of ids, which allows\n     * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n     * to contribute to a parent nodes matching.\n     *\n     * @param {Element} oldContent  the old content that will be morphed\n     * @param {Element} newContent  the new content to morph to\n     * @returns {IdSets}\n     */\n    function createIdMaps(oldContent, newContent) {\n      const oldIdElements = findIdElements(oldContent);\n      const newIdElements = findIdElements(newContent);\n\n      const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n      /** @type {Map<Node, Set<string>>} */\n      let idMap = new Map();\n      populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n      /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n      const newRoot = newContent.__idiomorphRoot || newContent;\n      populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n      return { persistentIds, idMap };\n    }\n\n    /**\n     * This function computes the set of ids that persist between the two contents excluding duplicates\n     *\n     * @param {Element[]} oldIdElements\n     * @param {Element[]} newIdElements\n     * @returns {Set<string>}\n     */\n    function createPersistentIds(oldIdElements, newIdElements) {\n      let duplicateIds = new Set();\n\n      /** @type {Map<string, string>} */\n      let oldIdTagNameMap = new Map();\n      for (const { id, tagName } of oldIdElements) {\n        if (oldIdTagNameMap.has(id)) {\n          duplicateIds.add(id);\n        } else {\n          oldIdTagNameMap.set(id, tagName);\n        }\n      }\n\n      let persistentIds = new Set();\n      for (const { id, tagName } of newIdElements) {\n        if (persistentIds.has(id)) {\n          duplicateIds.add(id);\n        } else if (oldIdTagNameMap.get(id) === tagName) {\n          persistentIds.add(id);\n        }\n        // skip if tag types mismatch because its not possible to morph one tag into another\n      }\n\n      for (const id of duplicateIds) {\n        persistentIds.delete(id);\n      }\n      return persistentIds;\n    }\n\n    return createMorphContext;\n  })();\n\n  //=============================================================================\n  // HTML Normalization Functions\n  //=============================================================================\n  const { normalizeElement, normalizeParent } = (function () {\n    /** @type {WeakSet<Node>} */\n    const generatedByIdiomorph = new WeakSet();\n\n    /**\n     *\n     * @param {Element | Document} content\n     * @returns {Element}\n     */\n    function normalizeElement(content) {\n      if (content instanceof Document) {\n        return content.documentElement;\n      } else {\n        return content;\n      }\n    }\n\n    /**\n     *\n     * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n     * @returns {Element}\n     */\n    function normalizeParent(newContent) {\n      if (newContent == null) {\n        return document.createElement(\"div\"); // dummy parent element\n      } else if (typeof newContent === \"string\") {\n        return normalizeParent(parseContent(newContent));\n      } else if (\n        generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n      ) {\n        // the template tag created by idiomorph parsing can serve as a dummy parent\n        return /** @type {Element} */ (newContent);\n      } else if (newContent instanceof Node) {\n        if (newContent.parentNode) {\n          // we can't use the parent directly because newContent may have siblings\n          // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n          // so instead we create a fake parent node that only sees a slice of its children.\n          /** @type {Element} */\n          return /** @type {any} */ (new SlicedParentNode(newContent));\n        } else {\n          // a single node is added as a child to a dummy parent\n          const dummyParent = document.createElement(\"div\");\n          dummyParent.append(newContent);\n          return dummyParent;\n        }\n      } else {\n        // all nodes in the array or HTMLElement collection are consolidated under\n        // a single dummy parent element\n        const dummyParent = document.createElement(\"div\");\n        for (const elt of [...newContent]) {\n          dummyParent.append(elt);\n        }\n        return dummyParent;\n      }\n    }\n\n    /**\n     * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n     * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n     * or replaced with one or more elements during the morph. This class effectively allows us a window into\n     * a slice of a node's children.\n     * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849\u20131916)\n     */\n    class SlicedParentNode {\n      /** @param {Node} node */\n      constructor(node) {\n        this.originalNode = node;\n        this.realParentNode = /** @type {Element} */ (node.parentNode);\n        this.previousSibling = node.previousSibling;\n        this.nextSibling = node.nextSibling;\n      }\n\n      /** @returns {Node[]} */\n      get childNodes() {\n        // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n        const nodes = [];\n        let cursor = this.previousSibling\n          ? this.previousSibling.nextSibling\n          : this.realParentNode.firstChild;\n        while (cursor && cursor != this.nextSibling) {\n          nodes.push(cursor);\n          cursor = cursor.nextSibling;\n        }\n        return nodes;\n      }\n\n      /**\n       * @param {string} selector\n       * @returns {Element[]}\n       */\n      querySelectorAll(selector) {\n        return this.childNodes.reduce((results, node) => {\n          if (node instanceof Element) {\n            if (node.matches(selector)) results.push(node);\n            const nodeList = node.querySelectorAll(selector);\n            for (let i = 0; i < nodeList.length; i++) {\n              results.push(nodeList[i]);\n            }\n          }\n          return results;\n        }, /** @type {Element[]} */ ([]));\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      insertBefore(node, referenceNode) {\n        return this.realParentNode.insertBefore(node, referenceNode);\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      moveBefore(node, referenceNode) {\n        // @ts-ignore - use new moveBefore feature\n        return this.realParentNode.moveBefore(node, referenceNode);\n      }\n\n      /**\n       * for later use with populateIdMapWithTree to halt upwards iteration\n       * @returns {Node}\n       */\n      get __idiomorphRoot() {\n        return this.originalNode;\n      }\n    }\n\n    /**\n     *\n     * @param {string} newContent\n     * @returns {Node | null | DocumentFragment}\n     */\n    function parseContent(newContent) {\n      let parser = new DOMParser();\n\n      // remove svgs to avoid false-positive matches on head, etc.\n      let contentWithSvgsRemoved = newContent.replace(\n        /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n        \"\",\n      );\n\n      // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n      if (\n        contentWithSvgsRemoved.match(/<\\/html>/) ||\n        contentWithSvgsRemoved.match(/<\\/head>/) ||\n        contentWithSvgsRemoved.match(/<\\/body>/)\n      ) {\n        let content = parser.parseFromString(newContent, \"text/html\");\n        // if it is a full HTML document, return the document itself as the parent container\n        if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n          generatedByIdiomorph.add(content);\n          return content;\n        } else {\n          // otherwise return the html element as the parent container\n          let htmlElement = content.firstChild;\n          if (htmlElement) {\n            generatedByIdiomorph.add(htmlElement);\n          }\n          return htmlElement;\n        }\n      } else {\n        // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n        // deal with touchy tags like tr, tbody, etc.\n        let responseDoc = parser.parseFromString(\n          \"<body><template>\" + newContent + \"</template></body>\",\n          \"text/html\",\n        );\n        let content = /** @type {HTMLTemplateElement} */ (\n          responseDoc.body.querySelector(\"template\")\n        ).content;\n        generatedByIdiomorph.add(content);\n        return content;\n      }\n    }\n\n    return { normalizeElement, normalizeParent };\n  })();\n\n  //=============================================================================\n  // This is what ends up becoming the Idiomorph global object\n  //=============================================================================\n  return {\n    morph,\n    defaults,\n  };\n})();\n\n/**\n * Morph the state of the currentElement based on the attributes and contents of\n * the newElement. Morphing may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing changes\n * @param newElement Element source of morphing changes\n */\nfunction morphElements(currentElement, newElement, { callbacks, ...options } = {}) {\n  Idiomorph.morph(currentElement, newElement, {\n    ...options,\n    callbacks: new DefaultIdiomorphCallbacks(callbacks)\n  });\n}\n\n/**\n * Morph the child elements of the currentElement based on the child elements of\n * the newElement. Morphing children may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing children changes\n * @param newElement Element source of morphing children changes\n */\nfunction morphChildren(currentElement, newElement, options = {}) {\n  morphElements(currentElement, newElement.childNodes, {\n    ...options,\n    morphStyle: \"innerHTML\"\n  });\n}\n\nfunction shouldRefreshFrameWithMorphing(currentFrame, newFrame) {\n  return currentFrame instanceof FrameElement &&\n    currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) &&\n    !currentFrame.closest(\"[data-turbo-permanent]\")\n}\n\nfunction areFramesCompatibleForRefreshing(currentFrame, newFrame) {\n  // newFrame cannot yet be an instance of FrameElement because custom\n  // elements don't get initialized until they're attached to the DOM, so\n  // test its Element#nodeName instead\n  return newFrame instanceof Element && newFrame.nodeName === \"TURBO-FRAME\" && currentFrame.id === newFrame.id &&\n  (!newFrame.getAttribute(\"src\") || urlsAreEqual(currentFrame.src, newFrame.getAttribute(\"src\")))\n}\n\nfunction closestFrameReloadableWithMorphing(node) {\n  return node.parentElement.closest(\"turbo-frame[src][refresh=morph]\")\n}\n\nclass DefaultIdiomorphCallbacks {\n  #beforeNodeMorphed\n\n  constructor({ beforeNodeMorphed } = {}) {\n    this.#beforeNodeMorphed = beforeNodeMorphed || (() => true);\n  }\n\n  beforeNodeAdded = (node) => {\n    return !(node.id && node.hasAttribute(\"data-turbo-permanent\") && document.getElementById(node.id))\n  }\n\n  beforeNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      if (!currentElement.hasAttribute(\"data-turbo-permanent\") && this.#beforeNodeMorphed(currentElement, newElement)) {\n        const event = dispatch(\"turbo:before-morph-element\", {\n          cancelable: true,\n          target: currentElement,\n          detail: { currentElement, newElement }\n        });\n\n        return !event.defaultPrevented\n      } else {\n        return false\n      }\n    }\n  }\n\n  beforeAttributeUpdated = (attributeName, target, mutationType) => {\n    const event = dispatch(\"turbo:before-morph-attribute\", {\n      cancelable: true,\n      target,\n      detail: { attributeName, mutationType }\n    });\n\n    return !event.defaultPrevented\n  }\n\n  beforeNodeRemoved = (node) => {\n    return this.beforeNodeMorphed(node)\n  }\n\n  afterNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      dispatch(\"turbo:morph-element\", {\n        target: currentElement,\n        detail: { currentElement, newElement }\n      });\n    }\n  }\n}\n\nclass MorphingFrameRenderer extends FrameRenderer {\n  static renderElement(currentElement, newElement) {\n    dispatch(\"turbo:before-frame-morph\", {\n      target: currentElement,\n      detail: { currentElement, newElement }\n    });\n\n    morphChildren(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              closestFrameReloadableWithMorphing(node) === currentElement\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n}\n\nclass ProgressBar {\n  static animationDuration = 300 /*ms*/\n\n  static get defaultCSS() {\n    return unindent`\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 2147483647;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `\n  }\n\n  hiding = false\n  value = 0\n  visible = false\n\n  constructor() {\n    this.stylesheetElement = this.createStylesheetElement();\n    this.progressElement = this.createProgressElement();\n    this.installStylesheetElement();\n    this.setValue(0);\n  }\n\n  show() {\n    if (!this.visible) {\n      this.visible = true;\n      this.installProgressElement();\n      this.startTrickling();\n    }\n  }\n\n  hide() {\n    if (this.visible && !this.hiding) {\n      this.hiding = true;\n      this.fadeProgressElement(() => {\n        this.uninstallProgressElement();\n        this.stopTrickling();\n        this.visible = false;\n        this.hiding = false;\n      });\n    }\n  }\n\n  setValue(value) {\n    this.value = value;\n    this.refresh();\n  }\n\n  // Private\n\n  installStylesheetElement() {\n    document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n  }\n\n  installProgressElement() {\n    this.progressElement.style.width = \"0\";\n    this.progressElement.style.opacity = \"1\";\n    document.documentElement.insertBefore(this.progressElement, document.body);\n    this.refresh();\n  }\n\n  fadeProgressElement(callback) {\n    this.progressElement.style.opacity = \"0\";\n    setTimeout(callback, ProgressBar.animationDuration * 1.5);\n  }\n\n  uninstallProgressElement() {\n    if (this.progressElement.parentNode) {\n      document.documentElement.removeChild(this.progressElement);\n    }\n  }\n\n  startTrickling() {\n    if (!this.trickleInterval) {\n      this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n    }\n  }\n\n  stopTrickling() {\n    window.clearInterval(this.trickleInterval);\n    delete this.trickleInterval;\n  }\n\n  trickle = () => {\n    this.setValue(this.value + Math.random() / 100);\n  }\n\n  refresh() {\n    requestAnimationFrame(() => {\n      this.progressElement.style.width = `${10 + this.value * 90}%`;\n    });\n  }\n\n  createStylesheetElement() {\n    const element = document.createElement(\"style\");\n    element.type = \"text/css\";\n    element.textContent = ProgressBar.defaultCSS;\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      element.nonce = cspNonce;\n    }\n    return element\n  }\n\n  createProgressElement() {\n    const element = document.createElement(\"div\");\n    element.className = \"turbo-progress-bar\";\n    return element\n  }\n}\n\nclass HeadSnapshot extends Snapshot {\n  detailsByOuterHTML = this.children\n    .filter((element) => !elementIsNoscript(element))\n    .map((element) => elementWithoutNonce(element))\n    .reduce((result, element) => {\n      const { outerHTML } = element;\n      const details =\n        outerHTML in result\n          ? result[outerHTML]\n          : {\n              type: elementType(element),\n              tracked: elementIsTracked(element),\n              elements: []\n            };\n      return {\n        ...result,\n        [outerHTML]: {\n          ...details,\n          elements: [...details.elements, element]\n        }\n      }\n    }, {})\n\n  get trackedElementSignature() {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n      .join(\"\")\n  }\n\n  getScriptElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot)\n  }\n\n  getStylesheetElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot)\n  }\n\n  getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n      .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n      .filter(({ type }) => type == matchedType)\n      .map(({ elements: [element] }) => element)\n  }\n\n  get provisionalElements() {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n      if (type == null && !tracked) {\n        return [...result, ...elements]\n      } else if (elements.length > 1) {\n        return [...result, ...elements.slice(1)]\n      } else {\n        return result\n      }\n    }, [])\n  }\n\n  getMetaValue(name) {\n    const element = this.findMetaElementByName(name);\n    return element ? element.getAttribute(\"content\") : null\n  }\n\n  findMetaElementByName(name) {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const {\n        elements: [element]\n      } = this.detailsByOuterHTML[outerHTML];\n      return elementIsMetaElementWithName(element, name) ? element : result\n    }, undefined | undefined)\n  }\n}\n\nfunction elementType(element) {\n  if (elementIsScript(element)) {\n    return \"script\"\n  } else if (elementIsStylesheet(element)) {\n    return \"stylesheet\"\n  }\n}\n\nfunction elementIsTracked(element) {\n  return element.getAttribute(\"data-turbo-track\") == \"reload\"\n}\n\nfunction elementIsScript(element) {\n  const tagName = element.localName;\n  return tagName == \"script\"\n}\n\nfunction elementIsNoscript(element) {\n  const tagName = element.localName;\n  return tagName == \"noscript\"\n}\n\nfunction elementIsStylesheet(element) {\n  const tagName = element.localName;\n  return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n}\n\nfunction elementIsMetaElementWithName(element, name) {\n  const tagName = element.localName;\n  return tagName == \"meta\" && element.getAttribute(\"name\") == name\n}\n\nfunction elementWithoutNonce(element) {\n  if (element.hasAttribute(\"nonce\")) {\n    element.setAttribute(\"nonce\", \"\");\n  }\n\n  return element\n}\n\nclass PageSnapshot extends Snapshot {\n  static fromHTMLString(html = \"\") {\n    return this.fromDocument(parseHTMLDocument(html))\n  }\n\n  static fromElement(element) {\n    return this.fromDocument(element.ownerDocument)\n  }\n\n  static fromDocument({ documentElement, body, head }) {\n    return new this(documentElement, body, new HeadSnapshot(head))\n  }\n\n  constructor(documentElement, body, headSnapshot) {\n    super(body);\n    this.documentElement = documentElement;\n    this.headSnapshot = headSnapshot;\n  }\n\n  clone() {\n    const clonedElement = this.element.cloneNode(true);\n\n    const selectElements = this.element.querySelectorAll(\"select\");\n    const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n\n    for (const [index, source] of selectElements.entries()) {\n      const clone = clonedSelectElements[index];\n      for (const option of clone.selectedOptions) option.selected = false;\n      for (const option of source.selectedOptions) clone.options[option.index].selected = true;\n    }\n\n    for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n      clonedPasswordInput.value = \"\";\n    }\n\n    for (const clonedNoscriptElement of clonedElement.querySelectorAll(\"noscript\")) {\n      clonedNoscriptElement.remove();\n    }\n\n    return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot)\n  }\n\n  get lang() {\n    return this.documentElement.getAttribute(\"lang\")\n  }\n\n  get dir() {\n    return this.documentElement.getAttribute(\"dir\")\n  }\n\n  get headElement() {\n    return this.headSnapshot.element\n  }\n\n  get rootLocation() {\n    const root = this.getSetting(\"root\") ?? \"/\";\n    return expandURL(root)\n  }\n\n  get cacheControlValue() {\n    return this.getSetting(\"cache-control\")\n  }\n\n  get isPreviewable() {\n    return this.cacheControlValue != \"no-preview\"\n  }\n\n  get isCacheable() {\n    return this.cacheControlValue != \"no-cache\"\n  }\n\n  get isVisitable() {\n    return this.getSetting(\"visit-control\") != \"reload\"\n  }\n\n  get prefersViewTransitions() {\n    const viewTransitionEnabled = this.getSetting(\"view-transition\") === \"true\" || this.headSnapshot.getMetaValue(\"view-transition\") === \"same-origin\";\n    return viewTransitionEnabled && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  }\n\n  get refreshMethod() {\n    return this.getSetting(\"refresh-method\")\n  }\n\n  get refreshScroll() {\n    return this.getSetting(\"refresh-scroll\")\n  }\n\n  // Private\n\n  getSetting(name) {\n    return this.headSnapshot.getMetaValue(`turbo-${name}`)\n  }\n}\n\nclass ViewTransitioner {\n  #viewTransitionStarted = false\n  #lastOperation = Promise.resolve()\n\n  renderChange(useViewTransition, render) {\n    if (useViewTransition && this.viewTransitionsAvailable && !this.#viewTransitionStarted) {\n      this.#viewTransitionStarted = true;\n      this.#lastOperation = this.#lastOperation.then(async () => {\n        await document.startViewTransition(render).finished;\n      });\n    } else {\n      this.#lastOperation = this.#lastOperation.then(render);\n    }\n\n    return this.#lastOperation\n  }\n\n  get viewTransitionsAvailable() {\n    return document.startViewTransition\n  }\n}\n\nconst defaultOptions = {\n  action: \"advance\",\n  historyChanged: false,\n  visitCachedSnapshot: () => {},\n  willRender: true,\n  updateHistory: true,\n  shouldCacheSnapshot: true,\n  acceptsStreamResponse: false,\n  refresh: {}\n};\n\nconst TimingMetric = {\n  visitStart: \"visitStart\",\n  requestStart: \"requestStart\",\n  requestEnd: \"requestEnd\",\n  visitEnd: \"visitEnd\"\n};\n\nconst VisitState = {\n  initialized: \"initialized\",\n  started: \"started\",\n  canceled: \"canceled\",\n  failed: \"failed\",\n  completed: \"completed\"\n};\n\nconst SystemStatusCode = {\n  networkFailure: 0,\n  timeoutFailure: -1,\n  contentTypeMismatch: -2\n};\n\nconst Direction = {\n  advance: \"forward\",\n  restore: \"back\",\n  replace: \"none\"\n};\n\nclass Visit {\n  identifier = uuid() // Required by turbo-ios\n  timingMetrics = {}\n\n  followedRedirect = false\n  historyChanged = false\n  scrolled = false\n  shouldCacheSnapshot = true\n  acceptsStreamResponse = false\n  snapshotCached = false\n  state = VisitState.initialized\n  viewTransitioner = new ViewTransitioner()\n\n  constructor(delegate, location, restorationIdentifier, options = {}) {\n    this.delegate = delegate;\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier || uuid();\n\n    const {\n      action,\n      historyChanged,\n      referrer,\n      snapshot,\n      snapshotHTML,\n      response,\n      visitCachedSnapshot,\n      willRender,\n      updateHistory,\n      shouldCacheSnapshot,\n      acceptsStreamResponse,\n      direction,\n      refresh\n    } = {\n      ...defaultOptions,\n      ...options\n    };\n    this.action = action;\n    this.historyChanged = historyChanged;\n    this.referrer = referrer;\n    this.snapshot = snapshot;\n    this.snapshotHTML = snapshotHTML;\n    this.response = response;\n    this.isPageRefresh = this.view.isPageRefresh(this);\n    this.visitCachedSnapshot = visitCachedSnapshot;\n    this.willRender = willRender;\n    this.updateHistory = updateHistory;\n    this.scrolled = !willRender;\n    this.shouldCacheSnapshot = shouldCacheSnapshot;\n    this.acceptsStreamResponse = acceptsStreamResponse;\n    this.direction = direction || Direction[action];\n    this.refresh = refresh;\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  get restorationData() {\n    return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)\n  }\n\n  start() {\n    if (this.state == VisitState.initialized) {\n      this.recordTimingMetric(TimingMetric.visitStart);\n      this.state = VisitState.started;\n      this.adapter.visitStarted(this);\n      this.delegate.visitStarted(this);\n    }\n  }\n\n  cancel() {\n    if (this.state == VisitState.started) {\n      if (this.request) {\n        this.request.cancel();\n      }\n      this.cancelRender();\n      this.state = VisitState.canceled;\n    }\n  }\n\n  complete() {\n    if (this.state == VisitState.started) {\n      this.recordTimingMetric(TimingMetric.visitEnd);\n      this.adapter.visitCompleted(this);\n      this.state = VisitState.completed;\n      this.followRedirect();\n\n      if (!this.followedRedirect) {\n        this.delegate.visitCompleted(this);\n      }\n    }\n  }\n\n  fail() {\n    if (this.state == VisitState.started) {\n      this.state = VisitState.failed;\n      this.adapter.visitFailed(this);\n      this.delegate.visitCompleted(this);\n    }\n  }\n\n  changeHistory() {\n    if (!this.historyChanged && this.updateHistory) {\n      const actionForHistory = this.location.href === this.referrer?.href ? \"replace\" : this.action;\n      const method = getHistoryMethodForAction(actionForHistory);\n      this.history.update(method, this.location, this.restorationIdentifier);\n      this.historyChanged = true;\n    }\n  }\n\n  issueRequest() {\n    if (this.hasPreloadedResponse()) {\n      this.simulateRequest();\n    } else if (this.shouldIssueRequest() && !this.request) {\n      this.request = new FetchRequest(this, FetchMethod.get, this.location);\n      this.request.perform();\n    }\n  }\n\n  simulateRequest() {\n    if (this.response) {\n      this.startRequest();\n      this.recordResponse();\n      this.finishRequest();\n    }\n  }\n\n  startRequest() {\n    this.recordTimingMetric(TimingMetric.requestStart);\n    this.adapter.visitRequestStarted(this);\n  }\n\n  recordResponse(response = this.response) {\n    this.response = response;\n    if (response) {\n      const { statusCode } = response;\n      if (isSuccessful(statusCode)) {\n        this.adapter.visitRequestCompleted(this);\n      } else {\n        this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n      }\n    }\n  }\n\n  finishRequest() {\n    this.recordTimingMetric(TimingMetric.requestEnd);\n    this.adapter.visitRequestFinished(this);\n  }\n\n  loadResponse() {\n    if (this.response) {\n      const { statusCode, responseHTML } = this.response;\n      this.render(async () => {\n        if (this.shouldCacheSnapshot) this.cacheSnapshot();\n        if (this.view.renderPromise) await this.view.renderPromise;\n\n        if (isSuccessful(statusCode) && responseHTML != null) {\n          const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n          await this.renderPageSnapshot(snapshot, false);\n\n          this.adapter.visitRendered(this);\n          this.complete();\n        } else {\n          await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n          this.adapter.visitRendered(this);\n          this.fail();\n        }\n      });\n    }\n  }\n\n  getCachedSnapshot() {\n    const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n\n    if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n      if (this.action == \"restore\" || snapshot.isPreviewable) {\n        return snapshot\n      }\n    }\n  }\n\n  getPreloadedSnapshot() {\n    if (this.snapshotHTML) {\n      return PageSnapshot.fromHTMLString(this.snapshotHTML)\n    }\n  }\n\n  hasCachedSnapshot() {\n    return this.getCachedSnapshot() != null\n  }\n\n  loadCachedSnapshot() {\n    const snapshot = this.getCachedSnapshot();\n    if (snapshot) {\n      const isPreview = this.shouldIssueRequest();\n      this.render(async () => {\n        this.cacheSnapshot();\n        if (this.isPageRefresh) {\n          this.adapter.visitRendered(this);\n        } else {\n          if (this.view.renderPromise) await this.view.renderPromise;\n\n          await this.renderPageSnapshot(snapshot, isPreview);\n\n          this.adapter.visitRendered(this);\n          if (!isPreview) {\n            this.complete();\n          }\n        }\n      });\n    }\n  }\n\n  followRedirect() {\n    if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) {\n      this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n        action: \"replace\",\n        response: this.response,\n        shouldCacheSnapshot: false,\n        willRender: false\n      });\n      this.followedRedirect = true;\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (this.acceptsStreamResponse) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted() {\n    this.startRequest();\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {}\n\n  async requestSucceededWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.redirectedToLocation = response.redirected ? response.location : undefined;\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  async requestFailedWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  requestErrored(_request, _error) {\n    this.recordResponse({\n      statusCode: SystemStatusCode.networkFailure,\n      redirected: false\n    });\n  }\n\n  requestFinished() {\n    this.finishRequest();\n  }\n\n  // Scrolling\n\n  performScroll() {\n    if (!this.scrolled && !this.view.forceReloaded && !this.view.shouldPreserveScrollPosition(this)) {\n      if (this.action == \"restore\") {\n        this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n      } else {\n        this.scrollToAnchor() || this.view.scrollToTop();\n      }\n\n      this.scrolled = true;\n    }\n  }\n\n  scrollToRestoredPosition() {\n    const { scrollPosition } = this.restorationData;\n    if (scrollPosition) {\n      this.view.scrollToPosition(scrollPosition);\n      return true\n    }\n  }\n\n  scrollToAnchor() {\n    const anchor = getAnchor(this.location);\n    if (anchor != null) {\n      this.view.scrollToAnchor(anchor);\n      return true\n    }\n  }\n\n  // Instrumentation\n\n  recordTimingMetric(metric) {\n    this.timingMetrics[metric] = new Date().getTime();\n  }\n\n  getTimingMetrics() {\n    return { ...this.timingMetrics }\n  }\n\n  // Private\n\n  hasPreloadedResponse() {\n    return typeof this.response == \"object\"\n  }\n\n  shouldIssueRequest() {\n    if (this.action == \"restore\") {\n      return !this.hasCachedSnapshot()\n    } else {\n      return this.willRender\n    }\n  }\n\n  cacheSnapshot() {\n    if (!this.snapshotCached) {\n      this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n      this.snapshotCached = true;\n    }\n  }\n\n  async render(callback) {\n    this.cancelRender();\n    await new Promise((resolve) => {\n      this.frame =\n        document.visibilityState === \"hidden\" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve());\n    });\n    await callback();\n    delete this.frame;\n  }\n\n  async renderPageSnapshot(snapshot, isPreview) {\n    await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(snapshot), async () => {\n      await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n      this.performScroll();\n    });\n  }\n\n  cancelRender() {\n    if (this.frame) {\n      cancelAnimationFrame(this.frame);\n      delete this.frame;\n    }\n  }\n}\n\nfunction isSuccessful(statusCode) {\n  return statusCode >= 200 && statusCode < 300\n}\n\nclass BrowserAdapter {\n  progressBar = new ProgressBar()\n\n  constructor(session) {\n    this.session = session;\n  }\n\n  visitProposedToLocation(location, options) {\n    if (locationIsVisitable(location, this.navigator.rootLocation)) {\n      this.navigator.startVisit(location, options?.restorationIdentifier || uuid(), options);\n    } else {\n      window.location.href = location.toString();\n    }\n  }\n\n  visitStarted(visit) {\n    this.location = visit.location;\n    this.redirectedToLocation = null;\n\n    visit.loadCachedSnapshot();\n    visit.issueRequest();\n  }\n\n  visitRequestStarted(visit) {\n    this.progressBar.setValue(0);\n    if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n      this.showVisitProgressBarAfterDelay();\n    } else {\n      this.showProgressBar();\n    }\n  }\n\n  visitRequestCompleted(visit) {\n    visit.loadResponse();\n\n    if (visit.response.redirected) {\n      this.redirectedToLocation = visit.redirectedToLocation;\n    }\n  }\n\n  visitRequestFailedWithStatusCode(visit, statusCode) {\n    switch (statusCode) {\n      case SystemStatusCode.networkFailure:\n      case SystemStatusCode.timeoutFailure:\n      case SystemStatusCode.contentTypeMismatch:\n        return this.reload({\n          reason: \"request_failed\",\n          context: {\n            statusCode\n          }\n        })\n      default:\n        return visit.loadResponse()\n    }\n  }\n\n  visitRequestFinished(_visit) {}\n\n  visitCompleted(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  pageInvalidated(reason) {\n    this.reload(reason);\n  }\n\n  visitFailed(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  visitRendered(_visit) {}\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    return true\n  }\n\n  // Form Submission Delegate\n\n  formSubmissionStarted(_formSubmission) {\n    this.progressBar.setValue(0);\n    this.showFormProgressBarAfterDelay();\n  }\n\n  formSubmissionFinished(_formSubmission) {\n    this.progressBar.setValue(1);\n    this.hideFormProgressBar();\n  }\n\n  // Private\n\n  showVisitProgressBarAfterDelay() {\n    this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n  }\n\n  hideVisitProgressBar() {\n    this.progressBar.hide();\n    if (this.visitProgressBarTimeout != null) {\n      window.clearTimeout(this.visitProgressBarTimeout);\n      delete this.visitProgressBarTimeout;\n    }\n  }\n\n  showFormProgressBarAfterDelay() {\n    if (this.formProgressBarTimeout == null) {\n      this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n  }\n\n  hideFormProgressBar() {\n    this.progressBar.hide();\n    if (this.formProgressBarTimeout != null) {\n      window.clearTimeout(this.formProgressBarTimeout);\n      delete this.formProgressBarTimeout;\n    }\n  }\n\n  showProgressBar = () => {\n    this.progressBar.show();\n  }\n\n  reload(reason) {\n    dispatch(\"turbo:reload\", { detail: reason });\n\n    window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href;\n  }\n\n  get navigator() {\n    return this.session.navigator\n  }\n}\n\nclass CacheObserver {\n  selector = \"[data-turbo-temporary]\"\n\n  started = false\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  removeTemporaryElements = (_event) => {\n    for (const element of this.temporaryElements) {\n      element.remove();\n    }\n  }\n\n  get temporaryElements() {\n    return [...document.querySelectorAll(this.selector)]\n  }\n}\n\nclass FrameRedirector {\n  constructor(session, element) {\n    this.session = session;\n    this.element = element;\n    this.linkInterceptor = new LinkInterceptor(this, element);\n    this.formSubmitObserver = new FormSubmitObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n    this.formSubmitObserver.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n    this.formSubmitObserver.stop();\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldRedirect(element)\n  }\n\n  linkClickIntercepted(element, url, event) {\n    const frame = this.#findFrameElement(element);\n    if (frame) {\n      frame.delegate.linkClickIntercepted(element, url, event);\n    }\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return (\n      element.closest(\"turbo-frame\") == null &&\n      this.#shouldSubmit(element, submitter) &&\n      this.#shouldRedirect(element, submitter)\n    )\n  }\n\n  formSubmitted(element, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n    if (frame) {\n      frame.delegate.formSubmitted(element, submitter);\n    }\n  }\n\n  #shouldSubmit(form, submitter) {\n    const action = getAction$1(form, submitter);\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const rootLocation = expandURL(meta?.content ?? \"/\");\n\n    return this.#shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation)\n  }\n\n  #shouldRedirect(element, submitter) {\n    const isNavigatable =\n      element instanceof HTMLFormElement\n        ? this.session.submissionIsNavigatable(element, submitter)\n        : this.session.elementIsNavigatable(element);\n\n    if (isNavigatable) {\n      const frame = this.#findFrameElement(element, submitter);\n      return frame ? frame != element.closest(\"turbo-frame\") : false\n    } else {\n      return false\n    }\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = submitter?.getAttribute(\"data-turbo-frame\") || element.getAttribute(\"data-turbo-frame\");\n    if (id && id != \"_top\") {\n      const frame = this.element.querySelector(`#${id}:not([disabled])`);\n      if (frame instanceof FrameElement) {\n        return frame\n      }\n    }\n  }\n}\n\nclass History {\n  location\n  restorationIdentifier = uuid()\n  restorationData = {}\n  started = false\n  currentIndex = 0\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"popstate\", this.onPopState, false);\n      this.currentIndex = history.state?.turbo?.restorationIndex || 0;\n      this.started = true;\n      this.replace(new URL(window.location.href));\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"popstate\", this.onPopState, false);\n      this.started = false;\n    }\n  }\n\n  push(location, restorationIdentifier) {\n    this.update(history.pushState, location, restorationIdentifier);\n  }\n\n  replace(location, restorationIdentifier) {\n    this.update(history.replaceState, location, restorationIdentifier);\n  }\n\n  update(method, location, restorationIdentifier = uuid()) {\n    if (method === history.pushState) ++this.currentIndex;\n\n    const state = { turbo: { restorationIdentifier, restorationIndex: this.currentIndex } };\n    method.call(history, state, \"\", location.href);\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier;\n  }\n\n  // Restoration data\n\n  getRestorationDataForIdentifier(restorationIdentifier) {\n    return this.restorationData[restorationIdentifier] || {}\n  }\n\n  updateRestorationData(additionalData) {\n    const { restorationIdentifier } = this;\n    const restorationData = this.restorationData[restorationIdentifier];\n    this.restorationData[restorationIdentifier] = {\n      ...restorationData,\n      ...additionalData\n    };\n  }\n\n  // Scroll restoration\n\n  assumeControlOfScrollRestoration() {\n    if (!this.previousScrollRestoration) {\n      this.previousScrollRestoration = history.scrollRestoration ?? \"auto\";\n      history.scrollRestoration = \"manual\";\n    }\n  }\n\n  relinquishControlOfScrollRestoration() {\n    if (this.previousScrollRestoration) {\n      history.scrollRestoration = this.previousScrollRestoration;\n      delete this.previousScrollRestoration;\n    }\n  }\n\n  // Event handlers\n\n  onPopState = (event) => {\n    const { turbo } = event.state || {};\n    this.location = new URL(window.location.href);\n\n    if (turbo) {\n      const { restorationIdentifier, restorationIndex } = turbo;\n      this.restorationIdentifier = restorationIdentifier;\n      const direction = restorationIndex > this.currentIndex ? \"forward\" : \"back\";\n      this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction);\n      this.currentIndex = restorationIndex;\n    } else {\n      this.currentIndex++;\n      this.delegate.historyPoppedWithEmptyState(this.location);\n    }\n  }\n}\n\nclass LinkPrefetchObserver {\n  started = false\n  #prefetchedLink = null\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (this.started) return\n\n    if (this.eventTarget.readyState === \"loading\") {\n      this.eventTarget.addEventListener(\"DOMContentLoaded\", this.#enable, { once: true });\n    } else {\n      this.#enable();\n    }\n  }\n\n  stop() {\n    if (!this.started) return\n\n    this.eventTarget.removeEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.removeEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.removeEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = false;\n  }\n\n  #enable = () => {\n    this.eventTarget.addEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.addEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.addEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = true;\n  }\n\n  #tryToPrefetchRequest = (event) => {\n    if (getMetaContent(\"turbo-prefetch\") === \"false\") return\n\n    const target = event.target;\n    const isLink = target.matches && target.matches(\"a[href]:not([target^=_]):not([download])\");\n\n    if (isLink && this.#isPrefetchable(target)) {\n      const link = target;\n      const location = getLocationForLink(link);\n\n      if (this.delegate.canPrefetchRequestToLocation(link, location)) {\n        this.#prefetchedLink = link;\n\n        const fetchRequest = new FetchRequest(\n          this,\n          FetchMethod.get,\n          location,\n          new URLSearchParams(),\n          target\n        );\n\n        fetchRequest.fetchOptions.priority = \"low\";\n\n        prefetchCache.putLater(location, fetchRequest, this.#cacheTtl);\n      }\n    }\n  }\n\n  #cancelRequestIfObsolete = (event) => {\n    if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();\n  }\n\n  #cancelPrefetchRequest = () => {\n    prefetchCache.clear();\n    this.#prefetchedLink = null;\n  }\n\n  #tryToUsePrefetchedRequest = (event) => {\n    if (event.target.tagName !== \"FORM\" && event.detail.fetchOptions.method === \"GET\") {\n      const cached = prefetchCache.get(event.detail.url);\n\n      if (cached) {\n        // User clicked link, use cache response\n        event.detail.fetchRequest = cached;\n      }\n\n      prefetchCache.clear();\n    }\n  }\n\n  prepareRequest(request) {\n    const link = request.target;\n\n    request.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n\n    const turboFrame = link.closest(\"turbo-frame\");\n    const turboFrameTarget = link.getAttribute(\"data-turbo-frame\") || turboFrame?.getAttribute(\"target\") || turboFrame?.id;\n\n    if (turboFrameTarget && turboFrameTarget !== \"_top\") {\n      request.headers[\"Turbo-Frame\"] = turboFrameTarget;\n    }\n  }\n\n  // Fetch request interface\n\n  requestSucceededWithResponse() {}\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  get #cacheTtl() {\n    return Number(getMetaContent(\"turbo-prefetch-cache-time\")) || cacheTtl\n  }\n\n  #isPrefetchable(link) {\n    const href = link.getAttribute(\"href\");\n\n    if (!href) return false\n\n    if (unfetchableLink(link)) return false\n    if (linkToTheSamePage(link)) return false\n    if (linkOptsOut(link)) return false\n    if (nonSafeLink(link)) return false\n    if (eventPrevented(link)) return false\n\n    return true\n  }\n}\n\nconst unfetchableLink = (link) => {\n  return link.origin !== document.location.origin || ![\"http:\", \"https:\"].includes(link.protocol) || link.hasAttribute(\"target\")\n};\n\nconst linkToTheSamePage = (link) => {\n  return (link.pathname + link.search === document.location.pathname + document.location.search) || link.href.startsWith(\"#\")\n};\n\nconst linkOptsOut = (link) => {\n  if (link.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n  if (link.getAttribute(\"data-turbo\") === \"false\") return true\n\n  const turboPrefetchParent = findClosestRecursively(link, \"[data-turbo-prefetch]\");\n  if (turboPrefetchParent && turboPrefetchParent.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n\n  return false\n};\n\nconst nonSafeLink = (link) => {\n  const turboMethod = link.getAttribute(\"data-turbo-method\");\n  if (turboMethod && turboMethod.toLowerCase() !== \"get\") return true\n\n  if (isUJS(link)) return true\n  if (link.hasAttribute(\"data-turbo-confirm\")) return true\n  if (link.hasAttribute(\"data-turbo-stream\")) return true\n\n  return false\n};\n\nconst isUJS = (link) => {\n  return link.hasAttribute(\"data-remote\") || link.hasAttribute(\"data-behavior\") || link.hasAttribute(\"data-confirm\") || link.hasAttribute(\"data-method\")\n};\n\nconst eventPrevented = (link) => {\n  const event = dispatch(\"turbo:before-prefetch\", { target: link, cancelable: true });\n  return event.defaultPrevented\n};\n\nclass Navigator {\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  proposeVisit(location, options = {}) {\n    if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n      this.delegate.visitProposedToLocation(location, options);\n    }\n  }\n\n  startVisit(locatable, restorationIdentifier, options = {}) {\n    this.stop();\n    this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, {\n      referrer: this.location,\n      ...options\n    });\n    this.currentVisit.start();\n  }\n\n  submitForm(form, submitter) {\n    this.stop();\n    this.formSubmission = new FormSubmission(this, form, submitter, true);\n\n    this.formSubmission.start();\n  }\n\n  stop() {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n      delete this.formSubmission;\n    }\n\n    if (this.currentVisit) {\n      this.currentVisit.cancel();\n      delete this.currentVisit;\n    }\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get rootLocation() {\n    return this.view.snapshot.rootLocation\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted(formSubmission) {\n    // Not all adapters implement formSubmissionStarted\n    if (typeof this.adapter.formSubmissionStarted === \"function\") {\n      this.adapter.formSubmissionStarted(formSubmission);\n    }\n  }\n\n  async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n    if (formSubmission == this.formSubmission) {\n      const responseHTML = await fetchResponse.responseHTML;\n      if (responseHTML) {\n        const shouldCacheSnapshot = formSubmission.isSafe;\n        if (!shouldCacheSnapshot) {\n          this.view.clearSnapshotCache();\n        }\n\n        const { statusCode, redirected } = fetchResponse;\n        const action = this.#getActionForFormSubmission(formSubmission, fetchResponse);\n        const visitOptions = {\n          action,\n          shouldCacheSnapshot,\n          response: { statusCode, responseHTML, redirected }\n        };\n        this.proposeVisit(fetchResponse.location, visitOptions);\n      }\n    }\n  }\n\n  async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    const responseHTML = await fetchResponse.responseHTML;\n\n    if (responseHTML) {\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n      if (fetchResponse.serverError) {\n        await this.view.renderError(snapshot, this.currentVisit);\n      } else {\n        await this.view.renderPage(snapshot, false, true, this.currentVisit);\n      }\n      if (snapshot.refreshScroll !== \"preserve\") {\n        this.view.scrollToTop();\n      }\n      this.view.clearSnapshotCache();\n    }\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished(formSubmission) {\n    // Not all adapters implement formSubmissionFinished\n    if (typeof this.adapter.formSubmissionFinished === \"function\") {\n      this.adapter.formSubmissionFinished(formSubmission);\n    }\n  }\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    // Not all adapters implement linkPrefetchingIsEnabledForLocation\n    if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === \"function\") {\n      return this.adapter.linkPrefetchingIsEnabledForLocation(location)\n    }\n\n    return true\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    this.delegate.visitStarted(visit);\n  }\n\n  visitCompleted(visit) {\n    this.delegate.visitCompleted(visit);\n    delete this.currentVisit;\n  }\n\n  // Same-page links are no longer handled with a Visit.\n  // This method is still needed for Turbo Native adapters.\n  locationWithActionIsSamePage(location, action) {\n    return false\n  }\n\n  // Visits\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  #getActionForFormSubmission(formSubmission, fetchResponse) {\n    const { submitter, formElement } = formSubmission;\n    return getVisitAction(submitter, formElement) || this.#getDefaultAction(fetchResponse)\n  }\n\n  #getDefaultAction(fetchResponse) {\n    const sameLocationRedirect = fetchResponse.redirected && fetchResponse.location.href === this.location?.href;\n    return sameLocationRedirect ? \"replace\" : \"advance\"\n  }\n}\n\nconst PageStage = {\n  initial: 0,\n  loading: 1,\n  interactive: 2,\n  complete: 3\n};\n\nclass PageObserver {\n  stage = PageStage.initial\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      if (this.stage == PageStage.initial) {\n        this.stage = PageStage.loading;\n      }\n      document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n      addEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n      removeEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = false;\n    }\n  }\n\n  interpretReadyState = () => {\n    const { readyState } = this;\n    if (readyState == \"interactive\") {\n      this.pageIsInteractive();\n    } else if (readyState == \"complete\") {\n      this.pageIsComplete();\n    }\n  }\n\n  pageIsInteractive() {\n    if (this.stage == PageStage.loading) {\n      this.stage = PageStage.interactive;\n      this.delegate.pageBecameInteractive();\n    }\n  }\n\n  pageIsComplete() {\n    this.pageIsInteractive();\n    if (this.stage == PageStage.interactive) {\n      this.stage = PageStage.complete;\n      this.delegate.pageLoaded();\n    }\n  }\n\n  pageWillUnload = () => {\n    this.delegate.pageWillUnload();\n  }\n\n  get readyState() {\n    return document.readyState\n  }\n}\n\nclass ScrollObserver {\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"scroll\", this.onScroll, false);\n      this.onScroll();\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"scroll\", this.onScroll, false);\n      this.started = false;\n    }\n  }\n\n  onScroll = () => {\n    this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n  }\n\n  // Private\n\n  updatePosition(position) {\n    this.delegate.scrollPositionChanged(position);\n  }\n}\n\nclass StreamMessageRenderer {\n  render({ fragment }) {\n    Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => {\n      withAutofocusFromFragment(fragment, () => {\n        withPreservedFocus(() => {\n          document.documentElement.appendChild(fragment);\n        });\n      });\n    });\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement, newPermanentElement) {\n    newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n  }\n\n  leavingBardo() {}\n}\n\nfunction getPermanentElementMapForFragment(fragment) {\n  const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n  const permanentElementMap = {};\n  for (const permanentElementInDocument of permanentElementsInDocument) {\n    const { id } = permanentElementInDocument;\n\n    for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n      const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n\n      if (elementInStream) {\n        permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n      }\n    }\n  }\n\n  return permanentElementMap\n}\n\nasync function withAutofocusFromFragment(fragment, callback) {\n  const generatedID = `turbo-stream-autofocus-${uuid()}`;\n  const turboStreams = fragment.querySelectorAll(\"turbo-stream\");\n  const elementWithAutofocus = firstAutofocusableElementInStreams(turboStreams);\n  let willAutofocusId = null;\n\n  if (elementWithAutofocus) {\n    if (elementWithAutofocus.id) {\n      willAutofocusId = elementWithAutofocus.id;\n    } else {\n      willAutofocusId = generatedID;\n    }\n\n    elementWithAutofocus.id = willAutofocusId;\n  }\n\n  callback();\n  await nextRepaint();\n\n  const hasNoActiveElement = document.activeElement == null || document.activeElement == document.body;\n\n  if (hasNoActiveElement && willAutofocusId) {\n    const elementToAutofocus = document.getElementById(willAutofocusId);\n\n    if (elementIsFocusable(elementToAutofocus)) {\n      elementToAutofocus.focus();\n    }\n    if (elementToAutofocus && elementToAutofocus.id == generatedID) {\n      elementToAutofocus.removeAttribute(\"id\");\n    }\n  }\n}\n\nasync function withPreservedFocus(callback) {\n  const [activeElementBeforeRender, activeElementAfterRender] = await around(callback, () => document.activeElement);\n\n  const restoreFocusTo = activeElementBeforeRender && activeElementBeforeRender.id;\n\n  if (restoreFocusTo) {\n    const elementToFocus = document.getElementById(restoreFocusTo);\n\n    if (elementIsFocusable(elementToFocus) && elementToFocus != activeElementAfterRender) {\n      elementToFocus.focus();\n    }\n  }\n}\n\nfunction firstAutofocusableElementInStreams(nodeListOfStreamElements) {\n  for (const streamElement of nodeListOfStreamElements) {\n    const elementWithAutofocus = queryAutofocusableElement(streamElement.templateElement.content);\n\n    if (elementWithAutofocus) return elementWithAutofocus\n  }\n\n  return null\n}\n\nclass StreamObserver {\n  sources = new Set()\n  #started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.#started) {\n      this.#started = true;\n      addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  stop() {\n    if (this.#started) {\n      this.#started = false;\n      removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  connectStreamSource(source) {\n    if (!this.streamSourceIsConnected(source)) {\n      this.sources.add(source);\n      source.addEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  disconnectStreamSource(source) {\n    if (this.streamSourceIsConnected(source)) {\n      this.sources.delete(source);\n      source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  streamSourceIsConnected(source) {\n    return this.sources.has(source)\n  }\n\n  inspectFetchResponse = (event) => {\n    const response = fetchResponseFromEvent(event);\n    if (response && fetchResponseIsStream(response)) {\n      event.preventDefault();\n      this.receiveMessageResponse(response);\n    }\n  }\n\n  receiveMessageEvent = (event) => {\n    if (this.#started && typeof event.data == \"string\") {\n      this.receiveMessageHTML(event.data);\n    }\n  }\n\n  async receiveMessageResponse(response) {\n    const html = await response.responseHTML;\n    if (html) {\n      this.receiveMessageHTML(html);\n    }\n  }\n\n  receiveMessageHTML(html) {\n    this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n  }\n}\n\nfunction fetchResponseFromEvent(event) {\n  const fetchResponse = event.detail?.fetchResponse;\n  if (fetchResponse instanceof FetchResponse) {\n    return fetchResponse\n  }\n}\n\nfunction fetchResponseIsStream(response) {\n  const contentType = response.contentType ?? \"\";\n  return contentType.startsWith(StreamMessage.contentType)\n}\n\nclass ErrorRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const { documentElement, body } = document;\n\n    documentElement.replaceChild(newElement, body);\n  }\n\n  async render() {\n    this.replaceHeadAndBody();\n    this.activateScriptElements();\n  }\n\n  replaceHeadAndBody() {\n    const { documentElement, head } = document;\n    documentElement.replaceChild(this.newHead, head);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  activateScriptElements() {\n    for (const replaceableElement of this.scriptElements) {\n      const parentNode = replaceableElement.parentNode;\n      if (parentNode) {\n        const element = activateScriptElement(replaceableElement);\n        parentNode.replaceChild(element, replaceableElement);\n      }\n    }\n  }\n\n  get newHead() {\n    return this.newSnapshot.headSnapshot.element\n  }\n\n  get scriptElements() {\n    return document.documentElement.querySelectorAll(\"script\")\n  }\n}\n\nclass PageRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    if (document.body && newElement instanceof HTMLBodyElement) {\n      document.body.replaceWith(newElement);\n    } else {\n      document.documentElement.appendChild(newElement);\n    }\n  }\n\n  get shouldRender() {\n    return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical\n  }\n\n  get reloadReason() {\n    if (!this.newSnapshot.isVisitable) {\n      return {\n        reason: \"turbo_visit_control_is_reload\"\n      }\n    }\n\n    if (!this.trackedElementsAreIdentical) {\n      return {\n        reason: \"tracked_element_mismatch\"\n      }\n    }\n  }\n\n  async prepareToRender() {\n    this.#setLanguage();\n    await this.mergeHead();\n  }\n\n  async render() {\n    if (this.willRender) {\n      await this.replaceBody();\n    }\n  }\n\n  finishRendering() {\n    super.finishRendering();\n    if (!this.isPreview) {\n      this.focusFirstAutofocusableElement();\n    }\n  }\n\n  get currentHeadSnapshot() {\n    return this.currentSnapshot.headSnapshot\n  }\n\n  get newHeadSnapshot() {\n    return this.newSnapshot.headSnapshot\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  #setLanguage() {\n    const { documentElement } = this.currentSnapshot;\n    const { dir, lang } = this.newSnapshot;\n\n    if (lang) {\n      documentElement.setAttribute(\"lang\", lang);\n    } else {\n      documentElement.removeAttribute(\"lang\");\n    }\n    if (dir) {\n      documentElement.setAttribute(\"dir\", dir);\n    } else {\n      documentElement.removeAttribute(\"dir\");\n    }\n  }\n\n  async mergeHead() {\n    const mergedHeadElements = this.mergeProvisionalElements();\n    const newStylesheetElements = this.copyNewHeadStylesheetElements();\n    this.copyNewHeadScriptElements();\n\n    await mergedHeadElements;\n    await newStylesheetElements;\n\n    if (this.willRender) {\n      this.removeUnusedDynamicStylesheetElements();\n    }\n  }\n\n  async replaceBody() {\n    await this.preservingPermanentElements(async () => {\n      this.activateNewBody();\n      await this.assignNewBody();\n    });\n  }\n\n  get trackedElementsAreIdentical() {\n    return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature\n  }\n\n  async copyNewHeadStylesheetElements() {\n    const loadingElements = [];\n\n    for (const element of this.newHeadStylesheetElements) {\n      loadingElements.push(waitForLoad(element));\n\n      document.head.appendChild(element);\n    }\n\n    await Promise.all(loadingElements);\n  }\n\n  copyNewHeadScriptElements() {\n    for (const element of this.newHeadScriptElements) {\n      document.head.appendChild(activateScriptElement(element));\n    }\n  }\n\n  removeUnusedDynamicStylesheetElements() {\n    for (const element of this.unusedDynamicStylesheetElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  async mergeProvisionalElements() {\n    const newHeadElements = [...this.newHeadProvisionalElements];\n\n    for (const element of this.currentHeadProvisionalElements) {\n      if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n        document.head.removeChild(element);\n      }\n    }\n\n    for (const element of newHeadElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  isCurrentElementInElementList(element, elementList) {\n    for (const [index, newElement] of elementList.entries()) {\n      // if title element...\n      if (element.tagName == \"TITLE\") {\n        if (newElement.tagName != \"TITLE\") {\n          continue\n        }\n        if (element.innerHTML == newElement.innerHTML) {\n          elementList.splice(index, 1);\n          return true\n        }\n      }\n\n      // if any other element...\n      if (newElement.isEqualNode(element)) {\n        elementList.splice(index, 1);\n        return true\n      }\n    }\n\n    return false\n  }\n\n  removeCurrentHeadProvisionalElements() {\n    for (const element of this.currentHeadProvisionalElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  copyNewHeadProvisionalElements() {\n    for (const element of this.newHeadProvisionalElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  activateNewBody() {\n    document.adoptNode(this.newElement);\n    this.removeNoscriptElements();\n    this.activateNewBodyScriptElements();\n  }\n\n  removeNoscriptElements() {\n    for (const noscriptElement of this.newElement.querySelectorAll(\"noscript\")) {\n      noscriptElement.remove();\n    }\n  }\n\n  activateNewBodyScriptElements() {\n    for (const inertScriptElement of this.newBodyScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  async assignNewBody() {\n    await this.renderElement(this.currentElement, this.newElement);\n  }\n\n  get unusedDynamicStylesheetElements() {\n    return this.oldHeadStylesheetElements.filter((element) => {\n      return element.getAttribute(\"data-turbo-track\") === \"dynamic\"\n    })\n  }\n\n  get oldHeadStylesheetElements() {\n    return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)\n  }\n\n  get newHeadStylesheetElements() {\n    return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get newHeadScriptElements() {\n    return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get currentHeadProvisionalElements() {\n    return this.currentHeadSnapshot.provisionalElements\n  }\n\n  get newHeadProvisionalElements() {\n    return this.newHeadSnapshot.provisionalElements\n  }\n\n  get newBodyScriptElements() {\n    return this.newElement.querySelectorAll(\"script\")\n  }\n}\n\nclass MorphingPageRenderer extends PageRenderer {\n  static renderElement(currentElement, newElement) {\n    morphElements(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              !closestFrameReloadableWithMorphing(node)\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n\n    dispatch(\"turbo:morph\", { detail: { currentElement, newElement } });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n\n  get renderMethod() {\n    return \"morph\"\n  }\n\n  get shouldAutofocus() {\n    return false\n  }\n}\n\nclass SnapshotCache extends LRUCache {\n  constructor(size) {\n    super(size, toCacheKey);\n  }\n\n  get snapshots() {\n    return this.entries\n  }\n}\n\nclass PageView extends View {\n  snapshotCache = new SnapshotCache(10)\n  lastRenderedLocation = new URL(location.href)\n  forceReloaded = false\n\n  shouldTransitionTo(newSnapshot) {\n    return this.snapshot.prefersViewTransitions && newSnapshot.prefersViewTransitions\n  }\n\n  renderPage(snapshot, isPreview = false, willRender = true, visit) {\n    const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === \"morph\";\n    const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer;\n\n    const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender);\n\n    if (!renderer.shouldRender) {\n      this.forceReloaded = true;\n    } else {\n      visit?.changeHistory();\n    }\n\n    return this.render(renderer)\n  }\n\n  renderError(snapshot, visit) {\n    visit?.changeHistory();\n    const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n    return this.render(renderer)\n  }\n\n  clearSnapshotCache() {\n    this.snapshotCache.clear();\n  }\n\n  async cacheSnapshot(snapshot = this.snapshot) {\n    if (snapshot.isCacheable) {\n      this.delegate.viewWillCacheSnapshot();\n      const { lastRenderedLocation: location } = this;\n      await nextEventLoopTick();\n      const cachedSnapshot = snapshot.clone();\n      this.snapshotCache.put(location, cachedSnapshot);\n      return cachedSnapshot\n    }\n  }\n\n  getCachedSnapshotForLocation(location) {\n    return this.snapshotCache.get(location)\n  }\n\n  isPageRefresh(visit) {\n    return !visit || (this.lastRenderedLocation.pathname === visit.location.pathname && visit.action === \"replace\")\n  }\n\n  shouldPreserveScrollPosition(visit) {\n    return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === \"preserve\"\n  }\n\n  get snapshot() {\n    return PageSnapshot.fromElement(this.element)\n  }\n}\n\nclass Preloader {\n  selector = \"a[data-turbo-preload]\"\n\n  constructor(delegate, snapshotCache) {\n    this.delegate = delegate;\n    this.snapshotCache = snapshotCache;\n  }\n\n  start() {\n    if (document.readyState === \"loading\") {\n      document.addEventListener(\"DOMContentLoaded\", this.#preloadAll);\n    } else {\n      this.preloadOnLoadLinksForView(document.body);\n    }\n  }\n\n  stop() {\n    document.removeEventListener(\"DOMContentLoaded\", this.#preloadAll);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    for (const link of element.querySelectorAll(this.selector)) {\n      if (this.delegate.shouldPreloadLink(link)) {\n        this.preloadURL(link);\n      }\n    }\n  }\n\n  async preloadURL(link) {\n    const location = new URL(link.href);\n\n    if (this.snapshotCache.has(location)) {\n      return\n    }\n\n    const fetchRequest = new FetchRequest(this, FetchMethod.get, location, new URLSearchParams(), link);\n    await fetchRequest.perform();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(fetchRequest) {\n    fetchRequest.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n  }\n\n  async requestSucceededWithResponse(fetchRequest, fetchResponse) {\n    try {\n      const responseHTML = await fetchResponse.responseHTML;\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n\n      this.snapshotCache.put(fetchRequest.url, snapshot);\n    } catch (_) {\n      // If we cannot preload that is ok!\n    }\n  }\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  #preloadAll = () => {\n    this.preloadOnLoadLinksForView(document.body);\n  }\n}\n\nclass Cache {\n  constructor(session) {\n    this.session = session;\n  }\n\n  clear() {\n    this.session.clearCache();\n  }\n\n  resetCacheControl() {\n    this.#setCacheControl(\"\");\n  }\n\n  exemptPageFromCache() {\n    this.#setCacheControl(\"no-cache\");\n  }\n\n  exemptPageFromPreview() {\n    this.#setCacheControl(\"no-preview\");\n  }\n\n  #setCacheControl(value) {\n    setMetaContent(\"turbo-cache-control\", value);\n  }\n}\n\nclass Session {\n  navigator = new Navigator(this)\n  history = new History(this)\n  view = new PageView(this, document.documentElement)\n  adapter = new BrowserAdapter(this)\n\n  pageObserver = new PageObserver(this)\n  cacheObserver = new CacheObserver()\n  linkPrefetchObserver = new LinkPrefetchObserver(this, document)\n  linkClickObserver = new LinkClickObserver(this, window)\n  formSubmitObserver = new FormSubmitObserver(this, document)\n  scrollObserver = new ScrollObserver(this)\n  streamObserver = new StreamObserver(this)\n  formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement)\n  frameRedirector = new FrameRedirector(this, document.documentElement)\n  streamMessageRenderer = new StreamMessageRenderer()\n  cache = new Cache(this)\n\n  enabled = true\n  started = false\n  #pageRefreshDebouncePeriod = 150\n\n  constructor(recentRequests) {\n    this.recentRequests = recentRequests;\n    this.preloader = new Preloader(this, this.view.snapshotCache);\n    this.debouncedRefresh = this.refresh;\n    this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod;\n  }\n\n  start() {\n    if (!this.started) {\n      this.pageObserver.start();\n      this.cacheObserver.start();\n      this.linkPrefetchObserver.start();\n      this.formLinkClickObserver.start();\n      this.linkClickObserver.start();\n      this.formSubmitObserver.start();\n      this.scrollObserver.start();\n      this.streamObserver.start();\n      this.frameRedirector.start();\n      this.history.start();\n      this.preloader.start();\n      this.started = true;\n      this.enabled = true;\n    }\n  }\n\n  disable() {\n    this.enabled = false;\n  }\n\n  stop() {\n    if (this.started) {\n      this.pageObserver.stop();\n      this.cacheObserver.stop();\n      this.linkPrefetchObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkClickObserver.stop();\n      this.formSubmitObserver.stop();\n      this.scrollObserver.stop();\n      this.streamObserver.stop();\n      this.frameRedirector.stop();\n      this.history.stop();\n      this.preloader.stop();\n      this.started = false;\n    }\n  }\n\n  registerAdapter(adapter) {\n    this.adapter = adapter;\n  }\n\n  visit(location, options = {}) {\n    const frameElement = options.frame ? document.getElementById(options.frame) : null;\n\n    if (frameElement instanceof FrameElement) {\n      const action = options.action || getVisitAction(frameElement);\n\n      frameElement.delegate.proposeVisitIfNavigatedWithAction(frameElement, action);\n      frameElement.src = location.toString();\n    } else {\n      this.navigator.proposeVisit(expandURL(location), options);\n    }\n  }\n\n  refresh(url, options = {}) {\n    options = typeof options === \"string\" ? { requestId: options } : options;\n\n    const { method, requestId, scroll } = options;\n    const isRecentRequest = requestId && this.recentRequests.has(requestId);\n    const isCurrentUrl = url === document.baseURI;\n    if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) {\n      this.visit(url, { action: \"replace\", shouldCacheSnapshot: false, refresh: { method, scroll } });\n    }\n  }\n\n  connectStreamSource(source) {\n    this.streamObserver.connectStreamSource(source);\n  }\n\n  disconnectStreamSource(source) {\n    this.streamObserver.disconnectStreamSource(source);\n  }\n\n  renderStreamMessage(message) {\n    this.streamMessageRenderer.render(StreamMessage.wrap(message));\n  }\n\n  clearCache() {\n    this.view.clearSnapshotCache();\n  }\n\n  setProgressBarDelay(delay) {\n    console.warn(\n      \"Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`\"\n    );\n\n    this.progressBarDelay = delay;\n  }\n\n  set progressBarDelay(delay) {\n    config.drive.progressBarDelay = delay;\n  }\n\n  get progressBarDelay() {\n    return config.drive.progressBarDelay\n  }\n\n  set drive(value) {\n    config.drive.enabled = value;\n  }\n\n  get drive() {\n    return config.drive.enabled\n  }\n\n  set formMode(value) {\n    config.forms.mode = value;\n  }\n\n  get formMode() {\n    return config.forms.mode\n  }\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  get pageRefreshDebouncePeriod() {\n    return this.#pageRefreshDebouncePeriod\n  }\n\n  set pageRefreshDebouncePeriod(value) {\n    this.refresh = debounce(this.debouncedRefresh.bind(this), value);\n    this.#pageRefreshDebouncePeriod = value;\n  }\n\n  // Preloader delegate\n\n  shouldPreloadLink(element) {\n    const isUnsafe = element.hasAttribute(\"data-turbo-method\");\n    const isStream = element.hasAttribute(\"data-turbo-stream\");\n    const frameTarget = element.getAttribute(\"data-turbo-frame\");\n    const frame = frameTarget == \"_top\" ?\n      null :\n      document.getElementById(frameTarget) || findClosestRecursively(element, \"turbo-frame:not([disabled])\");\n\n    if (isUnsafe || isStream || frame instanceof FrameElement) {\n      return false\n    } else {\n      const location = new URL(element.href);\n\n      return this.elementIsNavigatable(element) && locationIsVisitable(location, this.snapshot.rootLocation)\n    }\n  }\n\n  // History delegate\n\n  historyPoppedToLocationWithRestorationIdentifierAndDirection(location, restorationIdentifier, direction) {\n    if (this.enabled) {\n      this.navigator.startVisit(location, restorationIdentifier, {\n        action: \"restore\",\n        historyChanged: true,\n        direction\n      });\n    } else {\n      this.adapter.pageInvalidated({\n        reason: \"turbo_disabled\"\n      });\n    }\n  }\n\n  historyPoppedWithEmptyState(location) {\n    this.history.replace(location);\n    this.view.lastRenderedLocation = location;\n    this.view.cacheSnapshot();\n  }\n\n  // Scroll observer delegate\n\n  scrollPositionChanged(position) {\n    this.history.updateRestorationData({ scrollPosition: position });\n  }\n\n  // Form click observer delegate\n\n  willSubmitFormLinkToLocation(link, location) {\n    return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation)\n  }\n\n  submittedFormLinkToLocation() {}\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.navigator.linkPrefetchingIsEnabledForLocation(location)\n    )\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, event) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.applicationAllowsFollowingLinkToLocation(link, location, event)\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const action = this.getActionForLink(link);\n    const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n\n    this.visit(location.href, { action, acceptsStreamResponse });\n  }\n\n  // Navigator delegate\n\n  allowsVisitingLocationWithAction(location, action) {\n    return this.applicationAllowsVisitingLocation(location)\n  }\n\n  visitProposedToLocation(location, options) {\n    extendURLWithDeprecatedProperties(location);\n    this.adapter.visitProposedToLocation(location, options);\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    if (!visit.acceptsStreamResponse) {\n      markAsBusy(document.documentElement);\n      this.view.markVisitDirection(visit.direction);\n    }\n    extendURLWithDeprecatedProperties(visit.location);\n    this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n  }\n\n  visitCompleted(visit) {\n    this.view.unmarkVisitDirection();\n    clearBusyState(document.documentElement);\n    this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return (\n      this.submissionIsNavigatable(form, submitter) &&\n      locationIsVisitable(expandURL(action), this.snapshot.rootLocation)\n    )\n  }\n\n  formSubmitted(form, submitter) {\n    this.navigator.submitForm(form, submitter);\n  }\n\n  // Page observer delegate\n\n  pageBecameInteractive() {\n    this.view.lastRenderedLocation = this.location;\n    this.notifyApplicationAfterPageLoad();\n  }\n\n  pageLoaded() {\n    this.history.assumeControlOfScrollRestoration();\n  }\n\n  pageWillUnload() {\n    this.history.relinquishControlOfScrollRestoration();\n  }\n\n  // Stream observer delegate\n\n  receivedMessageFromStream(message) {\n    this.renderStreamMessage(message);\n  }\n\n  // Page view delegate\n\n  viewWillCacheSnapshot() {\n    this.notifyApplicationBeforeCachingSnapshot();\n  }\n\n  allowsImmediateRender({ element }, options) {\n    const event = this.notifyApplicationBeforeRender(element, options);\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, renderMethod) {\n    this.view.lastRenderedLocation = this.history.location;\n    this.notifyApplicationAfterRender(renderMethod);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    this.preloader.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated(reason) {\n    this.adapter.pageInvalidated(reason);\n  }\n\n  // Frame element\n\n  frameLoaded(frame) {\n    this.notifyApplicationAfterFrameLoad(frame);\n  }\n\n  frameRendered(fetchResponse, frame) {\n    this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n  }\n\n  // Application events\n\n  applicationAllowsFollowingLinkToLocation(link, location, ev) {\n    const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n    return !event.defaultPrevented\n  }\n\n  applicationAllowsVisitingLocation(location) {\n    const event = this.notifyApplicationBeforeVisitingLocation(location);\n    return !event.defaultPrevented\n  }\n\n  notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n    return dispatch(\"turbo:click\", {\n      target: link,\n      detail: { url: location.href, originalEvent: event },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationBeforeVisitingLocation(location) {\n    return dispatch(\"turbo:before-visit\", {\n      detail: { url: location.href },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterVisitingLocation(location, action) {\n    return dispatch(\"turbo:visit\", { detail: { url: location.href, action } })\n  }\n\n  notifyApplicationBeforeCachingSnapshot() {\n    return dispatch(\"turbo:before-cache\")\n  }\n\n  notifyApplicationBeforeRender(newBody, options) {\n    return dispatch(\"turbo:before-render\", {\n      detail: { newBody, ...options },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterRender(renderMethod) {\n    return dispatch(\"turbo:render\", { detail: { renderMethod } })\n  }\n\n  notifyApplicationAfterPageLoad(timing = {}) {\n    return dispatch(\"turbo:load\", {\n      detail: { url: this.location.href, timing }\n    })\n  }\n\n  notifyApplicationAfterFrameLoad(frame) {\n    return dispatch(\"turbo:frame-load\", { target: frame })\n  }\n\n  notifyApplicationAfterFrameRender(fetchResponse, frame) {\n    return dispatch(\"turbo:frame-render\", {\n      detail: { fetchResponse },\n      target: frame,\n      cancelable: true\n    })\n  }\n\n  // Helpers\n\n  submissionIsNavigatable(form, submitter) {\n    if (config.forms.mode == \"off\") {\n      return false\n    } else {\n      const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n\n      if (config.forms.mode == \"optin\") {\n        return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null\n      } else {\n        return submitterIsNavigatable && this.elementIsNavigatable(form)\n      }\n    }\n  }\n\n  elementIsNavigatable(element) {\n    const container = findClosestRecursively(element, \"[data-turbo]\");\n    const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n\n    // Check if Drive is enabled on the session or we're within a Frame.\n    if (config.drive.enabled || withinFrame) {\n      // Element is navigatable by default, unless `data-turbo=\"false\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") != \"false\"\n      } else {\n        return true\n      }\n    } else {\n      // Element isn't navigatable by default, unless `data-turbo=\"true\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") == \"true\"\n      } else {\n        return false\n      }\n    }\n  }\n\n  // Private\n\n  getActionForLink(link) {\n    return getVisitAction(link) || \"advance\"\n  }\n\n  get snapshot() {\n    return this.view.snapshot\n  }\n}\n\n// Older versions of the Turbo Native adapters referenced the\n// `Location#absoluteURL` property in their implementations of\n// the `Adapter#visitProposedToLocation()` and `#visitStarted()`\n// methods. The Location class has since been removed in favor\n// of the DOM URL API, and accordingly all Adapter methods now\n// receive URL objects.\n//\n// We alias #absoluteURL to #toString() here to avoid crashing\n// older adapters which do not expect URL objects. We should\n// consider removing this support at some point in the future.\n\nfunction extendURLWithDeprecatedProperties(url) {\n  Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\n\nconst deprecatedLocationPropertyDescriptors = {\n  absoluteURL: {\n    get() {\n      return this.toString()\n    }\n  }\n};\n\nconst session = new Session(recentRequests);\n\n// Rename `navigator` to avoid shadowing `window.navigator`\nconst { cache, navigator: sessionNavigator } = session;\n\n/**\n * Starts the main session.\n * This initialises any necessary observers such as those to monitor\n * link interactions.\n */\nfunction start() {\n  session.start();\n}\n\n/**\n * Registers an adapter for the main session.\n *\n * @param adapter Adapter to register\n */\nfunction registerAdapter(adapter) {\n  session.registerAdapter(adapter);\n}\n\n/**\n * Performs an application visit to the given location.\n *\n * @param location Location to visit (a URL or path)\n * @param options Options to apply\n * @param options.action Type of history navigation to apply (\"restore\",\n * \"replace\" or \"advance\")\n * @param options.historyChanged Specifies whether the browser history has\n * already been changed for this visit or not\n * @param options.referrer Specifies the referrer of this visit such that\n * navigations to the same page will not result in a new history entry.\n * @param options.snapshotHTML Cached snapshot to render\n * @param options.response Response of the specified location\n */\nfunction visit(location, options) {\n  session.visit(location, options);\n}\n\n/**\n * Connects a stream source to the main session.\n *\n * @param source Stream source to connect\n */\nfunction connectStreamSource(source) {\n  session.connectStreamSource(source);\n}\n\n/**\n * Disconnects a stream source from the main session.\n *\n * @param source Stream source to disconnect\n */\nfunction disconnectStreamSource(source) {\n  session.disconnectStreamSource(source);\n}\n\n/**\n * Renders a stream message to the main session by appending it to the\n * current document.\n *\n * @param message Message to render\n */\nfunction renderStreamMessage(message) {\n  session.renderStreamMessage(message);\n}\n\n/**\n * Sets the delay after which the progress bar will appear during navigation.\n *\n * The progress bar appears after 500ms by default.\n *\n * Note that this method has no effect when used with the iOS or Android\n * adapters.\n *\n * @param delay Time to delay in milliseconds\n */\nfunction setProgressBarDelay(delay) {\n  console.warn(\n    \"Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.drive.progressBarDelay = delay;\n}\n\nfunction setConfirmMethod(confirmMethod) {\n  console.warn(\n    \"Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.confirm = confirmMethod;\n}\n\nfunction setFormMode(mode) {\n  console.warn(\n    \"Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.mode = mode;\n}\n\n/**\n * Morph the state of the currentBody based on the attributes and contents of\n * the newBody. Morphing body elements may dispatch turbo:morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentBody HTMLBodyElement destination of morphing changes\n * @param newBody HTMLBodyElement source of morphing changes\n */\nfunction morphBodyElements(currentBody, newBody) {\n  MorphingPageRenderer.renderElement(currentBody, newBody);\n}\n\n/**\n * Morph the child elements of the currentFrame based on the child elements of\n * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentFrame FrameElement destination of morphing children changes\n * @param newFrame FrameElement source of morphing children changes\n */\nfunction morphTurboFrameElements(currentFrame, newFrame) {\n  MorphingFrameRenderer.renderElement(currentFrame, newFrame);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  PageRenderer: PageRenderer,\n  PageSnapshot: PageSnapshot,\n  FrameRenderer: FrameRenderer,\n  fetch: fetchWithTurboHeaders,\n  config: config,\n  session: session,\n  cache: cache,\n  navigator: sessionNavigator,\n  start: start,\n  registerAdapter: registerAdapter,\n  visit: visit,\n  connectStreamSource: connectStreamSource,\n  disconnectStreamSource: disconnectStreamSource,\n  renderStreamMessage: renderStreamMessage,\n  setProgressBarDelay: setProgressBarDelay,\n  setConfirmMethod: setConfirmMethod,\n  setFormMode: setFormMode,\n  morphBodyElements: morphBodyElements,\n  morphTurboFrameElements: morphTurboFrameElements,\n  morphChildren: morphChildren,\n  morphElements: morphElements\n});\n\nclass TurboFrameMissingError extends Error {}\n\nclass FrameController {\n  fetchResponseLoaded = (_fetchResponse) => Promise.resolve()\n  #currentFetchRequest = null\n  #resolveVisitPromise = () => {}\n  #connected = false\n  #hasBeenLoaded = false\n  #ignoredAttributes = new Set()\n  #shouldMorphFrame = false\n  action = null\n\n  constructor(element) {\n    this.element = element;\n    this.view = new FrameView(this, this.element);\n    this.appearanceObserver = new AppearanceObserver(this, this.element);\n    this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n    this.linkInterceptor = new LinkInterceptor(this, this.element);\n    this.restorationIdentifier = uuid();\n    this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n  }\n\n  // Frame delegate\n\n  connect() {\n    if (!this.#connected) {\n      this.#connected = true;\n      if (this.loadingStyle == FrameLoadingStyle.lazy) {\n        this.appearanceObserver.start();\n      } else {\n        this.#loadSourceURL();\n      }\n      this.formLinkClickObserver.start();\n      this.linkInterceptor.start();\n      this.formSubmitObserver.start();\n    }\n  }\n\n  disconnect() {\n    if (this.#connected) {\n      this.#connected = false;\n      this.appearanceObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkInterceptor.stop();\n      this.formSubmitObserver.stop();\n\n      if (!this.element.hasAttribute(\"recurse\")) {\n        this.#currentFetchRequest?.cancel();\n      }\n    }\n  }\n\n  disabledChanged() {\n    if (this.disabled) {\n      this.#currentFetchRequest?.cancel();\n    } else if (this.loadingStyle == FrameLoadingStyle.eager) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLChanged() {\n    if (this.#isIgnoringChangesTo(\"src\")) return\n\n    if (!this.sourceURL) {\n      this.#currentFetchRequest?.cancel();\n    }\n\n    if (this.element.isConnected) {\n      this.complete = false;\n    }\n\n    if (this.loadingStyle == FrameLoadingStyle.eager || this.#hasBeenLoaded) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLReloaded() {\n    const { refresh, src } = this.element;\n\n    this.#shouldMorphFrame = src && refresh === \"morph\";\n\n    this.element.removeAttribute(\"complete\");\n    this.element.src = null;\n    this.element.src = src;\n    return this.element.loaded\n  }\n\n  loadingStyleChanged() {\n    if (this.loadingStyle == FrameLoadingStyle.lazy) {\n      this.appearanceObserver.start();\n    } else {\n      this.appearanceObserver.stop();\n      this.#loadSourceURL();\n    }\n  }\n\n  async #loadSourceURL() {\n    if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n      this.element.loaded = this.#visit(expandURL(this.sourceURL));\n      this.appearanceObserver.stop();\n      await this.element.loaded;\n      this.#hasBeenLoaded = true;\n    }\n  }\n\n  async loadResponse(fetchResponse) {\n    if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n      this.sourceURL = fetchResponse.response.url;\n    }\n\n    try {\n      const html = await fetchResponse.responseHTML;\n      if (html) {\n        const document = parseHTMLDocument(html);\n        const pageSnapshot = PageSnapshot.fromDocument(document);\n\n        if (pageSnapshot.isVisitable) {\n          await this.#loadFrameResponse(fetchResponse, document);\n        } else {\n          await this.#handleUnvisitableFrameResponse(fetchResponse);\n        }\n      }\n    } finally {\n      this.#shouldMorphFrame = false;\n      this.fetchResponseLoaded = () => Promise.resolve();\n    }\n  }\n\n  // Appearance observer delegate\n\n  elementAppearedInViewport(element) {\n    this.proposeVisitIfNavigatedWithAction(element, getVisitAction(element));\n    this.#loadSourceURL();\n  }\n\n  // Form link click observer delegate\n\n  willSubmitFormLinkToLocation(link) {\n    return this.#shouldInterceptNavigation(link)\n  }\n\n  submittedFormLinkToLocation(link, _location, form) {\n    const frame = this.#findFrameElement(link);\n    if (frame) form.setAttribute(\"data-turbo-frame\", frame.id);\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldInterceptNavigation(element)\n  }\n\n  linkClickIntercepted(element, location) {\n    this.#navigateFrame(element, location);\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return element.closest(\"turbo-frame\") == this.element && this.#shouldInterceptNavigation(element, submitter)\n  }\n\n  formSubmitted(element, submitter) {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n    }\n\n    this.formSubmission = new FormSubmission(this, element, submitter);\n\n    const { fetchRequest } = this.formSubmission;\n    const frame = this.#findFrameElement(element, submitter);\n\n    this.prepareRequest(fetchRequest, frame);\n    this.formSubmission.start();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request, frame = this) {\n    request.headers[\"Turbo-Frame\"] = frame.id;\n\n    if (this.currentNavigationElement?.hasAttribute(\"data-turbo-stream\")) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    markAsBusy(this.element);\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {\n    this.#resolveVisitPromise();\n  }\n\n  async requestSucceededWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  async requestFailedWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  requestErrored(request, error) {\n    console.error(error);\n    this.#resolveVisitPromise();\n  }\n\n  requestFinished(_request) {\n    clearBusyState(this.element);\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted({ formElement }) {\n    markAsBusy(formElement, this.#findFrameElement(formElement));\n  }\n\n  formSubmissionSucceededWithResponse(formSubmission, response) {\n    const frame = this.#findFrameElement(formSubmission.formElement, formSubmission.submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(formSubmission.submitter, formSubmission.formElement, frame));\n    frame.delegate.loadResponse(response);\n\n    if (!formSubmission.isSafe) {\n      session.clearCache();\n    }\n  }\n\n  formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    this.element.delegate.loadResponse(fetchResponse);\n    session.clearCache();\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished({ formElement }) {\n    clearBusyState(formElement, this.#findFrameElement(formElement));\n  }\n\n  // View delegate\n\n  allowsImmediateRender({ element: newFrame }, options) {\n    const event = dispatch(\"turbo:before-frame-render\", {\n      target: this.element,\n      detail: { newFrame, ...options },\n      cancelable: true\n    });\n\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, _renderMethod) {}\n\n  preloadOnLoadLinksForView(element) {\n    session.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated() {}\n\n  // Frame renderer delegate\n\n  willRenderFrame(currentElement, _newElement) {\n    this.previousFrameElement = currentElement.cloneNode(true);\n  }\n\n  visitCachedSnapshot = ({ element }) => {\n    const frame = element.querySelector(\"#\" + this.element.id);\n\n    if (frame && this.previousFrameElement) {\n      frame.replaceChildren(...this.previousFrameElement.children);\n    }\n\n    delete this.previousFrameElement;\n  }\n\n  // Private\n\n  async #loadFrameResponse(fetchResponse, document) {\n    const newFrameElement = await this.extractForeignFrameElement(document.body);\n    const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer;\n\n    if (newFrameElement) {\n      const snapshot = new Snapshot(newFrameElement);\n      const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false);\n      if (this.view.renderPromise) await this.view.renderPromise;\n      this.changeHistory();\n\n      await this.view.render(renderer);\n      this.complete = true;\n      session.frameRendered(fetchResponse, this.element);\n      session.frameLoaded(this.element);\n      await this.fetchResponseLoaded(fetchResponse);\n    } else if (this.#willHandleFrameMissingFromResponse(fetchResponse)) {\n      this.#handleFrameMissingFromResponse(fetchResponse);\n    }\n  }\n\n  async #visit(url) {\n    const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n\n    this.#currentFetchRequest?.cancel();\n    this.#currentFetchRequest = request;\n\n    return new Promise((resolve) => {\n      this.#resolveVisitPromise = () => {\n        this.#resolveVisitPromise = () => {};\n        this.#currentFetchRequest = null;\n        resolve();\n      };\n      request.perform();\n    })\n  }\n\n  #navigateFrame(element, url, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(submitter, element, frame));\n\n    this.#withCurrentNavigationElement(element, () => {\n      frame.src = url;\n    });\n  }\n\n  proposeVisitIfNavigatedWithAction(frame, action = null) {\n    this.action = action;\n\n    if (this.action) {\n      const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n      const { visitCachedSnapshot } = frame.delegate;\n\n      frame.delegate.fetchResponseLoaded = async (fetchResponse) => {\n        if (frame.src) {\n          const { statusCode, redirected } = fetchResponse;\n          const responseHTML = await fetchResponse.responseHTML;\n          const response = { statusCode, redirected, responseHTML };\n          const options = {\n            response,\n            visitCachedSnapshot,\n            willRender: false,\n            updateHistory: false,\n            restorationIdentifier: this.restorationIdentifier,\n            snapshot: pageSnapshot\n          };\n\n          if (this.action) options.action = this.action;\n\n          session.visit(frame.src, options);\n        }\n      };\n    }\n  }\n\n  changeHistory() {\n    if (this.action) {\n      const method = getHistoryMethodForAction(this.action);\n      session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n    }\n  }\n\n  async #handleUnvisitableFrameResponse(fetchResponse) {\n    console.warn(\n      `The response (${fetchResponse.statusCode}) from <turbo-frame id=\"${this.element.id}\"> is performing a full page visit due to turbo-visit-control.`\n    );\n\n    await this.#visitResponse(fetchResponse.response);\n  }\n\n  #willHandleFrameMissingFromResponse(fetchResponse) {\n    this.element.setAttribute(\"complete\", \"\");\n\n    const response = fetchResponse.response;\n    const visit = async (url, options) => {\n      if (url instanceof Response) {\n        this.#visitResponse(url);\n      } else {\n        session.visit(url, options);\n      }\n    };\n\n    const event = dispatch(\"turbo:frame-missing\", {\n      target: this.element,\n      detail: { response, visit },\n      cancelable: true\n    });\n\n    return !event.defaultPrevented\n  }\n\n  #handleFrameMissingFromResponse(fetchResponse) {\n    this.view.missing();\n    this.#throwFrameMissingError(fetchResponse);\n  }\n\n  #throwFrameMissingError(fetchResponse) {\n    const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id=\"${this.element.id}\"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n    throw new TurboFrameMissingError(message)\n  }\n\n  async #visitResponse(response) {\n    const wrapped = new FetchResponse(response);\n    const responseHTML = await wrapped.responseHTML;\n    const { location, redirected, statusCode } = wrapped;\n\n    return session.visit(location, { response: { redirected, statusCode, responseHTML } })\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n    const target = this.#getFrameElementById(id);\n\n    return target instanceof FrameElement ? target : this.element\n  }\n\n  async extractForeignFrameElement(container) {\n    let element;\n    const id = CSS.escape(this.id);\n\n    try {\n      element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n      if (element) {\n        return element\n      }\n\n      element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n      if (element) {\n        await element.loaded;\n        return await this.extractForeignFrameElement(element)\n      }\n    } catch (error) {\n      console.error(error);\n      return new FrameElement()\n    }\n\n    return null\n  }\n\n  #formActionIsVisitable(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return locationIsVisitable(expandURL(action), this.rootLocation)\n  }\n\n  #shouldInterceptNavigation(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n\n    if (element instanceof HTMLFormElement && !this.#formActionIsVisitable(element, submitter)) {\n      return false\n    }\n\n    if (!this.enabled || id == \"_top\") {\n      return false\n    }\n\n    if (id) {\n      const frameElement = this.#getFrameElementById(id);\n      if (frameElement) {\n        return !frameElement.disabled\n      } else if (id == \"_parent\") {\n        return false\n      }\n    }\n\n    if (!session.elementIsNavigatable(element)) {\n      return false\n    }\n\n    if (submitter && !session.elementIsNavigatable(submitter)) {\n      return false\n    }\n\n    return true\n  }\n\n  // Computed properties\n\n  get id() {\n    return this.element.id\n  }\n\n  get disabled() {\n    return this.element.disabled\n  }\n\n  get enabled() {\n    return !this.disabled\n  }\n\n  get sourceURL() {\n    if (this.element.src) {\n      return this.element.src\n    }\n  }\n\n  set sourceURL(sourceURL) {\n    this.#ignoringChangesToAttribute(\"src\", () => {\n      this.element.src = sourceURL ?? null;\n    });\n  }\n\n  get loadingStyle() {\n    return this.element.loading\n  }\n\n  get isLoading() {\n    return this.formSubmission !== undefined || this.#resolveVisitPromise() !== undefined\n  }\n\n  get complete() {\n    return this.element.hasAttribute(\"complete\")\n  }\n\n  set complete(value) {\n    if (value) {\n      this.element.setAttribute(\"complete\", \"\");\n    } else {\n      this.element.removeAttribute(\"complete\");\n    }\n  }\n\n  get isActive() {\n    return this.element.isActive && this.#connected\n  }\n\n  get rootLocation() {\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const root = meta?.content ?? \"/\";\n    return expandURL(root)\n  }\n\n  #isIgnoringChangesTo(attributeName) {\n    return this.#ignoredAttributes.has(attributeName)\n  }\n\n  #ignoringChangesToAttribute(attributeName, callback) {\n    this.#ignoredAttributes.add(attributeName);\n    callback();\n    this.#ignoredAttributes.delete(attributeName);\n  }\n\n  #withCurrentNavigationElement(element, callback) {\n    this.currentNavigationElement = element;\n    callback();\n    delete this.currentNavigationElement;\n  }\n\n  #getFrameElementById(id) {\n    if (id != null) {\n      const element = id === \"_parent\" ?\n        this.element.parentElement.closest(\"turbo-frame\") :\n        document.getElementById(id);\n      if (element instanceof FrameElement) {\n        return element\n      }\n    }\n  }\n}\n\nfunction activateElement(element, currentURL) {\n  if (element) {\n    const src = element.getAttribute(\"src\");\n    if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n      throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`)\n    }\n    if (element.ownerDocument !== document) {\n      element = document.importNode(element, true);\n    }\n\n    if (element instanceof FrameElement) {\n      element.connectedCallback();\n      element.disconnectedCallback();\n      return element\n    }\n  }\n}\n\nconst StreamActions = {\n  after() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling));\n  },\n\n  append() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.append(this.templateContent));\n  },\n\n  before() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e));\n  },\n\n  prepend() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.prepend(this.templateContent));\n  },\n\n  remove() {\n    this.targetElements.forEach((e) => e.remove());\n  },\n\n  replace() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphElements(targetElement, this.templateContent);\n      } else {\n        targetElement.replaceWith(this.templateContent);\n      }\n    });\n  },\n\n  update() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphChildren(targetElement, this.templateContent);\n      } else {\n        targetElement.innerHTML = \"\";\n        targetElement.append(this.templateContent);\n      }\n    });\n  },\n\n  refresh() {\n    const method = this.getAttribute(\"method\");\n    const requestId = this.requestId;\n    const scroll = this.getAttribute(\"scroll\");\n\n    session.refresh(this.baseURI, { method, requestId, scroll });\n  }\n};\n\n// <turbo-stream action=replace target=id><template>...\n\n/**\n * Renders updates to the page from a stream of messages.\n *\n * Using the `action` attribute, this can be configured one of eight ways:\n *\n * - `after` - inserts the result after the target\n * - `append` - appends the result to the target\n * - `before` - inserts the result before the target\n * - `prepend` - prepends the result to the target\n * - `refresh` - initiates a page refresh\n * - `remove` - removes the target\n * - `replace` - replaces the outer HTML of the target\n * - `update` - replaces the inner HTML of the target\n *\n * @customElement turbo-stream\n * @example\n *   <turbo-stream action=\"append\" target=\"dom_id\">\n *     <template>\n *       Content to append to target designated with the dom_id.\n *     </template>\n *   </turbo-stream>\n */\nclass StreamElement extends HTMLElement {\n  static async renderElement(newElement) {\n    await newElement.performAction();\n  }\n\n  async connectedCallback() {\n    try {\n      await this.render();\n    } catch (error) {\n      console.error(error);\n    } finally {\n      this.disconnect();\n    }\n  }\n\n  async render() {\n    return (this.renderPromise ??= (async () => {\n      const event = this.beforeRenderEvent;\n\n      if (this.dispatchEvent(event)) {\n        await nextRepaint();\n        await event.detail.render(this);\n      }\n    })())\n  }\n\n  disconnect() {\n    try {\n      this.remove();\n      // eslint-disable-next-line no-empty\n    } catch {}\n  }\n\n  /**\n   * Removes duplicate children (by ID)\n   */\n  removeDuplicateTargetChildren() {\n    this.duplicateChildren.forEach((c) => c.remove());\n  }\n\n  /**\n   * Gets the list of duplicate children (i.e. those with the same ID)\n   */\n  get duplicateChildren() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute(\"id\"));\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute(\"id\")).map((c) => c.getAttribute(\"id\"));\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute(\"id\")))\n  }\n\n  /**\n  * Removes duplicate siblings (by ID)\n  */\n  removeDuplicateTargetSiblings() {\n    this.duplicateSiblings.forEach((c) => c.remove());\n  }\n\n  /**\n  * Gets the list of duplicate siblings (i.e. those with the same ID)\n  */\n  get duplicateSiblings() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id);\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id);\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.id))\n  }\n\n  /**\n   * Gets the action function to be performed.\n   */\n  get performAction() {\n    if (this.action) {\n      const actionFunction = StreamActions[this.action];\n      if (actionFunction) {\n        return actionFunction\n      }\n      this.#raise(\"unknown action\");\n    }\n    this.#raise(\"action attribute is missing\");\n  }\n\n  /**\n   * Gets the target elements which the template will be rendered to.\n   */\n  get targetElements() {\n    if (this.target) {\n      return this.targetElementsById\n    } else if (this.targets) {\n      return this.targetElementsByQuery\n    } else {\n      this.#raise(\"target or targets attribute is missing\");\n    }\n  }\n\n  /**\n   * Gets the contents of the main `<template>`.\n   */\n  get templateContent() {\n    return this.templateElement.content.cloneNode(true)\n  }\n\n  /**\n   * Gets the main `<template>` used for rendering\n   */\n  get templateElement() {\n    if (this.firstElementChild === null) {\n      const template = this.ownerDocument.createElement(\"template\");\n      this.appendChild(template);\n      return template\n    } else if (this.firstElementChild instanceof HTMLTemplateElement) {\n      return this.firstElementChild\n    }\n    this.#raise(\"first child element must be a <template> element\");\n  }\n\n  /**\n   * Gets the current action.\n   */\n  get action() {\n    return this.getAttribute(\"action\")\n  }\n\n  /**\n   * Gets the current target (an element ID) to which the result will\n   * be rendered.\n   */\n  get target() {\n    return this.getAttribute(\"target\")\n  }\n\n  /**\n   * Gets the current \"targets\" selector (a CSS selector)\n   */\n  get targets() {\n    return this.getAttribute(\"targets\")\n  }\n\n  /**\n   * Reads the request-id attribute\n   */\n  get requestId() {\n    return this.getAttribute(\"request-id\")\n  }\n\n  #raise(message) {\n    throw new Error(`${this.description}: ${message}`)\n  }\n\n  get description() {\n    return (this.outerHTML.match(/<[^>]+>/) ?? [])[0] ?? \"<turbo-stream>\"\n  }\n\n  get beforeRenderEvent() {\n    return new CustomEvent(\"turbo:before-stream-render\", {\n      bubbles: true,\n      cancelable: true,\n      detail: { newStream: this, render: StreamElement.renderElement }\n    })\n  }\n\n  get targetElementsById() {\n    const element = this.ownerDocument?.getElementById(this.target);\n\n    if (element !== null) {\n      return [element]\n    } else {\n      return []\n    }\n  }\n\n  get targetElementsByQuery() {\n    const elements = this.ownerDocument?.querySelectorAll(this.targets);\n\n    if (elements.length !== 0) {\n      return Array.prototype.slice.call(elements)\n    } else {\n      return []\n    }\n  }\n}\n\nclass StreamSourceElement extends HTMLElement {\n  streamSource = null\n\n  connectedCallback() {\n    this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src);\n\n    connectStreamSource(this.streamSource);\n  }\n\n  disconnectedCallback() {\n    if (this.streamSource) {\n      this.streamSource.close();\n\n      disconnectStreamSource(this.streamSource);\n    }\n  }\n\n  get src() {\n    return this.getAttribute(\"src\") || \"\"\n  }\n}\n\nFrameElement.delegateConstructor = FrameController;\n\nif (customElements.get(\"turbo-frame\") === undefined) {\n  customElements.define(\"turbo-frame\", FrameElement);\n}\n\nif (customElements.get(\"turbo-stream\") === undefined) {\n  customElements.define(\"turbo-stream\", StreamElement);\n}\n\nif (customElements.get(\"turbo-stream-source\") === undefined) {\n  customElements.define(\"turbo-stream-source\", StreamSourceElement);\n}\n\n(() => {\n  const scriptElement = document.currentScript;\n  if (!scriptElement) return\n  if (scriptElement.hasAttribute(\"data-turbo-suppress-warning\")) return\n\n  let element = scriptElement.parentElement;\n  while (element) {\n    if (element == document.body) {\n      return console.warn(\n        unindent`\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        \u2014\u2014\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `,\n        scriptElement.outerHTML\n      )\n    }\n\n    element = element.parentElement;\n  }\n})();\n\nwindow.Turbo = { ...Turbo, StreamActions };\nstart();\n\nexport { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, config, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, morphBodyElements, morphChildren, morphElements, morphTurboFrameElements, sessionNavigator as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit };\n", "let consumer\n\nexport async function getConsumer() {\n  return consumer || setConsumer(createConsumer().then(setConsumer))\n}\n\nexport function setConsumer(newConsumer) {\n  return consumer = newConsumer\n}\n\nexport async function createConsumer() {\n  const { createConsumer } = await import(/* webpackChunkName: \"actioncable\" */ \"@rails/actioncable/src\")\n  return createConsumer()\n}\n\nexport async function subscribeTo(channel, mixin) {\n  const { subscriptions } = await getConsumer()\n  return subscriptions.create(channel, mixin)\n}\n", "// Based on https://github.com/nathan7/snakeize\n//\n// This software is released under the MIT license:\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nexport default function walk (obj) {\n    if (!obj || typeof obj !== 'object') return obj;\n    if (obj instanceof Date || obj instanceof RegExp) return obj;\n    if (Array.isArray(obj)) return obj.map(walk);\n    return Object.keys(obj).reduce(function (acc, key) {\n        var camel = key[0].toLowerCase() + key.slice(1).replace(/([A-Z]+)/g, function (m, x) {\n            return '_' + x.toLowerCase();\n        });\n        acc[camel] = walk(obj[key]);\n        return acc;\n    }, {});\n};", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\nimport snakeize from \"./snakeize\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  static observedAttributes = [\"channel\", \"signed-stream-name\"]\n\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, {\n      received: this.dispatchMessageEvent.bind(this),\n      connected: this.subscriptionConnected.bind(this),\n      disconnected: this.subscriptionDisconnected.bind(this)\n    })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n    this.subscriptionDisconnected()\n  }\n\n  attributeChangedCallback() {\n    if (this.subscription) {\n      this.disconnectedCallback()\n      this.connectedCallback()\n    }\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\n  }\n\n  subscriptionConnected() {\n    this.setAttribute(\"connected\", \"\")\n  }\n\n  subscriptionDisconnected() {\n    this.removeAttribute(\"connected\")\n  }\n\n  get channel() {\n    const channel = this.getAttribute(\"channel\")\n    const signed_stream_name = this.getAttribute(\"signed-stream-name\")\n    return { channel, signed_stream_name, ...snakeize({ ...this.dataset }) }\n  }\n}\n\n\nif (customElements.get(\"turbo-cable-stream-source\") === undefined) {\n  customElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n}\n", "export function encodeMethodIntoRequestBody(event) {\n  if (event.target instanceof HTMLFormElement) {\n    const { target: form, detail: { fetchOptions } } = event\n\n    form.addEventListener(\"turbo:submit-start\", ({ detail: { formSubmission: { submitter } } }) => {\n      const body = isBodyInit(fetchOptions.body) ? fetchOptions.body : new URLSearchParams()\n      const method = determineFetchMethod(submitter, body, form)\n\n      if (!/get/i.test(method)) {\n        if (/post/i.test(method)) {\n          body.delete(\"_method\")\n        } else {\n          body.set(\"_method\", method)\n        }\n\n        fetchOptions.method = \"post\"\n      }\n    }, { once: true })\n  }\n}\n\nfunction determineFetchMethod(submitter, body, form) {\n  const formMethod = determineFormMethod(submitter)\n  const overrideMethod = body.get(\"_method\")\n  const method = form.getAttribute(\"method\") || \"get\"\n\n  if (typeof formMethod == \"string\") {\n    return formMethod\n  } else if (typeof overrideMethod == \"string\") {\n    return overrideMethod\n  } else {\n    return method\n  }\n}\n\nfunction determineFormMethod(submitter) {\n  if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) {\n    // Rails 7 ActionView::Helpers::FormBuilder#button method has an override\n    // for formmethod if the button does not have name or value attributes\n    // set, which is the default. This means that if you use <%= f.button\n    // formmethod: :delete %>, it will generate a <button name=\"_method\"\n    // value=\"delete\" formmethod=\"post\">. Therefore, if the submitter's name\n    // is already _method, it's value attribute already contains the desired\n    // method.\n    if (submitter.name === '_method') {\n      return submitter.value\n    } else if (submitter.hasAttribute(\"formmethod\")) {\n      return submitter.formMethod\n    } else {\n      return null\n    }\n  } else {\n    return null\n  }\n}\n\nfunction isBodyInit(body) {\n  return body instanceof FormData || body instanceof URLSearchParams\n}\n", "import \"./cable_stream_source_element\"\n\nimport * as Turbo from \"@hotwired/turbo\"\nexport { Turbo }\n\nimport * as cable from \"./cable\"\nexport { cable }\n\nimport { encodeMethodIntoRequestBody } from \"./fetch_requests\"\n\nwindow.Turbo = Turbo\n\naddEventListener(\"turbo:before-fetch-request\", encodeMethodIntoRequestBody)\n", "import \"controllers/eager\"\nimport \"@hotwired/turbo-rails\"\nimport { Turbo } from \"@hotwired/turbo-rails\"\n\n// Custom Turbo Stream action that performs a full-page browser navigation.\n// Useful for cross-origin redirects (e.g. www.* -> app.*) which Turbo's own\n// Visit cannot perform.\nTurbo.StreamActions.redirect_to = function () {\n  const url = this.getAttribute(\"url\")\n  if (url) {\n    window.location.href = url\n  }\n}\n\n// Helper function to safely initialize Preline\nfunction initializePreline() {\n  if (typeof HSStaticMethods !== 'undefined' && HSStaticMethods.autoInit) {\n    HSStaticMethods.autoInit()\n  } else {\n    // Retry after a short delay if Preline isn't ready yet\n    setTimeout(() => {\n      if (typeof HSStaticMethods !== 'undefined' && HSStaticMethods.autoInit) {\n        HSStaticMethods.autoInit()\n      }\n    }, 100)\n  }\n}\n\n// Initialize on initial page load - don't wait for anything\ndocument.addEventListener('DOMContentLoaded', () => {\n  initializePreline()\n})\n\n// Initialize on initial page load\ndocument.addEventListener('turbo:load', () => {\n  initializePreline()\n})\n\n// Initialize on frame loads\ndocument.addEventListener('turbo:frame-load', () => {\n  initializePreline()\n})\n\n// Initialize after Turbo renders new content\ndocument.addEventListener('turbo:render', () => {\n  initializePreline()\n})\n\n// Handle popstate events (browser back/forward) for insights pages\n// This ensures filters, tabs, and content update correctly when user navigates back/forward\nlet popstateHandler = null\n\nfunction isInsightsPageWithSection() {\n  const pathParts = window.location.pathname.split('/').filter(Boolean)\n  const insightsIndex = pathParts.indexOf('insights')\n\n  if (insightsIndex === -1) {\n    return false\n  }\n\n  // Valid sections that indicate this is a story/insights page\n  const validSections = ['overview', 'listings', 'occupancy_analysis', 'pricing_revenue',\n                         'supply_demand', 'submarkets', 'top_listings', 'related_markets']\n\n  // Check if the last part of the path is a valid section\n  const lastPart = pathParts[pathParts.length - 1]\n  return validSections.includes(lastPart)\n}\n\ndocument.addEventListener('turbo:load', () => {\n  // Remove previous handler if it exists\n  if (popstateHandler) {\n    window.removeEventListener('popstate', popstateHandler)\n  }\n\n  // Only add handler if we're on an insights page with a section\n  if (isInsightsPageWithSection()) {\n    popstateHandler = (event) => {\n      // Dispatch event to sync tabs (story_tabs_controller will listen)\n      window.dispatchEvent(new CustomEvent('story:syncFromUrl'))\n\n      // Use Turbo to visit the current URL (which changed via browser history)\n      // This will trigger Turbo navigation and update all frames automatically\n      Turbo.visit(window.location.href, { action: 'replace' })\n    }\n    window.addEventListener('popstate', popstateHandler)\n  }\n})\n\n// Clean up on page unload\ndocument.addEventListener('turbo:before-cache', () => {\n  if (popstateHandler) {\n    window.removeEventListener('popstate', popstateHandler)\n    popstateHandler = null\n  }\n})"],
  "mappings": "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",
  "names": ["adapters_default", "init_adapters", "__esmMin", "logger_default", "init_logger", "__esmMin", "init_adapters", "messages", "adapters_default", "now", "secondsSince", "ConnectionMonitor", "connection_monitor_default", "init_connection_monitor", "__esmMin", "init_logger", "time", "connection", "logger_default", "staleThreshold", "reconnectionBackoffRate", "backoff", "jitter", "internal_default", "init_internal", "__esmMin", "message_types", "protocols", "supportedProtocols", "indexOf", "Connection", "connection_default", "init_connection", "__esmMin", "init_adapters", "init_connection_monitor", "init_internal", "init_logger", "internal_default", "consumer", "connection_monitor_default", "data", "logger_default", "socketProtocols", "adapters_default", "allowReconnect", "error", "states", "state", "eventName", "handler", "event", "identifier", "message", "reason", "reconnect", "type", "extend", "Subscription", "init_subscription", "__esmMin", "object", "properties", "key", "value", "consumer", "params", "mixin", "action", "data", "SubscriptionGuarantor", "subscription_guarantor_default", "init_subscription_guarantor", "__esmMin", "init_logger", "subscriptions", "subscription", "logger_default", "s", "Subscriptions", "init_subscriptions", "__esmMin", "init_logger", "init_subscription", "init_subscription_guarantor", "consumer", "subscription_guarantor_default", "channelName", "mixin", "channel", "params", "subscription", "Subscription", "identifier", "s", "callbackName", "args", "subscriptions", "logger_default", "command", "createWebSocketURL", "url", "a", "Consumer", "init_consumer", "__esmMin", "init_connection", "init_subscriptions", "Subscriptions", "connection_default", "data", "subprotocol", "src_exports", "__export", "connection_default", "connection_monitor_default", "Consumer", "internal_default", "Subscription", "subscription_guarantor_default", "Subscriptions", "adapters_default", "createConsumer", "createWebSocketURL", "getConfig", "logger_default", "url", "name", "element", "init_src", "__esmMin", "init_adapters", "init_connection", "init_connection_monitor", "init_consumer", "init_internal", "init_logger", "init_subscription", "init_subscription_guarantor", "init_subscriptions", "EventListener", "eventTarget", "eventName", "eventOptions", "binding", "event", "extendedEvent", "extendEvent", "left", "right", "leftIndex", "rightIndex", "stopImmediatePropagation", "Dispatcher", "application", "eventListener", "listeners", "map", "clearEventListeners", "error", "message", "detail", "eventListenerMap", "cacheKey", "parts", "key", "defaultActionDescriptorFilters", "value", "element", "descriptorPattern", "parseActionDescriptorString", "descriptorString", "matches", "keyFilter", "parseEventTarget", "parseEventOptions", "eventTargetName", "options", "token", "stringifyEventTarget", "camelize", "_", "char", "namespaceCamelize", "capitalize", "dasherize", "tokenize", "isSomething", "object", "hasProperty", "property", "allModifiers", "Action", "index", "descriptor", "schema", "getDefaultEventNameForElement", "eventFilter", "filters", "standardFilter", "params", "pattern", "name", "match", "typecast", "meta", "ctrl", "alt", "shift", "modifier", "defaultEventNames", "e", "tagName", "Binding", "context", "action", "actionEvent", "method", "actionDescriptorFilters", "controller", "passes", "filter", "target", "currentTarget", "identifier", "ElementObserver", "delegate", "mutations", "callback", "mutation", "attributeName", "nodes", "node", "tree", "processor", "AttributeObserver", "add", "fetch", "del", "prune", "values", "Multimap", "set", "size", "_key", "_values", "SelectorObserver", "element", "selector", "delegate", "details", "ElementObserver", "Multimap", "callback", "matches", "tree", "match", "selectors", "_attributeName", "matchedBefore", "StringMapObserver", "mutations", "attributeName", "mutation", "oldValue", "key", "value", "attribute", "TokenListObserver", "AttributeObserver", "unmatchedTokens", "matchedTokens", "tokens", "token", "previousTokens", "currentTokens", "firstDifferingIndex", "zip", "previousToken", "currentToken", "tokensAreEqual", "tokenString", "parseTokenString", "content", "index", "left", "right", "length", "_", "ValueListObserver", "parseResult", "valuesByToken", "error", "BindingObserver", "context", "action", "binding", "Binding", "Action", "ValueObserver", "receiver", "descriptor", "name", "defaultValue", "writer", "rawValue", "rawOldValue", "changedMethodName", "changedMethod", "valueDescriptorMap", "descriptors", "hasMethodName", "capitalize", "TargetObserver", "_a", "readInheritableStaticArrayValues", "constructor", "propertyName", "ancestors", "getAncestorsForConstructor", "values", "getOwnStaticArrayValues", "readInheritableStaticObjectPairs", "pairs", "getOwnStaticObjectPairs", "definition", "OutletObserver", "outletName", "observer", "_selector", "outlet", "hasOutlet", "hasOutletController", "_element", "selectorObserver", "attributeObserver", "dependencies", "module", "identifiers", "Context", "scope", "functionName", "detail", "identifier", "controller", "message", "namespaceCamelize", "methodName", "args", "bless", "shadow", "getBlessedProperties", "properties", "shadowConstructor", "extend", "shadowProperties", "getShadowProperties", "blessedProperties", "blessing", "prototype", "getOwnKeys", "getShadowedDescriptor", "shadowingDescriptor", "object", "extendWithReflect", "extended", "testReflectExtension", "b", "blessDefinition", "Module", "application", "ClassMap", "tokenize", "DataMap", "dasherize", "Guide", "logger", "warnedKeys", "attributeValueContainsToken", "TargetSet", "targetName", "targetNames", "target", "targets", "targetDescriptor", "revisedAttributeName", "OutletSet", "controllerElement", "outletNames", "outlets", "controllerAttribute", "Scope", "_Scope", "schema", "ScopeObserver", "scopesByIdentifier", "referenceCount", "Router", "contexts", "afterLoad", "defaultSchema", "objectFromEntries", "c", "n", "array", "memo", "k", "v", "Application", "Dispatcher", "defaultActionDescriptorFilters", "domReady", "controllerConstructor", "filter", "head", "rest", "resolve", "ClassPropertiesBlessing", "classDefinition", "propertiesForClassDefinition", "classes", "OutletPropertiesBlessing", "outletDefinition", "propertiesForOutletDefinition", "getOutletController", "getControllerAndEnsureConnectedScope", "outletController", "camelizedName", "outletElement", "TargetPropertiesBlessing", "targetDefinition", "propertiesForTargetDefinition", "ValuePropertiesBlessing", "valueDefinitionPairs", "propertyDescriptorMap", "result", "valueDefinitionPair", "valueDescriptor", "parseValueDefinitionPair", "propertiesForValueDefinitionPair", "read", "write", "typeDefinition", "valueDescriptorForTokenAndTypeDefinition", "parseValueTypeConstant", "constant", "parseValueTypeDefault", "parseValueTypeObject", "payload", "typeObject", "hasType", "isSomething", "hasDefault", "fullObject", "onlyType", "onlyDefault", "typeFromObject", "typeFromDefaultValue", "propertyPath", "parseValueTypeDefinition", "typeFromConstant", "type", "defaultValueForDefinition", "defaultValuesByType", "hasProperty", "constantFromType", "camelize", "readers", "writers", "writeString", "writeJSON", "Controller", "_identifier", "_application", "eventName", "prefix", "bubbles", "cancelable", "event", "application", "Application", "a", "adr_tier_controller_default", "Controller", "globalMax", "seriesData", "date", "value", "event", "tier", "button", "buttonTier", "chartData", "tooltipItems", "dataIndex", "dateString", "ctx", "dates", "todayValue", "localeValue", "currencyCodeValue", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "currentDate", "now", "context", "chart", "amenities_categories_controller_default", "Controller", "category", "chip", "row", "chart", "height", "categories", "amenities_chart_controller_default", "Controller", "labels", "percentages", "barCount", "height", "indexes", "_", "index", "ctx", "width", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "context", "chart", "value", "VALID_STORY_SECTIONS", "getCurrentSectionFromPathname", "pathname", "pathParts", "insightsIndex", "sectionPart", "lastPart", "getCurrentSectionFromActiveTab", "activeTab", "href", "tabUrl", "getCurrentStorySection", "sectionFromPath", "sectionFromTab", "syncInsightsFormActionWithCurrentSection", "form", "currentSection", "formAction", "formUrl", "updateInsightsPathWithSection", "e", "url", "amenities_dropdown_controller_default", "Controller", "collectionItem", "item", "event", "e", "checkbox", "syncInsightsFormActionWithCurrentSection", "applyMethod", "changedFilters", "filterName", "name", "properties", "MANUALLY_TRACKED_INTERACTION_SELECTORS", "shouldAutocaptureElementInteraction", "_actionType", "element", "selector", "amplitude_controller_default", "Controller", "plugin", "shouldAutocaptureElementInteraction", "event", "name", "properties", "value", "identifyEvent", "eventName", "eventProperties", "baseProperties", "form", "formData", "formProperties", "subjectField", "emailField", "messageField", "allProperties", "propsString", "getMobileFiltersOverlayElement", "cleanupMobileFiltersOverlayState", "backdrop", "closeMobileFiltersOverlay", "overlay", "application_controller_default", "Controller", "event", "cleanupMobileFiltersOverlayState", "overlay", "getMobileFiltersOverlayElement", "formRoot", "mobileFiltersController", "form", "cityName", "filtersExplainerModal", "authSource", "target", "targetElement", "resolve", "properties", "sectionName", "url", "sectionId", "message", "flashMessage", "container", "source", "polygonId", "countryName", "eventName", "auth_controller_default", "Controller", "actionValue", "source", "properties", "event", "billingType", "action", "planId", "returnToPage", "form", "csrfToken", "csrfInput", "screenHintInput", "localeInput", "originInput", "url", "parseSearchedAt", "value", "parsed", "LEGACY_INSIGHTS_OFFSET_MS", "insightSearchedAt", "item", "index", "total", "mergeRecentSearches", "insights", "calculator", "limit", "normalizedInsights", "normalizedCalculator", "merged", "a", "b", "filterRecentSearches", "items", "query", "normalizedQuery", "CJK_SCRIPT_PATTERN", "normalizePlaceToken", "value", "placeNameMatchStrength", "query", "label", "q", "l", "isLatinQuery", "trimmed", "latinChars", "cjkChars", "totalChars", "preferEnglishLabels", "nativeValue", "englishValue", "nativeStrength", "englishStrength", "displayPlaceName", "data", "preferNativeWhenNoQuery", "displayParentName", "field", "autocompleteInputLabel", "options", "formatAutocompleteSuggestion", "name", "localityName", "regionName", "crawlingAreaName", "countryName", "countryCodeFromPlace", "place", "components", "component", "code", "mapsLoadPromise", "resolvedGoogleMapsApiKey", "ensureGoogleMapsBootstrap", "options", "g", "h", "p", "c", "l", "q", "m", "b", "d", "r", "e", "u", "resolve", "reject", "a", "k", "t", "lib", "args", "loadGoogleMaps", "apiKey", "language", "error", "autocomplete_controller_default", "Controller", "recentHeader", "noRecentSearchesMessage", "startSearchingMessage", "searchResultsHeader", "recentActivity", "suggestionInputLabel", "suggestion", "query", "options", "autocompleteInputLabel", "locations", "obj", "datasets", "syncCallback", "filtered", "filterRecentSearches", "context", "data", "asyncCallback", "title", "subtitle", "formatAutocompleteSuggestion", "ev", "currentHost", "targetHost", "protocol", "targetUrl", "path", "suffix", "e", "searchTerm", "$menu", "isMenuVisible", "$firstSuggestion", "$calculatorCta", "raw", "escapedAddress", "message", "event", "address", "apiKey", "resolvedGoogleMapsApiKey", "language", "maps", "loadGoogleMaps", "AutocompleteSuggestion", "AutocompleteSessionToken", "suggestions", "placePrediction", "place", "location", "lat", "lng", "params", "country", "countryCodeFromPlace", "error", "text", "div", "$controller", "$iconContainer", "$headerIconContainer", "$mobileIconContainer", "$input", "$container", "$loadingIndicator", "storageItemKey", "stored", "activityItem", "item", "maxItems", "retryError", "limit", "mergeRecentSearches", "value", "parsed", "normalized", "index", "slug", "bedroom_count_chart_controller_default", "Controller", "ctx", "total", "sum", "value", "percentages", "count", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "context", "chart", "calendar_controller_default", "Controller", "info", "startDate", "endDate", "previousStart", "direction", "properties", "blocking_reason", "review", "discount", "tooltip", "dateObj", "date", "e", "a", "chart_controller_default", "Controller", "event", "tierKey", "seriesKey", "datasetIndex", "meta", "button", "labelText", "ctx", "hasMultipleSeries", "chartData", "b", "dates", "date", "now", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "datasets", "seriesConfig", "key", "data", "index", "config", "seriesColor", "bedroomColors", "displayLabel", "value", "futureFill", "pointColor", "context", "chart", "e", "legendItem", "tooltipItems", "dataIndex", "dateString", "titleOptions", "datasetLabel", "formattedValue", "comp_set_list_row_controller_default", "Controller", "event", "url", "contact_form_controller_default", "Controller", "event", "name", "replyTo", "subject", "message", "bodyParts", "body", "params", "mailto", "link", "eventName", "properties", "email", "propsString", "daily_occupancy_chart_controller_default", "Controller", "ctx", "formattedBookedNights", "date", "today", "todayIndex", "barColors", "formattedDate", "isBooked", "bookedStatus", "isTodayArray", "context", "index", "displayedLabel", "currentYear", "isToday", "label", "value", "dateString", "desktop_filters_controller_default", "Controller", "el", "row", "detection_simulator_controller_default", "Controller", "event", "step", "activeStep", "button", "index", "panel", "exp", "dropdown_controller_default", "Controller", "event", "range", "months", "label", "labelElement", "button", "email_exists_modal_controller_default", "Controller", "emailDisplay", "modal", "attempt", "google", "password", "signinLink", "button", "event", "NON_FILTER_PARAMS", "normalizeFilterParamKey", "key", "isMeaningfulFilterValue", "value", "buildFilterParamsFromForm", "form", "params", "normalizedKey", "current", "buildInsightsFilterUrlFromForm", "formAction", "formUrl", "updateInsightsBrowserUrl", "sourceUrl", "currentUrl", "sectionFromSource", "getCurrentSectionFromPathname", "updateInsightsPathWithSection", "allFilterKeys", "checkbox", "input", "loadingTimeoutId", "streamHideDebounceId", "streamHideFallbackId", "filtersLoadingVisible", "documentLoadingListenersAttached", "showFiltersLoadingOverlay", "existingOverlay", "loadingOverlay", "clearFiltersLoadingTimers", "hideFiltersLoadingOverlay", "hideFiltersLoadingOverlayAfterPaint", "waitForPendingTurboStreams", "callback", "check", "scheduleHideAfterFilterStreams", "scheduleHideFallback", "delayMs", "attachFiltersLoadingListeners", "event", "form", "filters_container_controller_default", "Controller", "link", "isFilterAction", "closeMobileFiltersOverlay", "linkUrl", "currentSection", "getCurrentStorySection", "updateInsightsPathWithSection", "updateInsightsBrowserUrl", "e", "syncInsightsFormActionWithCurrentSection", "formAction", "formUrl", "buildFilterParamsFromForm", "value", "key", "filters_explainer_controller_default", "Controller", "event", "pricingModal", "eventName", "properties", "gallery_controller_default", "Controller", "event", "index", "img", "mappedIndex", "direction", "name", "properties", "urls", "NO_PHOTO_URL", "foundAny", "pending", "maybeFinalizeIfNone", "url", "ok", "resolve", "google_ads_controller_default", "Controller", "event", "value", "name", "goal", "payload", "google_one_tap_controller_default", "Controller", "onReady", "event", "notification", "skippedReason", "dismissedReason", "response", "form", "csrfToken", "csrfInput", "credentialInput", "returnUrlInput", "google_places_controller_default", "Controller", "fromValue", "resolvedGoogleMapsApiKey", "v", "apiKey", "maps", "loadGoogleMaps", "PlaceAutocompleteElement", "q", "input", "message", "event", "placePrediction", "place", "location", "lat", "lng", "label", "country", "countryCodeFromPlace", "e", "image_fallback_controller_default", "Controller", "images", "batchSize", "index", "processBatch", "img", "event", "currentSrc", "attempts", "fallbackUrls", "galleryController", "nextUrl", "url", "listingUuid", "error", "pathMatch", "anchor", "href", "hrefMatch", "STORAGE_KEY", "insights_city_tracking_controller_default", "Controller", "previousPolygonId", "isCityChange", "properties", "amplitude", "insights_csv_export_controller_default", "Controller", "event", "link", "response", "blob", "filename", "exported", "total", "eventName", "properties", "disposition", "match", "url", "anchor", "message", "value", "number", "landing_page_tracking_controller_default", "Controller", "properties", "event", "MOUSE_MOVE_THRESHOLD", "landing_page_engagement_controller_default", "Controller", "attributionReason", "event", "rawReferrer", "url", "pathname", "gateReason", "properties", "country_filter_controller_default", "Controller", "event", "chip", "visible", "row", "matchesContinent", "matchesQuery", "show", "value", "link_interceptor_controller_default", "Controller", "event", "link", "startUrl", "listings_chart_controller_default", "Controller", "ctx", "lineLabel", "fallback", "value", "lines", "index", "data", "item", "baseOptions", "values", "chart", "legend", "options", "fitValue", "ensurePrelineOverlayCollection", "dispatchWindowResize", "map_expand_controller_default", "Controller", "e", "event", "leafletContainer", "dispatchWindowResize", "expanded", "mapEl", "pageType", "mapController", "properties", "focalListingId", "STORAGE_KEY", "readMapHandoff", "handoff", "STORAGE_KEY", "clearMapHandoff", "samePage", "saved", "current", "strip", "path", "a", "b", "map_modal_controller_default", "Controller", "element", "readMapHandoff", "event", "parent", "mapIndex", "overviewFrame", "callback", "checkReady", "instance", "attempts", "checkInterval", "onFrameLoad", "maxAttempts", "waitForMap", "rect", "computedStyle", "modalMapContainer", "existingPlaceholder", "mapElement", "orphanedPlaceholder", "placeholder", "targetParent", "stage", "dispatchWindowResize", "modal_tracking_controller_default", "Controller", "modal", "mutations", "mutation", "node", "element", "dismissMethod", "event", "closeTrigger", "selector", "openModal", "name", "properties", "map_switcher_controller_default", "Controller", "type", "savePreference", "event", "select", "a", "metric_chart_switcher_controller_default", "Controller", "event", "metric", "card", "chartData", "dates", "date", "value", "tooltipItems", "dataIndex", "dateString", "ctx", "todayValue", "localeValue", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "currentDate", "now", "context", "chart", "minimal_chart_controller_default", "Controller", "chartData", "date", "value", "ctx", "labels", "dataset", "tooltipItems", "dataIndex", "dateString", "formattedDate", "context", "formattedValue", "index", "event", "activeElements", "chart_year_selector_controller_default", "Controller", "endYear", "chartData", "chartElement", "chartController", "mobile_comp_set_filters_controller_default", "Controller", "event", "form", "formData", "compSet", "bedrooms", "capacity", "params", "mobile_filters_controller_default", "Controller", "urlParams", "amenitiesContainer", "button", "key", "value", "event", "amenity", "item", "form", "select", "input", "formUrl", "buildInsightsFilterUrlFromForm", "updateInsightsBrowserUrl", "filtersContainer", "closeMobileFiltersOverlay", "link", "isReset", "currentSection", "getCurrentStorySection", "linkUrl", "updateInsightsPathWithSection", "e", "syncInsightsFormActionWithCurrentSection", "changedFilters", "filterName", "newValue", "oldValue", "urlAmenities", "newAmenities", "name", "EUROZONE_COUNTRY_CODES", "COUNTRY_CURRENCIES", "code", "LOCAL_CURRENCIES", "currencyForCountry", "countryCode", "code", "COUNTRY_CURRENCIES", "currencyForBuyer", "currencyCode", "fromCountry", "currency", "LOCAL_CURRENCIES", "previewPayload", "result", "displayCurrencyFromPreview", "data", "country", "discountIdForBuyer", "discountIds", "round2", "n", "checkoutSummary", "subtotal", "discount", "tax", "total", "taxMode", "expectedTotals", "net", "off", "taxAmount", "charged", "matchesOurPrice", "p", "taxInclusive", "afterDiscount", "gross", "paddle_controller_default", "Controller", "name", "data", "billingType", "urlParams", "event", "planId", "countryCode", "currencyCode", "discountId", "items", "country", "price", "currentCurrency", "priceAmount", "priceOptions", "lineItem", "totals", "previewCountry", "currencyForBuyer", "amount", "value", "error", "summary", "checkoutSummary", "taxInclusive", "totalAmount", "taxAmount", "discountAmount", "subtotalShown", "lineItemAmount", "priceText", "formattedTotal", "amountDueText", "paddleOptions", "checkout", "explicitDiscountId", "tier", "discountIdForBuyer", "hinted", "priceId", "preview", "previewPayload", "displayCurrencyFromPreview", "nextCurrency", "nextDiscount", "signature", "days", "expires", "nameEQ", "ca", "i", "c", "paywall_controller_default", "Controller", "polygon_navigation_controller_default", "Controller", "event", "polygonUuid", "polygonSlug", "polygonName", "childUrl", "portfolio_controller_default", "Controller", "input", "event", "value", "matches", "userId", "error", "template", "userIds", "id", "form", "url", "csrfToken", "submitButton", "response", "data", "message", "type", "notification", "button", "listingId", "detailsRow", "row", "listingRow", "isExpanding", "rect", "scrollTop", "offset", "targetScrollPosition", "frame", "btn", "plans", "pricing_controller_default", "Controller", "displayAnnually", "annuallyTarget", "monthlyTarget", "event", "plan", "id", "pricing_modal_controller_default", "Controller", "modal", "event", "title", "subtitle", "primary_intent_controller_default", "Controller", "storedIntent", "e", "intent", "event", "button", "csrfToken", "response", "data", "error", "exploreMarketsIntent", "exploreMarketsIntentOther", "intentLabels", "hasText", "text", "exploreIntent", "otherText", "payload", "el", "rating_count_distribution_chart_controller_default", "Controller", "ctx", "percentages", "val", "width", "height", "gradient", "getGradient", "chartArea", "chartWidth", "chartHeight", "context", "chart", "value", "rating_distribution_chart_controller_default", "Controller", "ctx", "colors", "datasets", "val", "ratingData", "index", "data", "context", "stars", "value", "recent_searches_controller_default", "Controller", "parsed", "value", "insights", "autocomplete_controller_default", "calculator", "recentSearches", "mergeRecentSearches", "search", "index", "itemHtml", "isLast", "rowClass", "title", "subtitle", "formatAutocompleteSuggestion", "locationName", "icon", "currentHost", "targetHost", "type", "text", "div", "event", "revenue_histogram_controller_default", "Controller", "ctx", "buckets", "data", "bucket", "bucketSize", "listingRevenue", "highlightColors", "listingBucketIndex", "currencySymbol", "tooltipItems", "item", "datapoint", "context", "bucketIndex", "a", "revenue_tier_controller_default", "Controller", "series", "key", "data", "b", "dateString", "date", "options", "globalMax", "seriesData", "value", "event", "tier", "theme", "button", "buttonTier", "chartData", "tooltipItems", "dataIndex", "ctx", "dates", "todayValue", "localeValue", "currencyCodeValue", "width", "height", "gradient", "accent", "getGradient", "chartArea", "chartWidth", "chartHeight", "context", "chart", "currentDate", "now", "scroll_reveal_controller_default", "Controller", "entries", "entry", "el", "signup_form_controller_default", "Controller", "script", "currentLength", "isPasswordValid", "formValid", "turnstileOk", "template", "event", "sortable_table_controller_default", "Controller", "event", "column", "direction", "datasetKey", "tbody", "left", "right", "leftValue", "rightValue", "missingComparison", "row", "leftMissing", "rightMissing", "value", "suffix", "_", "char", "header", "isActive", "icon", "story_tabs_controller_default", "Controller", "activeTab", "tab", "tabElement", "panelId", "id", "panel", "activePanel", "tabLink", "isMobileTab", "icon", "event", "link", "href", "linkUrl", "e", "marketOverviewFrame", "triggerResize", "scrollContainer", "containerRect", "tabRect", "containerScrollLeft", "containerWidth", "tabLeft", "tabWidth", "scrollTarget", "activeMobileTab", "isMobile", "isActive", "mobileNavFrame", "sectionId", "targetTab", "pathParts", "insightsIndex", "urlSectionToPanelId", "urlSection", "submarkets_controller_default", "Controller", "event", "button", "subscription_modal_controller_default", "Controller", "event", "userId", "userEmail", "application", "adr_tier_controller_default", "amenities_categories_controller_default", "amenities_chart_controller_default", "amenities_dropdown_controller_default", "amplitude_controller_default", "application_controller_default", "auth_controller_default", "autocomplete_controller_default", "bedroom_count_chart_controller_default", "calendar_controller_default", "chart_controller_default", "comp_set_list_row_controller_default", "contact_form_controller_default", "daily_occupancy_chart_controller_default", "desktop_filters_controller_default", "detection_simulator_controller_default", "dropdown_controller_default", "email_exists_modal_controller_default", "filters_container_controller_default", "filters_explainer_controller_default", "gallery_controller_default", "google_ads_controller_default", "google_one_tap_controller_default", "google_places_controller_default", "image_fallback_controller_default", "insights_city_tracking_controller_default", "insights_csv_export_controller_default", "landing_page_tracking_controller_default", "landing_page_engagement_controller_default", "country_filter_controller_default", "link_interceptor_controller_default", "listings_chart_controller_default", "map_expand_controller_default", "map_modal_controller_default", "modal_tracking_controller_default", "map_switcher_controller_default", "metric_chart_switcher_controller_default", "minimal_chart_controller_default", "chart_year_selector_controller_default", "mobile_comp_set_filters_controller_default", "mobile_filters_controller_default", "paddle_controller_default", "paywall_controller_default", "polygon_navigation_controller_default", "portfolio_controller_default", "pricing_controller_default", "pricing_modal_controller_default", "primary_intent_controller_default", "rating_count_distribution_chart_controller_default", "rating_distribution_chart_controller_default", "recent_searches_controller_default", "revenue_histogram_controller_default", "revenue_tier_controller_default", "scroll_reveal_controller_default", "signup_form_controller_default", "sortable_table_controller_default", "story_tabs_controller_default", "submarkets_controller_default", "subscription_modal_controller_default", "turbo_es2017_esm_exports", "__export", "FetchEnctype", "FetchMethod", "FetchRequest", "FetchResponse", "FrameElement", "FrameLoadingStyle", "FrameRenderer", "PageRenderer", "PageSnapshot", "StreamActions", "StreamElement", "StreamSourceElement", "cache", "config", "connectStreamSource", "disconnectStreamSource", "fetchWithTurboHeaders", "fetchEnctypeFromString", "fetchMethodFromString", "isSafe", "morphBodyElements", "morphChildren", "morphElements", "morphTurboFrameElements", "sessionNavigator", "registerAdapter", "renderStreamMessage", "session", "setConfirmMethod", "setFormMode", "setProgressBarDelay", "start", "visit", "_FrameElement", "name", "value", "frameLoadingStyleFromString", "style", "drive", "activateScriptElement", "element", "createdScriptElement", "cspNonce", "getCspNonce", "copyElementAttributes", "destinationElement", "sourceElement", "createDocumentFragment", "html", "template", "dispatch", "eventName", "target", "cancelable", "detail", "event", "cancelEvent", "nextRepaint", "nextEventLoopTick", "nextAnimationFrame", "resolve", "parseHTMLDocument", "unindent", "strings", "values", "lines", "interpolate", "match", "indent", "line", "result", "string", "uuid", "_", "i", "getAttribute", "attributeName", "elements", "hasAttribute", "markAsBusy", "clearBusyState", "waitForLoad", "timeoutInMilliseconds", "onComplete", "getHistoryMethodForAction", "action", "isAction", "getVisitAction", "getMetaElement", "getMetaContent", "nonce", "content", "setMetaContent", "findClosestRecursively", "selector", "elementIsFocusable", "queryAutofocusableElement", "elementOrDocumentFragment", "around", "callback", "reader", "before", "after", "doesNotTargetIFrame", "findLinkFromClickTarget", "link", "linkTarget", "debounce", "fn", "delay", "timeoutId", "args", "submitter", "Config", "#submitter", "forms", "expandURL", "locatable", "getAnchor", "url", "anchorMatch", "getAction$1", "form", "getExtension", "getLastPathComponent", "isPrefixedBy", "baseURL", "prefix", "addTrailingSlash", "locationIsVisitable", "location", "rootLocation", "getLocationForLink", "getRequestURL", "anchor", "toCacheKey", "urlsAreEqual", "left", "right", "getPathComponents", "response", "LimitedSet", "maxSize", "oldestValue", "recentRequests", "options", "modifiedHeaders", "requestUID", "method", "encoding", "#resolveRequestPromise", "_value", "delegate", "requestBody", "enctype", "body", "buildResourceAndBody", "fetchBody", "fetchMethod", "fetchOptions", "#allowRequestToBeIntercepted", "error", "#willDelegateErrorHandling", "fetchResponse", "mimeType", "requestInterception", "resource", "searchParams", "entriesExcludingFiles", "mergeIntoURLSearchParams", "entries", "AppearanceObserver", "StreamMessage", "message", "fragment", "importStreamElements", "streamElement", "inertScriptElement", "identity", "key", "LRUCache", "#toCacheKey", "size", "entry", "index", "PREFETCH_DELAY", "PrefetchCache", "#prefetchTimeout", "#maxAges", "prefetchDelay", "request", "ttl", "cacheTtl", "maxAge", "prefetchCache", "FormSubmissionState", "FormSubmission", "_FormSubmission", "formElement", "mustRedirect", "getMethod", "getAction", "getFormAction", "buildFormData", "getEnctype", "initialized", "requesting", "confirmationMessage", "stopping", "stopped", "token", "getCookieValue", "_request", "responseSucceededWithoutRedirect", "input", "formData", "cookieName", "cookie", "formElementAction", "formAction", "Snapshot", "queryPermanentElementsAll", "id", "getPermanentElementById", "snapshot", "permanentElementMap", "currentPermanentElement", "newPermanentElement", "node", "FormSubmitObserver", "eventTarget", "submissionDoesNotDismissDialog", "submissionDoesNotTargetIFrame", "View", "#resolveRenderPromise", "#resolveInterceptionPromise", "x", "y", "renderer", "isPreview", "shouldRender", "willRender", "shouldInvalidate", "renderInterception", "reason", "direction", "FrameView", "LinkInterceptor", "_event", "LinkClickObserver", "FormLinkClickObserver", "originalEvent", "type", "turboFrame", "turboAction", "turboConfirm", "Bardo", "bardo", "permanentElement", "placeholder", "createPlaceholderForPermanentElement", "clone", "Renderer", "#activeElement", "currentElement", "newElement", "currentSnapshot", "newSnapshot", "reject", "destinationRange", "frameElement", "sourceRange", "renderElement", "block", "readScrollLogicalPosition", "behavior", "readScrollBehavior", "activatedScriptElement", "defaultValue", "Idiomorph", "noOp", "defaults", "elt", "morph", "oldNode", "newContent", "normalizeElement", "newNode", "normalizeParent", "ctx", "createMorphContext", "morphedNodes", "saveAndRestoreFocus", "withHeadBlocking", "morphOuterHTML", "oldParent", "activeElement", "activeElementId", "selectionStart", "selectionEnd", "results", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "removeNodesBetween", "morphNode", "newChildId", "movedChild", "moveBeforeById", "insertedNode", "createNode", "tempNode", "removeNode", "newEmptyChild", "newClonedChild", "startPoint", "softMatch", "nextSibling", "siblingSoftMatchCount", "cursor", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "oldElt", "newElt", "moveBefore", "startInclusive", "endExclusive", "parentNode", "removeElementFromAncestorsIdMaps", "idSet", "handleHeadElement", "morphAttributes", "ignoreValueOfActiveElement", "oldAttributes", "newAttributes", "newAttribute", "ignoreAttribute", "oldAttribute", "syncInputValue", "oldElement", "newValue", "oldValue", "syncBooleanAttribute", "newLiveValue", "oldLiveValue", "ignoreUpdate", "attr", "updateType", "possibleActiveElement", "oldHead", "newHead", "promises", "newCtx", "added", "removed", "preserved", "nodesToAppend", "srcToNewHeadNodes", "newHeadChild", "currentHeadElt", "inNewContent", "isReAppended", "isPreserved", "promise", "_resolve", "removedElement", "persistentIds", "idMap", "createIdMaps", "mergedConfig", "mergeDefaults", "morphStyle", "createPantry", "createActiveElementAndParents", "finalConfig", "pantry", "activeElementAndParents", "findIdElements", "root", "populateIdMapWithTree", "current", "oldContent", "oldIdElements", "newIdElements", "createPersistentIds", "newRoot", "duplicateIds", "oldIdTagNameMap", "tagName", "generatedByIdiomorph", "parseContent", "SlicedParentNode", "dummyParent", "nodes", "nodeList", "referenceNode", "parser", "contentWithSvgsRemoved", "htmlElement", "callbacks", "DefaultIdiomorphCallbacks", "shouldRefreshFrameWithMorphing", "currentFrame", "newFrame", "areFramesCompatibleForRefreshing", "closestFrameReloadableWithMorphing", "#beforeNodeMorphed", "beforeNodeMorphed", "mutationType", "MorphingFrameRenderer", "ProgressBar", "_ProgressBar", "HeadSnapshot", "elementIsNoscript", "elementWithoutNonce", "outerHTML", "details", "elementType", "elementIsTracked", "matchedType", "tracked", "elementIsMetaElementWithName", "elementIsScript", "elementIsStylesheet", "_PageSnapshot", "documentElement", "head", "headSnapshot", "clonedElement", "selectElements", "clonedSelectElements", "source", "option", "clonedPasswordInput", "clonedNoscriptElement", "ViewTransitioner", "#viewTransitionStarted", "#lastOperation", "useViewTransition", "render", "defaultOptions", "TimingMetric", "VisitState", "SystemStatusCode", "Direction", "Visit", "restorationIdentifier", "historyChanged", "referrer", "snapshotHTML", "visitCachedSnapshot", "updateHistory", "shouldCacheSnapshot", "acceptsStreamResponse", "refresh", "actionForHistory", "statusCode", "isSuccessful", "responseHTML", "_response", "redirected", "_error", "scrollPosition", "metric", "BrowserAdapter", "_visit", "_formSubmission", "CacheObserver", "FrameRedirector", "_location", "#shouldRedirect", "frame", "#findFrameElement", "#shouldSubmit", "meta", "History", "state", "additionalData", "restorationData", "turbo", "restorationIndex", "LinkPrefetchObserver", "#prefetchedLink", "#enable", "#tryToPrefetchRequest", "#cancelRequestIfObsolete", "#tryToUsePrefetchedRequest", "#isPrefetchable", "fetchRequest", "#cacheTtl", "#cancelPrefetchRequest", "cached", "turboFrameTarget", "unfetchableLink", "linkToTheSamePage", "linkOptsOut", "nonSafeLink", "eventPrevented", "turboPrefetchParent", "turboMethod", "isUJS", "Navigator", "formSubmission", "visitOptions", "#getActionForFormSubmission", "#getDefaultAction", "PageStage", "PageObserver", "readyState", "ScrollObserver", "position", "StreamMessageRenderer", "getPermanentElementMapForFragment", "withAutofocusFromFragment", "withPreservedFocus", "permanentElementsInDocument", "permanentElementInDocument", "elementInStream", "generatedID", "turboStreams", "elementWithAutofocus", "firstAutofocusableElementInStreams", "willAutofocusId", "elementToAutofocus", "activeElementBeforeRender", "activeElementAfterRender", "restoreFocusTo", "elementToFocus", "nodeListOfStreamElements", "StreamObserver", "#started", "fetchResponseFromEvent", "fetchResponseIsStream", "ErrorRenderer", "replaceableElement", "#setLanguage", "dir", "lang", "mergedHeadElements", "newStylesheetElements", "loadingElements", "newHeadElements", "elementList", "noscriptElement", "MorphingPageRenderer", "SnapshotCache", "PageView", "rendererClass", "cachedSnapshot", "Preloader", "snapshotCache", "#preloadAll", "Cache", "#setCacheControl", "Session", "#pageRefreshDebouncePeriod", "adapter", "requestId", "scroll", "isRecentRequest", "isCurrentUrl", "isUnsafe", "isStream", "frameTarget", "extendURLWithDeprecatedProperties", "defaultPrevented", "_snapshot", "_isPreview", "renderMethod", "ev", "newBody", "timing", "submitterIsNavigatable", "container", "withinFrame", "deprecatedLocationPropertyDescriptors", "confirmMethod", "mode", "currentBody", "Turbo", "TurboFrameMissingError", "FrameController", "_fetchResponse", "#currentFetchRequest", "#resolveVisitPromise", "#connected", "#hasBeenLoaded", "#ignoredAttributes", "#shouldMorphFrame", "#loadSourceURL", "#isIgnoringChangesTo", "src", "#visit", "document", "#loadFrameResponse", "#handleUnvisitableFrameResponse", "#shouldInterceptNavigation", "#navigateFrame", "_renderMethod", "_newElement", "newFrameElement", "#willHandleFrameMissingFromResponse", "#handleFrameMissingFromResponse", "#withCurrentNavigationElement", "pageSnapshot", "#visitResponse", "#throwFrameMissingError", "wrapped", "#getFrameElementById", "activateElement", "#formActionIsVisitable", "sourceURL", "#ignoringChangesToAttribute", "currentURL", "e", "targetElement", "_StreamElement", "c", "existingChildren", "newChildrenIds", "actionFunction", "#raise", "scriptElement", "consumer", "getConsumer", "setConsumer", "createConsumer", "newConsumer", "subscribeTo", "channel", "mixin", "subscriptions", "walk", "obj", "acc", "key", "camel", "m", "x", "TurboCableStreamSourceElement", "connectStreamSource", "subscribeTo", "disconnectStreamSource", "data", "event", "channel", "signed_stream_name", "walk", "encodeMethodIntoRequestBody", "event", "form", "fetchOptions", "submitter", "body", "isBodyInit", "method", "determineFetchMethod", "formMethod", "determineFormMethod", "overrideMethod", "turbo_es2017_esm_exports", "encodeMethodIntoRequestBody", "turbo_es2017_esm_exports", "url", "initializePreline", "popstateHandler", "isInsightsPageWithSection", "pathParts", "validSections", "lastPart", "event"]
}
