{"version":3,"file":"application.js","mappings":"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","sources":["webpack://app/./node_modules/@rails/actioncable/src/adapters.js","webpack://app/./node_modules/@rails/actioncable/src/logger.js","webpack://app/./node_modules/@rails/actioncable/src/connection_monitor.js","webpack://app/./node_modules/@rails/actioncable/src/internal.js","webpack://app/./node_modules/@rails/actioncable/src/connection.js","webpack://app/./node_modules/@rails/actioncable/src/subscription.js","webpack://app/./node_modules/@rails/actioncable/src/subscription_guarantor.js","webpack://app/./node_modules/@rails/actioncable/src/subscriptions.js","webpack://app/./node_modules/@rails/actioncable/src/consumer.js","webpack://app/./node_modules/@rails/actioncable/src/index.js","webpack://app/./node_modules/sharer.js/sharer.js","webpack://app/webpack/bootstrap","webpack://app/webpack/runtime/define property getters","webpack://app/webpack/runtime/global","webpack://app/webpack/runtime/hasOwnProperty shorthand","webpack://app/webpack/runtime/make namespace object","webpack://app/./node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js","webpack://app/./node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js","webpack://app/./node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js","webpack://app/./node_modules/trix/dist/trix.js","webpack://app/./node_modules/@hotwired/stimulus/dist/stimulus.js","webpack://app/./app/javascript/controllers/application.js","webpack://app/./app/javascript/simplelightbox.js","webpack://app/./node_modules/ssr-window/ssr-window.esm.js","webpack://app/./node_modules/dom7/dom7.esm.js","webpack://app/./node_modules/swiper/shared/dom.js","webpack://app/./node_modules/swiper/shared/utils.js","webpack://app/./node_modules/swiper/shared/get-support.js","webpack://app/./node_modules/swiper/shared/get-device.js","webpack://app/./node_modules/swiper/shared/get-browser.js","webpack://app/./node_modules/swiper/core/events-emitter.js","webpack://app/./node_modules/swiper/core/update/index.js","webpack://app/./node_modules/swiper/core/update/updateSize.js","webpack://app/./node_modules/swiper/core/update/updateSlides.js","webpack://app/./node_modules/swiper/core/update/updateAutoHeight.js","webpack://app/./node_modules/swiper/core/update/updateSlidesOffset.js","webpack://app/./node_modules/swiper/core/update/updateSlidesProgress.js","webpack://app/./node_modules/swiper/core/update/updateProgress.js","webpack://app/./node_modules/swiper/core/update/updateSlidesClasses.js","webpack://app/./node_modules/swiper/core/update/updateActiveIndex.js","webpack://app/./node_modules/swiper/core/update/updateClickedSlide.js","webpack://app/./node_modules/swiper/core/translate/index.js","webpack://app/./node_modules/swiper/core/translate/getTranslate.js","webpack://app/./node_modules/swiper/core/translate/setTranslate.js","webpack://app/./node_modules/swiper/core/translate/minTranslate.js","webpack://app/./node_modules/swiper/core/translate/maxTranslate.js","webpack://app/./node_modules/swiper/core/translate/translateTo.js","webpack://app/./node_modules/swiper/core/transition/transitionEmit.js","webpack://app/./node_modules/swiper/core/slide/index.js","webpack://app/./node_modules/swiper/core/slide/slideTo.js","webpack://app/./node_modules/swiper/core/slide/slideToLoop.js","webpack://app/./node_modules/swiper/core/slide/slideNext.js","webpack://app/./node_modules/swiper/core/slide/slidePrev.js","webpack://app/./node_modules/swiper/core/slide/slideReset.js","webpack://app/./node_modules/swiper/core/slide/slideToClosest.js","webpack://app/./node_modules/swiper/core/slide/slideToClickedSlide.js","webpack://app/./node_modules/swiper/core/loop/index.js","webpack://app/./node_modules/swiper/core/loop/loopCreate.js","webpack://app/./node_modules/swiper/core/loop/loopFix.js","webpack://app/./node_modules/swiper/core/loop/loopDestroy.js","webpack://app/./node_modules/swiper/core/events/onTouchStart.js","webpack://app/./node_modules/swiper/core/events/onTouchMove.js","webpack://app/./node_modules/swiper/core/events/onTouchEnd.js","webpack://app/./node_modules/swiper/core/events/onResize.js","webpack://app/./node_modules/swiper/core/events/onClick.js","webpack://app/./node_modules/swiper/core/events/onScroll.js","webpack://app/./node_modules/swiper/core/events/index.js","webpack://app/./node_modules/swiper/core/breakpoints/setBreakpoint.js","webpack://app/./node_modules/swiper/core/breakpoints/index.js","webpack://app/./node_modules/swiper/core/breakpoints/getBreakpoint.js","webpack://app/./node_modules/swiper/core/classes/index.js","webpack://app/./node_modules/swiper/core/classes/addClasses.js","webpack://app/./node_modules/swiper/core/classes/removeClasses.js","webpack://app/./node_modules/swiper/core/images/index.js","webpack://app/./node_modules/swiper/core/images/loadImage.js","webpack://app/./node_modules/swiper/core/images/preloadImages.js","webpack://app/./node_modules/swiper/core/defaults.js","webpack://app/./node_modules/swiper/core/moduleExtendParams.js","webpack://app/./node_modules/swiper/core/core.js","webpack://app/./node_modules/swiper/core/transition/index.js","webpack://app/./node_modules/swiper/core/transition/setTransition.js","webpack://app/./node_modules/swiper/core/transition/transitionStart.js","webpack://app/./node_modules/swiper/core/transition/transitionEnd.js","webpack://app/./node_modules/swiper/core/grab-cursor/index.js","webpack://app/./node_modules/swiper/core/grab-cursor/setGrabCursor.js","webpack://app/./node_modules/swiper/core/grab-cursor/unsetGrabCursor.js","webpack://app/./node_modules/swiper/core/check-overflow/index.js","webpack://app/./node_modules/swiper/core/modules/resize/resize.js","webpack://app/./node_modules/swiper/core/modules/observer/observer.js","webpack://app/./node_modules/swiper/shared/classes-to-selector.js","webpack://app/./node_modules/tom-select/dist/esm/contrib/microevent.js","webpack://app/./app/javascript/controllers/home_carousel_controller.js","webpack://app/./node_modules/swiper/modules/pagination/pagination.js","webpack://app/./node_modules/swiper/shared/create-element-if-not-defined.js","webpack://app/./node_modules/swiper/modules/autoplay/autoplay.js","webpack://app/./node_modules/@orchidjs/unicode-variants/dist/esm/regex.js","webpack://app/./node_modules/@orchidjs/unicode-variants/dist/esm/strings.js","webpack://app/./node_modules/@orchidjs/unicode-variants/dist/esm/index.js","webpack://app/./node_modules/@orchidjs/sifter/dist/esm/utils.js","webpack://app/./node_modules/@orchidjs/sifter/dist/esm/sifter.js","webpack://app/./node_modules/tom-select/dist/esm/utils.js","webpack://app/./node_modules/tom-select/dist/esm/vanilla.js","webpack://app/./node_modules/tom-select/dist/esm/constants.js","webpack://app/./node_modules/tom-select/dist/esm/defaults.js","webpack://app/./node_modules/tom-select/dist/esm/getSettings.js","webpack://app/./node_modules/tom-select/dist/esm/tom-select.js","webpack://app/./node_modules/tom-select/dist/esm/contrib/microplugin.js","webpack://app/./node_modules/tom-select/dist/esm/contrib/highlight.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/checkbox_options/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/drag_drop/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/dropdown_input/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/input_autogrow/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/remove_button/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/tom-select.complete.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/change_listener/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/clear_button/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/dropdown_header/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/caret_position/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/no_backspace_delete/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/no_active_items/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/optgroup_columns/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/restore_on_backspace/plugin.js","webpack://app/./node_modules/tom-select/dist/esm/plugins/virtual_scroll/plugin.js","webpack://app/./node_modules/@rails/request.js/src/fetch_response.js","webpack://app/./node_modules/@rails/request.js/src/lib/utils.js","webpack://app/./node_modules/@rails/request.js/src/fetch_request.js","webpack://app/./node_modules/@rails/request.js/src/request_interceptor.js","webpack://app/./node_modules/@rails/request.js/src/verbs.js","webpack://app/./node_modules/stimulus-sortable/dist/stimulus-sortable.es.js","webpack://app/./node_modules/stimulus-clipboard/dist/stimulus-clipboard.es.js","webpack://app/./app/javascript/controllers/index.js","webpack://app/./app/javascript/controllers/sortable_controller.js","webpack://app/./app/javascript/controllers/mobile_navbar_controller.js","webpack://app/./app/javascript/controllers/navbar_controller.js","webpack://app/./app/javascript/controllers/gallery_controller.js","webpack://app/./app/javascript/share_controller/addresses_controller.js","webpack://app/./app/javascript/controllers/upload_slip_controller.js","webpack://app/./app/javascript/controllers/tabs_controller.js","webpack://app/./app/javascript/controllers/nested_form_controller.js","webpack://app/./app/javascript/controllers/admin_navbar_controller.js","webpack://app/./app/javascript/controllers/expense_form_controller.js","webpack://app/./app/javascript/controllers/combobox_controller.js","webpack://app/./app/javascript/controllers/modal_controller.js","webpack://app/./app/javascript/controllers/dispatch_event_controller.js","webpack://app/./node_modules/@rails/activestorage/app/assets/javascripts/activestorage.esm.js","webpack://app/./node_modules/@rails/actiontext/app/javascript/actiontext/attachment_upload.js","webpack://app/./app/javascript/application.js"],"sourcesContent":["export default {\n  logger: self.console,\n  WebSocket: self.WebSocket\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  recordPing() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    this.recordPing()\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  },\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      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, protocols)\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    if (this.isActive()) {\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  // 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    switch (type) {\n      case message_types.welcome:\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 this.monitor.recordPing()\n      case message_types.confirmation:\n        this.subscriptions.confirmSubscription(identifier)\n        return this.subscriptions.notify(identifier, \"connected\")\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 Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport logger from \"./logger\"\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  }\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\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\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n","import Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport Subscription from \"./subscription\"\nimport Subscriptions from \"./subscriptions\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport adapters from \"./adapters\"\nimport logger from \"./logger\"\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","/**\n * @preserve\n * Sharer.js\n *\n * @description Create your own social share buttons\n * @version 0.5.1\n * @author Ellison Leao <ellisonleao@gmail.com>\n * @license MIT\n *\n */\n\n(function (window, document) {\n  'use strict';\n  /**\n   * @constructor\n   */\n  var Sharer = function (elem) {\n    this.elem = elem;\n  };\n\n  /**\n   *  @function init\n   *  @description bind the events for multiple sharer elements\n   *  @returns {Empty}\n   */\n  Sharer.init = function () {\n    var elems = document.querySelectorAll('[data-sharer]'),\n      i,\n      l = elems.length;\n\n    for (i = 0; i < l; i++) {\n      elems[i].addEventListener('click', Sharer.add);\n    }\n  };\n\n  /**\n   *  @function add\n   *  @description bind the share event for a single dom element\n   *  @returns {Empty}\n   */\n  Sharer.add = function (elem) {\n    var target = elem.currentTarget || elem.srcElement;\n    var sharer = new Sharer(target);\n    sharer.share();\n  };\n\n  // instance methods\n  Sharer.prototype = {\n    constructor: Sharer,\n    /**\n     *  @function getValue\n     *  @description Helper to get the attribute of a DOM element\n     *  @param {String} attr DOM element attribute\n     *  @returns {String|Empty} returns the attr value or empty string\n     */\n    getValue: function (attr) {\n      var val = this.elem.getAttribute('data-' + attr);\n      // handing facebook hashtag attribute\n      if (val && attr === 'hashtag') {\n        if (!val.startsWith('#')) {\n          val = '#' + val;\n        }\n      }\n      return val === null ? '' : val;\n    },\n\n    /**\n     * @event share\n     * @description Main share event. Will pop a window or redirect to a link\n     * based on the data-sharer attribute.\n     */\n    share: function () {\n      var sharer = this.getValue('sharer').toLowerCase(),\n        sharers = {\n          facebook: {\n            shareUrl: 'https://www.facebook.com/sharer/sharer.php',\n            params: {\n              u: this.getValue('url'),\n              hashtag: this.getValue('hashtag'),\n              quote: this.getValue('quote'),\n            },\n          },\n          linkedin: {\n            shareUrl: 'https://www.linkedin.com/shareArticle',\n            params: {\n              url: this.getValue('url'),\n              mini: true,\n            },\n          },\n          twitter: {\n            shareUrl: 'https://twitter.com/intent/tweet/',\n            params: {\n              text: this.getValue('title'),\n              url: this.getValue('url'),\n              hashtags: this.getValue('hashtags'),\n              via: this.getValue('via'),\n            },\n          },\n          email: {\n            shareUrl: 'mailto:' + this.getValue('to'),\n            params: {\n              subject: this.getValue('subject'),\n              body: this.getValue('title') + '\\n' + this.getValue('url'),\n            },\n          },\n          whatsapp: {\n            shareUrl: this.getValue('web') === 'true' ? 'https://web.whatsapp.com/send' : 'https://wa.me/',\n            params: {\n              phone: this.getValue('to'),\n              text: this.getValue('title') + ' ' + this.getValue('url'),\n            },\n          },\n          telegram: {\n            shareUrl: 'https://t.me/share',\n            params: {\n              text: this.getValue('title'),\n              url: this.getValue('url'),\n            },\n          },\n          viber: {\n            shareUrl: 'viber://forward',\n            params: {\n              text: this.getValue('title') + ' ' + this.getValue('url'),\n            },\n          },\n          line: {\n            shareUrl:\n              'http://line.me/R/msg/text/?' + encodeURIComponent(this.getValue('title') + ' ' + this.getValue('url')),\n          },\n          pinterest: {\n            shareUrl: 'https://www.pinterest.com/pin/create/button/',\n            params: {\n              url: this.getValue('url'),\n              media: this.getValue('image'),\n              description: this.getValue('description'),\n            },\n          },\n          tumblr: {\n            shareUrl: 'http://tumblr.com/widgets/share/tool',\n            params: {\n              canonicalUrl: this.getValue('url'),\n              content: this.getValue('url'),\n              posttype: 'link',\n              title: this.getValue('title'),\n              caption: this.getValue('caption'),\n              tags: this.getValue('tags'),\n            },\n          },\n          hackernews: {\n            shareUrl: 'https://news.ycombinator.com/submitlink',\n            params: {\n              u: this.getValue('url'),\n              t: this.getValue('title'),\n            },\n          },\n          reddit: {\n            shareUrl: 'https://www.reddit.com/submit',\n            params: { url: this.getValue('url'), title: this.getValue('title') },\n          },\n          vk: {\n            shareUrl: 'http://vk.com/share.php',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n              description: this.getValue('caption'),\n              image: this.getValue('image'),\n            },\n          },\n          xing: {\n            shareUrl: 'https://www.xing.com/social/share/spi',\n            params: {\n              url: this.getValue('url'),\n            },\n          },\n          buffer: {\n            shareUrl: 'https://buffer.com/add',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n              via: this.getValue('via'),\n              picture: this.getValue('picture'),\n            },\n          },\n          instapaper: {\n            shareUrl: 'http://www.instapaper.com/edit',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n              description: this.getValue('description'),\n            },\n          },\n          pocket: {\n            shareUrl: 'https://getpocket.com/save',\n            params: {\n              url: this.getValue('url'),\n            },\n          },\n          mashable: {\n            shareUrl: 'https://mashable.com/submit',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n            },\n          },\n          mix: {\n            shareUrl: 'https://mix.com/add',\n            params: {\n              url: this.getValue('url'),\n            },\n          },\n          flipboard: {\n            shareUrl: 'https://share.flipboard.com/bookmarklet/popout',\n            params: {\n              v: 2,\n              title: this.getValue('title'),\n              url: this.getValue('url'),\n              t: Date.now(),\n            },\n          },\n          weibo: {\n            shareUrl: 'http://service.weibo.com/share/share.php',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n              pic: this.getValue('image'),\n              appkey: this.getValue('appkey'),\n              ralateUid: this.getValue('ralateuid'),\n              language: 'zh_cn',\n            },\n          },\n          blogger: {\n            shareUrl: 'https://www.blogger.com/blog-this.g',\n            params: {\n              u: this.getValue('url'),\n              n: this.getValue('title'),\n              t: this.getValue('description'),\n            },\n          },\n          baidu: {\n            shareUrl: 'http://cang.baidu.com/do/add',\n            params: {\n              it: this.getValue('title'),\n              iu: this.getValue('url'),\n            },\n          },\n          douban: {\n            shareUrl: 'https://www.douban.com/share/service',\n            params: {\n              name: this.getValue('name'),\n              href: this.getValue('url'),\n              image: this.getValue('image'),\n              comment: this.getValue('description'),\n            },\n          },\n          okru: {\n            shareUrl: 'https://connect.ok.ru/dk',\n            params: {\n              'st.cmd': 'WidgetSharePreview',\n              'st.shareUrl': this.getValue('url'),\n              title: this.getValue('title'),\n            },\n          },\n          mailru: {\n            shareUrl: 'http://connect.mail.ru/share',\n            params: {\n              share_url: this.getValue('url'),\n              linkname: this.getValue('title'),\n              linknote: this.getValue('description'),\n              type: 'page',\n            },\n          },\n          evernote: {\n            shareUrl: 'https://www.evernote.com/clip.action',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n            },\n          },\n          skype: {\n            shareUrl: 'https://web.skype.com/share',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n            },\n          },\n          delicious: {\n            shareUrl: 'https://del.icio.us/post',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n            },\n          },\n          sms: {\n            shareUrl: 'sms://',\n            params: {\n              body: this.getValue('body'),\n            },\n          },\n          trello: {\n            shareUrl: 'https://trello.com/add-card',\n            params: {\n              url: this.getValue('url'),\n              name: this.getValue('title'),\n              desc: this.getValue('description'),\n              mode: 'popup',\n            },\n          },\n          messenger: {\n            shareUrl: 'fb-messenger://share',\n            params: {\n              link: this.getValue('url'),\n            },\n          },\n          odnoklassniki: {\n            shareUrl: 'https://connect.ok.ru/dk',\n            params: {\n              st: {\n                cmd: 'WidgetSharePreview',\n                deprecated: 1,\n                shareUrl: this.getValue('url'),\n              },\n            },\n          },\n          meneame: {\n            shareUrl: 'https://www.meneame.net/submit',\n            params: {\n              url: this.getValue('url'),\n            },\n          },\n          diaspora: {\n            shareUrl: 'https://share.diasporafoundation.org',\n            params: {\n              title: this.getValue('title'),\n              url: this.getValue('url'),\n            },\n          },\n          googlebookmarks: {\n            shareUrl: 'https://www.google.com/bookmarks/mark',\n            params: {\n              op: 'edit',\n              bkmk: this.getValue('url'),\n              title: this.getValue('title'),\n            },\n          },\n          qzone: {\n            shareUrl: 'https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey',\n            params: {\n              url: this.getValue('url'),\n            },\n          },\n          refind: {\n            shareUrl: 'https://refind.com',\n            params: {\n              url: this.getValue('url'),\n            },\n          },\n          surfingbird: {\n            shareUrl: 'https://surfingbird.ru/share',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n              description: this.getValue('description'),\n            },\n          },\n          yahoomail: {\n            shareUrl: 'http://compose.mail.yahoo.com',\n            params: {\n              to: this.getValue('to'),\n              subject: this.getValue('subject'),\n              body: this.getValue('body'),\n            },\n          },\n          wordpress: {\n            shareUrl: 'https://wordpress.com/wp-admin/press-this.php',\n            params: {\n              u: this.getValue('url'),\n              t: this.getValue('title'),\n              s: this.getValue('title'),\n            },\n          },\n          amazon: {\n            shareUrl: 'https://www.amazon.com/gp/wishlist/static-add',\n            params: {\n              u: this.getValue('url'),\n              t: this.getValue('title'),\n            },\n          },\n          pinboard: {\n            shareUrl: 'https://pinboard.in/add',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n              description: this.getValue('description'),\n            },\n          },\n          threema: {\n            shareUrl: 'threema://compose',\n            params: {\n              text: this.getValue('text'),\n              id: this.getValue('id'),\n            },\n          },\n          kakaostory: {\n            shareUrl: 'https://story.kakao.com/share',\n            params: {\n              url: this.getValue('url'),\n            },\n          },\n          yummly: {\n            shareUrl: 'http://www.yummly.com/urb/verify',\n            params: {\n              url: this.getValue('url'),\n              title: this.getValue('title'),\n              yumtype: 'button',\n            },\n          },\n        },\n        s = sharers[sharer];\n\n      // custom popups sizes\n      if (s) {\n        s.width = this.getValue('width');\n        s.height = this.getValue('height');\n      }\n      return s !== undefined ? this.urlSharer(s) : false;\n    },\n    /**\n     * @event urlSharer\n     * @param {Object} sharer\n     */\n    urlSharer: function (sharer) {\n      var p = sharer.params || {},\n        keys = Object.keys(p),\n        i,\n        str = keys.length > 0 ? '?' : '';\n      for (i = 0; i < keys.length; i++) {\n        if (str !== '?') {\n          str += '&';\n        }\n        if (p[keys[i]]) {\n          str += keys[i] + '=' + encodeURIComponent(p[keys[i]]);\n        }\n      }\n      sharer.shareUrl += str;\n\n      var isLink = this.getValue('link') === 'true';\n      var isBlank = this.getValue('blank') === 'true';\n\n      if (isLink) {\n        if (isBlank) {\n          window.open(sharer.shareUrl, '_blank');\n        } else {\n          window.location.href = sharer.shareUrl;\n        }\n      } else {\n        console.log(sharer.shareUrl);\n        // defaults to popup if no data-link is provided\n        var popWidth = sharer.width || 600,\n          popHeight = sharer.height || 480,\n          left = window.innerWidth / 2 - popWidth / 2 + window.screenX,\n          top = window.innerHeight / 2 - popHeight / 2 + window.screenY,\n          popParams = 'scrollbars=no, width=' + popWidth + ', height=' + popHeight + ', top=' + top + ', left=' + left,\n          newWindow = window.open(sharer.shareUrl, '', popParams);\n\n        if (window.focus) {\n          newWindow.focus();\n        }\n      }\n    },\n  };\n\n  // adding sharer events on domcontentload\n  if (document.readyState === 'complete' || document.readyState !== 'loading') {\n    Sharer.init();\n  } else {\n    document.addEventListener('DOMContentLoaded', Sharer.init);\n  }\n\n  // exporting sharer for external usage\n  window.Sharer = Sharer;\n})(window, document);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\nTurbo 7.1.0\nCopyright © 2021 Basecamp, LLC\n */\n(function () {\n    if (window.Reflect === undefined || window.customElements === undefined ||\n        window.customElements.polyfillWrapFlushCallback) {\n        return;\n    }\n    const BuiltInHTMLElement = HTMLElement;\n    const wrapperForTheName = {\n        'HTMLElement': function HTMLElement() {\n            return Reflect.construct(BuiltInHTMLElement, [], this.constructor);\n        }\n    };\n    window.HTMLElement =\n        wrapperForTheName['HTMLElement'];\n    HTMLElement.prototype = BuiltInHTMLElement.prototype;\n    HTMLElement.prototype.constructor = HTMLElement;\n    Object.setPrototypeOf(HTMLElement, BuiltInHTMLElement);\n})();\n\n/**\n * The MIT License (MIT)\n * \n * Copyright (c) 2019 Javan Makhmali\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all 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,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n(function(prototype) {\n  if (typeof prototype.requestSubmit == \"function\") return\n\n  prototype.requestSubmit = function(submitter) {\n    if (submitter) {\n      validateSubmitter(submitter, this);\n      submitter.click();\n    } else {\n      submitter = document.createElement(\"input\");\n      submitter.type = \"submit\";\n      submitter.hidden = true;\n      this.appendChild(submitter);\n      submitter.click();\n      this.removeChild(submitter);\n    }\n  };\n\n  function validateSubmitter(submitter, form) {\n    submitter instanceof HTMLElement || raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n    submitter.type == \"submit\" || raise(TypeError, \"The specified element is not a submit button\");\n    submitter.form == form || raise(DOMException, \"The specified element is not owned by this form element\", \"NotFoundError\");\n  }\n\n  function raise(errorConstructor, message, name) {\n    throw new errorConstructor(\"Failed to execute 'requestSubmit' on 'HTMLFormElement': \" + message + \".\", name)\n  }\n})(HTMLFormElement.prototype);\n\nconst submittersByForm = new WeakMap;\nfunction findSubmitterFromClickTarget(target) {\n    const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n    const candidate = element ? element.closest(\"input, button\") : null;\n    return (candidate === null || candidate === void 0 ? void 0 : candidate.type) == \"submit\" ? candidate : null;\n}\nfunction clickCaptured(event) {\n    const submitter = findSubmitterFromClickTarget(event.target);\n    if (submitter && submitter.form) {\n        submittersByForm.set(submitter.form, submitter);\n    }\n}\n(function () {\n    if (\"submitter\" in Event.prototype)\n        return;\n    let prototype;\n    if (\"SubmitEvent\" in window && /Apple Computer/.test(navigator.vendor)) {\n        prototype = window.SubmitEvent.prototype;\n    }\n    else if (\"SubmitEvent\" in window) {\n        return;\n    }\n    else {\n        prototype = window.Event.prototype;\n    }\n    addEventListener(\"click\", clickCaptured, true);\n    Object.defineProperty(prototype, \"submitter\", {\n        get() {\n            if (this.type == \"submit\" && this.target instanceof HTMLFormElement) {\n                return submittersByForm.get(this.target);\n            }\n        }\n    });\n})();\n\nvar FrameLoadingStyle;\n(function (FrameLoadingStyle) {\n    FrameLoadingStyle[\"eager\"] = \"eager\";\n    FrameLoadingStyle[\"lazy\"] = \"lazy\";\n})(FrameLoadingStyle || (FrameLoadingStyle = {}));\nclass FrameElement extends HTMLElement {\n    constructor() {\n        super();\n        this.loaded = Promise.resolve();\n        this.delegate = new FrameElement.delegateConstructor(this);\n    }\n    static get observedAttributes() {\n        return [\"disabled\", \"loading\", \"src\"];\n    }\n    connectedCallback() {\n        this.delegate.connect();\n    }\n    disconnectedCallback() {\n        this.delegate.disconnect();\n    }\n    reload() {\n        const { src } = this;\n        this.src = null;\n        this.src = src;\n    }\n    attributeChangedCallback(name) {\n        if (name == \"loading\") {\n            this.delegate.loadingStyleChanged();\n        }\n        else if (name == \"src\") {\n            this.delegate.sourceURLChanged();\n        }\n        else {\n            this.delegate.disabledChanged();\n        }\n    }\n    get src() {\n        return this.getAttribute(\"src\");\n    }\n    set src(value) {\n        if (value) {\n            this.setAttribute(\"src\", value);\n        }\n        else {\n            this.removeAttribute(\"src\");\n        }\n    }\n    get loading() {\n        return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\");\n    }\n    set loading(value) {\n        if (value) {\n            this.setAttribute(\"loading\", value);\n        }\n        else {\n            this.removeAttribute(\"loading\");\n        }\n    }\n    get disabled() {\n        return this.hasAttribute(\"disabled\");\n    }\n    set disabled(value) {\n        if (value) {\n            this.setAttribute(\"disabled\", \"\");\n        }\n        else {\n            this.removeAttribute(\"disabled\");\n        }\n    }\n    get autoscroll() {\n        return this.hasAttribute(\"autoscroll\");\n    }\n    set autoscroll(value) {\n        if (value) {\n            this.setAttribute(\"autoscroll\", \"\");\n        }\n        else {\n            this.removeAttribute(\"autoscroll\");\n        }\n    }\n    get complete() {\n        return !this.delegate.isLoading;\n    }\n    get isActive() {\n        return this.ownerDocument === document && !this.isPreview;\n    }\n    get isPreview() {\n        var _a, _b;\n        return (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.hasAttribute(\"data-turbo-preview\");\n    }\n}\nfunction frameLoadingStyleFromString(style) {\n    switch (style.toLowerCase()) {\n        case \"lazy\": return FrameLoadingStyle.lazy;\n        default: return FrameLoadingStyle.eager;\n    }\n}\n\nfunction expandURL(locatable) {\n    return new URL(locatable.toString(), document.baseURI);\n}\nfunction getAnchor(url) {\n    let anchorMatch;\n    if (url.hash) {\n        return url.hash.slice(1);\n    }\n    else if (anchorMatch = url.href.match(/#(.*)$/)) {\n        return anchorMatch[1];\n    }\n}\nfunction getAction(form, submitter) {\n    const action = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formaction\")) || form.getAttribute(\"action\") || form.action;\n    return expandURL(action);\n}\nfunction getExtension(url) {\n    return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\";\n}\nfunction isHTML(url) {\n    return !!getExtension(url).match(/^(?:|\\.(?:htm|html|xhtml))$/);\n}\nfunction isPrefixedBy(baseURL, url) {\n    const prefix = getPrefix(url);\n    return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix);\n}\nfunction locationIsVisitable(location, rootLocation) {\n    return isPrefixedBy(location, rootLocation) && isHTML(location);\n}\nfunction getRequestURL(url) {\n    const anchor = getAnchor(url);\n    return anchor != null\n        ? url.href.slice(0, -(anchor.length + 1))\n        : url.href;\n}\nfunction toCacheKey(url) {\n    return getRequestURL(url);\n}\nfunction urlsAreEqual(left, right) {\n    return expandURL(left).href == expandURL(right).href;\n}\nfunction getPathComponents(url) {\n    return url.pathname.split(\"/\").slice(1);\n}\nfunction getLastPathComponent(url) {\n    return getPathComponents(url).slice(-1)[0];\n}\nfunction getPrefix(url) {\n    return addTrailingSlash(url.origin + url.pathname);\n}\nfunction addTrailingSlash(value) {\n    return value.endsWith(\"/\") ? value : value + \"/\";\n}\n\nclass FetchResponse {\n    constructor(response) {\n        this.response = response;\n    }\n    get succeeded() {\n        return this.response.ok;\n    }\n    get failed() {\n        return !this.succeeded;\n    }\n    get clientError() {\n        return this.statusCode >= 400 && this.statusCode <= 499;\n    }\n    get serverError() {\n        return this.statusCode >= 500 && this.statusCode <= 599;\n    }\n    get redirected() {\n        return this.response.redirected;\n    }\n    get location() {\n        return expandURL(this.response.url);\n    }\n    get isHTML() {\n        return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/);\n    }\n    get statusCode() {\n        return this.response.status;\n    }\n    get contentType() {\n        return this.header(\"Content-Type\");\n    }\n    get responseText() {\n        return this.response.clone().text();\n    }\n    get responseHTML() {\n        if (this.isHTML) {\n            return this.response.clone().text();\n        }\n        else {\n            return Promise.resolve(undefined);\n        }\n    }\n    header(name) {\n        return this.response.headers.get(name);\n    }\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n    const event = new CustomEvent(eventName, { cancelable, bubbles: true, detail });\n    if (target && target.isConnected) {\n        target.dispatchEvent(event);\n    }\n    else {\n        document.documentElement.dispatchEvent(event);\n    }\n    return event;\n}\nfunction nextAnimationFrame() {\n    return new Promise(resolve => requestAnimationFrame(() => resolve()));\n}\nfunction nextEventLoopTick() {\n    return new Promise(resolve => setTimeout(() => resolve(), 0));\n}\nfunction nextMicrotask() {\n    return Promise.resolve();\n}\nfunction parseHTMLDocument(html = \"\") {\n    return new DOMParser().parseFromString(html, \"text/html\");\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}\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}\nfunction uuid() {\n    return Array.apply(null, { length: 36 }).map((_, i) => {\n        if (i == 8 || i == 13 || i == 18 || i == 23) {\n            return \"-\";\n        }\n        else if (i == 14) {\n            return \"4\";\n        }\n        else if (i == 19) {\n            return (Math.floor(Math.random() * 4) + 8).toString(16);\n        }\n        else {\n            return Math.floor(Math.random() * 15).toString(16);\n        }\n    }).join(\"\");\n}\nfunction getAttribute(attributeName, ...elements) {\n    for (const value of elements.map(element => element === null || element === void 0 ? void 0 : element.getAttribute(attributeName))) {\n        if (typeof value == \"string\")\n            return value;\n    }\n    return null;\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}\nfunction clearBusyState(...elements) {\n    for (const element of elements) {\n        if (element.localName == \"turbo-frame\") {\n            element.removeAttribute(\"busy\");\n        }\n        element.removeAttribute(\"aria-busy\");\n    }\n}\n\nvar FetchMethod;\n(function (FetchMethod) {\n    FetchMethod[FetchMethod[\"get\"] = 0] = \"get\";\n    FetchMethod[FetchMethod[\"post\"] = 1] = \"post\";\n    FetchMethod[FetchMethod[\"put\"] = 2] = \"put\";\n    FetchMethod[FetchMethod[\"patch\"] = 3] = \"patch\";\n    FetchMethod[FetchMethod[\"delete\"] = 4] = \"delete\";\n})(FetchMethod || (FetchMethod = {}));\nfunction fetchMethodFromString(method) {\n    switch (method.toLowerCase()) {\n        case \"get\": return FetchMethod.get;\n        case \"post\": return FetchMethod.post;\n        case \"put\": return FetchMethod.put;\n        case \"patch\": return FetchMethod.patch;\n        case \"delete\": return FetchMethod.delete;\n    }\n}\nclass FetchRequest {\n    constructor(delegate, method, location, body = new URLSearchParams, target = null) {\n        this.abortController = new AbortController;\n        this.resolveRequestPromise = (value) => { };\n        this.delegate = delegate;\n        this.method = method;\n        this.headers = this.defaultHeaders;\n        this.body = body;\n        this.url = location;\n        this.target = target;\n    }\n    get location() {\n        return this.url;\n    }\n    get params() {\n        return this.url.searchParams;\n    }\n    get entries() {\n        return this.body ? Array.from(this.body.entries()) : [];\n    }\n    cancel() {\n        this.abortController.abort();\n    }\n    async perform() {\n        var _a, _b;\n        const { fetchOptions } = this;\n        (_b = (_a = this.delegate).prepareHeadersForRequest) === null || _b === void 0 ? void 0 : _b.call(_a, this.headers, this);\n        await this.allowRequestToBeIntercepted(fetchOptions);\n        try {\n            this.delegate.requestStarted(this);\n            const response = await fetch(this.url.href, fetchOptions);\n            return await this.receive(response);\n        }\n        catch (error) {\n            if (error.name !== 'AbortError') {\n                this.delegate.requestErrored(this, error);\n                throw error;\n            }\n        }\n        finally {\n            this.delegate.requestFinished(this);\n        }\n    }\n    async receive(response) {\n        const fetchResponse = new FetchResponse(response);\n        const event = dispatch(\"turbo:before-fetch-response\", { cancelable: true, detail: { fetchResponse }, target: this.target });\n        if (event.defaultPrevented) {\n            this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n        }\n        else if (fetchResponse.succeeded) {\n            this.delegate.requestSucceededWithResponse(this, fetchResponse);\n        }\n        else {\n            this.delegate.requestFailedWithResponse(this, fetchResponse);\n        }\n        return fetchResponse;\n    }\n    get fetchOptions() {\n        var _a;\n        return {\n            method: FetchMethod[this.method].toUpperCase(),\n            credentials: \"same-origin\",\n            headers: this.headers,\n            redirect: \"follow\",\n            body: this.isIdempotent ? null : this.body,\n            signal: this.abortSignal,\n            referrer: (_a = this.delegate.referrer) === null || _a === void 0 ? void 0 : _a.href\n        };\n    }\n    get defaultHeaders() {\n        return {\n            \"Accept\": \"text/html, application/xhtml+xml\"\n        };\n    }\n    get isIdempotent() {\n        return this.method == FetchMethod.get;\n    }\n    get abortSignal() {\n        return this.abortController.signal;\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        if (event.defaultPrevented)\n            await requestInterception;\n    }\n}\n\nclass AppearanceObserver {\n    constructor(delegate, element) {\n        this.started = false;\n        this.intersect = entries => {\n            const lastEntry = entries.slice(-1)[0];\n            if (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.isIntersecting) {\n                this.delegate.elementAppearedInViewport(this.element);\n            }\n        };\n        this.delegate = delegate;\n        this.element = element;\n        this.intersectionObserver = new IntersectionObserver(this.intersect);\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.intersectionObserver.observe(this.element);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.intersectionObserver.unobserve(this.element);\n        }\n    }\n}\n\nclass StreamMessage {\n    constructor(html) {\n        this.templateElement = document.createElement(\"template\");\n        this.templateElement.innerHTML = html;\n    }\n    static wrap(message) {\n        if (typeof message == \"string\") {\n            return new this(message);\n        }\n        else {\n            return message;\n        }\n    }\n    get fragment() {\n        const fragment = document.createDocumentFragment();\n        for (const element of this.foreignElements) {\n            fragment.appendChild(document.importNode(element, true));\n        }\n        return fragment;\n    }\n    get foreignElements() {\n        return this.templateChildren.reduce((streamElements, child) => {\n            if (child.tagName.toLowerCase() == \"turbo-stream\") {\n                return [...streamElements, child];\n            }\n            else {\n                return streamElements;\n            }\n        }, []);\n    }\n    get templateChildren() {\n        return Array.from(this.templateElement.content.children);\n    }\n}\nStreamMessage.contentType = \"text/vnd.turbo-stream.html\";\n\nvar FormSubmissionState;\n(function (FormSubmissionState) {\n    FormSubmissionState[FormSubmissionState[\"initialized\"] = 0] = \"initialized\";\n    FormSubmissionState[FormSubmissionState[\"requesting\"] = 1] = \"requesting\";\n    FormSubmissionState[FormSubmissionState[\"waiting\"] = 2] = \"waiting\";\n    FormSubmissionState[FormSubmissionState[\"receiving\"] = 3] = \"receiving\";\n    FormSubmissionState[FormSubmissionState[\"stopping\"] = 4] = \"stopping\";\n    FormSubmissionState[FormSubmissionState[\"stopped\"] = 5] = \"stopped\";\n})(FormSubmissionState || (FormSubmissionState = {}));\nvar FormEnctype;\n(function (FormEnctype) {\n    FormEnctype[\"urlEncoded\"] = \"application/x-www-form-urlencoded\";\n    FormEnctype[\"multipart\"] = \"multipart/form-data\";\n    FormEnctype[\"plain\"] = \"text/plain\";\n})(FormEnctype || (FormEnctype = {}));\nfunction formEnctypeFromString(encoding) {\n    switch (encoding.toLowerCase()) {\n        case FormEnctype.multipart: return FormEnctype.multipart;\n        case FormEnctype.plain: return FormEnctype.plain;\n        default: return FormEnctype.urlEncoded;\n    }\n}\nclass FormSubmission {\n    constructor(delegate, formElement, submitter, mustRedirect = false) {\n        this.state = FormSubmissionState.initialized;\n        this.delegate = delegate;\n        this.formElement = formElement;\n        this.submitter = submitter;\n        this.formData = buildFormData(formElement, submitter);\n        this.location = expandURL(this.action);\n        if (this.method == FetchMethod.get) {\n            mergeFormDataEntries(this.location, [...this.body.entries()]);\n        }\n        this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body, this.formElement);\n        this.mustRedirect = mustRedirect;\n    }\n    static confirmMethod(message, element) {\n        return confirm(message);\n    }\n    get method() {\n        var _a;\n        const method = ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formmethod\")) || this.formElement.getAttribute(\"method\") || \"\";\n        return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get;\n    }\n    get action() {\n        var _a;\n        const formElementAction = typeof this.formElement.action === 'string' ? this.formElement.action : null;\n        return ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formaction\")) || this.formElement.getAttribute(\"action\") || formElementAction || \"\";\n    }\n    get body() {\n        if (this.enctype == FormEnctype.urlEncoded || this.method == FetchMethod.get) {\n            return new URLSearchParams(this.stringFormData);\n        }\n        else {\n            return this.formData;\n        }\n    }\n    get enctype() {\n        var _a;\n        return formEnctypeFromString(((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formenctype\")) || this.formElement.enctype);\n    }\n    get isIdempotent() {\n        return this.fetchRequest.isIdempotent;\n    }\n    get stringFormData() {\n        return [...this.formData].reduce((entries, [name, value]) => {\n            return entries.concat(typeof value == \"string\" ? [[name, value]] : []);\n        }, []);\n    }\n    get confirmationMessage() {\n        return this.formElement.getAttribute(\"data-turbo-confirm\");\n    }\n    get needsConfirmation() {\n        return this.confirmationMessage !== null;\n    }\n    async start() {\n        const { initialized, requesting } = FormSubmissionState;\n        if (this.needsConfirmation) {\n            const answer = FormSubmission.confirmMethod(this.confirmationMessage, this.formElement);\n            if (!answer) {\n                return;\n            }\n        }\n        if (this.state == initialized) {\n            this.state = requesting;\n            return this.fetchRequest.perform();\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    prepareHeadersForRequest(headers, request) {\n        if (!request.isIdempotent) {\n            const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n            if (token) {\n                headers[\"X-CSRF-Token\"] = token;\n            }\n            headers[\"Accept\"] = [StreamMessage.contentType, headers[\"Accept\"]].join(\", \");\n        }\n    }\n    requestStarted(request) {\n        var _a;\n        this.state = FormSubmissionState.waiting;\n        (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.setAttribute(\"disabled\", \"\");\n        dispatch(\"turbo:submit-start\", { target: this.formElement, detail: { formSubmission: this } });\n        this.delegate.formSubmissionStarted(this);\n    }\n    requestPreventedHandlingResponse(request, response) {\n        this.result = { success: response.succeeded, fetchResponse: response };\n    }\n    requestSucceededWithResponse(request, response) {\n        if (response.clientError || response.serverError) {\n            this.delegate.formSubmissionFailedWithResponse(this, response);\n        }\n        else 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        }\n        else {\n            this.state = FormSubmissionState.receiving;\n            this.result = { success: true, fetchResponse: response };\n            this.delegate.formSubmissionSucceededWithResponse(this, response);\n        }\n    }\n    requestFailedWithResponse(request, response) {\n        this.result = { success: false, fetchResponse: response };\n        this.delegate.formSubmissionFailedWithResponse(this, response);\n    }\n    requestErrored(request, error) {\n        this.result = { success: false, error };\n        this.delegate.formSubmissionErrored(this, error);\n    }\n    requestFinished(request) {\n        var _a;\n        this.state = FormSubmissionState.stopped;\n        (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.removeAttribute(\"disabled\");\n        dispatch(\"turbo:submit-end\", { target: this.formElement, detail: Object.assign({ formSubmission: this }, this.result) });\n        this.delegate.formSubmissionFinished(this);\n    }\n    requestMustRedirect(request) {\n        return !request.isIdempotent && this.mustRedirect;\n    }\n}\nfunction buildFormData(formElement, submitter) {\n    const formData = new FormData(formElement);\n    const name = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"name\");\n    const value = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"value\");\n    if (name && value != null && formData.get(name) != value) {\n        formData.append(name, value);\n    }\n    return formData;\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}\nfunction getMetaContent(name) {\n    const element = document.querySelector(`meta[name=\"${name}\"]`);\n    return element && element.content;\n}\nfunction responseSucceededWithoutRedirect(response) {\n    return response.statusCode == 200 && !response.redirected;\n}\nfunction mergeFormDataEntries(url, entries) {\n    const searchParams = new URLSearchParams;\n    for (const [name, value] of entries) {\n        if (value instanceof File)\n            continue;\n        searchParams.append(name, value);\n    }\n    url.search = searchParams.toString();\n    return url;\n}\n\nclass Snapshot {\n    constructor(element) {\n        this.element = element;\n    }\n    get children() {\n        return [...this.element.children];\n    }\n    hasAnchor(anchor) {\n        return this.getElementForAnchor(anchor) != null;\n    }\n    getElementForAnchor(anchor) {\n        return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null;\n    }\n    get isConnected() {\n        return this.element.isConnected;\n    }\n    get firstAutofocusableElement() {\n        return this.element.querySelector(\"[autofocus]\");\n    }\n    get permanentElements() {\n        return [...this.element.querySelectorAll(\"[id][data-turbo-permanent]\")];\n    }\n    getPermanentElementById(id) {\n        return this.element.querySelector(`#${id}[data-turbo-permanent]`);\n    }\n    getPermanentElementMapForSnapshot(snapshot) {\n        const permanentElementMap = {};\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        return permanentElementMap;\n    }\n}\n\nclass FormInterceptor {\n    constructor(delegate, element) {\n        this.submitBubbled = ((event) => {\n            const form = event.target;\n            if (!event.defaultPrevented && form instanceof HTMLFormElement && form.closest(\"turbo-frame, html\") == this.element) {\n                const submitter = event.submitter || undefined;\n                const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.method;\n                if (method != \"dialog\" && this.delegate.shouldInterceptFormSubmission(form, submitter)) {\n                    event.preventDefault();\n                    event.stopImmediatePropagation();\n                    this.delegate.formSubmissionIntercepted(form, submitter);\n                }\n            }\n        });\n        this.delegate = delegate;\n        this.element = element;\n    }\n    start() {\n        this.element.addEventListener(\"submit\", this.submitBubbled);\n    }\n    stop() {\n        this.element.removeEventListener(\"submit\", this.submitBubbled);\n    }\n}\n\nclass View {\n    constructor(delegate, element) {\n        this.resolveRenderPromise = (value) => { };\n        this.resolveInterceptionPromise = (value) => { };\n        this.delegate = delegate;\n        this.element = element;\n    }\n    scrollToAnchor(anchor) {\n        const element = this.snapshot.getElementForAnchor(anchor);\n        if (element) {\n            this.scrollToElement(element);\n            this.focusElement(element);\n        }\n        else {\n            this.scrollToPosition({ x: 0, y: 0 });\n        }\n    }\n    scrollToAnchorFromLocation(location) {\n        this.scrollToAnchor(getAnchor(location));\n    }\n    scrollToElement(element) {\n        element.scrollIntoView();\n    }\n    focusElement(element) {\n        if (element instanceof HTMLElement) {\n            if (element.hasAttribute(\"tabindex\")) {\n                element.focus();\n            }\n            else {\n                element.setAttribute(\"tabindex\", \"-1\");\n                element.focus();\n                element.removeAttribute(\"tabindex\");\n            }\n        }\n    }\n    scrollToPosition({ x, y }) {\n        this.scrollRoot.scrollTo(x, y);\n    }\n    scrollToTop() {\n        this.scrollToPosition({ x: 0, y: 0 });\n    }\n    get scrollRoot() {\n        return window;\n    }\n    async render(renderer) {\n        const { isPreview, shouldRender, newSnapshot: snapshot } = renderer;\n        if (shouldRender) {\n            try {\n                this.renderPromise = new Promise(resolve => this.resolveRenderPromise = resolve);\n                this.renderer = renderer;\n                this.prepareToRenderSnapshot(renderer);\n                const renderInterception = new Promise(resolve => this.resolveInterceptionPromise = resolve);\n                const immediateRender = this.delegate.allowsImmediateRender(snapshot, this.resolveInterceptionPromise);\n                if (!immediateRender)\n                    await renderInterception;\n                await this.renderSnapshot(renderer);\n                this.delegate.viewRenderedSnapshot(snapshot, isPreview);\n                this.finishRenderingSnapshot(renderer);\n            }\n            finally {\n                delete this.renderer;\n                this.resolveRenderPromise(undefined);\n                delete this.renderPromise;\n            }\n        }\n        else {\n            this.invalidate();\n        }\n    }\n    invalidate() {\n        this.delegate.viewInvalidated();\n    }\n    prepareToRenderSnapshot(renderer) {\n        this.markAsPreview(renderer.isPreview);\n        renderer.prepareToRender();\n    }\n    markAsPreview(isPreview) {\n        if (isPreview) {\n            this.element.setAttribute(\"data-turbo-preview\", \"\");\n        }\n        else {\n            this.element.removeAttribute(\"data-turbo-preview\");\n        }\n    }\n    async renderSnapshot(renderer) {\n        await renderer.render();\n    }\n    finishRenderingSnapshot(renderer) {\n        renderer.finishRendering();\n    }\n}\n\nclass FrameView extends View {\n    invalidate() {\n        this.element.innerHTML = \"\";\n    }\n    get snapshot() {\n        return new Snapshot(this.element);\n    }\n}\n\nclass LinkInterceptor {\n    constructor(delegate, element) {\n        this.clickBubbled = (event) => {\n            if (this.respondsToEventTarget(event.target)) {\n                this.clickEvent = event;\n            }\n            else {\n                delete this.clickEvent;\n            }\n        };\n        this.linkClicked = ((event) => {\n            if (this.clickEvent && this.respondsToEventTarget(event.target) && event.target instanceof Element) {\n                if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url)) {\n                    this.clickEvent.preventDefault();\n                    event.preventDefault();\n                    this.delegate.linkClickIntercepted(event.target, event.detail.url);\n                }\n            }\n            delete this.clickEvent;\n        });\n        this.willVisit = () => {\n            delete this.clickEvent;\n        };\n        this.delegate = delegate;\n        this.element = element;\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    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    respondsToEventTarget(target) {\n        const element = target instanceof Element\n            ? target\n            : target instanceof Node\n                ? target.parentElement\n                : null;\n        return element && element.closest(\"turbo-frame, html\") == this.element;\n    }\n}\n\nclass Bardo {\n    constructor(permanentElementMap) {\n        this.permanentElementMap = permanentElementMap;\n    }\n    static preservingPermanentElements(permanentElementMap, callback) {\n        const bardo = new this(permanentElementMap);\n        bardo.enter();\n        callback();\n        bardo.leave();\n    }\n    enter() {\n        for (const id in this.permanentElementMap) {\n            const [, newPermanentElement] = this.permanentElementMap[id];\n            this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\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        }\n    }\n    replaceNewPermanentElementWithPlaceholder(permanentElement) {\n        const placeholder = createPlaceholderForPermanentElement(permanentElement);\n        permanentElement.replaceWith(placeholder);\n    }\n    replaceCurrentPermanentElementWithClone(permanentElement) {\n        const clone = permanentElement.cloneNode(true);\n        permanentElement.replaceWith(clone);\n    }\n    replacePlaceholderWithPermanentElement(permanentElement) {\n        const placeholder = this.getPlaceholderById(permanentElement.id);\n        placeholder === null || placeholder === void 0 ? void 0 : placeholder.replaceWith(permanentElement);\n    }\n    getPlaceholderById(id) {\n        return this.placeholders.find(element => element.content == id);\n    }\n    get placeholders() {\n        return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")];\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    constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n        this.currentSnapshot = currentSnapshot;\n        this.newSnapshot = newSnapshot;\n        this.isPreview = isPreview;\n        this.willRender = willRender;\n        this.promise = new Promise((resolve, reject) => this.resolvingFunctions = { resolve, reject });\n    }\n    get shouldRender() {\n        return true;\n    }\n    prepareToRender() {\n        return;\n    }\n    finishRendering() {\n        if (this.resolvingFunctions) {\n            this.resolvingFunctions.resolve();\n            delete this.resolvingFunctions;\n        }\n    }\n    createScriptElement(element) {\n        if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n            return element;\n        }\n        else {\n            const createdScriptElement = document.createElement(\"script\");\n            if (this.cspNonce) {\n                createdScriptElement.nonce = this.cspNonce;\n            }\n            createdScriptElement.textContent = element.textContent;\n            createdScriptElement.async = false;\n            copyElementAttributes(createdScriptElement, element);\n            return createdScriptElement;\n        }\n    }\n    preservingPermanentElements(callback) {\n        Bardo.preservingPermanentElements(this.permanentElementMap, callback);\n    }\n    focusFirstAutofocusableElement() {\n        const element = this.connectedSnapshot.firstAutofocusableElement;\n        if (elementIsFocusable(element)) {\n            element.focus();\n        }\n    }\n    get connectedSnapshot() {\n        return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot;\n    }\n    get currentElement() {\n        return this.currentSnapshot.element;\n    }\n    get newElement() {\n        return this.newSnapshot.element;\n    }\n    get permanentElementMap() {\n        return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot);\n    }\n    get cspNonce() {\n        var _a;\n        return (_a = document.head.querySelector('meta[name=\"csp-nonce\"]')) === null || _a === void 0 ? void 0 : _a.getAttribute(\"content\");\n    }\n}\nfunction copyElementAttributes(destinationElement, sourceElement) {\n    for (const { name, value } of [...sourceElement.attributes]) {\n        destinationElement.setAttribute(name, value);\n    }\n}\nfunction elementIsFocusable(element) {\n    return element && typeof element.focus == \"function\";\n}\n\nclass FrameRenderer extends Renderer {\n    get shouldRender() {\n        return true;\n    }\n    async render() {\n        await nextAnimationFrame();\n        this.preservingPermanentElements(() => {\n            this.loadFrameElement();\n        });\n        this.scrollFrameIntoView();\n        await nextAnimationFrame();\n        this.focusFirstAutofocusableElement();\n        await nextAnimationFrame();\n        this.activateScriptElements();\n    }\n    loadFrameElement() {\n        var _a;\n        const destinationRange = document.createRange();\n        destinationRange.selectNodeContents(this.currentElement);\n        destinationRange.deleteContents();\n        const frameElement = this.newElement;\n        const sourceRange = (_a = frameElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.createRange();\n        if (sourceRange) {\n            sourceRange.selectNodeContents(frameElement);\n            this.currentElement.appendChild(sourceRange.extractContents());\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            if (element) {\n                element.scrollIntoView({ block });\n                return true;\n            }\n        }\n        return false;\n    }\n    activateScriptElements() {\n        for (const inertScriptElement of this.newScriptElements) {\n            const activatedScriptElement = this.createScriptElement(inertScriptElement);\n            inertScriptElement.replaceWith(activatedScriptElement);\n        }\n    }\n    get newScriptElements() {\n        return this.currentElement.querySelectorAll(\"script\");\n    }\n}\nfunction readScrollLogicalPosition(value, defaultValue) {\n    if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n        return value;\n    }\n    else {\n        return defaultValue;\n    }\n}\n\nclass ProgressBar {\n    constructor() {\n        this.hiding = false;\n        this.value = 0;\n        this.visible = false;\n        this.trickle = () => {\n            this.setValue(this.value + Math.random() / 100);\n        };\n        this.stylesheetElement = this.createStylesheetElement();\n        this.progressElement = this.createProgressElement();\n        this.installStylesheetElement();\n        this.setValue(0);\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: 9999;\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    show() {\n        if (!this.visible) {\n            this.visible = true;\n            this.installProgressElement();\n            this.startTrickling();\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    setValue(value) {\n        this.value = value;\n        this.refresh();\n    }\n    installStylesheetElement() {\n        document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\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    fadeProgressElement(callback) {\n        this.progressElement.style.opacity = \"0\";\n        setTimeout(callback, ProgressBar.animationDuration * 1.5);\n    }\n    uninstallProgressElement() {\n        if (this.progressElement.parentNode) {\n            document.documentElement.removeChild(this.progressElement);\n        }\n    }\n    startTrickling() {\n        if (!this.trickleInterval) {\n            this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n        }\n    }\n    stopTrickling() {\n        window.clearInterval(this.trickleInterval);\n        delete this.trickleInterval;\n    }\n    refresh() {\n        requestAnimationFrame(() => {\n            this.progressElement.style.width = `${10 + (this.value * 90)}%`;\n        });\n    }\n    createStylesheetElement() {\n        const element = document.createElement(\"style\");\n        element.type = \"text/css\";\n        element.textContent = ProgressBar.defaultCSS;\n        return element;\n    }\n    createProgressElement() {\n        const element = document.createElement(\"div\");\n        element.className = \"turbo-progress-bar\";\n        return element;\n    }\n}\nProgressBar.animationDuration = 300;\n\nclass HeadSnapshot extends Snapshot {\n    constructor() {\n        super(...arguments);\n        this.detailsByOuterHTML = this.children\n            .filter((element) => !elementIsNoscript(element))\n            .map((element) => elementWithoutNonce(element))\n            .reduce((result, element) => {\n            const { outerHTML } = element;\n            const details = outerHTML in result\n                ? result[outerHTML]\n                : {\n                    type: elementType(element),\n                    tracked: elementIsTracked(element),\n                    elements: []\n                };\n            return Object.assign(Object.assign({}, result), { [outerHTML]: Object.assign(Object.assign({}, details), { elements: [...details.elements, element] }) });\n        }, {});\n    }\n    get trackedElementSignature() {\n        return Object.keys(this.detailsByOuterHTML)\n            .filter(outerHTML => this.detailsByOuterHTML[outerHTML].tracked)\n            .join(\"\");\n    }\n    getScriptElementsNotInSnapshot(snapshot) {\n        return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot);\n    }\n    getStylesheetElementsNotInSnapshot(snapshot) {\n        return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot);\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    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            }\n            else if (elements.length > 1) {\n                return [...result, ...elements.slice(1)];\n            }\n            else {\n                return result;\n            }\n        }, []);\n    }\n    getMetaValue(name) {\n        const element = this.findMetaElementByName(name);\n        return element\n            ? element.getAttribute(\"content\")\n            : null;\n    }\n    findMetaElementByName(name) {\n        return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n            const { elements: [element] } = this.detailsByOuterHTML[outerHTML];\n            return elementIsMetaElementWithName(element, name) ? element : result;\n        }, undefined);\n    }\n}\nfunction elementType(element) {\n    if (elementIsScript(element)) {\n        return \"script\";\n    }\n    else if (elementIsStylesheet(element)) {\n        return \"stylesheet\";\n    }\n}\nfunction elementIsTracked(element) {\n    return element.getAttribute(\"data-turbo-track\") == \"reload\";\n}\nfunction elementIsScript(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"script\";\n}\nfunction elementIsNoscript(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"noscript\";\n}\nfunction elementIsStylesheet(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\");\n}\nfunction elementIsMetaElementWithName(element, name) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"meta\" && element.getAttribute(\"name\") == name;\n}\nfunction elementWithoutNonce(element) {\n    if (element.hasAttribute(\"nonce\")) {\n        element.setAttribute(\"nonce\", \"\");\n    }\n    return element;\n}\n\nclass PageSnapshot extends Snapshot {\n    constructor(element, headSnapshot) {\n        super(element);\n        this.headSnapshot = headSnapshot;\n    }\n    static fromHTMLString(html = \"\") {\n        return this.fromDocument(parseHTMLDocument(html));\n    }\n    static fromElement(element) {\n        return this.fromDocument(element.ownerDocument);\n    }\n    static fromDocument({ head, body }) {\n        return new this(body, new HeadSnapshot(head));\n    }\n    clone() {\n        return new PageSnapshot(this.element.cloneNode(true), this.headSnapshot);\n    }\n    get headElement() {\n        return this.headSnapshot.element;\n    }\n    get rootLocation() {\n        var _a;\n        const root = (_a = this.getSetting(\"root\")) !== null && _a !== void 0 ? _a : \"/\";\n        return expandURL(root);\n    }\n    get cacheControlValue() {\n        return this.getSetting(\"cache-control\");\n    }\n    get isPreviewable() {\n        return this.cacheControlValue != \"no-preview\";\n    }\n    get isCacheable() {\n        return this.cacheControlValue != \"no-cache\";\n    }\n    get isVisitable() {\n        return this.getSetting(\"visit-control\") != \"reload\";\n    }\n    getSetting(name) {\n        return this.headSnapshot.getMetaValue(`turbo-${name}`);\n    }\n}\n\nvar TimingMetric;\n(function (TimingMetric) {\n    TimingMetric[\"visitStart\"] = \"visitStart\";\n    TimingMetric[\"requestStart\"] = \"requestStart\";\n    TimingMetric[\"requestEnd\"] = \"requestEnd\";\n    TimingMetric[\"visitEnd\"] = \"visitEnd\";\n})(TimingMetric || (TimingMetric = {}));\nvar VisitState;\n(function (VisitState) {\n    VisitState[\"initialized\"] = \"initialized\";\n    VisitState[\"started\"] = \"started\";\n    VisitState[\"canceled\"] = \"canceled\";\n    VisitState[\"failed\"] = \"failed\";\n    VisitState[\"completed\"] = \"completed\";\n})(VisitState || (VisitState = {}));\nconst defaultOptions = {\n    action: \"advance\",\n    historyChanged: false,\n    visitCachedSnapshot: () => { },\n    willRender: true,\n};\nvar SystemStatusCode;\n(function (SystemStatusCode) {\n    SystemStatusCode[SystemStatusCode[\"networkFailure\"] = 0] = \"networkFailure\";\n    SystemStatusCode[SystemStatusCode[\"timeoutFailure\"] = -1] = \"timeoutFailure\";\n    SystemStatusCode[SystemStatusCode[\"contentTypeMismatch\"] = -2] = \"contentTypeMismatch\";\n})(SystemStatusCode || (SystemStatusCode = {}));\nclass Visit {\n    constructor(delegate, location, restorationIdentifier, options = {}) {\n        this.identifier = uuid();\n        this.timingMetrics = {};\n        this.followedRedirect = false;\n        this.historyChanged = false;\n        this.scrolled = false;\n        this.snapshotCached = false;\n        this.state = VisitState.initialized;\n        this.delegate = delegate;\n        this.location = location;\n        this.restorationIdentifier = restorationIdentifier || uuid();\n        const { action, historyChanged, referrer, snapshotHTML, response, visitCachedSnapshot, willRender } = Object.assign(Object.assign({}, defaultOptions), options);\n        this.action = action;\n        this.historyChanged = historyChanged;\n        this.referrer = referrer;\n        this.snapshotHTML = snapshotHTML;\n        this.response = response;\n        this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action);\n        this.visitCachedSnapshot = visitCachedSnapshot;\n        this.willRender = willRender;\n        this.scrolled = !willRender;\n    }\n    get adapter() {\n        return this.delegate.adapter;\n    }\n    get view() {\n        return this.delegate.view;\n    }\n    get history() {\n        return this.delegate.history;\n    }\n    get restorationData() {\n        return this.history.getRestorationDataForIdentifier(this.restorationIdentifier);\n    }\n    get silent() {\n        return this.isSamePage;\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    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    complete() {\n        if (this.state == VisitState.started) {\n            this.recordTimingMetric(TimingMetric.visitEnd);\n            this.state = VisitState.completed;\n            this.adapter.visitCompleted(this);\n            this.delegate.visitCompleted(this);\n            this.followRedirect();\n        }\n    }\n    fail() {\n        if (this.state == VisitState.started) {\n            this.state = VisitState.failed;\n            this.adapter.visitFailed(this);\n        }\n    }\n    changeHistory() {\n        var _a;\n        if (!this.historyChanged) {\n            const actionForHistory = this.location.href === ((_a = this.referrer) === null || _a === void 0 ? void 0 : _a.href) ? \"replace\" : this.action;\n            const method = this.getHistoryMethodForAction(actionForHistory);\n            this.history.update(method, this.location, this.restorationIdentifier);\n            this.historyChanged = true;\n        }\n    }\n    issueRequest() {\n        if (this.hasPreloadedResponse()) {\n            this.simulateRequest();\n        }\n        else if (this.shouldIssueRequest() && !this.request) {\n            this.request = new FetchRequest(this, FetchMethod.get, this.location);\n            this.request.perform();\n        }\n    }\n    simulateRequest() {\n        if (this.response) {\n            this.startRequest();\n            this.recordResponse();\n            this.finishRequest();\n        }\n    }\n    startRequest() {\n        this.recordTimingMetric(TimingMetric.requestStart);\n        this.adapter.visitRequestStarted(this);\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            }\n            else {\n                this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n            }\n        }\n    }\n    finishRequest() {\n        this.recordTimingMetric(TimingMetric.requestEnd);\n        this.adapter.visitRequestFinished(this);\n    }\n    loadResponse() {\n        if (this.response) {\n            const { statusCode, responseHTML } = this.response;\n            this.render(async () => {\n                this.cacheSnapshot();\n                if (this.view.renderPromise)\n                    await this.view.renderPromise;\n                if (isSuccessful(statusCode) && responseHTML != null) {\n                    await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender);\n                    this.adapter.visitRendered(this);\n                    this.complete();\n                }\n                else {\n                    await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML));\n                    this.adapter.visitRendered(this);\n                    this.fail();\n                }\n            });\n        }\n    }\n    getCachedSnapshot() {\n        const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\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    getPreloadedSnapshot() {\n        if (this.snapshotHTML) {\n            return PageSnapshot.fromHTMLString(this.snapshotHTML);\n        }\n    }\n    hasCachedSnapshot() {\n        return this.getCachedSnapshot() != null;\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.isSamePage) {\n                    this.adapter.visitRendered(this);\n                }\n                else {\n                    if (this.view.renderPromise)\n                        await this.view.renderPromise;\n                    await this.view.renderPage(snapshot, isPreview, this.willRender);\n                    this.adapter.visitRendered(this);\n                    if (!isPreview) {\n                        this.complete();\n                    }\n                }\n            });\n        }\n    }\n    followRedirect() {\n        var _a;\n        if (this.redirectedToLocation && !this.followedRedirect && ((_a = this.response) === null || _a === void 0 ? void 0 : _a.redirected)) {\n            this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n                action: 'replace',\n                response: this.response\n            });\n            this.followedRedirect = true;\n        }\n    }\n    goToSamePageAnchor() {\n        if (this.isSamePage) {\n            this.render(async () => {\n                this.cacheSnapshot();\n                this.adapter.visitRendered(this);\n            });\n        }\n    }\n    requestStarted() {\n        this.startRequest();\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({ statusCode: SystemStatusCode.contentTypeMismatch, redirected });\n        }\n        else {\n            this.redirectedToLocation = response.redirected ? response.location : undefined;\n            this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\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({ statusCode: SystemStatusCode.contentTypeMismatch, redirected });\n        }\n        else {\n            this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n        }\n    }\n    requestErrored(request, error) {\n        this.recordResponse({ statusCode: SystemStatusCode.networkFailure, redirected: false });\n    }\n    requestFinished() {\n        this.finishRequest();\n    }\n    performScroll() {\n        if (!this.scrolled) {\n            if (this.action == \"restore\") {\n                this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n            }\n            else {\n                this.scrollToAnchor() || this.view.scrollToTop();\n            }\n            if (this.isSamePage) {\n                this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location);\n            }\n            this.scrolled = true;\n        }\n    }\n    scrollToRestoredPosition() {\n        const { scrollPosition } = this.restorationData;\n        if (scrollPosition) {\n            this.view.scrollToPosition(scrollPosition);\n            return true;\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    recordTimingMetric(metric) {\n        this.timingMetrics[metric] = new Date().getTime();\n    }\n    getTimingMetrics() {\n        return Object.assign({}, this.timingMetrics);\n    }\n    getHistoryMethodForAction(action) {\n        switch (action) {\n            case \"replace\": return history.replaceState;\n            case \"advance\":\n            case \"restore\": return history.pushState;\n        }\n    }\n    hasPreloadedResponse() {\n        return typeof this.response == \"object\";\n    }\n    shouldIssueRequest() {\n        if (this.isSamePage) {\n            return false;\n        }\n        else if (this.action == \"restore\") {\n            return !this.hasCachedSnapshot();\n        }\n        else {\n            return this.willRender;\n        }\n    }\n    cacheSnapshot() {\n        if (!this.snapshotCached) {\n            this.view.cacheSnapshot().then(snapshot => snapshot && this.visitCachedSnapshot(snapshot));\n            this.snapshotCached = true;\n        }\n    }\n    async render(callback) {\n        this.cancelRender();\n        await new Promise(resolve => {\n            this.frame = requestAnimationFrame(() => resolve());\n        });\n        await callback();\n        delete this.frame;\n        this.performScroll();\n    }\n    cancelRender() {\n        if (this.frame) {\n            cancelAnimationFrame(this.frame);\n            delete this.frame;\n        }\n    }\n}\nfunction isSuccessful(statusCode) {\n    return statusCode >= 200 && statusCode < 300;\n}\n\nclass BrowserAdapter {\n    constructor(session) {\n        this.progressBar = new ProgressBar;\n        this.showProgressBar = () => {\n            this.progressBar.show();\n        };\n        this.session = session;\n    }\n    visitProposedToLocation(location, options) {\n        this.navigator.startVisit(location, uuid(), options);\n    }\n    visitStarted(visit) {\n        visit.loadCachedSnapshot();\n        visit.issueRequest();\n        visit.changeHistory();\n        visit.goToSamePageAnchor();\n    }\n    visitRequestStarted(visit) {\n        this.progressBar.setValue(0);\n        if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n            this.showVisitProgressBarAfterDelay();\n        }\n        else {\n            this.showProgressBar();\n        }\n    }\n    visitRequestCompleted(visit) {\n        visit.loadResponse();\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            default:\n                return visit.loadResponse();\n        }\n    }\n    visitRequestFinished(visit) {\n        this.progressBar.setValue(1);\n        this.hideVisitProgressBar();\n    }\n    visitCompleted(visit) {\n    }\n    pageInvalidated() {\n        this.reload();\n    }\n    visitFailed(visit) {\n    }\n    visitRendered(visit) {\n    }\n    formSubmissionStarted(formSubmission) {\n        this.progressBar.setValue(0);\n        this.showFormProgressBarAfterDelay();\n    }\n    formSubmissionFinished(formSubmission) {\n        this.progressBar.setValue(1);\n        this.hideFormProgressBar();\n    }\n    showVisitProgressBarAfterDelay() {\n        this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n    hideVisitProgressBar() {\n        this.progressBar.hide();\n        if (this.visitProgressBarTimeout != null) {\n            window.clearTimeout(this.visitProgressBarTimeout);\n            delete this.visitProgressBarTimeout;\n        }\n    }\n    showFormProgressBarAfterDelay() {\n        if (this.formProgressBarTimeout == null) {\n            this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\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    reload() {\n        window.location.reload();\n    }\n    get navigator() {\n        return this.session.navigator;\n    }\n}\n\nclass CacheObserver {\n    constructor() {\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            addEventListener(\"turbo:before-cache\", this.removeStaleElements, false);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            removeEventListener(\"turbo:before-cache\", this.removeStaleElements, false);\n        }\n    }\n    removeStaleElements() {\n        const staleElements = [...document.querySelectorAll('[data-turbo-cache=\"false\"]')];\n        for (const element of staleElements) {\n            element.remove();\n        }\n    }\n}\n\nclass FormSubmitObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.submitCaptured = () => {\n            removeEventListener(\"submit\", this.submitBubbled, false);\n            addEventListener(\"submit\", this.submitBubbled, false);\n        };\n        this.submitBubbled = ((event) => {\n            if (!event.defaultPrevented) {\n                const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n                const submitter = event.submitter || undefined;\n                if (form) {\n                    const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.getAttribute(\"method\");\n                    if (method != \"dialog\" && this.delegate.willSubmitForm(form, submitter)) {\n                        event.preventDefault();\n                        this.delegate.formSubmitted(form, submitter);\n                    }\n                }\n            }\n        });\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"submit\", this.submitCaptured, true);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"submit\", this.submitCaptured, true);\n            this.started = false;\n        }\n    }\n}\n\nclass FrameRedirector {\n    constructor(element) {\n        this.element = element;\n        this.linkInterceptor = new LinkInterceptor(this, element);\n        this.formInterceptor = new FormInterceptor(this, element);\n    }\n    start() {\n        this.linkInterceptor.start();\n        this.formInterceptor.start();\n    }\n    stop() {\n        this.linkInterceptor.stop();\n        this.formInterceptor.stop();\n    }\n    shouldInterceptLinkClick(element, url) {\n        return this.shouldRedirect(element);\n    }\n    linkClickIntercepted(element, url) {\n        const frame = this.findFrameElement(element);\n        if (frame) {\n            frame.delegate.linkClickIntercepted(element, url);\n        }\n    }\n    shouldInterceptFormSubmission(element, submitter) {\n        return this.shouldSubmit(element, submitter);\n    }\n    formSubmissionIntercepted(element, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        if (frame) {\n            frame.removeAttribute(\"reloadable\");\n            frame.delegate.formSubmissionIntercepted(element, submitter);\n        }\n    }\n    shouldSubmit(form, submitter) {\n        var _a;\n        const action = getAction(form, submitter);\n        const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n        const rootLocation = expandURL((_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\");\n        return this.shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation);\n    }\n    shouldRedirect(element, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        return frame ? frame != element.closest(\"turbo-frame\") : false;\n    }\n    findFrameElement(element, submitter) {\n        const id = (submitter === null || submitter === void 0 ? void 0 : 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    constructor(delegate) {\n        this.restorationIdentifier = uuid();\n        this.restorationData = {};\n        this.started = false;\n        this.pageLoaded = false;\n        this.onPopState = (event) => {\n            if (this.shouldHandlePopState()) {\n                const { turbo } = event.state || {};\n                if (turbo) {\n                    this.location = new URL(window.location.href);\n                    const { restorationIdentifier } = turbo;\n                    this.restorationIdentifier = restorationIdentifier;\n                    this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location, restorationIdentifier);\n                }\n            }\n        };\n        this.onPageLoad = async (event) => {\n            await nextMicrotask();\n            this.pageLoaded = true;\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"popstate\", this.onPopState, false);\n            addEventListener(\"load\", this.onPageLoad, false);\n            this.started = true;\n            this.replace(new URL(window.location.href));\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"popstate\", this.onPopState, false);\n            removeEventListener(\"load\", this.onPageLoad, false);\n            this.started = false;\n        }\n    }\n    push(location, restorationIdentifier) {\n        this.update(history.pushState, location, restorationIdentifier);\n    }\n    replace(location, restorationIdentifier) {\n        this.update(history.replaceState, location, restorationIdentifier);\n    }\n    update(method, location, restorationIdentifier = uuid()) {\n        const state = { turbo: { restorationIdentifier } };\n        method.call(history, state, \"\", location.href);\n        this.location = location;\n        this.restorationIdentifier = restorationIdentifier;\n    }\n    getRestorationDataForIdentifier(restorationIdentifier) {\n        return this.restorationData[restorationIdentifier] || {};\n    }\n    updateRestorationData(additionalData) {\n        const { restorationIdentifier } = this;\n        const restorationData = this.restorationData[restorationIdentifier];\n        this.restorationData[restorationIdentifier] = Object.assign(Object.assign({}, restorationData), additionalData);\n    }\n    assumeControlOfScrollRestoration() {\n        var _a;\n        if (!this.previousScrollRestoration) {\n            this.previousScrollRestoration = (_a = history.scrollRestoration) !== null && _a !== void 0 ? _a : \"auto\";\n            history.scrollRestoration = \"manual\";\n        }\n    }\n    relinquishControlOfScrollRestoration() {\n        if (this.previousScrollRestoration) {\n            history.scrollRestoration = this.previousScrollRestoration;\n            delete this.previousScrollRestoration;\n        }\n    }\n    shouldHandlePopState() {\n        return this.pageIsLoaded();\n    }\n    pageIsLoaded() {\n        return this.pageLoaded || document.readyState == \"complete\";\n    }\n}\n\nclass LinkClickObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.clickCaptured = () => {\n            removeEventListener(\"click\", this.clickBubbled, false);\n            addEventListener(\"click\", this.clickBubbled, false);\n        };\n        this.clickBubbled = (event) => {\n            if (this.clickEventIsSignificant(event)) {\n                const target = (event.composedPath && event.composedPath()[0]) || event.target;\n                const link = this.findLinkFromClickTarget(target);\n                if (link) {\n                    const location = this.getLocationForLink(link);\n                    if (this.delegate.willFollowLinkToLocation(link, location)) {\n                        event.preventDefault();\n                        this.delegate.followedLinkToLocation(link, location);\n                    }\n                }\n            }\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"click\", this.clickCaptured, true);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"click\", this.clickCaptured, true);\n            this.started = false;\n        }\n    }\n    clickEventIsSignificant(event) {\n        return !((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    findLinkFromClickTarget(target) {\n        if (target instanceof Element) {\n            return target.closest(\"a[href]:not([target^=_]):not([download])\");\n        }\n    }\n    getLocationForLink(link) {\n        return expandURL(link.getAttribute(\"href\") || \"\");\n    }\n}\n\nfunction isAction(action) {\n    return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\n\nclass Navigator {\n    constructor(delegate) {\n        this.delegate = delegate;\n    }\n    proposeVisit(location, options = {}) {\n        if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n            if (locationIsVisitable(location, this.view.snapshot.rootLocation)) {\n                this.delegate.visitProposedToLocation(location, options);\n            }\n            else {\n                window.location.href = location.toString();\n            }\n        }\n    }\n    startVisit(locatable, restorationIdentifier, options = {}) {\n        this.stop();\n        this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, Object.assign({ referrer: this.location }, options));\n        this.currentVisit.start();\n    }\n    submitForm(form, submitter) {\n        this.stop();\n        this.formSubmission = new FormSubmission(this, form, submitter, true);\n        this.formSubmission.start();\n    }\n    stop() {\n        if (this.formSubmission) {\n            this.formSubmission.stop();\n            delete this.formSubmission;\n        }\n        if (this.currentVisit) {\n            this.currentVisit.cancel();\n            delete this.currentVisit;\n        }\n    }\n    get adapter() {\n        return this.delegate.adapter;\n    }\n    get view() {\n        return this.delegate.view;\n    }\n    get history() {\n        return this.delegate.history;\n    }\n    formSubmissionStarted(formSubmission) {\n        if (typeof this.adapter.formSubmissionStarted === 'function') {\n            this.adapter.formSubmissionStarted(formSubmission);\n        }\n    }\n    async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n        if (formSubmission == this.formSubmission) {\n            const responseHTML = await fetchResponse.responseHTML;\n            if (responseHTML) {\n                if (formSubmission.method != FetchMethod.get) {\n                    this.view.clearSnapshotCache();\n                }\n                const { statusCode, redirected } = fetchResponse;\n                const action = this.getActionForFormSubmission(formSubmission);\n                const visitOptions = { action, response: { statusCode, responseHTML, redirected } };\n                this.proposeVisit(fetchResponse.location, visitOptions);\n            }\n        }\n    }\n    async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n        const responseHTML = await fetchResponse.responseHTML;\n        if (responseHTML) {\n            const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n            if (fetchResponse.serverError) {\n                await this.view.renderError(snapshot);\n            }\n            else {\n                await this.view.renderPage(snapshot);\n            }\n            this.view.scrollToTop();\n            this.view.clearSnapshotCache();\n        }\n    }\n    formSubmissionErrored(formSubmission, error) {\n        console.error(error);\n    }\n    formSubmissionFinished(formSubmission) {\n        if (typeof this.adapter.formSubmissionFinished === 'function') {\n            this.adapter.formSubmissionFinished(formSubmission);\n        }\n    }\n    visitStarted(visit) {\n        this.delegate.visitStarted(visit);\n    }\n    visitCompleted(visit) {\n        this.delegate.visitCompleted(visit);\n    }\n    locationWithActionIsSamePage(location, action) {\n        const anchor = getAnchor(location);\n        const currentAnchor = getAnchor(this.view.lastRenderedLocation);\n        const isRestorationToTop = action === 'restore' && typeof anchor === 'undefined';\n        return action !== \"replace\" &&\n            getRequestURL(location) === getRequestURL(this.view.lastRenderedLocation) &&\n            (isRestorationToTop || (anchor != null && anchor !== currentAnchor));\n    }\n    visitScrolledToSamePageLocation(oldURL, newURL) {\n        this.delegate.visitScrolledToSamePageLocation(oldURL, newURL);\n    }\n    get location() {\n        return this.history.location;\n    }\n    get restorationIdentifier() {\n        return this.history.restorationIdentifier;\n    }\n    getActionForFormSubmission(formSubmission) {\n        const { formElement, submitter } = formSubmission;\n        const action = getAttribute(\"data-turbo-action\", submitter, formElement);\n        return isAction(action) ? action : \"advance\";\n    }\n}\n\nvar PageStage;\n(function (PageStage) {\n    PageStage[PageStage[\"initial\"] = 0] = \"initial\";\n    PageStage[PageStage[\"loading\"] = 1] = \"loading\";\n    PageStage[PageStage[\"interactive\"] = 2] = \"interactive\";\n    PageStage[PageStage[\"complete\"] = 3] = \"complete\";\n})(PageStage || (PageStage = {}));\nclass PageObserver {\n    constructor(delegate) {\n        this.stage = PageStage.initial;\n        this.started = false;\n        this.interpretReadyState = () => {\n            const { readyState } = this;\n            if (readyState == \"interactive\") {\n                this.pageIsInteractive();\n            }\n            else if (readyState == \"complete\") {\n                this.pageIsComplete();\n            }\n        };\n        this.pageWillUnload = () => {\n            this.delegate.pageWillUnload();\n        };\n        this.delegate = delegate;\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    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    pageIsInteractive() {\n        if (this.stage == PageStage.loading) {\n            this.stage = PageStage.interactive;\n            this.delegate.pageBecameInteractive();\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    get readyState() {\n        return document.readyState;\n    }\n}\n\nclass ScrollObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.onScroll = () => {\n            this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"scroll\", this.onScroll, false);\n            this.onScroll();\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"scroll\", this.onScroll, false);\n            this.started = false;\n        }\n    }\n    updatePosition(position) {\n        this.delegate.scrollPositionChanged(position);\n    }\n}\n\nclass StreamObserver {\n    constructor(delegate) {\n        this.sources = new Set;\n        this.started = false;\n        this.inspectFetchResponse = ((event) => {\n            const response = fetchResponseFromEvent(event);\n            if (response && fetchResponseIsStream(response)) {\n                event.preventDefault();\n                this.receiveMessageResponse(response);\n            }\n        });\n        this.receiveMessageEvent = (event) => {\n            if (this.started && typeof event.data == \"string\") {\n                this.receiveMessageHTML(event.data);\n            }\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\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    disconnectStreamSource(source) {\n        if (this.streamSourceIsConnected(source)) {\n            this.sources.delete(source);\n            source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n        }\n    }\n    streamSourceIsConnected(source) {\n        return this.sources.has(source);\n    }\n    async receiveMessageResponse(response) {\n        const html = await response.responseHTML;\n        if (html) {\n            this.receiveMessageHTML(html);\n        }\n    }\n    receiveMessageHTML(html) {\n        this.delegate.receivedMessageFromStream(new StreamMessage(html));\n    }\n}\nfunction fetchResponseFromEvent(event) {\n    var _a;\n    const fetchResponse = (_a = event.detail) === null || _a === void 0 ? void 0 : _a.fetchResponse;\n    if (fetchResponse instanceof FetchResponse) {\n        return fetchResponse;\n    }\n}\nfunction fetchResponseIsStream(response) {\n    var _a;\n    const contentType = (_a = response.contentType) !== null && _a !== void 0 ? _a : \"\";\n    return contentType.startsWith(StreamMessage.contentType);\n}\n\nclass ErrorRenderer extends Renderer {\n    async render() {\n        this.replaceHeadAndBody();\n        this.activateScriptElements();\n    }\n    replaceHeadAndBody() {\n        const { documentElement, head, body } = document;\n        documentElement.replaceChild(this.newHead, head);\n        documentElement.replaceChild(this.newElement, body);\n    }\n    activateScriptElements() {\n        for (const replaceableElement of this.scriptElements) {\n            const parentNode = replaceableElement.parentNode;\n            if (parentNode) {\n                const element = this.createScriptElement(replaceableElement);\n                parentNode.replaceChild(element, replaceableElement);\n            }\n        }\n    }\n    get newHead() {\n        return this.newSnapshot.headSnapshot.element;\n    }\n    get scriptElements() {\n        return [...document.documentElement.querySelectorAll(\"script\")];\n    }\n}\n\nclass PageRenderer extends Renderer {\n    get shouldRender() {\n        return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical;\n    }\n    prepareToRender() {\n        this.mergeHead();\n    }\n    async render() {\n        if (this.willRender) {\n            this.replaceBody();\n        }\n    }\n    finishRendering() {\n        super.finishRendering();\n        if (!this.isPreview) {\n            this.focusFirstAutofocusableElement();\n        }\n    }\n    get currentHeadSnapshot() {\n        return this.currentSnapshot.headSnapshot;\n    }\n    get newHeadSnapshot() {\n        return this.newSnapshot.headSnapshot;\n    }\n    get newElement() {\n        return this.newSnapshot.element;\n    }\n    mergeHead() {\n        this.copyNewHeadStylesheetElements();\n        this.copyNewHeadScriptElements();\n        this.removeCurrentHeadProvisionalElements();\n        this.copyNewHeadProvisionalElements();\n    }\n    replaceBody() {\n        this.preservingPermanentElements(() => {\n            this.activateNewBody();\n            this.assignNewBody();\n        });\n    }\n    get trackedElementsAreIdentical() {\n        return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature;\n    }\n    copyNewHeadStylesheetElements() {\n        for (const element of this.newHeadStylesheetElements) {\n            document.head.appendChild(element);\n        }\n    }\n    copyNewHeadScriptElements() {\n        for (const element of this.newHeadScriptElements) {\n            document.head.appendChild(this.createScriptElement(element));\n        }\n    }\n    removeCurrentHeadProvisionalElements() {\n        for (const element of this.currentHeadProvisionalElements) {\n            document.head.removeChild(element);\n        }\n    }\n    copyNewHeadProvisionalElements() {\n        for (const element of this.newHeadProvisionalElements) {\n            document.head.appendChild(element);\n        }\n    }\n    activateNewBody() {\n        document.adoptNode(this.newElement);\n        this.activateNewBodyScriptElements();\n    }\n    activateNewBodyScriptElements() {\n        for (const inertScriptElement of this.newBodyScriptElements) {\n            const activatedScriptElement = this.createScriptElement(inertScriptElement);\n            inertScriptElement.replaceWith(activatedScriptElement);\n        }\n    }\n    assignNewBody() {\n        if (document.body && this.newElement instanceof HTMLBodyElement) {\n            document.body.replaceWith(this.newElement);\n        }\n        else {\n            document.documentElement.appendChild(this.newElement);\n        }\n    }\n    get newHeadStylesheetElements() {\n        return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot);\n    }\n    get newHeadScriptElements() {\n        return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot);\n    }\n    get currentHeadProvisionalElements() {\n        return this.currentHeadSnapshot.provisionalElements;\n    }\n    get newHeadProvisionalElements() {\n        return this.newHeadSnapshot.provisionalElements;\n    }\n    get newBodyScriptElements() {\n        return this.newElement.querySelectorAll(\"script\");\n    }\n}\n\nclass SnapshotCache {\n    constructor(size) {\n        this.keys = [];\n        this.snapshots = {};\n        this.size = size;\n    }\n    has(location) {\n        return toCacheKey(location) in this.snapshots;\n    }\n    get(location) {\n        if (this.has(location)) {\n            const snapshot = this.read(location);\n            this.touch(location);\n            return snapshot;\n        }\n    }\n    put(location, snapshot) {\n        this.write(location, snapshot);\n        this.touch(location);\n        return snapshot;\n    }\n    clear() {\n        this.snapshots = {};\n    }\n    read(location) {\n        return this.snapshots[toCacheKey(location)];\n    }\n    write(location, snapshot) {\n        this.snapshots[toCacheKey(location)] = snapshot;\n    }\n    touch(location) {\n        const key = toCacheKey(location);\n        const index = this.keys.indexOf(key);\n        if (index > -1)\n            this.keys.splice(index, 1);\n        this.keys.unshift(key);\n        this.trim();\n    }\n    trim() {\n        for (const key of this.keys.splice(this.size)) {\n            delete this.snapshots[key];\n        }\n    }\n}\n\nclass PageView extends View {\n    constructor() {\n        super(...arguments);\n        this.snapshotCache = new SnapshotCache(10);\n        this.lastRenderedLocation = new URL(location.href);\n    }\n    renderPage(snapshot, isPreview = false, willRender = true) {\n        const renderer = new PageRenderer(this.snapshot, snapshot, isPreview, willRender);\n        return this.render(renderer);\n    }\n    renderError(snapshot) {\n        const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n        return this.render(renderer);\n    }\n    clearSnapshotCache() {\n        this.snapshotCache.clear();\n    }\n    async cacheSnapshot() {\n        if (this.shouldCacheSnapshot) {\n            this.delegate.viewWillCacheSnapshot();\n            const { snapshot, lastRenderedLocation: location } = this;\n            await nextEventLoopTick();\n            const cachedSnapshot = snapshot.clone();\n            this.snapshotCache.put(location, cachedSnapshot);\n            return cachedSnapshot;\n        }\n    }\n    getCachedSnapshotForLocation(location) {\n        return this.snapshotCache.get(location);\n    }\n    get snapshot() {\n        return PageSnapshot.fromElement(this.element);\n    }\n    get shouldCacheSnapshot() {\n        return this.snapshot.isCacheable;\n    }\n}\n\nclass Session {\n    constructor() {\n        this.navigator = new Navigator(this);\n        this.history = new History(this);\n        this.view = new PageView(this, document.documentElement);\n        this.adapter = new BrowserAdapter(this);\n        this.pageObserver = new PageObserver(this);\n        this.cacheObserver = new CacheObserver();\n        this.linkClickObserver = new LinkClickObserver(this);\n        this.formSubmitObserver = new FormSubmitObserver(this);\n        this.scrollObserver = new ScrollObserver(this);\n        this.streamObserver = new StreamObserver(this);\n        this.frameRedirector = new FrameRedirector(document.documentElement);\n        this.drive = true;\n        this.enabled = true;\n        this.progressBarDelay = 500;\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.pageObserver.start();\n            this.cacheObserver.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.started = true;\n            this.enabled = true;\n        }\n    }\n    disable() {\n        this.enabled = false;\n    }\n    stop() {\n        if (this.started) {\n            this.pageObserver.stop();\n            this.cacheObserver.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.started = false;\n        }\n    }\n    registerAdapter(adapter) {\n        this.adapter = adapter;\n    }\n    visit(location, options = {}) {\n        this.navigator.proposeVisit(expandURL(location), options);\n    }\n    connectStreamSource(source) {\n        this.streamObserver.connectStreamSource(source);\n    }\n    disconnectStreamSource(source) {\n        this.streamObserver.disconnectStreamSource(source);\n    }\n    renderStreamMessage(message) {\n        document.documentElement.appendChild(StreamMessage.wrap(message).fragment);\n    }\n    clearCache() {\n        this.view.clearSnapshotCache();\n    }\n    setProgressBarDelay(delay) {\n        this.progressBarDelay = delay;\n    }\n    get location() {\n        return this.history.location;\n    }\n    get restorationIdentifier() {\n        return this.history.restorationIdentifier;\n    }\n    historyPoppedToLocationWithRestorationIdentifier(location, restorationIdentifier) {\n        if (this.enabled) {\n            this.navigator.startVisit(location, restorationIdentifier, { action: \"restore\", historyChanged: true });\n        }\n        else {\n            this.adapter.pageInvalidated();\n        }\n    }\n    scrollPositionChanged(position) {\n        this.history.updateRestorationData({ scrollPosition: position });\n    }\n    willFollowLinkToLocation(link, location) {\n        return this.elementDriveEnabled(link)\n            && locationIsVisitable(location, this.snapshot.rootLocation)\n            && this.applicationAllowsFollowingLinkToLocation(link, location);\n    }\n    followedLinkToLocation(link, location) {\n        const action = this.getActionForLink(link);\n        this.convertLinkWithMethodClickToFormSubmission(link) || this.visit(location.href, { action });\n    }\n    convertLinkWithMethodClickToFormSubmission(link) {\n        const linkMethod = link.getAttribute(\"data-turbo-method\");\n        if (linkMethod) {\n            const form = document.createElement(\"form\");\n            form.method = linkMethod;\n            form.action = link.getAttribute(\"href\") || \"undefined\";\n            form.hidden = true;\n            if (link.hasAttribute(\"data-turbo-confirm\")) {\n                form.setAttribute(\"data-turbo-confirm\", link.getAttribute(\"data-turbo-confirm\"));\n            }\n            const frame = this.getTargetFrameForLink(link);\n            if (frame) {\n                form.setAttribute(\"data-turbo-frame\", frame);\n                form.addEventListener(\"turbo:submit-start\", () => form.remove());\n            }\n            else {\n                form.addEventListener(\"submit\", () => form.remove());\n            }\n            document.body.appendChild(form);\n            return dispatch(\"submit\", { cancelable: true, target: form });\n        }\n        else {\n            return false;\n        }\n    }\n    allowsVisitingLocationWithAction(location, action) {\n        return this.locationWithActionIsSamePage(location, action) || this.applicationAllowsVisitingLocation(location);\n    }\n    visitProposedToLocation(location, options) {\n        extendURLWithDeprecatedProperties(location);\n        this.adapter.visitProposedToLocation(location, options);\n    }\n    visitStarted(visit) {\n        extendURLWithDeprecatedProperties(visit.location);\n        if (!visit.silent) {\n            this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n        }\n    }\n    visitCompleted(visit) {\n        this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n    }\n    locationWithActionIsSamePage(location, action) {\n        return this.navigator.locationWithActionIsSamePage(location, action);\n    }\n    visitScrolledToSamePageLocation(oldURL, newURL) {\n        this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL);\n    }\n    willSubmitForm(form, submitter) {\n        const action = getAction(form, submitter);\n        return this.elementDriveEnabled(form)\n            && (!submitter || this.elementDriveEnabled(submitter))\n            && locationIsVisitable(expandURL(action), this.snapshot.rootLocation);\n    }\n    formSubmitted(form, submitter) {\n        this.navigator.submitForm(form, submitter);\n    }\n    pageBecameInteractive() {\n        this.view.lastRenderedLocation = this.location;\n        this.notifyApplicationAfterPageLoad();\n    }\n    pageLoaded() {\n        this.history.assumeControlOfScrollRestoration();\n    }\n    pageWillUnload() {\n        this.history.relinquishControlOfScrollRestoration();\n    }\n    receivedMessageFromStream(message) {\n        this.renderStreamMessage(message);\n    }\n    viewWillCacheSnapshot() {\n        var _a;\n        if (!((_a = this.navigator.currentVisit) === null || _a === void 0 ? void 0 : _a.silent)) {\n            this.notifyApplicationBeforeCachingSnapshot();\n        }\n    }\n    allowsImmediateRender({ element }, resume) {\n        const event = this.notifyApplicationBeforeRender(element, resume);\n        return !event.defaultPrevented;\n    }\n    viewRenderedSnapshot(snapshot, isPreview) {\n        this.view.lastRenderedLocation = this.history.location;\n        this.notifyApplicationAfterRender();\n    }\n    viewInvalidated() {\n        this.adapter.pageInvalidated();\n    }\n    frameLoaded(frame) {\n        this.notifyApplicationAfterFrameLoad(frame);\n    }\n    frameRendered(fetchResponse, frame) {\n        this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n    }\n    applicationAllowsFollowingLinkToLocation(link, location) {\n        const event = this.notifyApplicationAfterClickingLinkToLocation(link, location);\n        return !event.defaultPrevented;\n    }\n    applicationAllowsVisitingLocation(location) {\n        const event = this.notifyApplicationBeforeVisitingLocation(location);\n        return !event.defaultPrevented;\n    }\n    notifyApplicationAfterClickingLinkToLocation(link, location) {\n        return dispatch(\"turbo:click\", { target: link, detail: { url: location.href }, cancelable: true });\n    }\n    notifyApplicationBeforeVisitingLocation(location) {\n        return dispatch(\"turbo:before-visit\", { detail: { url: location.href }, cancelable: true });\n    }\n    notifyApplicationAfterVisitingLocation(location, action) {\n        markAsBusy(document.documentElement);\n        return dispatch(\"turbo:visit\", { detail: { url: location.href, action } });\n    }\n    notifyApplicationBeforeCachingSnapshot() {\n        return dispatch(\"turbo:before-cache\");\n    }\n    notifyApplicationBeforeRender(newBody, resume) {\n        return dispatch(\"turbo:before-render\", { detail: { newBody, resume }, cancelable: true });\n    }\n    notifyApplicationAfterRender() {\n        return dispatch(\"turbo:render\");\n    }\n    notifyApplicationAfterPageLoad(timing = {}) {\n        clearBusyState(document.documentElement);\n        return dispatch(\"turbo:load\", { detail: { url: this.location.href, timing } });\n    }\n    notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) {\n        dispatchEvent(new HashChangeEvent(\"hashchange\", { oldURL: oldURL.toString(), newURL: newURL.toString() }));\n    }\n    notifyApplicationAfterFrameLoad(frame) {\n        return dispatch(\"turbo:frame-load\", { target: frame });\n    }\n    notifyApplicationAfterFrameRender(fetchResponse, frame) {\n        return dispatch(\"turbo:frame-render\", { detail: { fetchResponse }, target: frame, cancelable: true });\n    }\n    elementDriveEnabled(element) {\n        const container = element === null || element === void 0 ? void 0 : element.closest(\"[data-turbo]\");\n        if (this.drive) {\n            if (container) {\n                return container.getAttribute(\"data-turbo\") != \"false\";\n            }\n            else {\n                return true;\n            }\n        }\n        else {\n            if (container) {\n                return container.getAttribute(\"data-turbo\") == \"true\";\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    getActionForLink(link) {\n        const action = link.getAttribute(\"data-turbo-action\");\n        return isAction(action) ? action : \"advance\";\n    }\n    getTargetFrameForLink(link) {\n        const frame = link.getAttribute(\"data-turbo-frame\");\n        if (frame) {\n            return frame;\n        }\n        else {\n            const container = link.closest(\"turbo-frame\");\n            if (container) {\n                return container.id;\n            }\n        }\n    }\n    get snapshot() {\n        return this.view.snapshot;\n    }\n}\nfunction extendURLWithDeprecatedProperties(url) {\n    Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\nconst deprecatedLocationPropertyDescriptors = {\n    absoluteURL: {\n        get() {\n            return this.toString();\n        }\n    }\n};\n\nconst session = new Session;\nconst { navigator: navigator$1 } = session;\nfunction start() {\n    session.start();\n}\nfunction registerAdapter(adapter) {\n    session.registerAdapter(adapter);\n}\nfunction visit(location, options) {\n    session.visit(location, options);\n}\nfunction connectStreamSource(source) {\n    session.connectStreamSource(source);\n}\nfunction disconnectStreamSource(source) {\n    session.disconnectStreamSource(source);\n}\nfunction renderStreamMessage(message) {\n    session.renderStreamMessage(message);\n}\nfunction clearCache() {\n    session.clearCache();\n}\nfunction setProgressBarDelay(delay) {\n    session.setProgressBarDelay(delay);\n}\nfunction setConfirmMethod(confirmMethod) {\n    FormSubmission.confirmMethod = confirmMethod;\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    navigator: navigator$1,\n    session: session,\n    PageRenderer: PageRenderer,\n    PageSnapshot: PageSnapshot,\n    start: start,\n    registerAdapter: registerAdapter,\n    visit: visit,\n    connectStreamSource: connectStreamSource,\n    disconnectStreamSource: disconnectStreamSource,\n    renderStreamMessage: renderStreamMessage,\n    clearCache: clearCache,\n    setProgressBarDelay: setProgressBarDelay,\n    setConfirmMethod: setConfirmMethod\n});\n\nclass FrameController {\n    constructor(element) {\n        this.fetchResponseLoaded = (fetchResponse) => { };\n        this.currentFetchRequest = null;\n        this.resolveVisitPromise = () => { };\n        this.connected = false;\n        this.hasBeenLoaded = false;\n        this.settingSourceURL = false;\n        this.element = element;\n        this.view = new FrameView(this, this.element);\n        this.appearanceObserver = new AppearanceObserver(this, this.element);\n        this.linkInterceptor = new LinkInterceptor(this, this.element);\n        this.formInterceptor = new FormInterceptor(this, this.element);\n    }\n    connect() {\n        if (!this.connected) {\n            this.connected = true;\n            this.reloadable = false;\n            if (this.loadingStyle == FrameLoadingStyle.lazy) {\n                this.appearanceObserver.start();\n            }\n            this.linkInterceptor.start();\n            this.formInterceptor.start();\n            this.sourceURLChanged();\n        }\n    }\n    disconnect() {\n        if (this.connected) {\n            this.connected = false;\n            this.appearanceObserver.stop();\n            this.linkInterceptor.stop();\n            this.formInterceptor.stop();\n        }\n    }\n    disabledChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.eager) {\n            this.loadSourceURL();\n        }\n    }\n    sourceURLChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.eager || this.hasBeenLoaded) {\n            this.loadSourceURL();\n        }\n    }\n    loadingStyleChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.lazy) {\n            this.appearanceObserver.start();\n        }\n        else {\n            this.appearanceObserver.stop();\n            this.loadSourceURL();\n        }\n    }\n    async loadSourceURL() {\n        if (!this.settingSourceURL && this.enabled && this.isActive && (this.reloadable || this.sourceURL != this.currentURL)) {\n            const previousURL = this.currentURL;\n            this.currentURL = this.sourceURL;\n            if (this.sourceURL) {\n                try {\n                    this.element.loaded = this.visit(expandURL(this.sourceURL));\n                    this.appearanceObserver.stop();\n                    await this.element.loaded;\n                    this.hasBeenLoaded = true;\n                }\n                catch (error) {\n                    this.currentURL = previousURL;\n                    throw error;\n                }\n            }\n        }\n    }\n    async loadResponse(fetchResponse) {\n        if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n            this.sourceURL = fetchResponse.response.url;\n        }\n        try {\n            const html = await fetchResponse.responseHTML;\n            if (html) {\n                const { body } = parseHTMLDocument(html);\n                const snapshot = new Snapshot(await this.extractForeignFrameElement(body));\n                const renderer = new FrameRenderer(this.view.snapshot, snapshot, false, false);\n                if (this.view.renderPromise)\n                    await this.view.renderPromise;\n                await this.view.render(renderer);\n                session.frameRendered(fetchResponse, this.element);\n                session.frameLoaded(this.element);\n                this.fetchResponseLoaded(fetchResponse);\n            }\n        }\n        catch (error) {\n            console.error(error);\n            this.view.invalidate();\n        }\n        finally {\n            this.fetchResponseLoaded = () => { };\n        }\n    }\n    elementAppearedInViewport(element) {\n        this.loadSourceURL();\n    }\n    shouldInterceptLinkClick(element, url) {\n        if (element.hasAttribute(\"data-turbo-method\")) {\n            return false;\n        }\n        else {\n            return this.shouldInterceptNavigation(element);\n        }\n    }\n    linkClickIntercepted(element, url) {\n        this.reloadable = true;\n        this.navigateFrame(element, url);\n    }\n    shouldInterceptFormSubmission(element, submitter) {\n        return this.shouldInterceptNavigation(element, submitter);\n    }\n    formSubmissionIntercepted(element, submitter) {\n        if (this.formSubmission) {\n            this.formSubmission.stop();\n        }\n        this.reloadable = false;\n        this.formSubmission = new FormSubmission(this, element, submitter);\n        const { fetchRequest } = this.formSubmission;\n        this.prepareHeadersForRequest(fetchRequest.headers, fetchRequest);\n        this.formSubmission.start();\n    }\n    prepareHeadersForRequest(headers, request) {\n        headers[\"Turbo-Frame\"] = this.id;\n    }\n    requestStarted(request) {\n        markAsBusy(this.element);\n    }\n    requestPreventedHandlingResponse(request, response) {\n        this.resolveVisitPromise();\n    }\n    async requestSucceededWithResponse(request, response) {\n        await this.loadResponse(response);\n        this.resolveVisitPromise();\n    }\n    requestFailedWithResponse(request, response) {\n        console.error(response);\n        this.resolveVisitPromise();\n    }\n    requestErrored(request, error) {\n        console.error(error);\n        this.resolveVisitPromise();\n    }\n    requestFinished(request) {\n        clearBusyState(this.element);\n    }\n    formSubmissionStarted({ formElement }) {\n        markAsBusy(formElement, this.findFrameElement(formElement));\n    }\n    formSubmissionSucceededWithResponse(formSubmission, response) {\n        const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter);\n        this.proposeVisitIfNavigatedWithAction(frame, formSubmission.formElement, formSubmission.submitter);\n        frame.delegate.loadResponse(response);\n    }\n    formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n        this.element.delegate.loadResponse(fetchResponse);\n    }\n    formSubmissionErrored(formSubmission, error) {\n        console.error(error);\n    }\n    formSubmissionFinished({ formElement }) {\n        clearBusyState(formElement, this.findFrameElement(formElement));\n    }\n    allowsImmediateRender(snapshot, resume) {\n        return true;\n    }\n    viewRenderedSnapshot(snapshot, isPreview) {\n    }\n    viewInvalidated() {\n    }\n    async visit(url) {\n        var _a;\n        const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams, this.element);\n        (_a = this.currentFetchRequest) === null || _a === void 0 ? void 0 : _a.cancel();\n        this.currentFetchRequest = request;\n        return new Promise(resolve => {\n            this.resolveVisitPromise = () => {\n                this.resolveVisitPromise = () => { };\n                this.currentFetchRequest = null;\n                resolve();\n            };\n            request.perform();\n        });\n    }\n    navigateFrame(element, url, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        this.proposeVisitIfNavigatedWithAction(frame, element, submitter);\n        frame.setAttribute(\"reloadable\", \"\");\n        frame.src = url;\n    }\n    proposeVisitIfNavigatedWithAction(frame, element, submitter) {\n        const action = getAttribute(\"data-turbo-action\", submitter, element, frame);\n        if (isAction(action)) {\n            const { visitCachedSnapshot } = new SnapshotSubstitution(frame);\n            frame.delegate.fetchResponseLoaded = (fetchResponse) => {\n                if (frame.src) {\n                    const { statusCode, redirected } = fetchResponse;\n                    const responseHTML = frame.ownerDocument.documentElement.outerHTML;\n                    const response = { statusCode, redirected, responseHTML };\n                    session.visit(frame.src, { action, response, visitCachedSnapshot, willRender: false });\n                }\n            };\n        }\n    }\n    findFrameElement(element, submitter) {\n        var _a;\n        const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n        return (_a = getFrameElementById(id)) !== null && _a !== void 0 ? _a : this.element;\n    }\n    async extractForeignFrameElement(container) {\n        let element;\n        const id = CSS.escape(this.id);\n        try {\n            if (element = activateElement(container.querySelector(`turbo-frame#${id}`), this.currentURL)) {\n                return element;\n            }\n            if (element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.currentURL)) {\n                await element.loaded;\n                return await this.extractForeignFrameElement(element);\n            }\n            console.error(`Response has no matching <turbo-frame id=\"${id}\"> element`);\n        }\n        catch (error) {\n            console.error(error);\n        }\n        return new FrameElement();\n    }\n    formActionIsVisitable(form, submitter) {\n        const action = getAction(form, submitter);\n        return locationIsVisitable(expandURL(action), this.rootLocation);\n    }\n    shouldInterceptNavigation(element, submitter) {\n        const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n        if (element instanceof HTMLFormElement && !this.formActionIsVisitable(element, submitter)) {\n            return false;\n        }\n        if (!this.enabled || id == \"_top\") {\n            return false;\n        }\n        if (id) {\n            const frameElement = getFrameElementById(id);\n            if (frameElement) {\n                return !frameElement.disabled;\n            }\n        }\n        if (!session.elementDriveEnabled(element)) {\n            return false;\n        }\n        if (submitter && !session.elementDriveEnabled(submitter)) {\n            return false;\n        }\n        return true;\n    }\n    get id() {\n        return this.element.id;\n    }\n    get enabled() {\n        return !this.element.disabled;\n    }\n    get sourceURL() {\n        if (this.element.src) {\n            return this.element.src;\n        }\n    }\n    get reloadable() {\n        const frame = this.findFrameElement(this.element);\n        return frame.hasAttribute(\"reloadable\");\n    }\n    set reloadable(value) {\n        const frame = this.findFrameElement(this.element);\n        if (value) {\n            frame.setAttribute(\"reloadable\", \"\");\n        }\n        else {\n            frame.removeAttribute(\"reloadable\");\n        }\n    }\n    set sourceURL(sourceURL) {\n        this.settingSourceURL = true;\n        this.element.src = sourceURL !== null && sourceURL !== void 0 ? sourceURL : null;\n        this.currentURL = this.element.src;\n        this.settingSourceURL = false;\n    }\n    get loadingStyle() {\n        return this.element.loading;\n    }\n    get isLoading() {\n        return this.formSubmission !== undefined || this.resolveVisitPromise() !== undefined;\n    }\n    get isActive() {\n        return this.element.isActive && this.connected;\n    }\n    get rootLocation() {\n        var _a;\n        const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n        const root = (_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\";\n        return expandURL(root);\n    }\n}\nclass SnapshotSubstitution {\n    constructor(element) {\n        this.visitCachedSnapshot = ({ element }) => {\n            var _a;\n            const { id, clone } = this;\n            (_a = element.querySelector(\"#\" + id)) === null || _a === void 0 ? void 0 : _a.replaceWith(clone);\n        };\n        this.clone = element.cloneNode(true);\n        this.id = element.id;\n    }\n}\nfunction getFrameElementById(id) {\n    if (id != null) {\n        const element = document.getElementById(id);\n        if (element instanceof FrameElement) {\n            return element;\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        if (element instanceof FrameElement) {\n            element.connectedCallback();\n            element.disconnectedCallback();\n            return element;\n        }\n    }\n}\n\nconst StreamActions = {\n    after() {\n        this.targetElements.forEach(e => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e.nextSibling); });\n    },\n    append() {\n        this.removeDuplicateTargetChildren();\n        this.targetElements.forEach(e => e.append(this.templateContent));\n    },\n    before() {\n        this.targetElements.forEach(e => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e); });\n    },\n    prepend() {\n        this.removeDuplicateTargetChildren();\n        this.targetElements.forEach(e => e.prepend(this.templateContent));\n    },\n    remove() {\n        this.targetElements.forEach(e => e.remove());\n    },\n    replace() {\n        this.targetElements.forEach(e => e.replaceWith(this.templateContent));\n    },\n    update() {\n        this.targetElements.forEach(e => {\n            e.innerHTML = \"\";\n            e.append(this.templateContent);\n        });\n    }\n};\n\nclass StreamElement extends HTMLElement {\n    async connectedCallback() {\n        try {\n            await this.render();\n        }\n        catch (error) {\n            console.error(error);\n        }\n        finally {\n            this.disconnect();\n        }\n    }\n    async render() {\n        var _a;\n        return (_a = this.renderPromise) !== null && _a !== void 0 ? _a : (this.renderPromise = (async () => {\n            if (this.dispatchEvent(this.beforeRenderEvent)) {\n                await nextAnimationFrame();\n                this.performAction();\n            }\n        })());\n    }\n    disconnect() {\n        try {\n            this.remove();\n        }\n        catch (_a) { }\n    }\n    removeDuplicateTargetChildren() {\n        this.duplicateChildren.forEach(c => c.remove());\n    }\n    get duplicateChildren() {\n        var _a;\n        const existingChildren = this.targetElements.flatMap(e => [...e.children]).filter(c => !!c.id);\n        const newChildrenIds = [...(_a = this.templateContent) === null || _a === void 0 ? void 0 : _a.children].filter(c => !!c.id).map(c => c.id);\n        return existingChildren.filter(c => newChildrenIds.includes(c.id));\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    get targetElements() {\n        if (this.target) {\n            return this.targetElementsById;\n        }\n        else if (this.targets) {\n            return this.targetElementsByQuery;\n        }\n        else {\n            this.raise(\"target or targets attribute is missing\");\n        }\n    }\n    get templateContent() {\n        return this.templateElement.content.cloneNode(true);\n    }\n    get templateElement() {\n        if (this.firstElementChild instanceof HTMLTemplateElement) {\n            return this.firstElementChild;\n        }\n        this.raise(\"first child element must be a <template> element\");\n    }\n    get action() {\n        return this.getAttribute(\"action\");\n    }\n    get target() {\n        return this.getAttribute(\"target\");\n    }\n    get targets() {\n        return this.getAttribute(\"targets\");\n    }\n    raise(message) {\n        throw new Error(`${this.description}: ${message}`);\n    }\n    get description() {\n        var _a, _b;\n        return (_b = ((_a = this.outerHTML.match(/<[^>]+>/)) !== null && _a !== void 0 ? _a : [])[0]) !== null && _b !== void 0 ? _b : \"<turbo-stream>\";\n    }\n    get beforeRenderEvent() {\n        return new CustomEvent(\"turbo:before-stream-render\", { bubbles: true, cancelable: true });\n    }\n    get targetElementsById() {\n        var _a;\n        const element = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.getElementById(this.target);\n        if (element !== null) {\n            return [element];\n        }\n        else {\n            return [];\n        }\n    }\n    get targetElementsByQuery() {\n        var _a;\n        const elements = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.targets);\n        if (elements.length !== 0) {\n            return Array.prototype.slice.call(elements);\n        }\n        else {\n            return [];\n        }\n    }\n}\n\nFrameElement.delegateConstructor = FrameController;\ncustomElements.define(\"turbo-frame\", FrameElement);\ncustomElements.define(\"turbo-stream\", StreamElement);\n\n(() => {\n    let element = document.currentScript;\n    if (!element)\n        return;\n    if (element.hasAttribute(\"data-turbo-suppress-warning\"))\n        return;\n    while (element = element.parentElement) {\n        if (element == document.body) {\n            return console.warn(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’s 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        ——\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `, element.outerHTML);\n        }\n    }\n})();\n\nwindow.Turbo = Turbo;\nstart();\n\nexport { PageRenderer, PageSnapshot, clearCache, connectStreamSource, disconnectStreamSource, navigator$1 as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, 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","import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, { received: this.dispatchMessageEvent.bind(this) })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\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 }\n  }\n}\n\ncustomElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n","/*\nTrix 2.0.0-alpha\nCopyright © 2022 Basecamp, LLC\n */\nvar name = \"trix\";\nvar version = \"2.0.0-alpha\";\nvar description = \"A rich text editor for everyday writing\";\nvar main = \"dist/trix.umd.js\";\nvar module = \"dist/trix.js\";\nvar style = \"dist/trix.css\";\nvar files = [\n\t\"dist/*.css\",\n\t\"dist/*.js\"\n];\nvar repository = {\n\ttype: \"git\",\n\turl: \"git+https://github.com/basecamp/trix.git\"\n};\nvar keywords = [\n\t\"rich text\",\n\t\"wysiwyg\",\n\t\"editor\"\n];\nvar author = \"Basecamp, LLC\";\nvar license = \"MIT\";\nvar bugs = {\n\turl: \"https://github.com/basecamp/trix/issues\"\n};\nvar homepage = \"https://trix-editor.org/\";\nvar devDependencies = {\n\t\"@babel/core\": \"^7.16.0\",\n\t\"@babel/preset-env\": \"^7.16.4\",\n\t\"@rollup/plugin-babel\": \"^5.3.0\",\n\t\"@rollup/plugin-json\": \"^4.1.0\",\n\t\"babel-eslint\": \"^10.1.0\",\n\teslint: \"^7.32.0\",\n\tesm: \"^3.2.25\",\n\tkarma: \"5.0.2\",\n\t\"karma-chrome-launcher\": \"3.1.0\",\n\t\"karma-qunit\": \"^4.1.2\",\n\t\"karma-sauce-launcher\": \"^4.3.6\",\n\t\"node-sass\": \"^6.0.1\",\n\tqunit: \"2.9.3\",\n\trangy: \"^1.3.0\",\n\trollup: \"^2.56.3\",\n\t\"rollup-plugin-commonjs\": \"^10.1.0\",\n\t\"rollup-plugin-includepaths\": \"^0.2.4\",\n\t\"rollup-plugin-node-resolve\": \"^5.2.0\",\n\t\"rollup-plugin-terser\": \"^7.0.2\",\n\tsvgo: \"^2.8.0\"\n};\nvar scripts = {\n\t\"build-css\": \"node-sass --functions=./assets/trix/stylesheets/functions assets/trix.scss dist/trix.css\",\n\t\"build-js\": \"rollup -c\",\n\t\"build-assets\": \"cp -f assets/*.html dist/\",\n\tbuild: \"yarn run build-js && yarn run build-css && yarn run build-assets\",\n\twatch: \"rollup -c -w\",\n\tlint: \"eslint .\",\n\tpretest: \"yarn run lint && yarn run build\",\n\ttest: \"karma start\",\n\tpostversion: \"git push && git push --tags\",\n\trelease: \"yarn test && npm adduser && yarn version && npm publish\"\n};\nvar dependencies = {\n};\nvar _package = {\n\tname: name,\n\tversion: version,\n\tdescription: description,\n\tmain: main,\n\tmodule: module,\n\tstyle: style,\n\tfiles: files,\n\trepository: repository,\n\tkeywords: keywords,\n\tauthor: author,\n\tlicense: license,\n\tbugs: bugs,\n\thomepage: homepage,\n\tdevDependencies: devDependencies,\n\tscripts: scripts,\n\tdependencies: dependencies\n};\n\nconst attachmentSelector = \"[data-trix-attachment]\";\nconst attachments = {\n  preview: {\n    presentation: \"gallery\",\n    caption: {\n      name: true,\n      size: true\n    }\n  },\n  file: {\n    caption: {\n      size: true\n    }\n  }\n};\n\nconst attributes = {\n  default: {\n    tagName: \"div\",\n    parse: false\n  },\n  quote: {\n    tagName: \"blockquote\",\n    nestable: true\n  },\n  heading1: {\n    tagName: \"h1\",\n    terminal: true,\n    breakOnReturn: true,\n    group: false\n  },\n  code: {\n    tagName: \"pre\",\n    terminal: true,\n    text: {\n      plaintext: true\n    }\n  },\n  bulletList: {\n    tagName: \"ul\",\n    parse: false\n  },\n  bullet: {\n    tagName: \"li\",\n    listAttribute: \"bulletList\",\n    group: false,\n    nestable: true,\n\n    test(element) {\n      return tagName$1(element.parentNode) === attributes[this.listAttribute].tagName;\n    }\n\n  },\n  numberList: {\n    tagName: \"ol\",\n    parse: false\n  },\n  number: {\n    tagName: \"li\",\n    listAttribute: \"numberList\",\n    group: false,\n    nestable: true,\n\n    test(element) {\n      return tagName$1(element.parentNode) === attributes[this.listAttribute].tagName;\n    }\n\n  },\n  attachmentGallery: {\n    tagName: \"div\",\n    exclusive: true,\n    terminal: true,\n    parse: false,\n    group: false\n  }\n};\n\nconst tagName$1 = element => {\n  var _element$tagName;\n\n  return element === null || element === void 0 ? void 0 : (_element$tagName = element.tagName) === null || _element$tagName === void 0 ? void 0 : _element$tagName.toLowerCase();\n};\n\nvar browser$1 = {\n  // Android emits composition events when moving the cursor through existing text\n  // Introduced in Chrome 65: https://bugs.chromium.org/p/chromium/issues/detail?id=764439#c9\n  composesExistingText: /Android.*Chrome/.test(navigator.userAgent),\n  // IE 11 activates resizing handles on editable elements that have \"layout\"\n  forcesObjectResizing: /Trident.*rv:11/.test(navigator.userAgent),\n  // https://www.w3.org/TR/input-events-1/ + https://www.w3.org/TR/input-events-2/\n  supportsInputEvents: function () {\n    if (typeof InputEvent === \"undefined\") {\n      return false;\n    }\n\n    for (const property of [\"data\", \"getTargetRanges\", \"inputType\"]) {\n      if (!(property in InputEvent.prototype)) {\n        return false;\n      }\n    }\n\n    return true;\n  }()\n};\n\nvar css$3 = {\n  attachment: \"attachment\",\n  attachmentCaption: \"attachment__caption\",\n  attachmentCaptionEditor: \"attachment__caption-editor\",\n  attachmentMetadata: \"attachment__metadata\",\n  attachmentMetadataContainer: \"attachment__metadata-container\",\n  attachmentName: \"attachment__name\",\n  attachmentProgress: \"attachment__progress\",\n  attachmentSize: \"attachment__size\",\n  attachmentToolbar: \"attachment__toolbar\",\n  attachmentGallery: \"attachment-gallery\"\n};\n\nvar lang$1 = {\n  attachFiles: \"Attach Files\",\n  bold: \"Bold\",\n  bullets: \"Bullets\",\n  byte: \"Byte\",\n  bytes: \"Bytes\",\n  captionPlaceholder: \"Add a caption…\",\n  code: \"Code\",\n  heading1: \"Heading\",\n  indent: \"Increase Level\",\n  italic: \"Italic\",\n  link: \"Link\",\n  numbers: \"Numbers\",\n  outdent: \"Decrease Level\",\n  quote: \"Quote\",\n  redo: \"Redo\",\n  remove: \"Remove\",\n  strike: \"Strikethrough\",\n  undo: \"Undo\",\n  unlink: \"Unlink\",\n  url: \"URL\",\n  urlPlaceholder: \"Enter a URL…\",\n  GB: \"GB\",\n  KB: \"KB\",\n  MB: \"MB\",\n  PB: \"PB\",\n  TB: \"TB\"\n};\n\n/* eslint-disable\n    no-case-declarations,\n*/\nconst sizes = [lang$1.bytes, lang$1.KB, lang$1.MB, lang$1.GB, lang$1.TB, lang$1.PB];\nvar fileSize = {\n  prefix: \"IEC\",\n  precision: 2,\n\n  formatter(number) {\n    switch (number) {\n      case 0:\n        return \"0 \".concat(lang$1.bytes);\n\n      case 1:\n        return \"1 \".concat(lang$1.byte);\n\n      default:\n        let base;\n\n        if (this.prefix === \"SI\") {\n          base = 1000;\n        } else if (this.prefix === \"IEC\") {\n          base = 1024;\n        }\n\n        const exp = Math.floor(Math.log(number) / Math.log(base));\n        const humanSize = number / Math.pow(base, exp);\n        const string = humanSize.toFixed(this.precision);\n        const withoutInsignificantZeros = string.replace(/0*$/, \"\").replace(/\\.$/, \"\");\n        return \"\".concat(withoutInsignificantZeros, \" \").concat(sizes[exp]);\n    }\n  }\n\n};\n\nconst ZERO_WIDTH_SPACE = \"\\uFEFF\";\nconst NON_BREAKING_SPACE = \"\\u00A0\";\nconst OBJECT_REPLACEMENT_CHARACTER = \"\\uFFFC\";\n\nconst extend = function (properties) {\n  for (const key in properties) {\n    const value = properties[key];\n    this[key] = value;\n  }\n\n  return this;\n};\n\nconst html = document.documentElement;\nconst match = html.matches;\nconst handleEvent = function (eventName) {\n  let {\n    onElement,\n    matchingSelector,\n    withCallback,\n    inPhase,\n    preventDefault,\n    times\n  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  const element = onElement ? onElement : html;\n  const selector = matchingSelector;\n  const useCapture = inPhase === \"capturing\";\n\n  const handler = function (event) {\n    if (times != null && --times === 0) {\n      handler.destroy();\n    }\n\n    const target = findClosestElementFromNode(event.target, {\n      matchingSelector: selector\n    });\n\n    if (target != null) {\n      withCallback === null || withCallback === void 0 ? void 0 : withCallback.call(target, event, target);\n\n      if (preventDefault) {\n        event.preventDefault();\n      }\n    }\n  };\n\n  handler.destroy = () => element.removeEventListener(eventName, handler, useCapture);\n\n  element.addEventListener(eventName, handler, useCapture);\n  return handler;\n};\nconst handleEventOnce = function (eventName) {\n  let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  options.times = 1;\n  return handleEvent(eventName, options);\n};\nconst triggerEvent = function (eventName) {\n  let {\n    onElement,\n    bubbles,\n    cancelable,\n    attributes\n  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  const element = onElement != null ? onElement : html;\n  bubbles = bubbles !== false;\n  cancelable = cancelable !== false;\n  const event = document.createEvent(\"Events\");\n  event.initEvent(eventName, bubbles, cancelable);\n\n  if (attributes != null) {\n    extend.call(event, attributes);\n  }\n\n  return element.dispatchEvent(event);\n};\nconst elementMatchesSelector = function (element, selector) {\n  if ((element === null || element === void 0 ? void 0 : element.nodeType) === 1) {\n    return match.call(element, selector);\n  }\n};\nconst findClosestElementFromNode = function (node) {\n  let {\n    matchingSelector,\n    untilNode\n  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  while (node && node.nodeType !== Node.ELEMENT_NODE) {\n    node = node.parentNode;\n  }\n\n  if (node == null) {\n    return;\n  }\n\n  if (matchingSelector != null) {\n    if (node.closest && untilNode == null) {\n      return node.closest(matchingSelector);\n    } else {\n      while (node && node !== untilNode) {\n        if (elementMatchesSelector(node, matchingSelector)) {\n          return node;\n        }\n\n        node = node.parentNode;\n      }\n    }\n  } else {\n    return node;\n  }\n};\nconst findInnerElement = function (element) {\n  while ((_element = element) !== null && _element !== void 0 && _element.firstElementChild) {\n    var _element;\n\n    element = element.firstElementChild;\n  }\n\n  return element;\n};\nconst innerElementIsActive = element => document.activeElement !== element && elementContainsNode(element, document.activeElement);\nconst elementContainsNode = function (element, node) {\n  if (!element || !node) {\n    return;\n  }\n\n  while (node) {\n    if (node === element) {\n      return true;\n    }\n\n    node = node.parentNode;\n  }\n};\nconst findNodeFromContainerAndOffset = function (container, offset) {\n  if (!container) {\n    return;\n  }\n\n  if (container.nodeType === Node.TEXT_NODE) {\n    return container;\n  } else if (offset === 0) {\n    return container.firstChild != null ? container.firstChild : container;\n  } else {\n    return container.childNodes.item(offset - 1);\n  }\n};\nconst findElementFromContainerAndOffset = function (container, offset) {\n  const node = findNodeFromContainerAndOffset(container, offset);\n  return findClosestElementFromNode(node);\n};\nconst findChildIndexOfNode = function (node) {\n  var _node;\n\n  if (!((_node = node) !== null && _node !== void 0 && _node.parentNode)) {\n    return;\n  }\n\n  let childIndex = 0;\n  node = node.previousSibling;\n\n  while (node) {\n    childIndex++;\n    node = node.previousSibling;\n  }\n\n  return childIndex;\n};\nconst removeNode = node => {\n  var _node$parentNode;\n\n  return node === null || node === void 0 ? void 0 : (_node$parentNode = node.parentNode) === null || _node$parentNode === void 0 ? void 0 : _node$parentNode.removeChild(node);\n};\nconst walkTree = function (tree) {\n  let {\n    onlyNodesOfType,\n    usingFilter,\n    expandEntityReferences\n  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  const whatToShow = (() => {\n    switch (onlyNodesOfType) {\n      case \"element\":\n        return NodeFilter.SHOW_ELEMENT;\n\n      case \"text\":\n        return NodeFilter.SHOW_TEXT;\n\n      case \"comment\":\n        return NodeFilter.SHOW_COMMENT;\n\n      default:\n        return NodeFilter.SHOW_ALL;\n    }\n  })();\n\n  return document.createTreeWalker(tree, whatToShow, usingFilter != null ? usingFilter : null, expandEntityReferences === true);\n};\nconst tagName = element => {\n  var _element$tagName;\n\n  return element === null || element === void 0 ? void 0 : (_element$tagName = element.tagName) === null || _element$tagName === void 0 ? void 0 : _element$tagName.toLowerCase();\n};\nconst makeElement = function (tag) {\n  let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  let key, value;\n\n  if (typeof tag === \"object\") {\n    options = tag;\n    tag = options.tagName;\n  } else {\n    options = {\n      attributes: options\n    };\n  }\n\n  const element = document.createElement(tag);\n\n  if (options.editable != null) {\n    if (options.attributes == null) {\n      options.attributes = {};\n    }\n\n    options.attributes.contenteditable = options.editable;\n  }\n\n  if (options.attributes) {\n    for (key in options.attributes) {\n      value = options.attributes[key];\n      element.setAttribute(key, value);\n    }\n  }\n\n  if (options.style) {\n    for (key in options.style) {\n      value = options.style[key];\n      element.style[key] = value;\n    }\n  }\n\n  if (options.data) {\n    for (key in options.data) {\n      value = options.data[key];\n      element.dataset[key] = value;\n    }\n  }\n\n  if (options.className) {\n    options.className.split(\" \").forEach(className => {\n      element.classList.add(className);\n    });\n  }\n\n  if (options.textContent) {\n    element.textContent = options.textContent;\n  }\n\n  if (options.childNodes) {\n    [].concat(options.childNodes).forEach(childNode => {\n      element.appendChild(childNode);\n    });\n  }\n\n  return element;\n};\nlet blockTagNames = undefined;\nconst getBlockTagNames = function () {\n  if (blockTagNames != null) {\n    return blockTagNames;\n  }\n\n  blockTagNames = [];\n\n  for (const key in attributes) {\n    const attributes$1 = attributes[key];\n\n    if (attributes$1.tagName) {\n      blockTagNames.push(attributes$1.tagName);\n    }\n  }\n\n  return blockTagNames;\n};\nconst nodeIsBlockContainer = node => nodeIsBlockStartComment(node === null || node === void 0 ? void 0 : node.firstChild);\nconst nodeProbablyIsBlockContainer = function (node) {\n  return getBlockTagNames().includes(tagName(node)) && !getBlockTagNames().includes(tagName(node.firstChild));\n};\nconst nodeIsBlockStart = function (node) {\n  let {\n    strict\n  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n    strict: true\n  };\n\n  if (strict) {\n    return nodeIsBlockStartComment(node);\n  } else {\n    return nodeIsBlockStartComment(node) || !nodeIsBlockStartComment(node.firstChild) && nodeProbablyIsBlockContainer(node);\n  }\n};\nconst nodeIsBlockStartComment = node => nodeIsCommentNode(node) && (node === null || node === void 0 ? void 0 : node.data) === \"block\";\nconst nodeIsCommentNode = node => (node === null || node === void 0 ? void 0 : node.nodeType) === Node.COMMENT_NODE;\nconst nodeIsCursorTarget = function (node) {\n  let {\n    name\n  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!node) {\n    return;\n  }\n\n  if (nodeIsTextNode(node)) {\n    if (node.data === ZERO_WIDTH_SPACE) {\n      if (name) {\n        return node.parentNode.dataset.trixCursorTarget === name;\n      } else {\n        return true;\n      }\n    }\n  } else {\n    return nodeIsCursorTarget(node.firstChild);\n  }\n};\nconst nodeIsAttachmentElement = node => elementMatchesSelector(node, attachmentSelector);\nconst nodeIsEmptyTextNode = node => nodeIsTextNode(node) && (node === null || node === void 0 ? void 0 : node.data) === \"\";\nconst nodeIsTextNode = node => (node === null || node === void 0 ? void 0 : node.nodeType) === Node.TEXT_NODE;\n\nconst input = {\n  level2Enabled: true,\n\n  getLevel() {\n    if (this.level2Enabled && browser$1.supportsInputEvents) {\n      return 2;\n    } else {\n      return 0;\n    }\n  },\n\n  pickFiles(callback) {\n    const input = makeElement(\"input\", {\n      type: \"file\",\n      multiple: true,\n      hidden: true,\n      id: this.fileInputId\n    });\n    input.addEventListener(\"change\", () => {\n      callback(input.files);\n      removeNode(input);\n    });\n    removeNode(document.getElementById(this.fileInputId));\n    document.body.appendChild(input);\n    input.click();\n  }\n\n};\n\nvar keyNames$2 = {\n  8: \"backspace\",\n  9: \"tab\",\n  13: \"return\",\n  27: \"escape\",\n  37: \"left\",\n  39: \"right\",\n  46: \"delete\",\n  68: \"d\",\n  72: \"h\",\n  79: \"o\"\n};\n\nvar textAttributes = {\n  bold: {\n    tagName: \"strong\",\n    inheritable: true,\n\n    parser(element) {\n      const style = window.getComputedStyle(element);\n      return style.fontWeight === \"bold\" || style.fontWeight >= 600;\n    }\n\n  },\n  italic: {\n    tagName: \"em\",\n    inheritable: true,\n\n    parser(element) {\n      const style = window.getComputedStyle(element);\n      return style.fontStyle === \"italic\";\n    }\n\n  },\n  href: {\n    groupTagName: \"a\",\n\n    parser(element) {\n      const matchingSelector = \"a:not(\".concat(attachmentSelector, \")\");\n      const link = element.closest(matchingSelector);\n\n      if (link) {\n        return link.getAttribute(\"href\");\n      }\n    }\n\n  },\n  strike: {\n    tagName: \"del\",\n    inheritable: true\n  },\n  frozen: {\n    style: {\n      backgroundColor: \"highlight\"\n    }\n  }\n};\n\nvar toolbar = {\n  getDefaultHTML() {\n    return \"<div class=\\\"trix-button-row\\\">\\n      <span class=\\\"trix-button-group trix-button-group--text-tools\\\" data-trix-button-group=\\\"text-tools\\\">\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-bold\\\" data-trix-attribute=\\\"bold\\\" data-trix-key=\\\"b\\\" title=\\\"\".concat(lang$1.bold, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.bold, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-italic\\\" data-trix-attribute=\\\"italic\\\" data-trix-key=\\\"i\\\" title=\\\"\").concat(lang$1.italic, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.italic, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-strike\\\" data-trix-attribute=\\\"strike\\\" title=\\\"\").concat(lang$1.strike, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.strike, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-link\\\" data-trix-attribute=\\\"href\\\" data-trix-action=\\\"link\\\" data-trix-key=\\\"k\\\" title=\\\"\").concat(lang$1.link, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.link, \"</button>\\n      </span>\\n\\n      <span class=\\\"trix-button-group trix-button-group--block-tools\\\" data-trix-button-group=\\\"block-tools\\\">\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-heading-1\\\" data-trix-attribute=\\\"heading1\\\" title=\\\"\").concat(lang$1.heading1, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.heading1, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-quote\\\" data-trix-attribute=\\\"quote\\\" title=\\\"\").concat(lang$1.quote, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.quote, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-code\\\" data-trix-attribute=\\\"code\\\" title=\\\"\").concat(lang$1.code, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.code, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-bullet-list\\\" data-trix-attribute=\\\"bullet\\\" title=\\\"\").concat(lang$1.bullets, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.bullets, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-number-list\\\" data-trix-attribute=\\\"number\\\" title=\\\"\").concat(lang$1.numbers, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.numbers, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-decrease-nesting-level\\\" data-trix-action=\\\"decreaseNestingLevel\\\" title=\\\"\").concat(lang$1.outdent, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.outdent, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-increase-nesting-level\\\" data-trix-action=\\\"increaseNestingLevel\\\" title=\\\"\").concat(lang$1.indent, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.indent, \"</button>\\n      </span>\\n\\n      <span class=\\\"trix-button-group trix-button-group--file-tools\\\" data-trix-button-group=\\\"file-tools\\\">\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-attach\\\" data-trix-action=\\\"attachFiles\\\" title=\\\"\").concat(lang$1.attachFiles, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.attachFiles, \"</button>\\n      </span>\\n\\n      <span class=\\\"trix-button-group-spacer\\\"></span>\\n\\n      <span class=\\\"trix-button-group trix-button-group--history-tools\\\" data-trix-button-group=\\\"history-tools\\\">\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-undo\\\" data-trix-action=\\\"undo\\\" data-trix-key=\\\"z\\\" title=\\\"\").concat(lang$1.undo, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.undo, \"</button>\\n        <button type=\\\"button\\\" class=\\\"trix-button trix-button--icon trix-button--icon-redo\\\" data-trix-action=\\\"redo\\\" data-trix-key=\\\"shift+z\\\" title=\\\"\").concat(lang$1.redo, \"\\\" tabindex=\\\"-1\\\">\").concat(lang$1.redo, \"</button>\\n      </span>\\n    </div>\\n\\n    <div class=\\\"trix-dialogs\\\" data-trix-dialogs>\\n      <div class=\\\"trix-dialog trix-dialog--link\\\" data-trix-dialog=\\\"href\\\" data-trix-dialog-attribute=\\\"href\\\">\\n        <div class=\\\"trix-dialog__link-fields\\\">\\n          <input type=\\\"url\\\" name=\\\"href\\\" class=\\\"trix-input trix-input--dialog\\\" placeholder=\\\"\").concat(lang$1.urlPlaceholder, \"\\\" aria-label=\\\"\").concat(lang$1.url, \"\\\" required data-trix-input>\\n          <div class=\\\"trix-button-group\\\">\\n            <input type=\\\"button\\\" class=\\\"trix-button trix-button--dialog\\\" value=\\\"\").concat(lang$1.link, \"\\\" data-trix-method=\\\"setAttribute\\\">\\n            <input type=\\\"button\\\" class=\\\"trix-button trix-button--dialog\\\" value=\\\"\").concat(lang$1.unlink, \"\\\" data-trix-method=\\\"removeAttribute\\\">\\n          </div>\\n        </div>\\n      </div>\\n    </div>\");\n  }\n\n};\n\nconst undoInterval = 5000;\n\nconst config = {\n  attachments,\n  blockAttributes: attributes,\n  browser: browser$1,\n  css: css$3,\n  fileSize,\n  input,\n  keyNames: keyNames$2,\n  lang: lang$1,\n  textAttributes,\n  toolbar,\n  undoInterval\n};\n\nfunction _asyncIterator(iterable) {\n  var method,\n      async,\n      sync,\n      retry = 2;\n\n  if (typeof Symbol !== \"undefined\") {\n    async = Symbol.asyncIterator;\n    sync = Symbol.iterator;\n  }\n\n  while (retry--) {\n    if (async && (method = iterable[async]) != null) {\n      return method.call(iterable);\n    }\n\n    if (sync && (method = iterable[sync]) != null) {\n      return new AsyncFromSyncIterator(method.call(iterable));\n    }\n\n    async = \"@@asyncIterator\";\n    sync = \"@@iterator\";\n  }\n\n  throw new TypeError(\"Object is not async iterable\");\n}\n\nfunction AsyncFromSyncIterator(s) {\n  AsyncFromSyncIterator = function (s) {\n    this.s = s;\n    this.n = s.next;\n  };\n\n  AsyncFromSyncIterator.prototype = {\n    s: null,\n    n: null,\n    next: function () {\n      return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));\n    },\n    return: function (value) {\n      var ret = this.s.return;\n\n      if (ret === undefined) {\n        return Promise.resolve({\n          value: value,\n          done: true\n        });\n      }\n\n      return AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments));\n    },\n    throw: function (value) {\n      var thr = this.s.return;\n      if (thr === undefined) return Promise.reject(value);\n      return AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments));\n    }\n  };\n\n  function AsyncFromSyncIteratorContinuation(r) {\n    if (Object(r) !== r) {\n      return Promise.reject(new TypeError(r + \" is not an object.\"));\n    }\n\n    var done = r.done;\n    return Promise.resolve(r.value).then(function (value) {\n      return {\n        value: value,\n        done: done\n      };\n    });\n  }\n\n  return new AsyncFromSyncIterator(s);\n}\n\nvar REACT_ELEMENT_TYPE;\n\nfunction _jsx(type, props, key, children) {\n  if (!REACT_ELEMENT_TYPE) {\n    REACT_ELEMENT_TYPE = typeof Symbol === \"function\" && Symbol[\"for\"] && Symbol[\"for\"](\"react.element\") || 0xeac7;\n  }\n\n  var defaultProps = type && type.defaultProps;\n  var childrenLength = arguments.length - 3;\n\n  if (!props && childrenLength !== 0) {\n    props = {\n      children: void 0\n    };\n  }\n\n  if (childrenLength === 1) {\n    props.children = children;\n  } else if (childrenLength > 1) {\n    var childArray = new Array(childrenLength);\n\n    for (var i = 0; i < childrenLength; i++) {\n      childArray[i] = arguments[i + 3];\n    }\n\n    props.children = childArray;\n  }\n\n  if (props && defaultProps) {\n    for (var propName in defaultProps) {\n      if (props[propName] === void 0) {\n        props[propName] = defaultProps[propName];\n      }\n    }\n  } else if (!props) {\n    props = defaultProps || {};\n  }\n\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key === undefined ? null : \"\" + key,\n    ref: null,\n    props: props,\n    _owner: null\n  };\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _wrapRegExp() {\n  _wrapRegExp = function (re, groups) {\n    return new BabelRegExp(re, undefined, groups);\n  };\n\n  var _super = RegExp.prototype;\n\n  var _groups = new WeakMap();\n\n  function BabelRegExp(re, flags, groups) {\n    var _this = new RegExp(re, flags);\n\n    _groups.set(_this, groups || _groups.get(re));\n\n    return _setPrototypeOf(_this, BabelRegExp.prototype);\n  }\n\n  _inherits(BabelRegExp, RegExp);\n\n  BabelRegExp.prototype.exec = function (str) {\n    var result = _super.exec.call(this, str);\n\n    if (result) result.groups = buildGroups(result, this);\n    return result;\n  };\n\n  BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {\n    if (typeof substitution === \"string\") {\n      var groups = _groups.get(this);\n\n      return _super[Symbol.replace].call(this, str, substitution.replace(/\\$<([^>]+)>/g, function (_, name) {\n        return \"$\" + groups[name];\n      }));\n    } else if (typeof substitution === \"function\") {\n      var _this = this;\n\n      return _super[Symbol.replace].call(this, str, function () {\n        var args = arguments;\n\n        if (typeof args[args.length - 1] !== \"object\") {\n          args = [].slice.call(args);\n          args.push(buildGroups(args, _this));\n        }\n\n        return substitution.apply(this, args);\n      });\n    } else {\n      return _super[Symbol.replace].call(this, str, substitution);\n    }\n  };\n\n  function buildGroups(result, re) {\n    var g = _groups.get(re);\n\n    return Object.keys(g).reduce(function (groups, name) {\n      groups[name] = result[g[name]];\n      return groups;\n    }, Object.create(null));\n  }\n\n  return _wrapRegExp.apply(this, arguments);\n}\n\nfunction _AwaitValue(value) {\n  this.wrapped = value;\n}\n\nfunction _AsyncGenerator(gen) {\n  var front, back;\n\n  function send(key, arg) {\n    return new Promise(function (resolve, reject) {\n      var request = {\n        key: key,\n        arg: arg,\n        resolve: resolve,\n        reject: reject,\n        next: null\n      };\n\n      if (back) {\n        back = back.next = request;\n      } else {\n        front = back = request;\n        resume(key, arg);\n      }\n    });\n  }\n\n  function resume(key, arg) {\n    try {\n      var result = gen[key](arg);\n      var value = result.value;\n      var wrappedAwait = value instanceof _AwaitValue;\n      Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {\n        if (wrappedAwait) {\n          resume(key === \"return\" ? \"return\" : \"next\", arg);\n          return;\n        }\n\n        settle(result.done ? \"return\" : \"normal\", arg);\n      }, function (err) {\n        resume(\"throw\", err);\n      });\n    } catch (err) {\n      settle(\"throw\", err);\n    }\n  }\n\n  function settle(type, value) {\n    switch (type) {\n      case \"return\":\n        front.resolve({\n          value: value,\n          done: true\n        });\n        break;\n\n      case \"throw\":\n        front.reject(value);\n        break;\n\n      default:\n        front.resolve({\n          value: value,\n          done: false\n        });\n        break;\n    }\n\n    front = front.next;\n\n    if (front) {\n      resume(front.key, front.arg);\n    } else {\n      back = null;\n    }\n  }\n\n  this._invoke = send;\n\n  if (typeof gen.return !== \"function\") {\n    this.return = undefined;\n  }\n}\n\n_AsyncGenerator.prototype[typeof Symbol === \"function\" && Symbol.asyncIterator || \"@@asyncIterator\"] = function () {\n  return this;\n};\n\n_AsyncGenerator.prototype.next = function (arg) {\n  return this._invoke(\"next\", arg);\n};\n\n_AsyncGenerator.prototype.throw = function (arg) {\n  return this._invoke(\"throw\", arg);\n};\n\n_AsyncGenerator.prototype.return = function (arg) {\n  return this._invoke(\"return\", arg);\n};\n\nfunction _wrapAsyncGenerator(fn) {\n  return function () {\n    return new _AsyncGenerator(fn.apply(this, arguments));\n  };\n}\n\nfunction _awaitAsyncGenerator(value) {\n  return new _AwaitValue(value);\n}\n\nfunction _asyncGeneratorDelegate(inner, awaitWrap) {\n  var iter = {},\n      waiting = false;\n\n  function pump(key, value) {\n    waiting = true;\n    value = new Promise(function (resolve) {\n      resolve(inner[key](value));\n    });\n    return {\n      done: false,\n      value: awaitWrap(value)\n    };\n  }\n\n  ;\n\n  iter[typeof Symbol !== \"undefined\" && Symbol.iterator || \"@@iterator\"] = function () {\n    return this;\n  };\n\n  iter.next = function (value) {\n    if (waiting) {\n      waiting = false;\n      return value;\n    }\n\n    return pump(\"next\", value);\n  };\n\n  if (typeof inner.throw === \"function\") {\n    iter.throw = function (value) {\n      if (waiting) {\n        waiting = false;\n        throw value;\n      }\n\n      return pump(\"throw\", value);\n    };\n  }\n\n  if (typeof inner.return === \"function\") {\n    iter.return = function (value) {\n      if (waiting) {\n        waiting = false;\n        return value;\n      }\n\n      return pump(\"return\", value);\n    };\n  }\n\n  return iter;\n}\n\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n  try {\n    var info = gen[key](arg);\n    var value = info.value;\n  } catch (error) {\n    reject(error);\n    return;\n  }\n\n  if (info.done) {\n    resolve(value);\n  } else {\n    Promise.resolve(value).then(_next, _throw);\n  }\n}\n\nfunction _asyncToGenerator(fn) {\n  return function () {\n    var self = this,\n        args = arguments;\n    return new Promise(function (resolve, reject) {\n      var gen = fn.apply(self, args);\n\n      function _next(value) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n      }\n\n      function _throw(err) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n      }\n\n      _next(undefined);\n    });\n  };\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineEnumerableProperties(obj, descs) {\n  for (var key in descs) {\n    var desc = descs[key];\n    desc.configurable = desc.enumerable = true;\n    if (\"value\" in desc) desc.writable = true;\n    Object.defineProperty(obj, key, desc);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    var objectSymbols = Object.getOwnPropertySymbols(descs);\n\n    for (var i = 0; i < objectSymbols.length; i++) {\n      var sym = objectSymbols[i];\n      var desc = descs[sym];\n      desc.configurable = desc.enumerable = true;\n      if (\"value\" in desc) desc.writable = true;\n      Object.defineProperty(obj, sym, desc);\n    }\n  }\n\n  return obj;\n}\n\nfunction _defaults(obj, defaults) {\n  var keys = Object.getOwnPropertyNames(defaults);\n\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    var value = Object.getOwnPropertyDescriptor(defaults, key);\n\n    if (value && value.configurable && obj[key] === undefined) {\n      Object.defineProperty(obj, key, value);\n    }\n  }\n\n  return obj;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction _objectSpread(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? Object(arguments[i]) : {};\n    var ownKeys = Object.keys(source);\n\n    if (typeof Object.getOwnPropertySymbols === 'function') {\n      ownKeys.push.apply(ownKeys, Object.getOwnPropertySymbols(source).filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n      }));\n    }\n\n    ownKeys.forEach(function (key) {\n      _defineProperty(target, key, source[key]);\n    });\n  }\n\n  return target;\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n\n  _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction _construct(Parent, args, Class) {\n  if (_isNativeReflectConstruct()) {\n    _construct = Reflect.construct;\n  } else {\n    _construct = function _construct(Parent, args, Class) {\n      var a = [null];\n      a.push.apply(a, args);\n      var Constructor = Function.bind.apply(Parent, a);\n      var instance = new Constructor();\n      if (Class) _setPrototypeOf(instance, Class.prototype);\n      return instance;\n    };\n  }\n\n  return _construct.apply(null, arguments);\n}\n\nfunction _isNativeFunction(fn) {\n  return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nfunction _wrapNativeSuper(Class) {\n  var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n  _wrapNativeSuper = function _wrapNativeSuper(Class) {\n    if (Class === null || !_isNativeFunction(Class)) return Class;\n\n    if (typeof Class !== \"function\") {\n      throw new TypeError(\"Super expression must either be null or a function\");\n    }\n\n    if (typeof _cache !== \"undefined\") {\n      if (_cache.has(Class)) return _cache.get(Class);\n\n      _cache.set(Class, Wrapper);\n    }\n\n    function Wrapper() {\n      return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n    }\n\n    Wrapper.prototype = Object.create(Class.prototype, {\n      constructor: {\n        value: Wrapper,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n    return _setPrototypeOf(Wrapper, Class);\n  };\n\n  return _wrapNativeSuper(Class);\n}\n\nfunction _instanceof(left, right) {\n  if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n    return !!right[Symbol.hasInstance](left);\n  } else {\n    return left instanceof right;\n  }\n}\n\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    default: obj\n  };\n}\n\nfunction _getRequireWildcardCache(nodeInterop) {\n  if (typeof WeakMap !== \"function\") return null;\n  var cacheBabelInterop = new WeakMap();\n  var cacheNodeInterop = new WeakMap();\n  return (_getRequireWildcardCache = function (nodeInterop) {\n    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n  })(nodeInterop);\n}\n\nfunction _interopRequireWildcard(obj, nodeInterop) {\n  if (!nodeInterop && obj && obj.__esModule) {\n    return obj;\n  }\n\n  if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") {\n    return {\n      default: obj\n    };\n  }\n\n  var cache = _getRequireWildcardCache(nodeInterop);\n\n  if (cache && cache.has(obj)) {\n    return cache.get(obj);\n  }\n\n  var newObj = {};\n  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n  for (var key in obj) {\n    if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) {\n      var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n      if (desc && (desc.get || desc.set)) {\n        Object.defineProperty(newObj, key, desc);\n      } else {\n        newObj[key] = obj[key];\n      }\n    }\n  }\n\n  newObj.default = obj;\n\n  if (cache) {\n    cache.set(obj, newObj);\n  }\n\n  return newObj;\n}\n\nfunction _newArrowCheck(innerThis, boundThis) {\n  if (innerThis !== boundThis) {\n    throw new TypeError(\"Cannot instantiate an arrow function\");\n  }\n}\n\nfunction _objectDestructuringEmpty(obj) {\n  if (obj == null) throw new TypeError(\"Cannot destructure undefined\");\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n\n  var target = _objectWithoutPropertiesLoose(source, excluded);\n\n  var key, i;\n\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n    return call;\n  } else if (call !== void 0) {\n    throw new TypeError(\"Derived constructors may only return object or undefined\");\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _createSuper(Derived) {\n  var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n  return function _createSuperInternal() {\n    var Super = _getPrototypeOf(Derived),\n        result;\n\n    if (hasNativeReflectConstruct) {\n      var NewTarget = _getPrototypeOf(this).constructor;\n\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n\n    return _possibleConstructorReturn(this, result);\n  };\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _get() {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(arguments.length < 3 ? target : receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get.apply(this, arguments);\n}\n\nfunction set(target, property, value, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.set) {\n    set = Reflect.set;\n  } else {\n    set = function set(target, property, value, receiver) {\n      var base = _superPropBase(target, property);\n\n      var desc;\n\n      if (base) {\n        desc = Object.getOwnPropertyDescriptor(base, property);\n\n        if (desc.set) {\n          desc.set.call(receiver, value);\n          return true;\n        } else if (!desc.writable) {\n          return false;\n        }\n      }\n\n      desc = Object.getOwnPropertyDescriptor(receiver, property);\n\n      if (desc) {\n        if (!desc.writable) {\n          return false;\n        }\n\n        desc.value = value;\n        Object.defineProperty(receiver, property, desc);\n      } else {\n        _defineProperty(receiver, property, value);\n      }\n\n      return true;\n    };\n  }\n\n  return set(target, property, value, receiver);\n}\n\nfunction _set(target, property, value, receiver, isStrict) {\n  var s = set(target, property, value, receiver || target);\n\n  if (!s && isStrict) {\n    throw new Error('failed to set property');\n  }\n\n  return value;\n}\n\nfunction _taggedTemplateLiteral(strings, raw) {\n  if (!raw) {\n    raw = strings.slice(0);\n  }\n\n  return Object.freeze(Object.defineProperties(strings, {\n    raw: {\n      value: Object.freeze(raw)\n    }\n  }));\n}\n\nfunction _taggedTemplateLiteralLoose(strings, raw) {\n  if (!raw) {\n    raw = strings.slice(0);\n  }\n\n  strings.raw = raw;\n  return strings;\n}\n\nfunction _readOnlyError(name) {\n  throw new TypeError(\"\\\"\" + name + \"\\\" is read-only\");\n}\n\nfunction _writeOnlyError(name) {\n  throw new TypeError(\"\\\"\" + name + \"\\\" is write-only\");\n}\n\nfunction _classNameTDZError(name) {\n  throw new Error(\"Class \\\"\" + name + \"\\\" cannot be referenced in computed property keys.\");\n}\n\nfunction _temporalUndefined() {}\n\nfunction _tdz(name) {\n  throw new ReferenceError(name + \" is not defined - temporal dead zone\");\n}\n\nfunction _temporalRef(val, name) {\n  return val === _temporalUndefined ? _tdz(name) : val;\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _slicedToArrayLoose(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _toArray(arr) {\n  return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _maybeArrayLike(next, arr, i) {\n  if (arr && !Array.isArray(arr) && typeof arr.length === \"number\") {\n    var len = arr.length;\n    return _arrayLikeToArray(arr, i !== void 0 && i < len ? i : len);\n  }\n\n  return next(arr, i);\n}\n\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n  if (_i == null) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n\n  var _s, _e;\n\n  try {\n    for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _iterableToArrayLimitLoose(arr, i) {\n  var _i = arr && (typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]);\n\n  if (_i == null) return;\n  var _arr = [];\n\n  for (_i = _i.call(arr), _step; !(_step = _i.next()).done;) {\n    _arr.push(_step.value);\n\n    if (i && _arr.length === i) break;\n  }\n\n  return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n  return arr2;\n}\n\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n  var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n  if (!it) {\n    if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n      if (it) o = it;\n      var i = 0;\n\n      var F = function () {};\n\n      return {\n        s: F,\n        n: function () {\n          if (i >= o.length) return {\n            done: true\n          };\n          return {\n            done: false,\n            value: o[i++]\n          };\n        },\n        e: function (e) {\n          throw e;\n        },\n        f: F\n      };\n    }\n\n    throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var normalCompletion = true,\n      didErr = false,\n      err;\n  return {\n    s: function () {\n      it = it.call(o);\n    },\n    n: function () {\n      var step = it.next();\n      normalCompletion = step.done;\n      return step;\n    },\n    e: function (e) {\n      didErr = true;\n      err = e;\n    },\n    f: function () {\n      try {\n        if (!normalCompletion && it.return != null) it.return();\n      } finally {\n        if (didErr) throw err;\n      }\n    }\n  };\n}\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) {\n  var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n  if (it) return (it = it.call(o)).next.bind(it);\n\n  if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n    if (it) o = it;\n    var i = 0;\n    return function () {\n      if (i >= o.length) return {\n        done: true\n      };\n      return {\n        done: false,\n        value: o[i++]\n      };\n    };\n  }\n\n  throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _skipFirstGeneratorNext(fn) {\n  return function () {\n    var it = fn.apply(this, arguments);\n    it.next();\n    return it;\n  };\n}\n\nfunction _toPrimitive(input, hint) {\n  if (typeof input !== \"object\" || input === null) return input;\n  var prim = input[Symbol.toPrimitive];\n\n  if (prim !== undefined) {\n    var res = prim.call(input, hint || \"default\");\n    if (typeof res !== \"object\") return res;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n\n  return (hint === \"string\" ? String : Number)(input);\n}\n\nfunction _toPropertyKey(arg) {\n  var key = _toPrimitive(arg, \"string\");\n\n  return typeof key === \"symbol\" ? key : String(key);\n}\n\nfunction _initializerWarningHelper(descriptor, context) {\n  throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n}\n\nfunction _initializerDefineProperty(target, property, descriptor, context) {\n  if (!descriptor) return;\n  Object.defineProperty(target, property, {\n    enumerable: descriptor.enumerable,\n    configurable: descriptor.configurable,\n    writable: descriptor.writable,\n    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n  });\n}\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object.keys(descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object.defineProperty(target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\nvar id$2 = 0;\n\nfunction _classPrivateFieldLooseKey(name) {\n  return \"__private_\" + id$2++ + \"_\" + name;\n}\n\nfunction _classPrivateFieldLooseBase(receiver, privateKey) {\n  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {\n    throw new TypeError(\"attempted to use private field on non-instance\");\n  }\n\n  return receiver;\n}\n\nfunction _classPrivateFieldGet(receiver, privateMap) {\n  var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\");\n\n  return _classApplyDescriptorGet(receiver, descriptor);\n}\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) {\n  var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\");\n\n  _classApplyDescriptorSet(receiver, descriptor, value);\n\n  return value;\n}\n\nfunction _classPrivateFieldDestructureSet(receiver, privateMap) {\n  var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\");\n\n  return _classApplyDescriptorDestructureSet(receiver, descriptor);\n}\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) {\n  if (!privateMap.has(receiver)) {\n    throw new TypeError(\"attempted to \" + action + \" private field on non-instance\");\n  }\n\n  return privateMap.get(receiver);\n}\n\nfunction _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {\n  _classCheckPrivateStaticAccess(receiver, classConstructor);\n\n  _classCheckPrivateStaticFieldDescriptor(descriptor, \"get\");\n\n  return _classApplyDescriptorGet(receiver, descriptor);\n}\n\nfunction _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {\n  _classCheckPrivateStaticAccess(receiver, classConstructor);\n\n  _classCheckPrivateStaticFieldDescriptor(descriptor, \"set\");\n\n  _classApplyDescriptorSet(receiver, descriptor, value);\n\n  return value;\n}\n\nfunction _classStaticPrivateMethodGet(receiver, classConstructor, method) {\n  _classCheckPrivateStaticAccess(receiver, classConstructor);\n\n  return method;\n}\n\nfunction _classStaticPrivateMethodSet() {\n  throw new TypeError(\"attempted to set read only static private field\");\n}\n\nfunction _classApplyDescriptorGet(receiver, descriptor) {\n  if (descriptor.get) {\n    return descriptor.get.call(receiver);\n  }\n\n  return descriptor.value;\n}\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) {\n  if (descriptor.set) {\n    descriptor.set.call(receiver, value);\n  } else {\n    if (!descriptor.writable) {\n      throw new TypeError(\"attempted to set read only private field\");\n    }\n\n    descriptor.value = value;\n  }\n}\n\nfunction _classApplyDescriptorDestructureSet(receiver, descriptor) {\n  if (descriptor.set) {\n    if (!(\"__destrObj\" in descriptor)) {\n      descriptor.__destrObj = {\n        set value(v) {\n          descriptor.set.call(receiver, v);\n        }\n\n      };\n    }\n\n    return descriptor.__destrObj;\n  } else {\n    if (!descriptor.writable) {\n      throw new TypeError(\"attempted to set read only private field\");\n    }\n\n    return descriptor;\n  }\n}\n\nfunction _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) {\n  _classCheckPrivateStaticAccess(receiver, classConstructor);\n\n  _classCheckPrivateStaticFieldDescriptor(descriptor, \"set\");\n\n  return _classApplyDescriptorDestructureSet(receiver, descriptor);\n}\n\nfunction _classCheckPrivateStaticAccess(receiver, classConstructor) {\n  if (receiver !== classConstructor) {\n    throw new TypeError(\"Private static access of wrong provenance\");\n  }\n}\n\nfunction _classCheckPrivateStaticFieldDescriptor(descriptor, action) {\n  if (descriptor === undefined) {\n    throw new TypeError(\"attempted to \" + action + \" private static field before its declaration\");\n  }\n}\n\nfunction _decorate(decorators, factory, superClass, mixins) {\n  var api = _getDecoratorsApi();\n\n  if (mixins) {\n    for (var i = 0; i < mixins.length; i++) {\n      api = mixins[i](api);\n    }\n  }\n\n  var r = factory(function initialize(O) {\n    api.initializeInstanceElements(O, decorated.elements);\n  }, superClass);\n  var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);\n  api.initializeClassElements(r.F, decorated.elements);\n  return api.runClassFinishers(r.F, decorated.finishers);\n}\n\nfunction _getDecoratorsApi() {\n  _getDecoratorsApi = function () {\n    return api;\n  };\n\n  var api = {\n    elementsDefinitionOrder: [[\"method\"], [\"field\"]],\n    initializeInstanceElements: function (O, elements) {\n      [\"method\", \"field\"].forEach(function (kind) {\n        elements.forEach(function (element) {\n          if (element.kind === kind && element.placement === \"own\") {\n            this.defineClassElement(O, element);\n          }\n        }, this);\n      }, this);\n    },\n    initializeClassElements: function (F, elements) {\n      var proto = F.prototype;\n      [\"method\", \"field\"].forEach(function (kind) {\n        elements.forEach(function (element) {\n          var placement = element.placement;\n\n          if (element.kind === kind && (placement === \"static\" || placement === \"prototype\")) {\n            var receiver = placement === \"static\" ? F : proto;\n            this.defineClassElement(receiver, element);\n          }\n        }, this);\n      }, this);\n    },\n    defineClassElement: function (receiver, element) {\n      var descriptor = element.descriptor;\n\n      if (element.kind === \"field\") {\n        var initializer = element.initializer;\n        descriptor = {\n          enumerable: descriptor.enumerable,\n          writable: descriptor.writable,\n          configurable: descriptor.configurable,\n          value: initializer === void 0 ? void 0 : initializer.call(receiver)\n        };\n      }\n\n      Object.defineProperty(receiver, element.key, descriptor);\n    },\n    decorateClass: function (elements, decorators) {\n      var newElements = [];\n      var finishers = [];\n      var placements = {\n        static: [],\n        prototype: [],\n        own: []\n      };\n      elements.forEach(function (element) {\n        this.addElementPlacement(element, placements);\n      }, this);\n      elements.forEach(function (element) {\n        if (!_hasDecorators(element)) return newElements.push(element);\n        var elementFinishersExtras = this.decorateElement(element, placements);\n        newElements.push(elementFinishersExtras.element);\n        newElements.push.apply(newElements, elementFinishersExtras.extras);\n        finishers.push.apply(finishers, elementFinishersExtras.finishers);\n      }, this);\n\n      if (!decorators) {\n        return {\n          elements: newElements,\n          finishers: finishers\n        };\n      }\n\n      var result = this.decorateConstructor(newElements, decorators);\n      finishers.push.apply(finishers, result.finishers);\n      result.finishers = finishers;\n      return result;\n    },\n    addElementPlacement: function (element, placements, silent) {\n      var keys = placements[element.placement];\n\n      if (!silent && keys.indexOf(element.key) !== -1) {\n        throw new TypeError(\"Duplicated element (\" + element.key + \")\");\n      }\n\n      keys.push(element.key);\n    },\n    decorateElement: function (element, placements) {\n      var extras = [];\n      var finishers = [];\n\n      for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {\n        var keys = placements[element.placement];\n        keys.splice(keys.indexOf(element.key), 1);\n        var elementObject = this.fromElementDescriptor(element);\n        var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);\n        element = elementFinisherExtras.element;\n        this.addElementPlacement(element, placements);\n\n        if (elementFinisherExtras.finisher) {\n          finishers.push(elementFinisherExtras.finisher);\n        }\n\n        var newExtras = elementFinisherExtras.extras;\n\n        if (newExtras) {\n          for (var j = 0; j < newExtras.length; j++) {\n            this.addElementPlacement(newExtras[j], placements);\n          }\n\n          extras.push.apply(extras, newExtras);\n        }\n      }\n\n      return {\n        element: element,\n        finishers: finishers,\n        extras: extras\n      };\n    },\n    decorateConstructor: function (elements, decorators) {\n      var finishers = [];\n\n      for (var i = decorators.length - 1; i >= 0; i--) {\n        var obj = this.fromClassDescriptor(elements);\n        var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);\n\n        if (elementsAndFinisher.finisher !== undefined) {\n          finishers.push(elementsAndFinisher.finisher);\n        }\n\n        if (elementsAndFinisher.elements !== undefined) {\n          elements = elementsAndFinisher.elements;\n\n          for (var j = 0; j < elements.length - 1; j++) {\n            for (var k = j + 1; k < elements.length; k++) {\n              if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {\n                throw new TypeError(\"Duplicated element (\" + elements[j].key + \")\");\n              }\n            }\n          }\n        }\n      }\n\n      return {\n        elements: elements,\n        finishers: finishers\n      };\n    },\n    fromElementDescriptor: function (element) {\n      var obj = {\n        kind: element.kind,\n        key: element.key,\n        placement: element.placement,\n        descriptor: element.descriptor\n      };\n      var desc = {\n        value: \"Descriptor\",\n        configurable: true\n      };\n      Object.defineProperty(obj, Symbol.toStringTag, desc);\n      if (element.kind === \"field\") obj.initializer = element.initializer;\n      return obj;\n    },\n    toElementDescriptors: function (elementObjects) {\n      if (elementObjects === undefined) return;\n      return _toArray(elementObjects).map(function (elementObject) {\n        var element = this.toElementDescriptor(elementObject);\n        this.disallowProperty(elementObject, \"finisher\", \"An element descriptor\");\n        this.disallowProperty(elementObject, \"extras\", \"An element descriptor\");\n        return element;\n      }, this);\n    },\n    toElementDescriptor: function (elementObject) {\n      var kind = String(elementObject.kind);\n\n      if (kind !== \"method\" && kind !== \"field\") {\n        throw new TypeError('An element descriptor\\'s .kind property must be either \"method\" or' + ' \"field\", but a decorator created an element descriptor with' + ' .kind \"' + kind + '\"');\n      }\n\n      var key = _toPropertyKey(elementObject.key);\n\n      var placement = String(elementObject.placement);\n\n      if (placement !== \"static\" && placement !== \"prototype\" && placement !== \"own\") {\n        throw new TypeError('An element descriptor\\'s .placement property must be one of \"static\",' + ' \"prototype\" or \"own\", but a decorator created an element descriptor' + ' with .placement \"' + placement + '\"');\n      }\n\n      var descriptor = elementObject.descriptor;\n      this.disallowProperty(elementObject, \"elements\", \"An element descriptor\");\n      var element = {\n        kind: kind,\n        key: key,\n        placement: placement,\n        descriptor: Object.assign({}, descriptor)\n      };\n\n      if (kind !== \"field\") {\n        this.disallowProperty(elementObject, \"initializer\", \"A method descriptor\");\n      } else {\n        this.disallowProperty(descriptor, \"get\", \"The property descriptor of a field descriptor\");\n        this.disallowProperty(descriptor, \"set\", \"The property descriptor of a field descriptor\");\n        this.disallowProperty(descriptor, \"value\", \"The property descriptor of a field descriptor\");\n        element.initializer = elementObject.initializer;\n      }\n\n      return element;\n    },\n    toElementFinisherExtras: function (elementObject) {\n      var element = this.toElementDescriptor(elementObject);\n\n      var finisher = _optionalCallableProperty(elementObject, \"finisher\");\n\n      var extras = this.toElementDescriptors(elementObject.extras);\n      return {\n        element: element,\n        finisher: finisher,\n        extras: extras\n      };\n    },\n    fromClassDescriptor: function (elements) {\n      var obj = {\n        kind: \"class\",\n        elements: elements.map(this.fromElementDescriptor, this)\n      };\n      var desc = {\n        value: \"Descriptor\",\n        configurable: true\n      };\n      Object.defineProperty(obj, Symbol.toStringTag, desc);\n      return obj;\n    },\n    toClassDescriptor: function (obj) {\n      var kind = String(obj.kind);\n\n      if (kind !== \"class\") {\n        throw new TypeError('A class descriptor\\'s .kind property must be \"class\", but a decorator' + ' created a class descriptor with .kind \"' + kind + '\"');\n      }\n\n      this.disallowProperty(obj, \"key\", \"A class descriptor\");\n      this.disallowProperty(obj, \"placement\", \"A class descriptor\");\n      this.disallowProperty(obj, \"descriptor\", \"A class descriptor\");\n      this.disallowProperty(obj, \"initializer\", \"A class descriptor\");\n      this.disallowProperty(obj, \"extras\", \"A class descriptor\");\n\n      var finisher = _optionalCallableProperty(obj, \"finisher\");\n\n      var elements = this.toElementDescriptors(obj.elements);\n      return {\n        elements: elements,\n        finisher: finisher\n      };\n    },\n    runClassFinishers: function (constructor, finishers) {\n      for (var i = 0; i < finishers.length; i++) {\n        var newConstructor = (0, finishers[i])(constructor);\n\n        if (newConstructor !== undefined) {\n          if (typeof newConstructor !== \"function\") {\n            throw new TypeError(\"Finishers must return a constructor.\");\n          }\n\n          constructor = newConstructor;\n        }\n      }\n\n      return constructor;\n    },\n    disallowProperty: function (obj, name, objectType) {\n      if (obj[name] !== undefined) {\n        throw new TypeError(objectType + \" can't have a .\" + name + \" property.\");\n      }\n    }\n  };\n  return api;\n}\n\nfunction _createElementDescriptor(def) {\n  var key = _toPropertyKey(def.key);\n\n  var descriptor;\n\n  if (def.kind === \"method\") {\n    descriptor = {\n      value: def.value,\n      writable: true,\n      configurable: true,\n      enumerable: false\n    };\n  } else if (def.kind === \"get\") {\n    descriptor = {\n      get: def.value,\n      configurable: true,\n      enumerable: false\n    };\n  } else if (def.kind === \"set\") {\n    descriptor = {\n      set: def.value,\n      configurable: true,\n      enumerable: false\n    };\n  } else if (def.kind === \"field\") {\n    descriptor = {\n      configurable: true,\n      writable: true,\n      enumerable: true\n    };\n  }\n\n  var element = {\n    kind: def.kind === \"field\" ? \"field\" : \"method\",\n    key: key,\n    placement: def.static ? \"static\" : def.kind === \"field\" ? \"own\" : \"prototype\",\n    descriptor: descriptor\n  };\n  if (def.decorators) element.decorators = def.decorators;\n  if (def.kind === \"field\") element.initializer = def.value;\n  return element;\n}\n\nfunction _coalesceGetterSetter(element, other) {\n  if (element.descriptor.get !== undefined) {\n    other.descriptor.get = element.descriptor.get;\n  } else {\n    other.descriptor.set = element.descriptor.set;\n  }\n}\n\nfunction _coalesceClassElements(elements) {\n  var newElements = [];\n\n  var isSameElement = function (other) {\n    return other.kind === \"method\" && other.key === element.key && other.placement === element.placement;\n  };\n\n  for (var i = 0; i < elements.length; i++) {\n    var element = elements[i];\n    var other;\n\n    if (element.kind === \"method\" && (other = newElements.find(isSameElement))) {\n      if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {\n        if (_hasDecorators(element) || _hasDecorators(other)) {\n          throw new ReferenceError(\"Duplicated methods (\" + element.key + \") can't be decorated.\");\n        }\n\n        other.descriptor = element.descriptor;\n      } else {\n        if (_hasDecorators(element)) {\n          if (_hasDecorators(other)) {\n            throw new ReferenceError(\"Decorators can't be placed on different accessors with for \" + \"the same property (\" + element.key + \").\");\n          }\n\n          other.decorators = element.decorators;\n        }\n\n        _coalesceGetterSetter(element, other);\n      }\n    } else {\n      newElements.push(element);\n    }\n  }\n\n  return newElements;\n}\n\nfunction _hasDecorators(element) {\n  return element.decorators && element.decorators.length;\n}\n\nfunction _isDataDescriptor(desc) {\n  return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);\n}\n\nfunction _optionalCallableProperty(obj, name) {\n  var value = obj[name];\n\n  if (value !== undefined && typeof value !== \"function\") {\n    throw new TypeError(\"Expected '\" + name + \"' to be a function\");\n  }\n\n  return value;\n}\n\nfunction _classPrivateMethodGet(receiver, privateSet, fn) {\n  if (!privateSet.has(receiver)) {\n    throw new TypeError(\"attempted to get private field on non-instance\");\n  }\n\n  return fn;\n}\n\nfunction _checkPrivateRedeclaration(obj, privateCollection) {\n  if (privateCollection.has(obj)) {\n    throw new TypeError(\"Cannot initialize the same private elements twice on an object\");\n  }\n}\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) {\n  _checkPrivateRedeclaration(obj, privateMap);\n\n  privateMap.set(obj, value);\n}\n\nfunction _classPrivateMethodInitSpec(obj, privateSet) {\n  _checkPrivateRedeclaration(obj, privateSet);\n\n  privateSet.add(obj);\n}\n\nfunction _classPrivateMethodSet() {\n  throw new TypeError(\"attempted to reassign private method\");\n}\n\nclass BasicObject {\n  static proxyMethod(expression) {\n    const {\n      name,\n      toMethod,\n      toProperty,\n      optional\n    } = parseProxyMethodExpression(expression);\n\n    this.prototype[name] = function () {\n      let subject;\n      let object;\n\n      if (toMethod) {\n        if (optional) {\n          var _this$toMethod;\n\n          object = (_this$toMethod = this[toMethod]) === null || _this$toMethod === void 0 ? void 0 : _this$toMethod.call(this);\n        } else {\n          object = this[toMethod]();\n        }\n      } else if (toProperty) {\n        object = this[toProperty];\n      }\n\n      if (optional) {\n        var _object;\n\n        subject = (_object = object) === null || _object === void 0 ? void 0 : _object[name];\n\n        if (subject) {\n          return apply.call(subject, object, arguments);\n        }\n      } else {\n        subject = object[name];\n        return apply.call(subject, object, arguments);\n      }\n    };\n  }\n\n}\n\nconst parseProxyMethodExpression = function (expression) {\n  const match = expression.match(proxyMethodExpressionPattern);\n\n  if (!match) {\n    throw new Error(\"can't parse @proxyMethod expression: \".concat(expression));\n  }\n\n  const args = {\n    name: match[4]\n  };\n\n  if (match[2] != null) {\n    args.toMethod = match[1];\n  } else {\n    args.toProperty = match[1];\n  }\n\n  if (match[3] != null) {\n    args.optional = true;\n  }\n\n  return args;\n};\n\nconst {\n  apply\n} = Function.prototype;\nconst proxyMethodExpressionPattern = new RegExp(\"\\\n^\\\n(.+?)\\\n(\\\\(\\\\))?\\\n(\\\\?)?\\\n\\\\.\\\n(.+?)\\\n$\\\n\");\n\nvar _Array$from, _$codePointAt$1, _$1, _String$fromCodePoint;\nclass UTF16String extends BasicObject {\n  static box() {\n    let value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n\n    if (value instanceof this) {\n      return value;\n    } else {\n      return this.fromUCS2String(value === null || value === void 0 ? void 0 : value.toString());\n    }\n  }\n\n  static fromUCS2String(ucs2String) {\n    return new this(ucs2String, ucs2decode(ucs2String));\n  }\n\n  static fromCodepoints(codepoints) {\n    return new this(ucs2encode(codepoints), codepoints);\n  }\n\n  constructor(ucs2String, codepoints) {\n    super(...arguments);\n    this.ucs2String = ucs2String;\n    this.codepoints = codepoints;\n    this.length = this.codepoints.length;\n    this.ucs2Length = this.ucs2String.length;\n  }\n\n  offsetToUCS2Offset(offset) {\n    return ucs2encode(this.codepoints.slice(0, Math.max(0, offset))).length;\n  }\n\n  offsetFromUCS2Offset(ucs2Offset) {\n    return ucs2decode(this.ucs2String.slice(0, Math.max(0, ucs2Offset))).length;\n  }\n\n  slice() {\n    return this.constructor.fromCodepoints(this.codepoints.slice(...arguments));\n  }\n\n  charAt(offset) {\n    return this.slice(offset, offset + 1);\n  }\n\n  isEqualTo(value) {\n    return this.constructor.box(value).ucs2String === this.ucs2String;\n  }\n\n  toJSON() {\n    return this.ucs2String;\n  }\n\n  getCacheKey() {\n    return this.ucs2String;\n  }\n\n  toString() {\n    return this.ucs2String;\n  }\n\n}\nconst hasArrayFrom = ((_Array$from = Array.from) === null || _Array$from === void 0 ? void 0 : _Array$from.call(Array, \"\\ud83d\\udc7c\").length) === 1;\nconst hasStringCodePointAt$1 = ((_$codePointAt$1 = (_$1 = \" \").codePointAt) === null || _$codePointAt$1 === void 0 ? void 0 : _$codePointAt$1.call(_$1, 0)) != null;\nconst hasStringFromCodePoint = ((_String$fromCodePoint = String.fromCodePoint) === null || _String$fromCodePoint === void 0 ? void 0 : _String$fromCodePoint.call(String, 32, 128124)) === \" \\ud83d\\udc7c\"; // UCS-2 conversion helpers ported from Mathias Bynens' Punycode.js:\n// https://github.com/bestiejs/punycode.js#punycodeucs2\n\nlet ucs2decode, ucs2encode; // Creates an array containing the numeric code points of each Unicode\n// character in the string. While JavaScript uses UCS-2 internally,\n// this function will convert a pair of surrogate halves (each of which\n// UCS-2 exposes as separate characters) into a single code point,\n// matching UTF-16.\n\nif (hasArrayFrom && hasStringCodePointAt$1) {\n  ucs2decode = string => Array.from(string).map(char => char.codePointAt(0));\n} else {\n  ucs2decode = function (string) {\n    const output = [];\n    let counter = 0;\n    const {\n      length\n    } = string;\n\n    while (counter < length) {\n      let value = string.charCodeAt(counter++);\n\n      if (0xd800 <= value && value <= 0xdbff && counter < length) {\n        // high surrogate, and there is a next character\n        const extra = string.charCodeAt(counter++);\n\n        if ((extra & 0xfc00) === 0xdc00) {\n          // low surrogate\n          value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n        } else {\n          // unmatched surrogate; only append this code unit, in case the\n          // next code unit is the high surrogate of a surrogate pair\n          counter--;\n        }\n      }\n\n      output.push(value);\n    }\n\n    return output;\n  };\n} // Creates a string based on an array of numeric code points.\n\n\nif (hasStringFromCodePoint) {\n  ucs2encode = array => String.fromCodePoint(...Array.from(array || []));\n} else {\n  ucs2encode = function (array) {\n    const characters = (() => {\n      const result = [];\n      Array.from(array).forEach(value => {\n        let output = \"\";\n\n        if (value > 0xffff) {\n          value -= 0x10000;\n          output += String.fromCharCode(value >>> 10 & 0x3ff | 0xd800);\n          value = 0xdc00 | value & 0x3ff;\n        }\n\n        result.push(output + String.fromCharCode(value));\n      });\n      return result;\n    })();\n\n    return characters.join(\"\");\n  };\n}\n\nlet id$1 = 0;\nclass TrixObject extends BasicObject {\n  static fromJSONString(jsonString) {\n    return this.fromJSON(JSON.parse(jsonString));\n  }\n\n  constructor() {\n    super(...arguments);\n    this.id = ++id$1;\n  }\n\n  hasSameConstructorAs(object) {\n    return this.constructor === (object === null || object === void 0 ? void 0 : object.constructor);\n  }\n\n  isEqualTo(object) {\n    return this === object;\n  }\n\n  inspect() {\n    const parts = [];\n    const contents = this.contentsForInspection() || {};\n\n    for (const key in contents) {\n      const value = contents[key];\n      parts.push(\"\".concat(key, \"=\").concat(value));\n    }\n\n    return \"#<\".concat(this.constructor.name, \":\").concat(this.id).concat(parts.length ? \" \".concat(parts.join(\", \")) : \"\", \">\");\n  }\n\n  contentsForInspection() {}\n\n  toJSONString() {\n    return JSON.stringify(this);\n  }\n\n  toUTF16String() {\n    return UTF16String.box(this);\n  }\n\n  getCacheKey() {\n    return this.id.toString();\n  }\n\n}\n\n/* eslint-disable\n    id-length,\n*/\nconst arraysAreEqual = function () {\n  let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  let b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n  if (a.length !== b.length) {\n    return false;\n  }\n\n  for (let index = 0; index < a.length; index++) {\n    const value = a[index];\n\n    if (value !== b[index]) {\n      return false;\n    }\n  }\n\n  return true;\n};\nconst arrayStartsWith = function () {\n  let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  let b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  return arraysAreEqual(a.slice(0, b.length), b);\n};\nconst spliceArray = function (array) {\n  const result = array.slice(0);\n\n  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    args[_key - 1] = arguments[_key];\n  }\n\n  result.splice(...args);\n  return result;\n};\nconst summarizeArrayChange = function () {\n  let oldArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  let newArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  const added = [];\n  const removed = [];\n  const existingValues = new Set();\n  oldArray.forEach(value => {\n    existingValues.add(value);\n  });\n  const currentValues = new Set();\n  newArray.forEach(value => {\n    currentValues.add(value);\n\n    if (!existingValues.has(value)) {\n      added.push(value);\n    }\n  });\n  oldArray.forEach(value => {\n    if (!currentValues.has(value)) {\n      removed.push(value);\n    }\n  });\n  return {\n    added,\n    removed\n  };\n};\n\nconst RTL_PATTERN = /[\\u05BE\\u05C0\\u05C3\\u05D0-\\u05EA\\u05F0-\\u05F4\\u061B\\u061F\\u0621-\\u063A\\u0640-\\u064A\\u066D\\u0671-\\u06B7\\u06BA-\\u06BE\\u06C0-\\u06CE\\u06D0-\\u06D5\\u06E5\\u06E6\\u200F\\u202B\\u202E\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE72\\uFE74\\uFE76-\\uFEFC]/;\nconst getDirection = function () {\n  const input = makeElement(\"input\", {\n    dir: \"auto\",\n    name: \"x\",\n    dirName: \"x.dir\"\n  });\n  const form = makeElement(\"form\");\n  form.appendChild(input);\n\n  const supportsDirName = function () {\n    try {\n      return new FormData(form).has(input.dirName);\n    } catch (error) {\n      return false;\n    }\n  }();\n\n  const supportsDirSelector = function () {\n    try {\n      return input.matches(\":dir(ltr),:dir(rtl)\");\n    } catch (error) {\n      return false;\n    }\n  }();\n\n  if (supportsDirName) {\n    return function (string) {\n      input.value = string;\n      return new FormData(form).get(input.dirName);\n    };\n  } else if (supportsDirSelector) {\n    return function (string) {\n      input.value = string;\n\n      if (input.matches(\":dir(rtl)\")) {\n        return \"rtl\";\n      } else {\n        return \"ltr\";\n      }\n    };\n  } else {\n    return function (string) {\n      const char = string.trim().charAt(0);\n\n      if (RTL_PATTERN.test(char)) {\n        return \"rtl\";\n      } else {\n        return \"ltr\";\n      }\n    };\n  }\n}();\n\nlet allAttributeNames = null;\nlet blockAttributeNames = null;\nlet textAttributeNames = null;\nlet listAttributeNames = null;\nconst getAllAttributeNames = () => {\n  if (!allAttributeNames) {\n    allAttributeNames = getTextAttributeNames().concat(getBlockAttributeNames());\n  }\n\n  return allAttributeNames;\n};\nconst getBlockConfig = attributeName => config.blockAttributes[attributeName];\nconst getBlockAttributeNames = () => {\n  if (!blockAttributeNames) {\n    blockAttributeNames = Object.keys(config.blockAttributes);\n  }\n\n  return blockAttributeNames;\n};\nconst getTextConfig = attributeName => config.textAttributes[attributeName];\nconst getTextAttributeNames = () => {\n  if (!textAttributeNames) {\n    textAttributeNames = Object.keys(config.textAttributes);\n  }\n\n  return textAttributeNames;\n};\nconst getListAttributeNames = () => {\n  if (!listAttributeNames) {\n    listAttributeNames = [];\n\n    for (const key in config.blockAttributes) {\n      const {\n        listAttribute\n      } = config.blockAttributes[key];\n\n      if (listAttribute != null) {\n        listAttributeNames.push(listAttribute);\n      }\n    }\n  }\n\n  return listAttributeNames;\n};\n\n/* eslint-disable\n*/\nconst installDefaultCSSForTagName = function (tagName, defaultCSS) {\n  const styleElement = insertStyleElementForTagName(tagName);\n  styleElement.textContent = defaultCSS.replace(/%t/g, tagName);\n};\n\nconst insertStyleElementForTagName = function (tagName) {\n  const element = document.createElement(\"style\");\n  element.setAttribute(\"type\", \"text/css\");\n  element.setAttribute(\"data-tag-name\", tagName.toLowerCase());\n  const nonce = getCSPNonce();\n\n  if (nonce) {\n    element.setAttribute(\"nonce\", nonce);\n  }\n\n  document.head.insertBefore(element, document.head.firstChild);\n  return element;\n};\n\nconst getCSPNonce = function () {\n  const element = getMetaElement(\"trix-csp-nonce\") || getMetaElement(\"csp-nonce\");\n\n  if (element) {\n    return element.getAttribute(\"content\");\n  }\n};\n\nconst getMetaElement = name => document.head.querySelector(\"meta[name=\".concat(name, \"]\"));\n\nconst testTransferData = {\n  \"application/x-trix-feature-detection\": \"test\"\n};\nconst dataTransferIsPlainText = function (dataTransfer) {\n  const text = dataTransfer.getData(\"text/plain\");\n  const html = dataTransfer.getData(\"text/html\");\n\n  if (text && html) {\n    const {\n      body\n    } = new DOMParser().parseFromString(html, \"text/html\");\n\n    if (body.textContent === text) {\n      return !body.querySelector(\"*\");\n    }\n  } else {\n    return text === null || text === void 0 ? void 0 : text.length;\n  }\n};\nconst dataTransferIsWritable = function (dataTransfer) {\n  if (!(dataTransfer !== null && dataTransfer !== void 0 && dataTransfer.setData)) return false;\n\n  for (const key in testTransferData) {\n    const value = testTransferData[key];\n\n    try {\n      dataTransfer.setData(key, value);\n      if (!dataTransfer.getData(key) === value) return false;\n    } catch (error) {\n      return false;\n    }\n  }\n\n  return true;\n};\nconst keyEventIsKeyboardCommand = function () {\n  if (/Mac|^iP/.test(navigator.platform)) {\n    return event => event.metaKey;\n  } else {\n    return event => event.ctrlKey;\n  }\n}();\n\nconst defer = fn => setTimeout(fn, 1);\n\n/* eslint-disable\n    id-length,\n*/\nconst copyObject = function () {\n  let object = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  const result = {};\n\n  for (const key in object) {\n    const value = object[key];\n    result[key] = value;\n  }\n\n  return result;\n};\nconst objectsAreEqual = function () {\n  let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  let b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (Object.keys(a).length !== Object.keys(b).length) {\n    return false;\n  }\n\n  for (const key in a) {\n    const value = a[key];\n\n    if (value !== b[key]) {\n      return false;\n    }\n  }\n\n  return true;\n};\n\nconst normalizeRange = function (range) {\n  if (range == null) return;\n\n  if (!Array.isArray(range)) {\n    range = [range, range];\n  }\n\n  return [copyValue(range[0]), copyValue(range[1] != null ? range[1] : range[0])];\n};\nconst rangeIsCollapsed = function (range) {\n  if (range == null) return;\n  const [start, end] = normalizeRange(range);\n  return rangeValuesAreEqual(start, end);\n};\nconst rangesAreEqual = function (leftRange, rightRange) {\n  if (leftRange == null || rightRange == null) return;\n  const [leftStart, leftEnd] = normalizeRange(leftRange);\n  const [rightStart, rightEnd] = normalizeRange(rightRange);\n  return rangeValuesAreEqual(leftStart, rightStart) && rangeValuesAreEqual(leftEnd, rightEnd);\n};\n\nconst copyValue = function (value) {\n  if (typeof value === \"number\") {\n    return value;\n  } else {\n    return copyObject(value);\n  }\n};\n\nconst rangeValuesAreEqual = function (left, right) {\n  if (typeof left === \"number\") {\n    return left === right;\n  } else {\n    return objectsAreEqual(left, right);\n  }\n};\n\n/* eslint-disable\n    id-length,\n*/\nclass SelectionChangeObserver extends BasicObject {\n  constructor() {\n    super(...arguments);\n    this.update = this.update.bind(this);\n    this.run = this.run.bind(this);\n    this.selectionManagers = [];\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n\n      if (\"onselectionchange\" in document) {\n        return document.addEventListener(\"selectionchange\", this.update, true);\n      } else {\n        return this.run();\n      }\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      return document.removeEventListener(\"selectionchange\", this.update, true);\n    }\n  }\n\n  registerSelectionManager(selectionManager) {\n    if (!this.selectionManagers.includes(selectionManager)) {\n      this.selectionManagers.push(selectionManager);\n      return this.start();\n    }\n  }\n\n  unregisterSelectionManager(selectionManager) {\n    this.selectionManagers = this.selectionManagers.filter(s => s !== selectionManager);\n\n    if (this.selectionManagers.length === 0) {\n      return this.stop();\n    }\n  }\n\n  notifySelectionManagersOfSelectionChange() {\n    return this.selectionManagers.map(selectionManager => selectionManager.selectionDidChange());\n  }\n\n  update() {\n    const domRange = getDOMRange();\n\n    if (!domRangesAreEqual(domRange, this.domRange)) {\n      this.domRange = domRange;\n      return this.notifySelectionManagersOfSelectionChange();\n    }\n  }\n\n  reset() {\n    this.domRange = null;\n    return this.update();\n  } // Private\n\n\n  run() {\n    if (this.started) {\n      this.update();\n      return requestAnimationFrame(this.run);\n    }\n  }\n\n}\n\nconst domRangesAreEqual = (left, right) => (left === null || left === void 0 ? void 0 : left.startContainer) === (right === null || right === void 0 ? void 0 : right.startContainer) && (left === null || left === void 0 ? void 0 : left.startOffset) === (right === null || right === void 0 ? void 0 : right.startOffset) && (left === null || left === void 0 ? void 0 : left.endContainer) === (right === null || right === void 0 ? void 0 : right.endContainer) && (left === null || left === void 0 ? void 0 : left.endOffset) === (right === null || right === void 0 ? void 0 : right.endOffset);\n\nconst selectionChangeObserver = new SelectionChangeObserver();\nconst getDOMSelection = function () {\n  const selection = window.getSelection();\n\n  if (selection.rangeCount > 0) {\n    return selection;\n  }\n};\nconst getDOMRange = function () {\n  var _getDOMSelection;\n\n  const domRange = (_getDOMSelection = getDOMSelection()) === null || _getDOMSelection === void 0 ? void 0 : _getDOMSelection.getRangeAt(0);\n\n  if (domRange) {\n    if (!domRangeIsPrivate(domRange)) {\n      return domRange;\n    }\n  }\n};\nconst setDOMRange = function (domRange) {\n  const selection = window.getSelection();\n  selection.removeAllRanges();\n  selection.addRange(domRange);\n  return selectionChangeObserver.update();\n}; // In Firefox, clicking certain <input> elements changes the selection to a\n// private element used to draw its UI. Attempting to access properties of those\n// elements throws an error.\n// https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n\nconst domRangeIsPrivate = domRange => nodeIsPrivate(domRange.startContainer) || nodeIsPrivate(domRange.endContainer);\n\nconst nodeIsPrivate = node => !Object.getPrototypeOf(node);\n\n/* eslint-disable\n    id-length,\n    no-useless-escape,\n*/\nconst normalizeSpaces = string => string.replace(new RegExp(\"\".concat(ZERO_WIDTH_SPACE), \"g\"), \"\").replace(new RegExp(\"\".concat(NON_BREAKING_SPACE), \"g\"), \" \");\nconst normalizeNewlines = string => string.replace(/\\r\\n/g, \"\\n\");\nconst breakableWhitespacePattern = new RegExp(\"[^\\\\S\".concat(NON_BREAKING_SPACE, \"]\"));\nconst squishBreakableWhitespace = string => string // Replace all breakable whitespace characters with a space\n.replace(new RegExp(\"\".concat(breakableWhitespacePattern.source), \"g\"), \" \") // Replace two or more spaces with a single space\n.replace(/\\ {2,}/g, \" \");\nconst summarizeStringChange = function (oldString, newString) {\n  let added, removed;\n  oldString = UTF16String.box(oldString);\n  newString = UTF16String.box(newString);\n\n  if (newString.length < oldString.length) {\n    [removed, added] = utf16StringDifferences(oldString, newString);\n  } else {\n    [added, removed] = utf16StringDifferences(newString, oldString);\n  }\n\n  return {\n    added,\n    removed\n  };\n};\n\nconst utf16StringDifferences = function (a, b) {\n  if (a.isEqualTo(b)) {\n    return [\"\", \"\"];\n  }\n\n  const diffA = utf16StringDifference(a, b);\n  const {\n    length\n  } = diffA.utf16String;\n  let diffB;\n\n  if (length) {\n    const {\n      offset\n    } = diffA;\n    const codepoints = a.codepoints.slice(0, offset).concat(a.codepoints.slice(offset + length));\n    diffB = utf16StringDifference(b, UTF16String.fromCodepoints(codepoints));\n  } else {\n    diffB = utf16StringDifference(b, a);\n  }\n\n  return [diffA.utf16String.toString(), diffB.utf16String.toString()];\n};\n\nconst utf16StringDifference = function (a, b) {\n  let leftIndex = 0;\n  let rightIndexA = a.length;\n  let rightIndexB = b.length;\n\n  while (leftIndex < rightIndexA && a.charAt(leftIndex).isEqualTo(b.charAt(leftIndex))) {\n    leftIndex++;\n  }\n\n  while (rightIndexA > leftIndex + 1 && a.charAt(rightIndexA - 1).isEqualTo(b.charAt(rightIndexB - 1))) {\n    rightIndexA--;\n    rightIndexB--;\n  }\n\n  return {\n    utf16String: a.slice(leftIndex, rightIndexA),\n    offset: leftIndex\n  };\n};\n\nclass Hash extends TrixObject {\n  static fromCommonAttributesOfObjects() {\n    let objects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n    if (!objects.length) {\n      return new this();\n    }\n\n    let hash = box(objects[0]);\n    let keys = hash.getKeys();\n    objects.slice(1).forEach(object => {\n      keys = hash.getKeysCommonToHash(box(object));\n      hash = hash.slice(keys);\n    });\n    return hash;\n  }\n\n  static box(values) {\n    return box(values);\n  }\n\n  constructor() {\n    let values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    super(...arguments);\n    this.values = copy(values);\n  }\n\n  add(key, value) {\n    return this.merge(object(key, value));\n  }\n\n  remove(key) {\n    return new Hash(copy(this.values, key));\n  }\n\n  get(key) {\n    return this.values[key];\n  }\n\n  has(key) {\n    return key in this.values;\n  }\n\n  merge(values) {\n    return new Hash(merge(this.values, unbox(values)));\n  }\n\n  slice(keys) {\n    const values = {};\n    keys.forEach(key => {\n      if (this.has(key)) {\n        values[key] = this.values[key];\n      }\n    });\n    return new Hash(values);\n  }\n\n  getKeys() {\n    return Object.keys(this.values);\n  }\n\n  getKeysCommonToHash(hash) {\n    hash = box(hash);\n    return this.getKeys().filter(key => this.values[key] === hash.values[key]);\n  }\n\n  isEqualTo(values) {\n    return arraysAreEqual(this.toArray(), box(values).toArray());\n  }\n\n  isEmpty() {\n    return this.getKeys().length === 0;\n  }\n\n  toArray() {\n    if (!this.array) {\n      const result = [];\n\n      for (const key in this.values) {\n        const value = this.values[key];\n        result.push(result.push(key, value));\n      }\n\n      this.array = result.slice(0);\n    }\n\n    return this.array;\n  }\n\n  toObject() {\n    return copy(this.values);\n  }\n\n  toJSON() {\n    return this.toObject();\n  }\n\n  contentsForInspection() {\n    return {\n      values: JSON.stringify(this.values)\n    };\n  }\n\n}\n\nconst object = function (key, value) {\n  const result = {};\n  result[key] = value;\n  return result;\n};\n\nconst merge = function (object, values) {\n  const result = copy(object);\n\n  for (const key in values) {\n    const value = values[key];\n    result[key] = value;\n  }\n\n  return result;\n};\n\nconst copy = function (object, keyToRemove) {\n  const result = {};\n  const sortedKeys = Object.keys(object).sort();\n  sortedKeys.forEach(key => {\n    if (key !== keyToRemove) {\n      result[key] = object[key];\n    }\n  });\n  return result;\n};\n\nconst box = function (object) {\n  if (object instanceof Hash) {\n    return object;\n  } else {\n    return new Hash(object);\n  }\n};\n\nconst unbox = function (object) {\n  if (object instanceof Hash) {\n    return object.values;\n  } else {\n    return object;\n  }\n};\n\nclass Operation extends BasicObject {\n  isPerforming() {\n    return this.performing === true;\n  }\n\n  hasPerformed() {\n    return this.performed === true;\n  }\n\n  hasSucceeded() {\n    return this.performed && this.succeeded;\n  }\n\n  hasFailed() {\n    return this.performed && !this.succeeded;\n  }\n\n  getPromise() {\n    if (!this.promise) {\n      this.promise = new Promise((resolve, reject) => {\n        this.performing = true;\n        return this.perform((succeeded, result) => {\n          this.succeeded = succeeded;\n          this.performing = false;\n          this.performed = true;\n\n          if (this.succeeded) {\n            resolve(result);\n          } else {\n            reject(result);\n          }\n        });\n      });\n    }\n\n    return this.promise;\n  }\n\n  perform(callback) {\n    return callback(false);\n  }\n\n  release() {\n    var _this$promise, _this$promise$cancel;\n\n    (_this$promise = this.promise) === null || _this$promise === void 0 ? void 0 : (_this$promise$cancel = _this$promise.cancel) === null || _this$promise$cancel === void 0 ? void 0 : _this$promise$cancel.call(_this$promise);\n    this.promise = null;\n    this.performing = null;\n    this.performed = null;\n    this.succeeded = null;\n  }\n\n}\nOperation.proxyMethod(\"getPromise().then\");\nOperation.proxyMethod(\"getPromise().catch\");\n\nclass ImagePreloadOperation extends Operation {\n  constructor(url) {\n    super(...arguments);\n    this.url = url;\n  }\n\n  perform(callback) {\n    const image = new Image();\n\n    image.onload = () => {\n      image.width = this.width = image.naturalWidth;\n      image.height = this.height = image.naturalHeight;\n      return callback(true, image);\n    };\n\n    image.onerror = () => callback(false);\n\n    image.src = this.url;\n  }\n\n}\n\nclass Attachment extends TrixObject {\n  static attachmentForFile(file) {\n    const attributes = this.attributesForFile(file);\n    const attachment = new this(attributes);\n    attachment.setFile(file);\n    return attachment;\n  }\n\n  static attributesForFile(file) {\n    return new Hash({\n      filename: file.name,\n      filesize: file.size,\n      contentType: file.type\n    });\n  }\n\n  static fromJSON(attachmentJSON) {\n    return new this(attachmentJSON);\n  }\n\n  constructor() {\n    let attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    super(attributes);\n    this.releaseFile = this.releaseFile.bind(this);\n    this.attributes = Hash.box(attributes);\n    this.didChangeAttributes();\n  }\n\n  getAttribute(attribute) {\n    return this.attributes.get(attribute);\n  }\n\n  hasAttribute(attribute) {\n    return this.attributes.has(attribute);\n  }\n\n  getAttributes() {\n    return this.attributes.toObject();\n  }\n\n  setAttributes() {\n    let attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    const newAttributes = this.attributes.merge(attributes);\n\n    if (!this.attributes.isEqualTo(newAttributes)) {\n      var _this$previewDelegate, _this$previewDelegate2, _this$delegate, _this$delegate$attach;\n\n      this.attributes = newAttributes;\n      this.didChangeAttributes();\n      (_this$previewDelegate = this.previewDelegate) === null || _this$previewDelegate === void 0 ? void 0 : (_this$previewDelegate2 = _this$previewDelegate.attachmentDidChangeAttributes) === null || _this$previewDelegate2 === void 0 ? void 0 : _this$previewDelegate2.call(_this$previewDelegate, this);\n      return (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$attach = _this$delegate.attachmentDidChangeAttributes) === null || _this$delegate$attach === void 0 ? void 0 : _this$delegate$attach.call(_this$delegate, this);\n    }\n  }\n\n  didChangeAttributes() {\n    if (this.isPreviewable()) {\n      return this.preloadURL();\n    }\n  }\n\n  isPending() {\n    return this.file != null && !(this.getURL() || this.getHref());\n  }\n\n  isPreviewable() {\n    if (this.attributes.has(\"previewable\")) {\n      return this.attributes.get(\"previewable\");\n    } else {\n      return Attachment.previewablePattern.test(this.getContentType());\n    }\n  }\n\n  getType() {\n    if (this.hasContent()) {\n      return \"content\";\n    } else if (this.isPreviewable()) {\n      return \"preview\";\n    } else {\n      return \"file\";\n    }\n  }\n\n  getURL() {\n    return this.attributes.get(\"url\");\n  }\n\n  getHref() {\n    return this.attributes.get(\"href\");\n  }\n\n  getFilename() {\n    return this.attributes.get(\"filename\") || \"\";\n  }\n\n  getFilesize() {\n    return this.attributes.get(\"filesize\");\n  }\n\n  getFormattedFilesize() {\n    const filesize = this.attributes.get(\"filesize\");\n\n    if (typeof filesize === \"number\") {\n      return config.fileSize.formatter(filesize);\n    } else {\n      return \"\";\n    }\n  }\n\n  getExtension() {\n    var _this$getFilename$mat;\n\n    return (_this$getFilename$mat = this.getFilename().match(/\\.(\\w+)$/)) === null || _this$getFilename$mat === void 0 ? void 0 : _this$getFilename$mat[1].toLowerCase();\n  }\n\n  getContentType() {\n    return this.attributes.get(\"contentType\");\n  }\n\n  hasContent() {\n    return this.attributes.has(\"content\");\n  }\n\n  getContent() {\n    return this.attributes.get(\"content\");\n  }\n\n  getWidth() {\n    return this.attributes.get(\"width\");\n  }\n\n  getHeight() {\n    return this.attributes.get(\"height\");\n  }\n\n  getFile() {\n    return this.file;\n  }\n\n  setFile(file) {\n    this.file = file;\n\n    if (this.isPreviewable()) {\n      return this.preloadFile();\n    }\n  }\n\n  releaseFile() {\n    this.releasePreloadedFile();\n    this.file = null;\n  }\n\n  getUploadProgress() {\n    return this.uploadProgress != null ? this.uploadProgress : 0;\n  }\n\n  setUploadProgress(value) {\n    if (this.uploadProgress !== value) {\n      var _this$uploadProgressD, _this$uploadProgressD2;\n\n      this.uploadProgress = value;\n      return (_this$uploadProgressD = this.uploadProgressDelegate) === null || _this$uploadProgressD === void 0 ? void 0 : (_this$uploadProgressD2 = _this$uploadProgressD.attachmentDidChangeUploadProgress) === null || _this$uploadProgressD2 === void 0 ? void 0 : _this$uploadProgressD2.call(_this$uploadProgressD, this);\n    }\n  }\n\n  toJSON() {\n    return this.getAttributes();\n  }\n\n  getCacheKey() {\n    return [super.getCacheKey(...arguments), this.attributes.getCacheKey(), this.getPreviewURL()].join(\"/\");\n  } // Previewable\n\n\n  getPreviewURL() {\n    return this.previewURL || this.preloadingURL;\n  }\n\n  setPreviewURL(url) {\n    if (url !== this.getPreviewURL()) {\n      var _this$previewDelegate3, _this$previewDelegate4, _this$delegate2, _this$delegate2$attac;\n\n      this.previewURL = url;\n      (_this$previewDelegate3 = this.previewDelegate) === null || _this$previewDelegate3 === void 0 ? void 0 : (_this$previewDelegate4 = _this$previewDelegate3.attachmentDidChangeAttributes) === null || _this$previewDelegate4 === void 0 ? void 0 : _this$previewDelegate4.call(_this$previewDelegate3, this);\n      return (_this$delegate2 = this.delegate) === null || _this$delegate2 === void 0 ? void 0 : (_this$delegate2$attac = _this$delegate2.attachmentDidChangePreviewURL) === null || _this$delegate2$attac === void 0 ? void 0 : _this$delegate2$attac.call(_this$delegate2, this);\n    }\n  }\n\n  preloadURL() {\n    return this.preload(this.getURL(), this.releaseFile);\n  }\n\n  preloadFile() {\n    if (this.file) {\n      this.fileObjectURL = URL.createObjectURL(this.file);\n      return this.preload(this.fileObjectURL);\n    }\n  }\n\n  releasePreloadedFile() {\n    if (this.fileObjectURL) {\n      URL.revokeObjectURL(this.fileObjectURL);\n      this.fileObjectURL = null;\n    }\n  }\n\n  preload(url, callback) {\n    if (url && url !== this.getPreviewURL()) {\n      this.preloadingURL = url;\n      const operation = new ImagePreloadOperation(url);\n      return operation.then(_ref => {\n        let {\n          width,\n          height\n        } = _ref;\n\n        if (!this.getWidth() || !this.getHeight()) {\n          this.setAttributes({\n            width,\n            height\n          });\n        }\n\n        this.preloadingURL = null;\n        this.setPreviewURL(url);\n        return callback === null || callback === void 0 ? void 0 : callback();\n      }).catch(() => {\n        this.preloadingURL = null;\n        return callback === null || callback === void 0 ? void 0 : callback();\n      });\n    }\n  }\n\n}\n\n_defineProperty(Attachment, \"previewablePattern\", /^image(\\/(gif|png|jpe?g)|$)/);\n\nclass ManagedAttachment extends BasicObject {\n  constructor(attachmentManager, attachment) {\n    super(...arguments);\n    this.attachmentManager = attachmentManager;\n    this.attachment = attachment;\n    this.id = this.attachment.id;\n    this.file = this.attachment.file;\n  }\n\n  remove() {\n    return this.attachmentManager.requestRemovalOfAttachment(this.attachment);\n  }\n\n}\nManagedAttachment.proxyMethod(\"attachment.getAttribute\");\nManagedAttachment.proxyMethod(\"attachment.hasAttribute\");\nManagedAttachment.proxyMethod(\"attachment.setAttribute\");\nManagedAttachment.proxyMethod(\"attachment.getAttributes\");\nManagedAttachment.proxyMethod(\"attachment.setAttributes\");\nManagedAttachment.proxyMethod(\"attachment.isPending\");\nManagedAttachment.proxyMethod(\"attachment.isPreviewable\");\nManagedAttachment.proxyMethod(\"attachment.getURL\");\nManagedAttachment.proxyMethod(\"attachment.getHref\");\nManagedAttachment.proxyMethod(\"attachment.getFilename\");\nManagedAttachment.proxyMethod(\"attachment.getFilesize\");\nManagedAttachment.proxyMethod(\"attachment.getFormattedFilesize\");\nManagedAttachment.proxyMethod(\"attachment.getExtension\");\nManagedAttachment.proxyMethod(\"attachment.getContentType\");\nManagedAttachment.proxyMethod(\"attachment.getFile\");\nManagedAttachment.proxyMethod(\"attachment.setFile\");\nManagedAttachment.proxyMethod(\"attachment.releaseFile\");\nManagedAttachment.proxyMethod(\"attachment.getUploadProgress\");\nManagedAttachment.proxyMethod(\"attachment.setUploadProgress\");\n\nclass AttachmentManager extends BasicObject {\n  constructor() {\n    let attachments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    super(...arguments);\n    this.managedAttachments = {};\n    Array.from(attachments).forEach(attachment => {\n      this.manageAttachment(attachment);\n    });\n  }\n\n  getAttachments() {\n    const result = [];\n\n    for (const id in this.managedAttachments) {\n      const attachment = this.managedAttachments[id];\n      result.push(attachment);\n    }\n\n    return result;\n  }\n\n  manageAttachment(attachment) {\n    if (!this.managedAttachments[attachment.id]) {\n      this.managedAttachments[attachment.id] = new ManagedAttachment(this, attachment);\n    }\n\n    return this.managedAttachments[attachment.id];\n  }\n\n  attachmentIsManaged(attachment) {\n    return attachment.id in this.managedAttachments;\n  }\n\n  requestRemovalOfAttachment(attachment) {\n    if (this.attachmentIsManaged(attachment)) {\n      var _this$delegate, _this$delegate$attach;\n\n      return (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$attach = _this$delegate.attachmentManagerDidRequestRemovalOfAttachment) === null || _this$delegate$attach === void 0 ? void 0 : _this$delegate$attach.call(_this$delegate, attachment);\n    }\n  }\n\n  unmanageAttachment(attachment) {\n    const managedAttachment = this.managedAttachments[attachment.id];\n    delete this.managedAttachments[attachment.id];\n    return managedAttachment;\n  }\n\n}\n\nclass Piece extends TrixObject {\n  static registerType(type, constructor) {\n    constructor.type = type;\n    this.types[type] = constructor;\n  }\n\n  static fromJSON(pieceJSON) {\n    const constructor = this.types[pieceJSON.type];\n\n    if (constructor) {\n      return constructor.fromJSON(pieceJSON);\n    }\n  }\n\n  constructor(value) {\n    let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    super(...arguments);\n    this.attributes = Hash.box(attributes);\n  }\n\n  copyWithAttributes(attributes) {\n    return new this.constructor(this.getValue(), attributes);\n  }\n\n  copyWithAdditionalAttributes(attributes) {\n    return this.copyWithAttributes(this.attributes.merge(attributes));\n  }\n\n  copyWithoutAttribute(attribute) {\n    return this.copyWithAttributes(this.attributes.remove(attribute));\n  }\n\n  copy() {\n    return this.copyWithAttributes(this.attributes);\n  }\n\n  getAttribute(attribute) {\n    return this.attributes.get(attribute);\n  }\n\n  getAttributesHash() {\n    return this.attributes;\n  }\n\n  getAttributes() {\n    return this.attributes.toObject();\n  }\n\n  hasAttribute(attribute) {\n    return this.attributes.has(attribute);\n  }\n\n  hasSameStringValueAsPiece(piece) {\n    return piece && this.toString() === piece.toString();\n  }\n\n  hasSameAttributesAsPiece(piece) {\n    return piece && (this.attributes === piece.attributes || this.attributes.isEqualTo(piece.attributes));\n  }\n\n  isBlockBreak() {\n    return false;\n  }\n\n  isEqualTo(piece) {\n    return super.isEqualTo(...arguments) || this.hasSameConstructorAs(piece) && this.hasSameStringValueAsPiece(piece) && this.hasSameAttributesAsPiece(piece);\n  }\n\n  isEmpty() {\n    return this.length === 0;\n  }\n\n  isSerializable() {\n    return true;\n  }\n\n  toJSON() {\n    return {\n      type: this.constructor.type,\n      attributes: this.getAttributes()\n    };\n  }\n\n  contentsForInspection() {\n    return {\n      type: this.constructor.type,\n      attributes: this.attributes.inspect()\n    };\n  } // Grouping\n\n\n  canBeGrouped() {\n    return this.hasAttribute(\"href\");\n  }\n\n  canBeGroupedWith(piece) {\n    return this.getAttribute(\"href\") === piece.getAttribute(\"href\");\n  } // Splittable\n\n\n  getLength() {\n    return this.length;\n  }\n\n  canBeConsolidatedWith(piece) {\n    return false;\n  }\n\n}\n\n_defineProperty(Piece, \"types\", {});\n\nclass AttachmentPiece extends Piece {\n  static fromJSON(pieceJSON) {\n    return new this(Attachment.fromJSON(pieceJSON.attachment), pieceJSON.attributes);\n  }\n\n  constructor(attachment) {\n    super(...arguments);\n    this.attachment = attachment;\n    this.length = 1;\n    this.ensureAttachmentExclusivelyHasAttribute(\"href\");\n\n    if (!this.attachment.hasContent()) {\n      this.removeProhibitedAttributes();\n    }\n  }\n\n  ensureAttachmentExclusivelyHasAttribute(attribute) {\n    if (this.hasAttribute(attribute)) {\n      if (!this.attachment.hasAttribute(attribute)) {\n        this.attachment.setAttributes(this.attributes.slice(attribute));\n      }\n\n      this.attributes = this.attributes.remove(attribute);\n    }\n  }\n\n  removeProhibitedAttributes() {\n    const attributes = this.attributes.slice(AttachmentPiece.permittedAttributes);\n\n    if (!attributes.isEqualTo(this.attributes)) {\n      this.attributes = attributes;\n    }\n  }\n\n  getValue() {\n    return this.attachment;\n  }\n\n  isSerializable() {\n    return !this.attachment.isPending();\n  }\n\n  getCaption() {\n    return this.attributes.get(\"caption\") || \"\";\n  }\n\n  isEqualTo(piece) {\n    var _piece$attachment;\n\n    return super.isEqualTo(piece) && this.attachment.id === (piece === null || piece === void 0 ? void 0 : (_piece$attachment = piece.attachment) === null || _piece$attachment === void 0 ? void 0 : _piece$attachment.id);\n  }\n\n  toString() {\n    return OBJECT_REPLACEMENT_CHARACTER;\n  }\n\n  toJSON() {\n    const json = super.toJSON(...arguments);\n    json.attachment = this.attachment;\n    return json;\n  }\n\n  getCacheKey() {\n    return [super.getCacheKey(...arguments), this.attachment.getCacheKey()].join(\"/\");\n  }\n\n  toConsole() {\n    return JSON.stringify(this.toString());\n  }\n\n}\n\n_defineProperty(AttachmentPiece, \"permittedAttributes\", [\"caption\", \"presentation\"]);\n\nPiece.registerType(\"attachment\", AttachmentPiece);\n\nclass StringPiece extends Piece {\n  static fromJSON(pieceJSON) {\n    return new this(pieceJSON.string, pieceJSON.attributes);\n  }\n\n  constructor(string) {\n    super(...arguments);\n    this.string = normalizeNewlines(string);\n    this.length = this.string.length;\n  }\n\n  getValue() {\n    return this.string;\n  }\n\n  toString() {\n    return this.string.toString();\n  }\n\n  isBlockBreak() {\n    return this.toString() === \"\\n\" && this.getAttribute(\"blockBreak\") === true;\n  }\n\n  toJSON() {\n    const result = super.toJSON(...arguments);\n    result.string = this.string;\n    return result;\n  } // Splittable\n\n\n  canBeConsolidatedWith(piece) {\n    return piece && this.hasSameConstructorAs(piece) && this.hasSameAttributesAsPiece(piece);\n  }\n\n  consolidateWith(piece) {\n    return new this.constructor(this.toString() + piece.toString(), this.attributes);\n  }\n\n  splitAtOffset(offset) {\n    let left, right;\n\n    if (offset === 0) {\n      left = null;\n      right = this;\n    } else if (offset === this.length) {\n      left = this;\n      right = null;\n    } else {\n      left = new this.constructor(this.string.slice(0, offset), this.attributes);\n      right = new this.constructor(this.string.slice(offset), this.attributes);\n    }\n\n    return [left, right];\n  }\n\n  toConsole() {\n    let {\n      string\n    } = this;\n\n    if (string.length > 15) {\n      string = string.slice(0, 14) + \"…\";\n    }\n\n    return JSON.stringify(string.toString());\n  }\n\n}\nPiece.registerType(\"string\", StringPiece);\n\n/* eslint-disable\n    prefer-const,\n*/\nclass SplittableList extends TrixObject {\n  static box(objects) {\n    if (objects instanceof this) {\n      return objects;\n    } else {\n      return new this(objects);\n    }\n  }\n\n  constructor() {\n    let objects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    super(...arguments);\n    this.objects = objects.slice(0);\n    this.length = this.objects.length;\n  }\n\n  indexOf(object) {\n    return this.objects.indexOf(object);\n  }\n\n  splice() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return new this.constructor(spliceArray(this.objects, ...args));\n  }\n\n  eachObject(callback) {\n    return this.objects.map((object, index) => callback(object, index));\n  }\n\n  insertObjectAtIndex(object, index) {\n    return this.splice(index, 0, object);\n  }\n\n  insertSplittableListAtIndex(splittableList, index) {\n    return this.splice(index, 0, ...splittableList.objects);\n  }\n\n  insertSplittableListAtPosition(splittableList, position) {\n    const [objects, index] = this.splitObjectAtPosition(position);\n    return new this.constructor(objects).insertSplittableListAtIndex(splittableList, index);\n  }\n\n  editObjectAtIndex(index, callback) {\n    return this.replaceObjectAtIndex(callback(this.objects[index]), index);\n  }\n\n  replaceObjectAtIndex(object, index) {\n    return this.splice(index, 1, object);\n  }\n\n  removeObjectAtIndex(index) {\n    return this.splice(index, 1);\n  }\n\n  getObjectAtIndex(index) {\n    return this.objects[index];\n  }\n\n  getSplittableListInRange(range) {\n    const [objects, leftIndex, rightIndex] = this.splitObjectsAtRange(range);\n    return new this.constructor(objects.slice(leftIndex, rightIndex + 1));\n  }\n\n  selectSplittableList(test) {\n    const objects = this.objects.filter(object => test(object));\n    return new this.constructor(objects);\n  }\n\n  removeObjectsInRange(range) {\n    const [objects, leftIndex, rightIndex] = this.splitObjectsAtRange(range);\n    return new this.constructor(objects).splice(leftIndex, rightIndex - leftIndex + 1);\n  }\n\n  transformObjectsInRange(range, transform) {\n    const [objects, leftIndex, rightIndex] = this.splitObjectsAtRange(range);\n    const transformedObjects = objects.map((object, index) => leftIndex <= index && index <= rightIndex ? transform(object) : object);\n    return new this.constructor(transformedObjects);\n  }\n\n  splitObjectsAtRange(range) {\n    let rightOuterIndex;\n    let [objects, leftInnerIndex, offset] = this.splitObjectAtPosition(startOfRange(range));\n    [objects, rightOuterIndex] = new this.constructor(objects).splitObjectAtPosition(endOfRange(range) + offset);\n    return [objects, leftInnerIndex, rightOuterIndex - 1];\n  }\n\n  getObjectAtPosition(position) {\n    const {\n      index\n    } = this.findIndexAndOffsetAtPosition(position);\n    return this.objects[index];\n  }\n\n  splitObjectAtPosition(position) {\n    let splitIndex, splitOffset;\n    const {\n      index,\n      offset\n    } = this.findIndexAndOffsetAtPosition(position);\n    const objects = this.objects.slice(0);\n\n    if (index != null) {\n      if (offset === 0) {\n        splitIndex = index;\n        splitOffset = 0;\n      } else {\n        const object = this.getObjectAtIndex(index);\n        const [leftObject, rightObject] = object.splitAtOffset(offset);\n        objects.splice(index, 1, leftObject, rightObject);\n        splitIndex = index + 1;\n        splitOffset = leftObject.getLength() - offset;\n      }\n    } else {\n      splitIndex = objects.length;\n      splitOffset = 0;\n    }\n\n    return [objects, splitIndex, splitOffset];\n  }\n\n  consolidate() {\n    const objects = [];\n    let pendingObject = this.objects[0];\n    this.objects.slice(1).forEach(object => {\n      var _pendingObject$canBeC, _pendingObject;\n\n      if ((_pendingObject$canBeC = (_pendingObject = pendingObject).canBeConsolidatedWith) !== null && _pendingObject$canBeC !== void 0 && _pendingObject$canBeC.call(_pendingObject, object)) {\n        pendingObject = pendingObject.consolidateWith(object);\n      } else {\n        objects.push(pendingObject);\n        pendingObject = object;\n      }\n    });\n\n    if (pendingObject) {\n      objects.push(pendingObject);\n    }\n\n    return new this.constructor(objects);\n  }\n\n  consolidateFromIndexToIndex(startIndex, endIndex) {\n    const objects = this.objects.slice(0);\n    const objectsInRange = objects.slice(startIndex, endIndex + 1);\n    const consolidatedInRange = new this.constructor(objectsInRange).consolidate().toArray();\n    return this.splice(startIndex, objectsInRange.length, ...consolidatedInRange);\n  }\n\n  findIndexAndOffsetAtPosition(position) {\n    let index;\n    let currentPosition = 0;\n\n    for (index = 0; index < this.objects.length; index++) {\n      const object = this.objects[index];\n      const nextPosition = currentPosition + object.getLength();\n\n      if (currentPosition <= position && position < nextPosition) {\n        return {\n          index,\n          offset: position - currentPosition\n        };\n      }\n\n      currentPosition = nextPosition;\n    }\n\n    return {\n      index: null,\n      offset: null\n    };\n  }\n\n  findPositionAtIndexAndOffset(index, offset) {\n    let position = 0;\n\n    for (let currentIndex = 0; currentIndex < this.objects.length; currentIndex++) {\n      const object = this.objects[currentIndex];\n\n      if (currentIndex < index) {\n        position += object.getLength();\n      } else if (currentIndex === index) {\n        position += offset;\n        break;\n      }\n    }\n\n    return position;\n  }\n\n  getEndPosition() {\n    if (this.endPosition == null) {\n      this.endPosition = 0;\n      this.objects.forEach(object => this.endPosition += object.getLength());\n    }\n\n    return this.endPosition;\n  }\n\n  toString() {\n    return this.objects.join(\"\");\n  }\n\n  toArray() {\n    return this.objects.slice(0);\n  }\n\n  toJSON() {\n    return this.toArray();\n  }\n\n  isEqualTo(splittableList) {\n    return super.isEqualTo(...arguments) || objectArraysAreEqual(this.objects, splittableList === null || splittableList === void 0 ? void 0 : splittableList.objects);\n  }\n\n  contentsForInspection() {\n    return {\n      objects: \"[\".concat(this.objects.map(object => object.inspect()).join(\", \"), \"]\")\n    };\n  }\n\n}\n\nconst objectArraysAreEqual = function (left) {\n  let right = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n  if (left.length !== right.length) {\n    return false;\n  }\n\n  let result = true;\n\n  for (let index = 0; index < left.length; index++) {\n    const object = left[index];\n\n    if (result && !object.isEqualTo(right[index])) {\n      result = false;\n    }\n  }\n\n  return result;\n};\n\nconst startOfRange = range => range[0];\n\nconst endOfRange = range => range[1];\n\nclass Text extends TrixObject {\n  static textForAttachmentWithAttributes(attachment, attributes) {\n    const piece = new AttachmentPiece(attachment, attributes);\n    return new this([piece]);\n  }\n\n  static textForStringWithAttributes(string, attributes) {\n    const piece = new StringPiece(string, attributes);\n    return new this([piece]);\n  }\n\n  static fromJSON(textJSON) {\n    const pieces = Array.from(textJSON).map(pieceJSON => Piece.fromJSON(pieceJSON));\n    return new this(pieces);\n  }\n\n  constructor() {\n    let pieces = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    super(...arguments);\n    const notEmpty = pieces.filter(piece => !piece.isEmpty());\n    this.pieceList = new SplittableList(notEmpty);\n  }\n\n  copy() {\n    return this.copyWithPieceList(this.pieceList);\n  }\n\n  copyWithPieceList(pieceList) {\n    return new this.constructor(pieceList.consolidate().toArray());\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const pieces = this.getPieces().map(piece => objectMap.find(piece) || piece);\n    return new this.constructor(pieces);\n  }\n\n  appendText(text) {\n    return this.insertTextAtPosition(text, this.getLength());\n  }\n\n  insertTextAtPosition(text, position) {\n    return this.copyWithPieceList(this.pieceList.insertSplittableListAtPosition(text.pieceList, position));\n  }\n\n  removeTextAtRange(range) {\n    return this.copyWithPieceList(this.pieceList.removeObjectsInRange(range));\n  }\n\n  replaceTextAtRange(text, range) {\n    return this.removeTextAtRange(range).insertTextAtPosition(text, range[0]);\n  }\n\n  moveTextFromRangeToPosition(range, position) {\n    if (range[0] <= position && position <= range[1]) return;\n    const text = this.getTextAtRange(range);\n    const length = text.getLength();\n\n    if (range[0] < position) {\n      position -= length;\n    }\n\n    return this.removeTextAtRange(range).insertTextAtPosition(text, position);\n  }\n\n  addAttributeAtRange(attribute, value, range) {\n    const attributes = {};\n    attributes[attribute] = value;\n    return this.addAttributesAtRange(attributes, range);\n  }\n\n  addAttributesAtRange(attributes, range) {\n    return this.copyWithPieceList(this.pieceList.transformObjectsInRange(range, piece => piece.copyWithAdditionalAttributes(attributes)));\n  }\n\n  removeAttributeAtRange(attribute, range) {\n    return this.copyWithPieceList(this.pieceList.transformObjectsInRange(range, piece => piece.copyWithoutAttribute(attribute)));\n  }\n\n  setAttributesAtRange(attributes, range) {\n    return this.copyWithPieceList(this.pieceList.transformObjectsInRange(range, piece => piece.copyWithAttributes(attributes)));\n  }\n\n  getAttributesAtPosition(position) {\n    var _this$pieceList$getOb;\n\n    return ((_this$pieceList$getOb = this.pieceList.getObjectAtPosition(position)) === null || _this$pieceList$getOb === void 0 ? void 0 : _this$pieceList$getOb.getAttributes()) || {};\n  }\n\n  getCommonAttributes() {\n    const objects = Array.from(this.pieceList.toArray()).map(piece => piece.getAttributes());\n    return Hash.fromCommonAttributesOfObjects(objects).toObject();\n  }\n\n  getCommonAttributesAtRange(range) {\n    return this.getTextAtRange(range).getCommonAttributes() || {};\n  }\n\n  getExpandedRangeForAttributeAtOffset(attributeName, offset) {\n    let right;\n    let left = right = offset;\n    const length = this.getLength();\n\n    while (left > 0 && this.getCommonAttributesAtRange([left - 1, right])[attributeName]) {\n      left--;\n    }\n\n    while (right < length && this.getCommonAttributesAtRange([offset, right + 1])[attributeName]) {\n      right++;\n    }\n\n    return [left, right];\n  }\n\n  getTextAtRange(range) {\n    return this.copyWithPieceList(this.pieceList.getSplittableListInRange(range));\n  }\n\n  getStringAtRange(range) {\n    return this.pieceList.getSplittableListInRange(range).toString();\n  }\n\n  getStringAtPosition(position) {\n    return this.getStringAtRange([position, position + 1]);\n  }\n\n  startsWithString(string) {\n    return this.getStringAtRange([0, string.length]) === string;\n  }\n\n  endsWithString(string) {\n    const length = this.getLength();\n    return this.getStringAtRange([length - string.length, length]) === string;\n  }\n\n  getAttachmentPieces() {\n    return this.pieceList.toArray().filter(piece => !!piece.attachment);\n  }\n\n  getAttachments() {\n    return this.getAttachmentPieces().map(piece => piece.attachment);\n  }\n\n  getAttachmentAndPositionById(attachmentId) {\n    let position = 0;\n\n    for (const piece of this.pieceList.toArray()) {\n      var _piece$attachment;\n\n      if (((_piece$attachment = piece.attachment) === null || _piece$attachment === void 0 ? void 0 : _piece$attachment.id) === attachmentId) {\n        return {\n          attachment: piece.attachment,\n          position\n        };\n      }\n\n      position += piece.length;\n    }\n\n    return {\n      attachment: null,\n      position: null\n    };\n  }\n\n  getAttachmentById(attachmentId) {\n    const {\n      attachment\n    } = this.getAttachmentAndPositionById(attachmentId);\n    return attachment;\n  }\n\n  getRangeOfAttachment(attachment) {\n    const attachmentAndPosition = this.getAttachmentAndPositionById(attachment.id);\n    const position = attachmentAndPosition.position;\n    attachment = attachmentAndPosition.attachment;\n\n    if (attachment) {\n      return [position, position + 1];\n    }\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    const range = this.getRangeOfAttachment(attachment);\n\n    if (range) {\n      return this.addAttributesAtRange(attributes, range);\n    } else {\n      return this;\n    }\n  }\n\n  getLength() {\n    return this.pieceList.getEndPosition();\n  }\n\n  isEmpty() {\n    return this.getLength() === 0;\n  }\n\n  isEqualTo(text) {\n    var _text$pieceList;\n\n    return super.isEqualTo(text) || (text === null || text === void 0 ? void 0 : (_text$pieceList = text.pieceList) === null || _text$pieceList === void 0 ? void 0 : _text$pieceList.isEqualTo(this.pieceList));\n  }\n\n  isBlockBreak() {\n    return this.getLength() === 1 && this.pieceList.getObjectAtIndex(0).isBlockBreak();\n  }\n\n  eachPiece(callback) {\n    return this.pieceList.eachObject(callback);\n  }\n\n  getPieces() {\n    return this.pieceList.toArray();\n  }\n\n  getPieceAtPosition(position) {\n    return this.pieceList.getObjectAtPosition(position);\n  }\n\n  contentsForInspection() {\n    return {\n      pieceList: this.pieceList.inspect()\n    };\n  }\n\n  toSerializableText() {\n    const pieceList = this.pieceList.selectSplittableList(piece => piece.isSerializable());\n    return this.copyWithPieceList(pieceList);\n  }\n\n  toString() {\n    return this.pieceList.toString();\n  }\n\n  toJSON() {\n    return this.pieceList.toJSON();\n  }\n\n  toConsole() {\n    return JSON.stringify(this.pieceList.toArray().map(piece => JSON.parse(piece.toConsole())));\n  } // BIDI\n\n\n  getDirection() {\n    return getDirection(this.toString());\n  }\n\n  isRTL() {\n    return this.getDirection() === \"rtl\";\n  }\n\n}\n\nclass Block extends TrixObject {\n  static fromJSON(blockJSON) {\n    const text = Text.fromJSON(blockJSON.text);\n    return new this(text, blockJSON.attributes);\n  }\n\n  constructor(text, attributes) {\n    super(...arguments);\n    this.text = applyBlockBreakToText(text || new Text());\n    this.attributes = attributes || [];\n  }\n\n  isEmpty() {\n    return this.text.isBlockBreak();\n  }\n\n  isEqualTo(block) {\n    if (super.isEqualTo(block)) return true;\n    return this.text.isEqualTo(block === null || block === void 0 ? void 0 : block.text) && arraysAreEqual(this.attributes, block === null || block === void 0 ? void 0 : block.attributes);\n  }\n\n  copyWithText(text) {\n    return new Block(text, this.attributes);\n  }\n\n  copyWithoutText() {\n    return this.copyWithText(null);\n  }\n\n  copyWithAttributes(attributes) {\n    return new Block(this.text, attributes);\n  }\n\n  copyWithoutAttributes() {\n    return this.copyWithAttributes(null);\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const mappedText = objectMap.find(this.text);\n\n    if (mappedText) {\n      return this.copyWithText(mappedText);\n    } else {\n      return this.copyWithText(this.text.copyUsingObjectMap(objectMap));\n    }\n  }\n\n  addAttribute(attribute) {\n    const attributes = this.attributes.concat(expandAttribute(attribute));\n    return this.copyWithAttributes(attributes);\n  }\n\n  removeAttribute(attribute) {\n    const {\n      listAttribute\n    } = getBlockConfig(attribute);\n    const attributes = removeLastValue(removeLastValue(this.attributes, attribute), listAttribute);\n    return this.copyWithAttributes(attributes);\n  }\n\n  removeLastAttribute() {\n    return this.removeAttribute(this.getLastAttribute());\n  }\n\n  getLastAttribute() {\n    return getLastElement(this.attributes);\n  }\n\n  getAttributes() {\n    return this.attributes.slice(0);\n  }\n\n  getAttributeLevel() {\n    return this.attributes.length;\n  }\n\n  getAttributeAtLevel(level) {\n    return this.attributes[level - 1];\n  }\n\n  hasAttribute(attributeName) {\n    return this.attributes.includes(attributeName);\n  }\n\n  hasAttributes() {\n    return this.getAttributeLevel() > 0;\n  }\n\n  getLastNestableAttribute() {\n    return getLastElement(this.getNestableAttributes());\n  }\n\n  getNestableAttributes() {\n    return this.attributes.filter(attribute => getBlockConfig(attribute).nestable);\n  }\n\n  getNestingLevel() {\n    return this.getNestableAttributes().length;\n  }\n\n  decreaseNestingLevel() {\n    const attribute = this.getLastNestableAttribute();\n\n    if (attribute) {\n      return this.removeAttribute(attribute);\n    } else {\n      return this;\n    }\n  }\n\n  increaseNestingLevel() {\n    const attribute = this.getLastNestableAttribute();\n\n    if (attribute) {\n      const index = this.attributes.lastIndexOf(attribute);\n      const attributes = spliceArray(this.attributes, index + 1, 0, ...expandAttribute(attribute));\n      return this.copyWithAttributes(attributes);\n    } else {\n      return this;\n    }\n  }\n\n  getListItemAttributes() {\n    return this.attributes.filter(attribute => getBlockConfig(attribute).listAttribute);\n  }\n\n  isListItem() {\n    var _getBlockConfig;\n\n    return (_getBlockConfig = getBlockConfig(this.getLastAttribute())) === null || _getBlockConfig === void 0 ? void 0 : _getBlockConfig.listAttribute;\n  }\n\n  isTerminalBlock() {\n    var _getBlockConfig2;\n\n    return (_getBlockConfig2 = getBlockConfig(this.getLastAttribute())) === null || _getBlockConfig2 === void 0 ? void 0 : _getBlockConfig2.terminal;\n  }\n\n  breaksOnReturn() {\n    var _getBlockConfig3;\n\n    return (_getBlockConfig3 = getBlockConfig(this.getLastAttribute())) === null || _getBlockConfig3 === void 0 ? void 0 : _getBlockConfig3.breakOnReturn;\n  }\n\n  findLineBreakInDirectionFromPosition(direction, position) {\n    const string = this.toString();\n    let result;\n\n    switch (direction) {\n      case \"forward\":\n        result = string.indexOf(\"\\n\", position);\n        break;\n\n      case \"backward\":\n        result = string.slice(0, position).lastIndexOf(\"\\n\");\n    }\n\n    if (result !== -1) {\n      return result;\n    }\n  }\n\n  contentsForInspection() {\n    return {\n      text: this.text.inspect(),\n      attributes: this.attributes\n    };\n  }\n\n  toString() {\n    return this.text.toString();\n  }\n\n  toJSON() {\n    return {\n      text: this.text,\n      attributes: this.attributes\n    };\n  } // BIDI\n\n\n  getDirection() {\n    return this.text.getDirection();\n  }\n\n  isRTL() {\n    return this.text.isRTL();\n  } // Splittable\n\n\n  getLength() {\n    return this.text.getLength();\n  }\n\n  canBeConsolidatedWith(block) {\n    return !this.hasAttributes() && !block.hasAttributes() && this.getDirection() === block.getDirection();\n  }\n\n  consolidateWith(block) {\n    const newlineText = Text.textForStringWithAttributes(\"\\n\");\n    const text = this.getTextWithoutBlockBreak().appendText(newlineText);\n    return this.copyWithText(text.appendText(block.text));\n  }\n\n  splitAtOffset(offset) {\n    let left, right;\n\n    if (offset === 0) {\n      left = null;\n      right = this;\n    } else if (offset === this.getLength()) {\n      left = this;\n      right = null;\n    } else {\n      left = this.copyWithText(this.text.getTextAtRange([0, offset]));\n      right = this.copyWithText(this.text.getTextAtRange([offset, this.getLength()]));\n    }\n\n    return [left, right];\n  }\n\n  getBlockBreakPosition() {\n    return this.text.getLength() - 1;\n  }\n\n  getTextWithoutBlockBreak() {\n    if (textEndsInBlockBreak(this.text)) {\n      return this.text.getTextAtRange([0, this.getBlockBreakPosition()]);\n    } else {\n      return this.text.copy();\n    }\n  } // Grouping\n\n\n  canBeGrouped(depth) {\n    return this.attributes[depth];\n  }\n\n  canBeGroupedWith(otherBlock, depth) {\n    const otherAttributes = otherBlock.getAttributes();\n    const otherAttribute = otherAttributes[depth];\n    const attribute = this.attributes[depth];\n    return attribute === otherAttribute && !(getBlockConfig(attribute).group === false && !getListAttributeNames().includes(otherAttributes[depth + 1])) && (this.getDirection() === otherBlock.getDirection() || otherBlock.isEmpty());\n  }\n\n} // Block breaks\n\nconst applyBlockBreakToText = function (text) {\n  text = unmarkExistingInnerBlockBreaksInText(text);\n  text = addBlockBreakToText(text);\n  return text;\n};\n\nconst unmarkExistingInnerBlockBreaksInText = function (text) {\n  let modified = false;\n  const pieces = text.getPieces();\n  let innerPieces = pieces.slice(0, pieces.length - 1);\n  const lastPiece = pieces[pieces.length - 1];\n  if (!lastPiece) return text;\n  innerPieces = innerPieces.map(piece => {\n    if (piece.isBlockBreak()) {\n      modified = true;\n      return unmarkBlockBreakPiece(piece);\n    } else {\n      return piece;\n    }\n  });\n\n  if (modified) {\n    return new Text([...innerPieces, lastPiece]);\n  } else {\n    return text;\n  }\n};\n\nconst blockBreakText = Text.textForStringWithAttributes(\"\\n\", {\n  blockBreak: true\n});\n\nconst addBlockBreakToText = function (text) {\n  if (textEndsInBlockBreak(text)) {\n    return text;\n  } else {\n    return text.appendText(blockBreakText);\n  }\n};\n\nconst textEndsInBlockBreak = function (text) {\n  const length = text.getLength();\n\n  if (length === 0) {\n    return false;\n  }\n\n  const endText = text.getTextAtRange([length - 1, length]);\n  return endText.isBlockBreak();\n};\n\nconst unmarkBlockBreakPiece = piece => piece.copyWithoutAttribute(\"blockBreak\"); // Attributes\n\n\nconst expandAttribute = function (attribute) {\n  const {\n    listAttribute\n  } = getBlockConfig(attribute);\n\n  if (listAttribute) {\n    return [listAttribute, attribute];\n  } else {\n    return [attribute];\n  }\n}; // Array helpers\n\n\nconst getLastElement = array => array.slice(-1)[0];\n\nconst removeLastValue = function (array, value) {\n  const index = array.lastIndexOf(value);\n\n  if (index === -1) {\n    return array;\n  } else {\n    return spliceArray(array, index, 1);\n  }\n};\n\nclass ObjectMap extends BasicObject {\n  constructor() {\n    let objects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    super(...arguments);\n    this.objects = {};\n    Array.from(objects).forEach(object => {\n      const hash = JSON.stringify(object);\n\n      if (this.objects[hash] == null) {\n        this.objects[hash] = object;\n      }\n    });\n  }\n\n  find(object) {\n    const hash = JSON.stringify(object);\n    return this.objects[hash];\n  }\n\n}\n\nclass Document extends TrixObject {\n  static fromJSON(documentJSON) {\n    const blocks = Array.from(documentJSON).map(blockJSON => Block.fromJSON(blockJSON));\n    return new this(blocks);\n  }\n\n  static fromString(string, textAttributes) {\n    const text = Text.textForStringWithAttributes(string, textAttributes);\n    return new this([new Block(text)]);\n  }\n\n  constructor() {\n    let blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    super(...arguments);\n\n    if (blocks.length === 0) {\n      blocks = [new Block()];\n    }\n\n    this.blockList = SplittableList.box(blocks);\n  }\n\n  isEmpty() {\n    const block = this.getBlockAtIndex(0);\n    return this.blockList.length === 1 && block.isEmpty() && !block.hasAttributes();\n  }\n\n  copy() {\n    let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    const blocks = options.consolidateBlocks ? this.blockList.consolidate().toArray() : this.blockList.toArray();\n    return new this.constructor(blocks);\n  }\n\n  copyUsingObjectsFromDocument(sourceDocument) {\n    const objectMap = new ObjectMap(sourceDocument.getObjects());\n    return this.copyUsingObjectMap(objectMap);\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const blocks = this.getBlocks().map(block => {\n      const mappedBlock = objectMap.find(block);\n      return mappedBlock || block.copyUsingObjectMap(objectMap);\n    });\n    return new this.constructor(blocks);\n  }\n\n  copyWithBaseBlockAttributes() {\n    let blockAttributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    const blocks = this.getBlocks().map(block => {\n      const attributes = blockAttributes.concat(block.getAttributes());\n      return block.copyWithAttributes(attributes);\n    });\n    return new this.constructor(blocks);\n  }\n\n  replaceBlock(oldBlock, newBlock) {\n    const index = this.blockList.indexOf(oldBlock);\n\n    if (index === -1) {\n      return this;\n    }\n\n    return new this.constructor(this.blockList.replaceObjectAtIndex(newBlock, index));\n  }\n\n  insertDocumentAtRange(document, range) {\n    const {\n      blockList\n    } = document;\n    range = normalizeRange(range);\n    let [position] = range;\n    const {\n      index,\n      offset\n    } = this.locationFromPosition(position);\n    let result = this;\n    const block = this.getBlockAtPosition(position);\n\n    if (rangeIsCollapsed(range) && block.isEmpty() && !block.hasAttributes()) {\n      result = new this.constructor(result.blockList.removeObjectAtIndex(index));\n    } else if (block.getBlockBreakPosition() === offset) {\n      position++;\n    }\n\n    result = result.removeTextAtRange(range);\n    return new this.constructor(result.blockList.insertSplittableListAtPosition(blockList, position));\n  }\n\n  mergeDocumentAtRange(document, range) {\n    let formattedDocument, result;\n    range = normalizeRange(range);\n    const [startPosition] = range;\n    const startLocation = this.locationFromPosition(startPosition);\n    const blockAttributes = this.getBlockAtIndex(startLocation.index).getAttributes();\n    const baseBlockAttributes = document.getBaseBlockAttributes();\n    const trailingBlockAttributes = blockAttributes.slice(-baseBlockAttributes.length);\n\n    if (arraysAreEqual(baseBlockAttributes, trailingBlockAttributes)) {\n      const leadingBlockAttributes = blockAttributes.slice(0, -baseBlockAttributes.length);\n      formattedDocument = document.copyWithBaseBlockAttributes(leadingBlockAttributes);\n    } else {\n      formattedDocument = document.copy({\n        consolidateBlocks: true\n      }).copyWithBaseBlockAttributes(blockAttributes);\n    }\n\n    const blockCount = formattedDocument.getBlockCount();\n    const firstBlock = formattedDocument.getBlockAtIndex(0);\n\n    if (arraysAreEqual(blockAttributes, firstBlock.getAttributes())) {\n      const firstText = firstBlock.getTextWithoutBlockBreak();\n      result = this.insertTextAtRange(firstText, range);\n\n      if (blockCount > 1) {\n        formattedDocument = new this.constructor(formattedDocument.getBlocks().slice(1));\n        const position = startPosition + firstText.getLength();\n        result = result.insertDocumentAtRange(formattedDocument, position);\n      }\n    } else {\n      result = this.insertDocumentAtRange(formattedDocument, range);\n    }\n\n    return result;\n  }\n\n  insertTextAtRange(text, range) {\n    range = normalizeRange(range);\n    const [startPosition] = range;\n    const {\n      index,\n      offset\n    } = this.locationFromPosition(startPosition);\n    const document = this.removeTextAtRange(range);\n    return new this.constructor(document.blockList.editObjectAtIndex(index, block => block.copyWithText(block.text.insertTextAtPosition(text, offset))));\n  }\n\n  removeTextAtRange(range) {\n    let blocks;\n    range = normalizeRange(range);\n    const [leftPosition, rightPosition] = range;\n\n    if (rangeIsCollapsed(range)) {\n      return this;\n    }\n\n    const [leftLocation, rightLocation] = Array.from(this.locationRangeFromRange(range));\n    const leftIndex = leftLocation.index;\n    const leftOffset = leftLocation.offset;\n    const leftBlock = this.getBlockAtIndex(leftIndex);\n    const rightIndex = rightLocation.index;\n    const rightOffset = rightLocation.offset;\n    const rightBlock = this.getBlockAtIndex(rightIndex);\n    const removeRightNewline = rightPosition - leftPosition === 1 && leftBlock.getBlockBreakPosition() === leftOffset && rightBlock.getBlockBreakPosition() !== rightOffset && rightBlock.text.getStringAtPosition(rightOffset) === \"\\n\";\n\n    if (removeRightNewline) {\n      blocks = this.blockList.editObjectAtIndex(rightIndex, block => block.copyWithText(block.text.removeTextAtRange([rightOffset, rightOffset + 1])));\n    } else {\n      let block;\n      const leftText = leftBlock.text.getTextAtRange([0, leftOffset]);\n      const rightText = rightBlock.text.getTextAtRange([rightOffset, rightBlock.getLength()]);\n      const text = leftText.appendText(rightText);\n      const removingLeftBlock = leftIndex !== rightIndex && leftOffset === 0;\n      const useRightBlock = removingLeftBlock && leftBlock.getAttributeLevel() >= rightBlock.getAttributeLevel();\n\n      if (useRightBlock) {\n        block = rightBlock.copyWithText(text);\n      } else {\n        block = leftBlock.copyWithText(text);\n      }\n\n      const affectedBlockCount = rightIndex + 1 - leftIndex;\n      blocks = this.blockList.splice(leftIndex, affectedBlockCount, block);\n    }\n\n    return new this.constructor(blocks);\n  }\n\n  moveTextFromRangeToPosition(range, position) {\n    let text;\n    range = normalizeRange(range);\n    const [startPosition, endPosition] = range;\n\n    if (startPosition <= position && position <= endPosition) {\n      return this;\n    }\n\n    let document = this.getDocumentAtRange(range);\n    let result = this.removeTextAtRange(range);\n    const movingRightward = startPosition < position;\n\n    if (movingRightward) {\n      position -= document.getLength();\n    }\n\n    const [firstBlock, ...blocks] = document.getBlocks();\n\n    if (blocks.length === 0) {\n      text = firstBlock.getTextWithoutBlockBreak();\n\n      if (movingRightward) {\n        position += 1;\n      }\n    } else {\n      text = firstBlock.text;\n    }\n\n    result = result.insertTextAtRange(text, position);\n\n    if (blocks.length === 0) {\n      return result;\n    }\n\n    document = new this.constructor(blocks);\n    position += text.getLength();\n    return result.insertDocumentAtRange(document, position);\n  }\n\n  addAttributeAtRange(attribute, value, range) {\n    let {\n      blockList\n    } = this;\n    this.eachBlockAtRange(range, (block, textRange, index) => blockList = blockList.editObjectAtIndex(index, function () {\n      if (getBlockConfig(attribute)) {\n        return block.addAttribute(attribute, value);\n      } else {\n        if (textRange[0] === textRange[1]) {\n          return block;\n        } else {\n          return block.copyWithText(block.text.addAttributeAtRange(attribute, value, textRange));\n        }\n      }\n    }));\n    return new this.constructor(blockList);\n  }\n\n  addAttribute(attribute, value) {\n    let {\n      blockList\n    } = this;\n    this.eachBlock((block, index) => blockList = blockList.editObjectAtIndex(index, () => block.addAttribute(attribute, value)));\n    return new this.constructor(blockList);\n  }\n\n  removeAttributeAtRange(attribute, range) {\n    let {\n      blockList\n    } = this;\n    this.eachBlockAtRange(range, function (block, textRange, index) {\n      if (getBlockConfig(attribute)) {\n        blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(attribute));\n      } else if (textRange[0] !== textRange[1]) {\n        blockList = blockList.editObjectAtIndex(index, () => block.copyWithText(block.text.removeAttributeAtRange(attribute, textRange)));\n      }\n    });\n    return new this.constructor(blockList);\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    const range = this.getRangeOfAttachment(attachment);\n    const [startPosition] = Array.from(range);\n    const {\n      index\n    } = this.locationFromPosition(startPosition);\n    const text = this.getTextAtIndex(index);\n    return new this.constructor(this.blockList.editObjectAtIndex(index, block => block.copyWithText(text.updateAttributesForAttachment(attributes, attachment))));\n  }\n\n  removeAttributeForAttachment(attribute, attachment) {\n    const range = this.getRangeOfAttachment(attachment);\n    return this.removeAttributeAtRange(attribute, range);\n  }\n\n  insertBlockBreakAtRange(range) {\n    let blocks;\n    range = normalizeRange(range);\n    const [startPosition] = range;\n    const {\n      offset\n    } = this.locationFromPosition(startPosition);\n    const document = this.removeTextAtRange(range);\n\n    if (offset === 0) {\n      blocks = [new Block()];\n    }\n\n    return new this.constructor(document.blockList.insertSplittableListAtPosition(new SplittableList(blocks), startPosition));\n  }\n\n  applyBlockAttributeAtRange(attributeName, value, range) {\n    const expanded = this.expandRangeToLineBreaksAndSplitBlocks(range);\n    let document = expanded.document;\n    range = expanded.range;\n    const blockConfig = getBlockConfig(attributeName);\n\n    if (blockConfig.listAttribute) {\n      document = document.removeLastListAttributeAtRange(range, {\n        exceptAttributeName: attributeName\n      });\n      const converted = document.convertLineBreaksToBlockBreaksInRange(range);\n      document = converted.document;\n      range = converted.range;\n    } else if (blockConfig.exclusive) {\n      document = document.removeBlockAttributesAtRange(range);\n    } else if (blockConfig.terminal) {\n      document = document.removeLastTerminalAttributeAtRange(range);\n    } else {\n      document = document.consolidateBlocksAtRange(range);\n    }\n\n    return document.addAttributeAtRange(attributeName, value, range);\n  }\n\n  removeLastListAttributeAtRange(range) {\n    let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let {\n      blockList\n    } = this;\n    this.eachBlockAtRange(range, function (block, textRange, index) {\n      const lastAttributeName = block.getLastAttribute();\n\n      if (!lastAttributeName) {\n        return;\n      }\n\n      if (!getBlockConfig(lastAttributeName).listAttribute) {\n        return;\n      }\n\n      if (lastAttributeName === options.exceptAttributeName) {\n        return;\n      }\n\n      blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(lastAttributeName));\n    });\n    return new this.constructor(blockList);\n  }\n\n  removeLastTerminalAttributeAtRange(range) {\n    let {\n      blockList\n    } = this;\n    this.eachBlockAtRange(range, function (block, textRange, index) {\n      const lastAttributeName = block.getLastAttribute();\n\n      if (!lastAttributeName) {\n        return;\n      }\n\n      if (!getBlockConfig(lastAttributeName).terminal) {\n        return;\n      }\n\n      blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(lastAttributeName));\n    });\n    return new this.constructor(blockList);\n  }\n\n  removeBlockAttributesAtRange(range) {\n    let {\n      blockList\n    } = this;\n    this.eachBlockAtRange(range, function (block, textRange, index) {\n      if (block.hasAttributes()) {\n        blockList = blockList.editObjectAtIndex(index, () => block.copyWithoutAttributes());\n      }\n    });\n    return new this.constructor(blockList);\n  }\n\n  expandRangeToLineBreaksAndSplitBlocks(range) {\n    let position;\n    range = normalizeRange(range);\n    let [startPosition, endPosition] = range;\n    const startLocation = this.locationFromPosition(startPosition);\n    const endLocation = this.locationFromPosition(endPosition);\n    let document = this;\n    const startBlock = document.getBlockAtIndex(startLocation.index);\n    startLocation.offset = startBlock.findLineBreakInDirectionFromPosition(\"backward\", startLocation.offset);\n\n    if (startLocation.offset != null) {\n      position = document.positionFromLocation(startLocation);\n      document = document.insertBlockBreakAtRange([position, position + 1]);\n      endLocation.index += 1;\n      endLocation.offset -= document.getBlockAtIndex(startLocation.index).getLength();\n      startLocation.index += 1;\n    }\n\n    startLocation.offset = 0;\n\n    if (endLocation.offset === 0 && endLocation.index > startLocation.index) {\n      endLocation.index -= 1;\n      endLocation.offset = document.getBlockAtIndex(endLocation.index).getBlockBreakPosition();\n    } else {\n      const endBlock = document.getBlockAtIndex(endLocation.index);\n\n      if (endBlock.text.getStringAtRange([endLocation.offset - 1, endLocation.offset]) === \"\\n\") {\n        endLocation.offset -= 1;\n      } else {\n        endLocation.offset = endBlock.findLineBreakInDirectionFromPosition(\"forward\", endLocation.offset);\n      }\n\n      if (endLocation.offset !== endBlock.getBlockBreakPosition()) {\n        position = document.positionFromLocation(endLocation);\n        document = document.insertBlockBreakAtRange([position, position + 1]);\n      }\n    }\n\n    startPosition = document.positionFromLocation(startLocation);\n    endPosition = document.positionFromLocation(endLocation);\n    range = normalizeRange([startPosition, endPosition]);\n    return {\n      document,\n      range\n    };\n  }\n\n  convertLineBreaksToBlockBreaksInRange(range) {\n    range = normalizeRange(range);\n    let [position] = range;\n    const string = this.getStringAtRange(range).slice(0, -1);\n    let document = this;\n    string.replace(/.*?\\n/g, function (match) {\n      position += match.length;\n      document = document.insertBlockBreakAtRange([position - 1, position]);\n    });\n    return {\n      document,\n      range\n    };\n  }\n\n  consolidateBlocksAtRange(range) {\n    range = normalizeRange(range);\n    const [startPosition, endPosition] = range;\n    const startIndex = this.locationFromPosition(startPosition).index;\n    const endIndex = this.locationFromPosition(endPosition).index;\n    return new this.constructor(this.blockList.consolidateFromIndexToIndex(startIndex, endIndex));\n  }\n\n  getDocumentAtRange(range) {\n    range = normalizeRange(range);\n    const blocks = this.blockList.getSplittableListInRange(range).toArray();\n    return new this.constructor(blocks);\n  }\n\n  getStringAtRange(range) {\n    let endIndex;\n    const array = range = normalizeRange(range),\n          endPosition = array[array.length - 1];\n\n    if (endPosition !== this.getLength()) {\n      endIndex = -1;\n    }\n\n    return this.getDocumentAtRange(range).toString().slice(0, endIndex);\n  }\n\n  getBlockAtIndex(index) {\n    return this.blockList.getObjectAtIndex(index);\n  }\n\n  getBlockAtPosition(position) {\n    const {\n      index\n    } = this.locationFromPosition(position);\n    return this.getBlockAtIndex(index);\n  }\n\n  getTextAtIndex(index) {\n    var _this$getBlockAtIndex;\n\n    return (_this$getBlockAtIndex = this.getBlockAtIndex(index)) === null || _this$getBlockAtIndex === void 0 ? void 0 : _this$getBlockAtIndex.text;\n  }\n\n  getTextAtPosition(position) {\n    const {\n      index\n    } = this.locationFromPosition(position);\n    return this.getTextAtIndex(index);\n  }\n\n  getPieceAtPosition(position) {\n    const {\n      index,\n      offset\n    } = this.locationFromPosition(position);\n    return this.getTextAtIndex(index).getPieceAtPosition(offset);\n  }\n\n  getCharacterAtPosition(position) {\n    const {\n      index,\n      offset\n    } = this.locationFromPosition(position);\n    return this.getTextAtIndex(index).getStringAtRange([offset, offset + 1]);\n  }\n\n  getLength() {\n    return this.blockList.getEndPosition();\n  }\n\n  getBlocks() {\n    return this.blockList.toArray();\n  }\n\n  getBlockCount() {\n    return this.blockList.length;\n  }\n\n  getEditCount() {\n    return this.editCount;\n  }\n\n  eachBlock(callback) {\n    return this.blockList.eachObject(callback);\n  }\n\n  eachBlockAtRange(range, callback) {\n    let block, textRange;\n    range = normalizeRange(range);\n    const [startPosition, endPosition] = range;\n    const startLocation = this.locationFromPosition(startPosition);\n    const endLocation = this.locationFromPosition(endPosition);\n\n    if (startLocation.index === endLocation.index) {\n      block = this.getBlockAtIndex(startLocation.index);\n      textRange = [startLocation.offset, endLocation.offset];\n      return callback(block, textRange, startLocation.index);\n    } else {\n      for (let index = startLocation.index; index <= endLocation.index; index++) {\n        block = this.getBlockAtIndex(index);\n\n        if (block) {\n          switch (index) {\n            case startLocation.index:\n              textRange = [startLocation.offset, block.text.getLength()];\n              break;\n\n            case endLocation.index:\n              textRange = [0, endLocation.offset];\n              break;\n\n            default:\n              textRange = [0, block.text.getLength()];\n          }\n\n          callback(block, textRange, index);\n        }\n      }\n    }\n  }\n\n  getCommonAttributesAtRange(range) {\n    range = normalizeRange(range);\n    const [startPosition] = range;\n\n    if (rangeIsCollapsed(range)) {\n      return this.getCommonAttributesAtPosition(startPosition);\n    } else {\n      const textAttributes = [];\n      const blockAttributes = [];\n      this.eachBlockAtRange(range, function (block, textRange) {\n        if (textRange[0] !== textRange[1]) {\n          textAttributes.push(block.text.getCommonAttributesAtRange(textRange));\n          return blockAttributes.push(attributesForBlock(block));\n        }\n      });\n      return Hash.fromCommonAttributesOfObjects(textAttributes).merge(Hash.fromCommonAttributesOfObjects(blockAttributes)).toObject();\n    }\n  }\n\n  getCommonAttributesAtPosition(position) {\n    let key, value;\n    const {\n      index,\n      offset\n    } = this.locationFromPosition(position);\n    const block = this.getBlockAtIndex(index);\n\n    if (!block) {\n      return {};\n    }\n\n    const commonAttributes = attributesForBlock(block);\n    const attributes = block.text.getAttributesAtPosition(offset);\n    const attributesLeft = block.text.getAttributesAtPosition(offset - 1);\n    const inheritableAttributes = Object.keys(config.textAttributes).filter(key => {\n      return config.textAttributes[key].inheritable;\n    });\n\n    for (key in attributesLeft) {\n      value = attributesLeft[key];\n\n      if (value === attributes[key] || inheritableAttributes.includes(key)) {\n        commonAttributes[key] = value;\n      }\n    }\n\n    return commonAttributes;\n  }\n\n  getRangeOfCommonAttributeAtPosition(attributeName, position) {\n    const {\n      index,\n      offset\n    } = this.locationFromPosition(position);\n    const text = this.getTextAtIndex(index);\n    const [startOffset, endOffset] = Array.from(text.getExpandedRangeForAttributeAtOffset(attributeName, offset));\n    const start = this.positionFromLocation({\n      index,\n      offset: startOffset\n    });\n    const end = this.positionFromLocation({\n      index,\n      offset: endOffset\n    });\n    return normalizeRange([start, end]);\n  }\n\n  getBaseBlockAttributes() {\n    let baseBlockAttributes = this.getBlockAtIndex(0).getAttributes();\n\n    for (let blockIndex = 1; blockIndex < this.getBlockCount(); blockIndex++) {\n      const blockAttributes = this.getBlockAtIndex(blockIndex).getAttributes();\n      const lastAttributeIndex = Math.min(baseBlockAttributes.length, blockAttributes.length);\n\n      baseBlockAttributes = (() => {\n        const result = [];\n\n        for (let index = 0; index < lastAttributeIndex; index++) {\n          if (blockAttributes[index] !== baseBlockAttributes[index]) {\n            break;\n          }\n\n          result.push(blockAttributes[index]);\n        }\n\n        return result;\n      })();\n    }\n\n    return baseBlockAttributes;\n  }\n\n  getAttachmentById(attachmentId) {\n    for (const attachment of this.getAttachments()) {\n      if (attachment.id === attachmentId) {\n        return attachment;\n      }\n    }\n  }\n\n  getAttachmentPieces() {\n    let attachmentPieces = [];\n    this.blockList.eachObject(_ref => {\n      let {\n        text\n      } = _ref;\n      return attachmentPieces = attachmentPieces.concat(text.getAttachmentPieces());\n    });\n    return attachmentPieces;\n  }\n\n  getAttachments() {\n    return this.getAttachmentPieces().map(piece => piece.attachment);\n  }\n\n  getRangeOfAttachment(attachment) {\n    let position = 0;\n    const iterable = this.blockList.toArray();\n\n    for (let index = 0; index < iterable.length; index++) {\n      const {\n        text\n      } = iterable[index];\n      const textRange = text.getRangeOfAttachment(attachment);\n\n      if (textRange) {\n        return normalizeRange([position + textRange[0], position + textRange[1]]);\n      }\n\n      position += text.getLength();\n    }\n  }\n\n  getLocationRangeOfAttachment(attachment) {\n    const range = this.getRangeOfAttachment(attachment);\n    return this.locationRangeFromRange(range);\n  }\n\n  getAttachmentPieceForAttachment(attachment) {\n    for (const piece of this.getAttachmentPieces()) {\n      if (piece.attachment === attachment) {\n        return piece;\n      }\n    }\n  }\n\n  findRangesForBlockAttribute(attributeName) {\n    let position = 0;\n    const ranges = [];\n    this.getBlocks().forEach(block => {\n      const length = block.getLength();\n\n      if (block.hasAttribute(attributeName)) {\n        ranges.push([position, position + length]);\n      }\n\n      position += length;\n    });\n    return ranges;\n  }\n\n  findRangesForTextAttribute(attributeName) {\n    let {\n      withValue\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let position = 0;\n    let range = [];\n    const ranges = [];\n\n    const match = function (piece) {\n      if (withValue) {\n        return piece.getAttribute(attributeName) === withValue;\n      } else {\n        return piece.hasAttribute(attributeName);\n      }\n    };\n\n    this.getPieces().forEach(piece => {\n      const length = piece.getLength();\n\n      if (match(piece)) {\n        if (range[1] === position) {\n          range[1] = position + length;\n        } else {\n          ranges.push(range = [position, position + length]);\n        }\n      }\n\n      position += length;\n    });\n    return ranges;\n  }\n\n  locationFromPosition(position) {\n    const location = this.blockList.findIndexAndOffsetAtPosition(Math.max(0, position));\n\n    if (location.index != null) {\n      return location;\n    } else {\n      const blocks = this.getBlocks();\n      return {\n        index: blocks.length - 1,\n        offset: blocks[blocks.length - 1].getLength()\n      };\n    }\n  }\n\n  positionFromLocation(location) {\n    return this.blockList.findPositionAtIndexAndOffset(location.index, location.offset);\n  }\n\n  locationRangeFromPosition(position) {\n    return normalizeRange(this.locationFromPosition(position));\n  }\n\n  locationRangeFromRange(range) {\n    range = normalizeRange(range);\n    if (!range) return;\n    const [startPosition, endPosition] = Array.from(range);\n    const startLocation = this.locationFromPosition(startPosition);\n    const endLocation = this.locationFromPosition(endPosition);\n    return normalizeRange([startLocation, endLocation]);\n  }\n\n  rangeFromLocationRange(locationRange) {\n    let rightPosition;\n    locationRange = normalizeRange(locationRange);\n    const leftPosition = this.positionFromLocation(locationRange[0]);\n\n    if (!rangeIsCollapsed(locationRange)) {\n      rightPosition = this.positionFromLocation(locationRange[1]);\n    }\n\n    return normalizeRange([leftPosition, rightPosition]);\n  }\n\n  isEqualTo(document) {\n    return this.blockList.isEqualTo(document === null || document === void 0 ? void 0 : document.blockList);\n  }\n\n  getTexts() {\n    return this.getBlocks().map(block => block.text);\n  }\n\n  getPieces() {\n    const pieces = [];\n    Array.from(this.getTexts()).forEach(text => {\n      pieces.push(...Array.from(text.getPieces() || []));\n    });\n    return pieces;\n  }\n\n  getObjects() {\n    return this.getBlocks().concat(this.getTexts()).concat(this.getPieces());\n  }\n\n  toSerializableDocument() {\n    const blocks = [];\n    this.blockList.eachObject(block => blocks.push(block.copyWithText(block.text.toSerializableText())));\n    return new this.constructor(blocks);\n  }\n\n  toString() {\n    return this.blockList.toString();\n  }\n\n  toJSON() {\n    return this.blockList.toJSON();\n  }\n\n  toConsole() {\n    return JSON.stringify(this.blockList.toArray()).map(block => JSON.parse(block.text.toConsole()));\n  }\n\n}\n\nconst attributesForBlock = function (block) {\n  const attributes = {};\n  const attributeName = block.getLastAttribute();\n\n  if (attributeName) {\n    attributes[attributeName] = true;\n  }\n\n  return attributes;\n};\n\nconst DEFAULT_ALLOWED_ATTRIBUTES = \"style href src width height class\".split(\" \");\nconst DEFAULT_FORBIDDEN_PROTOCOLS = \"javascript:\".split(\" \");\nconst DEFAULT_FORBIDDEN_ELEMENTS = \"script iframe\".split(\" \");\nclass HTMLSanitizer extends BasicObject {\n  static sanitize(html, options) {\n    const sanitizer = new this(html, options);\n    sanitizer.sanitize();\n    return sanitizer;\n  }\n\n  constructor(html) {\n    let {\n      allowedAttributes,\n      forbiddenProtocols,\n      forbiddenElements\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    super(...arguments);\n    this.allowedAttributes = allowedAttributes || DEFAULT_ALLOWED_ATTRIBUTES;\n    this.forbiddenProtocols = forbiddenProtocols || DEFAULT_FORBIDDEN_PROTOCOLS;\n    this.forbiddenElements = forbiddenElements || DEFAULT_FORBIDDEN_ELEMENTS;\n    this.body = createBodyElementForHTML(html);\n  }\n\n  sanitize() {\n    this.sanitizeElements();\n    return this.normalizeListElementNesting();\n  }\n\n  getHTML() {\n    return this.body.innerHTML;\n  }\n\n  getBody() {\n    return this.body;\n  } // Private\n\n\n  sanitizeElements() {\n    const walker = walkTree(this.body);\n    const nodesToRemove = [];\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode;\n\n      switch (node.nodeType) {\n        case Node.ELEMENT_NODE:\n          if (this.elementIsRemovable(node)) {\n            nodesToRemove.push(node);\n          } else {\n            this.sanitizeElement(node);\n          }\n\n          break;\n\n        case Node.COMMENT_NODE:\n          nodesToRemove.push(node);\n          break;\n      }\n    }\n\n    nodesToRemove.forEach(node => removeNode(node));\n    return this.body;\n  }\n\n  sanitizeElement(element) {\n    if (element.hasAttribute(\"href\")) {\n      if (this.forbiddenProtocols.includes(element.protocol)) {\n        element.removeAttribute(\"href\");\n      }\n    }\n\n    Array.from(element.attributes).forEach(_ref => {\n      let {\n        name\n      } = _ref;\n\n      if (!this.allowedAttributes.includes(name) && name.indexOf(\"data-trix\") !== 0) {\n        element.removeAttribute(name);\n      }\n    });\n    return element;\n  }\n\n  normalizeListElementNesting() {\n    Array.from(this.body.querySelectorAll(\"ul,ol\")).forEach(listElement => {\n      const previousElement = listElement.previousElementSibling;\n\n      if (previousElement) {\n        if (tagName(previousElement) === \"li\") {\n          previousElement.appendChild(listElement);\n        }\n      }\n    });\n    return this.body;\n  }\n\n  elementIsRemovable(element) {\n    if ((element === null || element === void 0 ? void 0 : element.nodeType) !== Node.ELEMENT_NODE) return;\n    return this.elementIsForbidden(element) || this.elementIsntSerializable(element);\n  }\n\n  elementIsForbidden(element) {\n    return this.forbiddenElements.includes(tagName(element));\n  }\n\n  elementIsntSerializable(element) {\n    return element.getAttribute(\"data-trix-serialize\") === \"false\" && !nodeIsAttachmentElement(element);\n  }\n\n}\n\nconst createBodyElementForHTML = function () {\n  let html = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n  // Remove everything after </html>\n  html = html.replace(/<\\/html[^>]*>[^]*$/i, \"</html>\");\n  const doc = document.implementation.createHTMLDocument(\"\");\n  doc.documentElement.innerHTML = html;\n  Array.from(doc.head.querySelectorAll(\"style\")).forEach(element => {\n    doc.body.appendChild(element);\n  });\n  return doc.body;\n};\n\n/* eslint-disable\n    no-case-declarations,\n    no-irregular-whitespace,\n*/\n\nconst pieceForString = function (string) {\n  let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  const type = \"string\";\n  string = normalizeSpaces(string);\n  return {\n    string,\n    attributes,\n    type\n  };\n};\n\nconst pieceForAttachment = function (attachment) {\n  let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  const type = \"attachment\";\n  return {\n    attachment,\n    attributes,\n    type\n  };\n};\n\nconst blockForAttributes = function () {\n  let attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  const text = [];\n  return {\n    text,\n    attributes\n  };\n};\n\nconst parseTrixDataAttribute = (element, name) => {\n  try {\n    return JSON.parse(element.getAttribute(\"data-trix-\".concat(name)));\n  } catch (error) {\n    return {};\n  }\n};\n\nconst getImageDimensions = element => {\n  const width = element.getAttribute(\"width\");\n  const height = element.getAttribute(\"height\");\n  const dimensions = {};\n\n  if (width) {\n    dimensions.width = parseInt(width, 10);\n  }\n\n  if (height) {\n    dimensions.height = parseInt(height, 10);\n  }\n\n  return dimensions;\n};\n\nclass HTMLParser extends BasicObject {\n  static parse(html, options) {\n    const parser = new this(html, options);\n    parser.parse();\n    return parser;\n  }\n\n  constructor(html) {\n    let {\n      referenceElement\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    super(...arguments);\n    this.html = html;\n    this.referenceElement = referenceElement;\n    this.blocks = [];\n    this.blockElements = [];\n    this.processedElements = [];\n  }\n\n  getDocument() {\n    return Document.fromJSON(this.blocks);\n  } // HTML parsing\n\n\n  parse() {\n    try {\n      this.createHiddenContainer();\n      const html = HTMLSanitizer.sanitize(this.html).getHTML();\n      this.containerElement.innerHTML = html;\n      const walker = walkTree(this.containerElement, {\n        usingFilter: nodeFilter\n      });\n\n      while (walker.nextNode()) {\n        this.processNode(walker.currentNode);\n      }\n\n      return this.translateBlockElementMarginsToNewlines();\n    } finally {\n      this.removeHiddenContainer();\n    }\n  }\n\n  createHiddenContainer() {\n    if (this.referenceElement) {\n      this.containerElement = this.referenceElement.cloneNode(false);\n      this.containerElement.removeAttribute(\"id\");\n      this.containerElement.setAttribute(\"data-trix-internal\", \"\");\n      this.containerElement.style.display = \"none\";\n      return this.referenceElement.parentNode.insertBefore(this.containerElement, this.referenceElement.nextSibling);\n    } else {\n      this.containerElement = makeElement({\n        tagName: \"div\",\n        style: {\n          display: \"none\"\n        }\n      });\n      return document.body.appendChild(this.containerElement);\n    }\n  }\n\n  removeHiddenContainer() {\n    return removeNode(this.containerElement);\n  }\n\n  processNode(node) {\n    switch (node.nodeType) {\n      case Node.TEXT_NODE:\n        if (!this.isInsignificantTextNode(node)) {\n          this.appendBlockForTextNode(node);\n          return this.processTextNode(node);\n        }\n\n        break;\n\n      case Node.ELEMENT_NODE:\n        this.appendBlockForElement(node);\n        return this.processElement(node);\n    }\n  }\n\n  appendBlockForTextNode(node) {\n    const element = node.parentNode;\n\n    if (element === this.currentBlockElement && this.isBlockElement(node.previousSibling)) {\n      return this.appendStringWithAttributes(\"\\n\");\n    } else if (element === this.containerElement || this.isBlockElement(element)) {\n      var _this$currentBlock;\n\n      const attributes = this.getBlockAttributes(element);\n\n      if (!arraysAreEqual(attributes, (_this$currentBlock = this.currentBlock) === null || _this$currentBlock === void 0 ? void 0 : _this$currentBlock.attributes)) {\n        this.currentBlock = this.appendBlockForAttributesWithElement(attributes, element);\n        this.currentBlockElement = element;\n      }\n    }\n  }\n\n  appendBlockForElement(element) {\n    const elementIsBlockElement = this.isBlockElement(element);\n    const currentBlockContainsElement = elementContainsNode(this.currentBlockElement, element);\n\n    if (elementIsBlockElement && !this.isBlockElement(element.firstChild)) {\n      if (!this.isInsignificantTextNode(element.firstChild) || !this.isBlockElement(element.firstElementChild)) {\n        const attributes = this.getBlockAttributes(element);\n\n        if (element.firstChild) {\n          if (!(currentBlockContainsElement && arraysAreEqual(attributes, this.currentBlock.attributes))) {\n            this.currentBlock = this.appendBlockForAttributesWithElement(attributes, element);\n            this.currentBlockElement = element;\n          } else {\n            return this.appendStringWithAttributes(\"\\n\");\n          }\n        }\n      }\n    } else if (this.currentBlockElement && !currentBlockContainsElement && !elementIsBlockElement) {\n      const parentBlockElement = this.findParentBlockElement(element);\n\n      if (parentBlockElement) {\n        return this.appendBlockForElement(parentBlockElement);\n      } else {\n        this.currentBlock = this.appendEmptyBlock();\n        this.currentBlockElement = null;\n      }\n    }\n  }\n\n  findParentBlockElement(element) {\n    let {\n      parentElement\n    } = element;\n\n    while (parentElement && parentElement !== this.containerElement) {\n      if (this.isBlockElement(parentElement) && this.blockElements.includes(parentElement)) {\n        return parentElement;\n      } else {\n        parentElement = parentElement.parentElement;\n      }\n    }\n\n    return null;\n  }\n\n  processTextNode(node) {\n    let string = node.data;\n\n    if (!elementCanDisplayPreformattedText(node.parentNode)) {\n      var _node$previousSibling;\n\n      string = squishBreakableWhitespace(string);\n\n      if (stringEndsWithWhitespace((_node$previousSibling = node.previousSibling) === null || _node$previousSibling === void 0 ? void 0 : _node$previousSibling.textContent)) {\n        string = leftTrimBreakableWhitespace(string);\n      }\n    }\n\n    return this.appendStringWithAttributes(string, this.getTextAttributes(node.parentNode));\n  }\n\n  processElement(element) {\n    let attributes;\n\n    if (nodeIsAttachmentElement(element)) {\n      attributes = parseTrixDataAttribute(element, \"attachment\");\n\n      if (Object.keys(attributes).length) {\n        const textAttributes = this.getTextAttributes(element);\n        this.appendAttachmentWithAttributes(attributes, textAttributes); // We have everything we need so avoid processing inner nodes\n\n        element.innerHTML = \"\";\n      }\n\n      return this.processedElements.push(element);\n    } else {\n      switch (tagName(element)) {\n        case \"br\":\n          if (!this.isExtraBR(element) && !this.isBlockElement(element.nextSibling)) {\n            this.appendStringWithAttributes(\"\\n\", this.getTextAttributes(element));\n          }\n\n          return this.processedElements.push(element);\n\n        case \"img\":\n          attributes = {\n            url: element.getAttribute(\"src\"),\n            contentType: \"image\"\n          };\n          const object = getImageDimensions(element);\n\n          for (const key in object) {\n            const value = object[key];\n            attributes[key] = value;\n          }\n\n          this.appendAttachmentWithAttributes(attributes, this.getTextAttributes(element));\n          return this.processedElements.push(element);\n\n        case \"tr\":\n          if (element.parentNode.firstChild !== element) {\n            return this.appendStringWithAttributes(\"\\n\");\n          }\n\n          break;\n\n        case \"td\":\n          if (element.parentNode.firstChild !== element) {\n            return this.appendStringWithAttributes(\" | \");\n          }\n\n          break;\n      }\n    }\n  } // Document construction\n\n\n  appendBlockForAttributesWithElement(attributes, element) {\n    this.blockElements.push(element);\n    const block = blockForAttributes(attributes);\n    this.blocks.push(block);\n    return block;\n  }\n\n  appendEmptyBlock() {\n    return this.appendBlockForAttributesWithElement([], null);\n  }\n\n  appendStringWithAttributes(string, attributes) {\n    return this.appendPiece(pieceForString(string, attributes));\n  }\n\n  appendAttachmentWithAttributes(attachment, attributes) {\n    return this.appendPiece(pieceForAttachment(attachment, attributes));\n  }\n\n  appendPiece(piece) {\n    if (this.blocks.length === 0) {\n      this.appendEmptyBlock();\n    }\n\n    return this.blocks[this.blocks.length - 1].text.push(piece);\n  }\n\n  appendStringToTextAtIndex(string, index) {\n    const {\n      text\n    } = this.blocks[index];\n    const piece = text[text.length - 1];\n\n    if ((piece === null || piece === void 0 ? void 0 : piece.type) === \"string\") {\n      piece.string += string;\n    } else {\n      return text.push(pieceForString(string));\n    }\n  }\n\n  prependStringToTextAtIndex(string, index) {\n    const {\n      text\n    } = this.blocks[index];\n    const piece = text[0];\n\n    if ((piece === null || piece === void 0 ? void 0 : piece.type) === \"string\") {\n      piece.string = string + piece.string;\n    } else {\n      return text.unshift(pieceForString(string));\n    }\n  } // Attribute parsing\n\n\n  getTextAttributes(element) {\n    let value;\n    const attributes = {};\n\n    for (const attribute in config.textAttributes) {\n      const configAttr = config.textAttributes[attribute];\n\n      if (configAttr.tagName && findClosestElementFromNode(element, {\n        matchingSelector: configAttr.tagName,\n        untilNode: this.containerElement\n      })) {\n        attributes[attribute] = true;\n      } else if (configAttr.parser) {\n        value = configAttr.parser(element);\n\n        if (value) {\n          let attributeInheritedFromBlock = false;\n\n          for (const blockElement of this.findBlockElementAncestors(element)) {\n            if (configAttr.parser(blockElement) === value) {\n              attributeInheritedFromBlock = true;\n              break;\n            }\n          }\n\n          if (!attributeInheritedFromBlock) {\n            attributes[attribute] = value;\n          }\n        }\n      } else if (configAttr.styleProperty) {\n        value = element.style[configAttr.styleProperty];\n\n        if (value) {\n          attributes[attribute] = value;\n        }\n      }\n    }\n\n    if (nodeIsAttachmentElement(element)) {\n      const object = parseTrixDataAttribute(element, \"attributes\");\n\n      for (const key in object) {\n        value = object[key];\n        attributes[key] = value;\n      }\n    }\n\n    return attributes;\n  }\n\n  getBlockAttributes(element) {\n    const attributes = [];\n\n    while (element && element !== this.containerElement) {\n      for (const attribute in config.blockAttributes) {\n        const attrConfig = config.blockAttributes[attribute];\n\n        if (attrConfig.parse !== false) {\n          if (tagName(element) === attrConfig.tagName) {\n            var _attrConfig$test;\n\n            if ((_attrConfig$test = attrConfig.test) !== null && _attrConfig$test !== void 0 && _attrConfig$test.call(attrConfig, element) || !attrConfig.test) {\n              attributes.push(attribute);\n\n              if (attrConfig.listAttribute) {\n                attributes.push(attrConfig.listAttribute);\n              }\n            }\n          }\n        }\n      }\n\n      element = element.parentNode;\n    }\n\n    return attributes.reverse();\n  }\n\n  findBlockElementAncestors(element) {\n    const ancestors = [];\n\n    while (element && element !== this.containerElement) {\n      const tag = tagName(element);\n\n      if (getBlockTagNames().includes(tag)) {\n        ancestors.push(element);\n      }\n\n      element = element.parentNode;\n    }\n\n    return ancestors;\n  } // Element inspection\n\n\n  isBlockElement(element) {\n    if ((element === null || element === void 0 ? void 0 : element.nodeType) !== Node.ELEMENT_NODE) return;\n    if (nodeIsAttachmentElement(element)) return;\n    if (findClosestElementFromNode(element, {\n      matchingSelector: \"td\",\n      untilNode: this.containerElement\n    })) return;\n    return getBlockTagNames().includes(tagName(element)) || window.getComputedStyle(element).display === \"block\";\n  }\n\n  isInsignificantTextNode(node) {\n    if ((node === null || node === void 0 ? void 0 : node.nodeType) !== Node.TEXT_NODE) return;\n    if (!stringIsAllBreakableWhitespace(node.data)) return;\n    const {\n      parentNode,\n      previousSibling,\n      nextSibling\n    } = node;\n    if (nodeEndsWithNonWhitespace(parentNode.previousSibling) && !this.isBlockElement(parentNode.previousSibling)) return;\n    if (elementCanDisplayPreformattedText(parentNode)) return;\n    return !previousSibling || this.isBlockElement(previousSibling) || !nextSibling || this.isBlockElement(nextSibling);\n  }\n\n  isExtraBR(element) {\n    return tagName(element) === \"br\" && this.isBlockElement(element.parentNode) && element.parentNode.lastChild === element;\n  } // Margin translation\n\n\n  translateBlockElementMarginsToNewlines() {\n    const defaultMargin = this.getMarginOfDefaultBlockElement();\n\n    for (let index = 0; index < this.blocks.length; index++) {\n      const margin = this.getMarginOfBlockElementAtIndex(index);\n\n      if (margin) {\n        if (margin.top > defaultMargin.top * 2) {\n          this.prependStringToTextAtIndex(\"\\n\", index);\n        }\n\n        if (margin.bottom > defaultMargin.bottom * 2) {\n          this.appendStringToTextAtIndex(\"\\n\", index);\n        }\n      }\n    }\n  }\n\n  getMarginOfBlockElementAtIndex(index) {\n    const element = this.blockElements[index];\n\n    if (element) {\n      if (element.textContent) {\n        if (!getBlockTagNames().includes(tagName(element)) && !this.processedElements.includes(element)) {\n          return getBlockElementMargin(element);\n        }\n      }\n    }\n  }\n\n  getMarginOfDefaultBlockElement() {\n    const element = makeElement(config.blockAttributes.default.tagName);\n    this.containerElement.appendChild(element);\n    return getBlockElementMargin(element);\n  }\n\n} // Helpers\n\nconst elementCanDisplayPreformattedText = function (element) {\n  const {\n    whiteSpace\n  } = window.getComputedStyle(element);\n  return [\"pre\", \"pre-wrap\", \"pre-line\"].includes(whiteSpace);\n};\n\nconst nodeEndsWithNonWhitespace = node => node && !stringEndsWithWhitespace(node.textContent);\n\nconst getBlockElementMargin = function (element) {\n  const style = window.getComputedStyle(element);\n\n  if (style.display === \"block\") {\n    return {\n      top: parseInt(style.marginTop),\n      bottom: parseInt(style.marginBottom)\n    };\n  }\n};\n\nconst nodeFilter = function (node) {\n  if (tagName(node) === \"style\") {\n    return NodeFilter.FILTER_REJECT;\n  } else {\n    return NodeFilter.FILTER_ACCEPT;\n  }\n}; // Whitespace\n\n\nconst leftTrimBreakableWhitespace = string => string.replace(new RegExp(\"^\".concat(breakableWhitespacePattern.source, \"+\")), \"\");\n\nconst stringIsAllBreakableWhitespace = string => new RegExp(\"^\".concat(breakableWhitespacePattern.source, \"*$\")).test(string);\n\nconst stringEndsWithWhitespace = string => /\\s$/.test(string);\n\nclass LineBreakInsertion {\n  constructor(composition) {\n    this.composition = composition;\n    this.document = this.composition.document;\n    const selectedRange = this.composition.getSelectedRange();\n    this.startPosition = selectedRange[0];\n    this.endPosition = selectedRange[1];\n    this.startLocation = this.document.locationFromPosition(this.startPosition);\n    this.endLocation = this.document.locationFromPosition(this.endPosition);\n    this.block = this.document.getBlockAtIndex(this.endLocation.index);\n    this.breaksOnReturn = this.block.breaksOnReturn();\n    this.previousCharacter = this.block.text.getStringAtPosition(this.endLocation.offset - 1);\n    this.nextCharacter = this.block.text.getStringAtPosition(this.endLocation.offset);\n  }\n\n  shouldInsertBlockBreak() {\n    if (this.block.hasAttributes() && this.block.isListItem() && !this.block.isEmpty()) {\n      return this.startLocation.offset !== 0;\n    } else {\n      return this.breaksOnReturn && this.nextCharacter !== \"\\n\";\n    }\n  }\n\n  shouldBreakFormattedBlock() {\n    return this.block.hasAttributes() && !this.block.isListItem() && (this.breaksOnReturn && this.nextCharacter === \"\\n\" || this.previousCharacter === \"\\n\");\n  }\n\n  shouldDecreaseListLevel() {\n    return this.block.hasAttributes() && this.block.isListItem() && this.block.isEmpty();\n  }\n\n  shouldPrependListItem() {\n    return this.block.isListItem() && this.startLocation.offset === 0 && !this.block.isEmpty();\n  }\n\n  shouldRemoveLastBlockAttribute() {\n    return this.block.hasAttributes() && !this.block.isListItem() && this.block.isEmpty();\n  }\n\n}\n\nconst PLACEHOLDER = \" \";\nclass Composition extends BasicObject {\n  constructor() {\n    super(...arguments);\n    this.document = new Document();\n    this.attachments = [];\n    this.currentAttributes = {};\n    this.revision = 0;\n  }\n\n  setDocument(document) {\n    if (!document.isEqualTo(this.document)) {\n      var _this$delegate, _this$delegate$compos;\n\n      this.document = document;\n      this.refreshAttachments();\n      this.revision++;\n      return (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$compos = _this$delegate.compositionDidChangeDocument) === null || _this$delegate$compos === void 0 ? void 0 : _this$delegate$compos.call(_this$delegate, document);\n    }\n  } // Snapshots\n\n\n  getSnapshot() {\n    return {\n      document: this.document,\n      selectedRange: this.getSelectedRange()\n    };\n  }\n\n  loadSnapshot(_ref) {\n    var _this$delegate2, _this$delegate2$compo, _this$delegate3, _this$delegate3$compo;\n\n    let {\n      document,\n      selectedRange\n    } = _ref;\n    (_this$delegate2 = this.delegate) === null || _this$delegate2 === void 0 ? void 0 : (_this$delegate2$compo = _this$delegate2.compositionWillLoadSnapshot) === null || _this$delegate2$compo === void 0 ? void 0 : _this$delegate2$compo.call(_this$delegate2);\n    this.setDocument(document != null ? document : new Document());\n    this.setSelection(selectedRange != null ? selectedRange : [0, 0]);\n    return (_this$delegate3 = this.delegate) === null || _this$delegate3 === void 0 ? void 0 : (_this$delegate3$compo = _this$delegate3.compositionDidLoadSnapshot) === null || _this$delegate3$compo === void 0 ? void 0 : _this$delegate3$compo.call(_this$delegate3);\n  } // Responder protocol\n\n\n  insertText(text) {\n    let {\n      updatePosition\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n      updatePosition: true\n    };\n    const selectedRange = this.getSelectedRange();\n    this.setDocument(this.document.insertTextAtRange(text, selectedRange));\n    const startPosition = selectedRange[0];\n    const endPosition = startPosition + text.getLength();\n\n    if (updatePosition) {\n      this.setSelection(endPosition);\n    }\n\n    return this.notifyDelegateOfInsertionAtRange([startPosition, endPosition]);\n  }\n\n  insertBlock() {\n    let block = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Block();\n    const document = new Document([block]);\n    return this.insertDocument(document);\n  }\n\n  insertDocument() {\n    let document = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Document();\n    const selectedRange = this.getSelectedRange();\n    this.setDocument(this.document.insertDocumentAtRange(document, selectedRange));\n    const startPosition = selectedRange[0];\n    const endPosition = startPosition + document.getLength();\n    this.setSelection(endPosition);\n    return this.notifyDelegateOfInsertionAtRange([startPosition, endPosition]);\n  }\n\n  insertString(string, options) {\n    const attributes = this.getCurrentTextAttributes();\n    const text = Text.textForStringWithAttributes(string, attributes);\n    return this.insertText(text, options);\n  }\n\n  insertBlockBreak() {\n    const selectedRange = this.getSelectedRange();\n    this.setDocument(this.document.insertBlockBreakAtRange(selectedRange));\n    const startPosition = selectedRange[0];\n    const endPosition = startPosition + 1;\n    this.setSelection(endPosition);\n    return this.notifyDelegateOfInsertionAtRange([startPosition, endPosition]);\n  }\n\n  insertLineBreak() {\n    const insertion = new LineBreakInsertion(this);\n\n    if (insertion.shouldDecreaseListLevel()) {\n      this.decreaseListLevel();\n      return this.setSelection(insertion.startPosition);\n    } else if (insertion.shouldPrependListItem()) {\n      const document = new Document([insertion.block.copyWithoutText()]);\n      return this.insertDocument(document);\n    } else if (insertion.shouldInsertBlockBreak()) {\n      return this.insertBlockBreak();\n    } else if (insertion.shouldRemoveLastBlockAttribute()) {\n      return this.removeLastBlockAttribute();\n    } else if (insertion.shouldBreakFormattedBlock()) {\n      return this.breakFormattedBlock(insertion);\n    } else {\n      return this.insertString(\"\\n\");\n    }\n  }\n\n  insertHTML(html) {\n    const document = HTMLParser.parse(html).getDocument();\n    const selectedRange = this.getSelectedRange();\n    this.setDocument(this.document.mergeDocumentAtRange(document, selectedRange));\n    const startPosition = selectedRange[0];\n    const endPosition = startPosition + document.getLength() - 1;\n    this.setSelection(endPosition);\n    return this.notifyDelegateOfInsertionAtRange([startPosition, endPosition]);\n  }\n\n  replaceHTML(html) {\n    const document = HTMLParser.parse(html).getDocument().copyUsingObjectsFromDocument(this.document);\n    const locationRange = this.getLocationRange({\n      strict: false\n    });\n    const selectedRange = this.document.rangeFromLocationRange(locationRange);\n    this.setDocument(document);\n    return this.setSelection(selectedRange);\n  }\n\n  insertFile(file) {\n    return this.insertFiles([file]);\n  }\n\n  insertFiles(files) {\n    const attachments = [];\n    Array.from(files).forEach(file => {\n      var _this$delegate4;\n\n      if ((_this$delegate4 = this.delegate) !== null && _this$delegate4 !== void 0 && _this$delegate4.compositionShouldAcceptFile(file)) {\n        const attachment = Attachment.attachmentForFile(file);\n        attachments.push(attachment);\n      }\n    });\n    return this.insertAttachments(attachments);\n  }\n\n  insertAttachment(attachment) {\n    return this.insertAttachments([attachment]);\n  }\n\n  insertAttachments(attachments) {\n    let text = new Text();\n    Array.from(attachments).forEach(attachment => {\n      var _config$attachments$t;\n\n      const type = attachment.getType();\n      const presentation = (_config$attachments$t = config.attachments[type]) === null || _config$attachments$t === void 0 ? void 0 : _config$attachments$t.presentation;\n      const attributes = this.getCurrentTextAttributes();\n\n      if (presentation) {\n        attributes.presentation = presentation;\n      }\n\n      const attachmentText = Text.textForAttachmentWithAttributes(attachment, attributes);\n      text = text.appendText(attachmentText);\n    });\n    return this.insertText(text);\n  }\n\n  shouldManageDeletingInDirection(direction) {\n    const locationRange = this.getLocationRange();\n\n    if (rangeIsCollapsed(locationRange)) {\n      if (direction === \"backward\" && locationRange[0].offset === 0) {\n        return true;\n      }\n\n      if (this.shouldManageMovingCursorInDirection(direction)) {\n        return true;\n      }\n    } else {\n      if (locationRange[0].index !== locationRange[1].index) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  deleteInDirection(direction) {\n    let {\n      length\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let attachment, deletingIntoPreviousBlock, selectionSpansBlocks;\n    const locationRange = this.getLocationRange();\n    let range = this.getSelectedRange();\n    const selectionIsCollapsed = rangeIsCollapsed(range);\n\n    if (selectionIsCollapsed) {\n      deletingIntoPreviousBlock = direction === \"backward\" && locationRange[0].offset === 0;\n    } else {\n      selectionSpansBlocks = locationRange[0].index !== locationRange[1].index;\n    }\n\n    if (deletingIntoPreviousBlock) {\n      if (this.canDecreaseBlockAttributeLevel()) {\n        const block = this.getBlock();\n\n        if (block.isListItem()) {\n          this.decreaseListLevel();\n        } else {\n          this.decreaseBlockAttributeLevel();\n        }\n\n        this.setSelection(range[0]);\n\n        if (block.isEmpty()) {\n          return false;\n        }\n      }\n    }\n\n    if (selectionIsCollapsed) {\n      range = this.getExpandedRangeInDirection(direction, {\n        length\n      });\n\n      if (direction === \"backward\") {\n        attachment = this.getAttachmentAtRange(range);\n      }\n    }\n\n    if (attachment) {\n      this.editAttachment(attachment);\n      return false;\n    } else {\n      this.setDocument(this.document.removeTextAtRange(range));\n      this.setSelection(range[0]);\n\n      if (deletingIntoPreviousBlock || selectionSpansBlocks) {\n        return false;\n      }\n    }\n  }\n\n  moveTextFromRange(range) {\n    const [position] = Array.from(this.getSelectedRange());\n    this.setDocument(this.document.moveTextFromRangeToPosition(range, position));\n    return this.setSelection(position);\n  }\n\n  removeAttachment(attachment) {\n    const range = this.document.getRangeOfAttachment(attachment);\n\n    if (range) {\n      this.stopEditingAttachment();\n      this.setDocument(this.document.removeTextAtRange(range));\n      return this.setSelection(range[0]);\n    }\n  }\n\n  removeLastBlockAttribute() {\n    const [startPosition, endPosition] = Array.from(this.getSelectedRange());\n    const block = this.document.getBlockAtPosition(endPosition);\n    this.removeCurrentAttribute(block.getLastAttribute());\n    return this.setSelection(startPosition);\n  }\n\n  insertPlaceholder() {\n    this.placeholderPosition = this.getPosition();\n    return this.insertString(PLACEHOLDER);\n  }\n\n  selectPlaceholder() {\n    if (this.placeholderPosition != null) {\n      this.setSelectedRange([this.placeholderPosition, this.placeholderPosition + PLACEHOLDER.length]);\n      return this.getSelectedRange();\n    }\n  }\n\n  forgetPlaceholder() {\n    this.placeholderPosition = null;\n  } // Current attributes\n\n\n  hasCurrentAttribute(attributeName) {\n    const value = this.currentAttributes[attributeName];\n    return value != null && value !== false;\n  }\n\n  toggleCurrentAttribute(attributeName) {\n    const value = !this.currentAttributes[attributeName];\n\n    if (value) {\n      return this.setCurrentAttribute(attributeName, value);\n    } else {\n      return this.removeCurrentAttribute(attributeName);\n    }\n  }\n\n  canSetCurrentAttribute(attributeName) {\n    if (getBlockConfig(attributeName)) {\n      return this.canSetCurrentBlockAttribute(attributeName);\n    } else {\n      return this.canSetCurrentTextAttribute(attributeName);\n    }\n  }\n\n  canSetCurrentTextAttribute(attributeName) {\n    const document = this.getSelectedDocument();\n    if (!document) return;\n\n    for (const attachment of Array.from(document.getAttachments())) {\n      if (!attachment.hasContent()) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  canSetCurrentBlockAttribute(attributeName) {\n    const block = this.getBlock();\n    if (!block) return;\n    return !block.isTerminalBlock();\n  }\n\n  setCurrentAttribute(attributeName, value) {\n    if (getBlockConfig(attributeName)) {\n      return this.setBlockAttribute(attributeName, value);\n    } else {\n      this.setTextAttribute(attributeName, value);\n      this.currentAttributes[attributeName] = value;\n      return this.notifyDelegateOfCurrentAttributesChange();\n    }\n  }\n\n  setTextAttribute(attributeName, value) {\n    const selectedRange = this.getSelectedRange();\n    if (!selectedRange) return;\n    const [startPosition, endPosition] = Array.from(selectedRange);\n\n    if (startPosition === endPosition) {\n      if (attributeName === \"href\") {\n        const text = Text.textForStringWithAttributes(value, {\n          href: value\n        });\n        return this.insertText(text);\n      }\n    } else {\n      return this.setDocument(this.document.addAttributeAtRange(attributeName, value, selectedRange));\n    }\n  }\n\n  setBlockAttribute(attributeName, value) {\n    const selectedRange = this.getSelectedRange();\n\n    if (this.canSetCurrentAttribute(attributeName)) {\n      this.setDocument(this.document.applyBlockAttributeAtRange(attributeName, value, selectedRange));\n      return this.setSelection(selectedRange);\n    }\n  }\n\n  removeCurrentAttribute(attributeName) {\n    if (getBlockConfig(attributeName)) {\n      this.removeBlockAttribute(attributeName);\n      return this.updateCurrentAttributes();\n    } else {\n      this.removeTextAttribute(attributeName);\n      delete this.currentAttributes[attributeName];\n      return this.notifyDelegateOfCurrentAttributesChange();\n    }\n  }\n\n  removeTextAttribute(attributeName) {\n    const selectedRange = this.getSelectedRange();\n    if (!selectedRange) return;\n    return this.setDocument(this.document.removeAttributeAtRange(attributeName, selectedRange));\n  }\n\n  removeBlockAttribute(attributeName) {\n    const selectedRange = this.getSelectedRange();\n    if (!selectedRange) return;\n    return this.setDocument(this.document.removeAttributeAtRange(attributeName, selectedRange));\n  }\n\n  canDecreaseNestingLevel() {\n    var _this$getBlock;\n\n    return ((_this$getBlock = this.getBlock()) === null || _this$getBlock === void 0 ? void 0 : _this$getBlock.getNestingLevel()) > 0;\n  }\n\n  canIncreaseNestingLevel() {\n    var _getBlockConfig;\n\n    const block = this.getBlock();\n    if (!block) return;\n\n    if ((_getBlockConfig = getBlockConfig(block.getLastNestableAttribute())) !== null && _getBlockConfig !== void 0 && _getBlockConfig.listAttribute) {\n      const previousBlock = this.getPreviousBlock();\n\n      if (previousBlock) {\n        return arrayStartsWith(previousBlock.getListItemAttributes(), block.getListItemAttributes());\n      }\n    } else {\n      return block.getNestingLevel() > 0;\n    }\n  }\n\n  decreaseNestingLevel() {\n    const block = this.getBlock();\n    if (!block) return;\n    return this.setDocument(this.document.replaceBlock(block, block.decreaseNestingLevel()));\n  }\n\n  increaseNestingLevel() {\n    const block = this.getBlock();\n    if (!block) return;\n    return this.setDocument(this.document.replaceBlock(block, block.increaseNestingLevel()));\n  }\n\n  canDecreaseBlockAttributeLevel() {\n    var _this$getBlock2;\n\n    return ((_this$getBlock2 = this.getBlock()) === null || _this$getBlock2 === void 0 ? void 0 : _this$getBlock2.getAttributeLevel()) > 0;\n  }\n\n  decreaseBlockAttributeLevel() {\n    var _this$getBlock3;\n\n    const attribute = (_this$getBlock3 = this.getBlock()) === null || _this$getBlock3 === void 0 ? void 0 : _this$getBlock3.getLastAttribute();\n\n    if (attribute) {\n      return this.removeCurrentAttribute(attribute);\n    }\n  }\n\n  decreaseListLevel() {\n    let [startPosition] = Array.from(this.getSelectedRange());\n    const {\n      index\n    } = this.document.locationFromPosition(startPosition);\n    let endIndex = index;\n    const attributeLevel = this.getBlock().getAttributeLevel();\n    let block = this.document.getBlockAtIndex(endIndex + 1);\n\n    while (block) {\n      if (!block.isListItem() || block.getAttributeLevel() <= attributeLevel) {\n        break;\n      }\n\n      endIndex++;\n      block = this.document.getBlockAtIndex(endIndex + 1);\n    }\n\n    startPosition = this.document.positionFromLocation({\n      index,\n      offset: 0\n    });\n    const endPosition = this.document.positionFromLocation({\n      index: endIndex,\n      offset: 0\n    });\n    return this.setDocument(this.document.removeLastListAttributeAtRange([startPosition, endPosition]));\n  }\n\n  updateCurrentAttributes() {\n    const selectedRange = this.getSelectedRange({\n      ignoreLock: true\n    });\n\n    if (selectedRange) {\n      const currentAttributes = this.document.getCommonAttributesAtRange(selectedRange);\n      Array.from(getAllAttributeNames()).forEach(attributeName => {\n        if (!currentAttributes[attributeName]) {\n          if (!this.canSetCurrentAttribute(attributeName)) {\n            currentAttributes[attributeName] = false;\n          }\n        }\n      });\n\n      if (!objectsAreEqual(currentAttributes, this.currentAttributes)) {\n        this.currentAttributes = currentAttributes;\n        return this.notifyDelegateOfCurrentAttributesChange();\n      }\n    }\n  }\n\n  getCurrentAttributes() {\n    return extend.call({}, this.currentAttributes);\n  }\n\n  getCurrentTextAttributes() {\n    const attributes = {};\n\n    for (const key in this.currentAttributes) {\n      const value = this.currentAttributes[key];\n\n      if (value !== false) {\n        if (getTextConfig(key)) {\n          attributes[key] = value;\n        }\n      }\n    }\n\n    return attributes;\n  } // Selection freezing\n\n\n  freezeSelection() {\n    return this.setCurrentAttribute(\"frozen\", true);\n  }\n\n  thawSelection() {\n    return this.removeCurrentAttribute(\"frozen\");\n  }\n\n  hasFrozenSelection() {\n    return this.hasCurrentAttribute(\"frozen\");\n  }\n\n  setSelection(selectedRange) {\n    var _this$delegate5;\n\n    const locationRange = this.document.locationRangeFromRange(selectedRange);\n    return (_this$delegate5 = this.delegate) === null || _this$delegate5 === void 0 ? void 0 : _this$delegate5.compositionDidRequestChangingSelectionToLocationRange(locationRange);\n  }\n\n  getSelectedRange() {\n    const locationRange = this.getLocationRange();\n\n    if (locationRange) {\n      return this.document.rangeFromLocationRange(locationRange);\n    }\n  }\n\n  setSelectedRange(selectedRange) {\n    const locationRange = this.document.locationRangeFromRange(selectedRange);\n    return this.getSelectionManager().setLocationRange(locationRange);\n  }\n\n  getPosition() {\n    const locationRange = this.getLocationRange();\n\n    if (locationRange) {\n      return this.document.positionFromLocation(locationRange[0]);\n    }\n  }\n\n  getLocationRange(options) {\n    if (this.targetLocationRange) {\n      return this.targetLocationRange;\n    } else {\n      return this.getSelectionManager().getLocationRange(options) || normalizeRange({\n        index: 0,\n        offset: 0\n      });\n    }\n  }\n\n  withTargetLocationRange(locationRange, fn) {\n    let result;\n    this.targetLocationRange = locationRange;\n\n    try {\n      result = fn();\n    } finally {\n      this.targetLocationRange = null;\n    }\n\n    return result;\n  }\n\n  withTargetRange(range, fn) {\n    const locationRange = this.document.locationRangeFromRange(range);\n    return this.withTargetLocationRange(locationRange, fn);\n  }\n\n  withTargetDOMRange(domRange, fn) {\n    const locationRange = this.createLocationRangeFromDOMRange(domRange, {\n      strict: false\n    });\n    return this.withTargetLocationRange(locationRange, fn);\n  }\n\n  getExpandedRangeInDirection(direction) {\n    let {\n      length\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let [startPosition, endPosition] = Array.from(this.getSelectedRange());\n\n    if (direction === \"backward\") {\n      if (length) {\n        startPosition -= length;\n      } else {\n        startPosition = this.translateUTF16PositionFromOffset(startPosition, -1);\n      }\n    } else {\n      if (length) {\n        endPosition += length;\n      } else {\n        endPosition = this.translateUTF16PositionFromOffset(endPosition, 1);\n      }\n    }\n\n    return normalizeRange([startPosition, endPosition]);\n  }\n\n  shouldManageMovingCursorInDirection(direction) {\n    if (this.editingAttachment) {\n      return true;\n    }\n\n    const range = this.getExpandedRangeInDirection(direction);\n    return this.getAttachmentAtRange(range) != null;\n  }\n\n  moveCursorInDirection(direction) {\n    let canEditAttachment, range;\n\n    if (this.editingAttachment) {\n      range = this.document.getRangeOfAttachment(this.editingAttachment);\n    } else {\n      const selectedRange = this.getSelectedRange();\n      range = this.getExpandedRangeInDirection(direction);\n      canEditAttachment = !rangesAreEqual(selectedRange, range);\n    }\n\n    if (direction === \"backward\") {\n      this.setSelectedRange(range[0]);\n    } else {\n      this.setSelectedRange(range[1]);\n    }\n\n    if (canEditAttachment) {\n      const attachment = this.getAttachmentAtRange(range);\n\n      if (attachment) {\n        return this.editAttachment(attachment);\n      }\n    }\n  }\n\n  expandSelectionInDirection(direction) {\n    let {\n      length\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    const range = this.getExpandedRangeInDirection(direction, {\n      length\n    });\n    return this.setSelectedRange(range);\n  }\n\n  expandSelectionForEditing() {\n    if (this.hasCurrentAttribute(\"href\")) {\n      return this.expandSelectionAroundCommonAttribute(\"href\");\n    }\n  }\n\n  expandSelectionAroundCommonAttribute(attributeName) {\n    const position = this.getPosition();\n    const range = this.document.getRangeOfCommonAttributeAtPosition(attributeName, position);\n    return this.setSelectedRange(range);\n  }\n\n  selectionContainsAttachments() {\n    var _this$getSelectedAtta;\n\n    return ((_this$getSelectedAtta = this.getSelectedAttachments()) === null || _this$getSelectedAtta === void 0 ? void 0 : _this$getSelectedAtta.length) > 0;\n  }\n\n  selectionIsInCursorTarget() {\n    return this.editingAttachment || this.positionIsCursorTarget(this.getPosition());\n  }\n\n  positionIsCursorTarget(position) {\n    const location = this.document.locationFromPosition(position);\n\n    if (location) {\n      return this.locationIsCursorTarget(location);\n    }\n  }\n\n  positionIsBlockBreak(position) {\n    var _this$document$getPie;\n\n    return (_this$document$getPie = this.document.getPieceAtPosition(position)) === null || _this$document$getPie === void 0 ? void 0 : _this$document$getPie.isBlockBreak();\n  }\n\n  getSelectedDocument() {\n    const selectedRange = this.getSelectedRange();\n\n    if (selectedRange) {\n      return this.document.getDocumentAtRange(selectedRange);\n    }\n  }\n\n  getSelectedAttachments() {\n    var _this$getSelectedDocu;\n\n    return (_this$getSelectedDocu = this.getSelectedDocument()) === null || _this$getSelectedDocu === void 0 ? void 0 : _this$getSelectedDocu.getAttachments();\n  } // Attachments\n\n\n  getAttachments() {\n    return this.attachments.slice(0);\n  }\n\n  refreshAttachments() {\n    const attachments = this.document.getAttachments();\n    const {\n      added,\n      removed\n    } = summarizeArrayChange(this.attachments, attachments);\n    this.attachments = attachments;\n    Array.from(removed).forEach(attachment => {\n      var _this$delegate6, _this$delegate6$compo;\n\n      attachment.delegate = null;\n      (_this$delegate6 = this.delegate) === null || _this$delegate6 === void 0 ? void 0 : (_this$delegate6$compo = _this$delegate6.compositionDidRemoveAttachment) === null || _this$delegate6$compo === void 0 ? void 0 : _this$delegate6$compo.call(_this$delegate6, attachment);\n    });\n    return (() => {\n      const result = [];\n      Array.from(added).forEach(attachment => {\n        var _this$delegate7, _this$delegate7$compo;\n\n        attachment.delegate = this;\n        result.push((_this$delegate7 = this.delegate) === null || _this$delegate7 === void 0 ? void 0 : (_this$delegate7$compo = _this$delegate7.compositionDidAddAttachment) === null || _this$delegate7$compo === void 0 ? void 0 : _this$delegate7$compo.call(_this$delegate7, attachment));\n      });\n      return result;\n    })();\n  } // Attachment delegate\n\n\n  attachmentDidChangeAttributes(attachment) {\n    var _this$delegate8, _this$delegate8$compo;\n\n    this.revision++;\n    return (_this$delegate8 = this.delegate) === null || _this$delegate8 === void 0 ? void 0 : (_this$delegate8$compo = _this$delegate8.compositionDidEditAttachment) === null || _this$delegate8$compo === void 0 ? void 0 : _this$delegate8$compo.call(_this$delegate8, attachment);\n  }\n\n  attachmentDidChangePreviewURL(attachment) {\n    var _this$delegate9, _this$delegate9$compo;\n\n    this.revision++;\n    return (_this$delegate9 = this.delegate) === null || _this$delegate9 === void 0 ? void 0 : (_this$delegate9$compo = _this$delegate9.compositionDidChangeAttachmentPreviewURL) === null || _this$delegate9$compo === void 0 ? void 0 : _this$delegate9$compo.call(_this$delegate9, attachment);\n  } // Attachment editing\n\n\n  editAttachment(attachment, options) {\n    var _this$delegate10, _this$delegate10$comp;\n\n    if (attachment === this.editingAttachment) return;\n    this.stopEditingAttachment();\n    this.editingAttachment = attachment;\n    return (_this$delegate10 = this.delegate) === null || _this$delegate10 === void 0 ? void 0 : (_this$delegate10$comp = _this$delegate10.compositionDidStartEditingAttachment) === null || _this$delegate10$comp === void 0 ? void 0 : _this$delegate10$comp.call(_this$delegate10, this.editingAttachment, options);\n  }\n\n  stopEditingAttachment() {\n    var _this$delegate11, _this$delegate11$comp;\n\n    if (!this.editingAttachment) return;\n    (_this$delegate11 = this.delegate) === null || _this$delegate11 === void 0 ? void 0 : (_this$delegate11$comp = _this$delegate11.compositionDidStopEditingAttachment) === null || _this$delegate11$comp === void 0 ? void 0 : _this$delegate11$comp.call(_this$delegate11, this.editingAttachment);\n    this.editingAttachment = null;\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    return this.setDocument(this.document.updateAttributesForAttachment(attributes, attachment));\n  }\n\n  removeAttributeForAttachment(attribute, attachment) {\n    return this.setDocument(this.document.removeAttributeForAttachment(attribute, attachment));\n  } // Private\n\n\n  breakFormattedBlock(insertion) {\n    let {\n      document\n    } = insertion;\n    const {\n      block\n    } = insertion;\n    let position = insertion.startPosition;\n    let range = [position - 1, position];\n\n    if (block.getBlockBreakPosition() === insertion.startLocation.offset) {\n      if (block.breaksOnReturn() && insertion.nextCharacter === \"\\n\") {\n        position += 1;\n      } else {\n        document = document.removeTextAtRange(range);\n      }\n\n      range = [position, position];\n    } else if (insertion.nextCharacter === \"\\n\") {\n      if (insertion.previousCharacter === \"\\n\") {\n        range = [position - 1, position + 1];\n      } else {\n        range = [position, position + 1];\n        position += 1;\n      }\n    } else if (insertion.startLocation.offset - 1 !== 0) {\n      position += 1;\n    }\n\n    const newDocument = new Document([block.removeLastAttribute().copyWithoutText()]);\n    this.setDocument(document.insertDocumentAtRange(newDocument, range));\n    return this.setSelection(position);\n  }\n\n  getPreviousBlock() {\n    const locationRange = this.getLocationRange();\n\n    if (locationRange) {\n      const {\n        index\n      } = locationRange[0];\n\n      if (index > 0) {\n        return this.document.getBlockAtIndex(index - 1);\n      }\n    }\n  }\n\n  getBlock() {\n    const locationRange = this.getLocationRange();\n\n    if (locationRange) {\n      return this.document.getBlockAtIndex(locationRange[0].index);\n    }\n  }\n\n  getAttachmentAtRange(range) {\n    const document = this.document.getDocumentAtRange(range);\n\n    if (document.toString() === \"\".concat(OBJECT_REPLACEMENT_CHARACTER, \"\\n\")) {\n      return document.getAttachments()[0];\n    }\n  }\n\n  notifyDelegateOfCurrentAttributesChange() {\n    var _this$delegate12, _this$delegate12$comp;\n\n    return (_this$delegate12 = this.delegate) === null || _this$delegate12 === void 0 ? void 0 : (_this$delegate12$comp = _this$delegate12.compositionDidChangeCurrentAttributes) === null || _this$delegate12$comp === void 0 ? void 0 : _this$delegate12$comp.call(_this$delegate12, this.currentAttributes);\n  }\n\n  notifyDelegateOfInsertionAtRange(range) {\n    var _this$delegate13, _this$delegate13$comp;\n\n    return (_this$delegate13 = this.delegate) === null || _this$delegate13 === void 0 ? void 0 : (_this$delegate13$comp = _this$delegate13.compositionDidPerformInsertionAtRange) === null || _this$delegate13$comp === void 0 ? void 0 : _this$delegate13$comp.call(_this$delegate13, range);\n  }\n\n  translateUTF16PositionFromOffset(position, offset) {\n    const utf16string = this.document.toUTF16String();\n    const utf16position = utf16string.offsetFromUCS2Offset(position);\n    return utf16string.offsetToUCS2Offset(utf16position + offset);\n  }\n\n}\nComposition.proxyMethod(\"getSelectionManager().getPointRange\");\nComposition.proxyMethod(\"getSelectionManager().setLocationRangeFromPointRange\");\nComposition.proxyMethod(\"getSelectionManager().createLocationRangeFromDOMRange\");\nComposition.proxyMethod(\"getSelectionManager().locationIsCursorTarget\");\nComposition.proxyMethod(\"getSelectionManager().selectionIsExpanded\");\nComposition.proxyMethod(\"delegate?.getSelectionManager\");\n\nclass UndoManager extends BasicObject {\n  constructor(composition) {\n    super(...arguments);\n    this.composition = composition;\n    this.undoEntries = [];\n    this.redoEntries = [];\n  }\n\n  recordUndoEntry(description) {\n    let {\n      context,\n      consolidatable\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    const previousEntry = this.undoEntries.slice(-1)[0];\n\n    if (!consolidatable || !entryHasDescriptionAndContext(previousEntry, description, context)) {\n      const undoEntry = this.createEntry({\n        description,\n        context\n      });\n      this.undoEntries.push(undoEntry);\n      this.redoEntries = [];\n    }\n  }\n\n  undo() {\n    const undoEntry = this.undoEntries.pop();\n\n    if (undoEntry) {\n      const redoEntry = this.createEntry(undoEntry);\n      this.redoEntries.push(redoEntry);\n      return this.composition.loadSnapshot(undoEntry.snapshot);\n    }\n  }\n\n  redo() {\n    const redoEntry = this.redoEntries.pop();\n\n    if (redoEntry) {\n      const undoEntry = this.createEntry(redoEntry);\n      this.undoEntries.push(undoEntry);\n      return this.composition.loadSnapshot(redoEntry.snapshot);\n    }\n  }\n\n  canUndo() {\n    return this.undoEntries.length > 0;\n  }\n\n  canRedo() {\n    return this.redoEntries.length > 0;\n  } // Private\n\n\n  createEntry() {\n    let {\n      description,\n      context\n    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    return {\n      description: description === null || description === void 0 ? void 0 : description.toString(),\n      context: JSON.stringify(context),\n      snapshot: this.composition.getSnapshot()\n    };\n  }\n\n}\n\nconst entryHasDescriptionAndContext = (entry, description, context) => (entry === null || entry === void 0 ? void 0 : entry.description) === (description === null || description === void 0 ? void 0 : description.toString()) && (entry === null || entry === void 0 ? void 0 : entry.context) === JSON.stringify(context);\n\nconst attachmentGalleryFilter = function (snapshot) {\n  const filter = new Filter(snapshot);\n  filter.perform();\n  return filter.getSnapshot();\n};\nconst BLOCK_ATTRIBUTE_NAME = \"attachmentGallery\";\nconst TEXT_ATTRIBUTE_NAME = \"presentation\";\nconst TEXT_ATTRIBUTE_VALUE = \"gallery\";\n\nclass Filter {\n  constructor(snapshot) {\n    this.document = snapshot.document;\n    this.selectedRange = snapshot.selectedRange;\n  }\n\n  perform() {\n    this.removeBlockAttribute();\n    return this.applyBlockAttribute();\n  }\n\n  getSnapshot() {\n    return {\n      document: this.document,\n      selectedRange: this.selectedRange\n    };\n  } // Private\n\n\n  removeBlockAttribute() {\n    return this.findRangesOfBlocks().map(range => this.document = this.document.removeAttributeAtRange(BLOCK_ATTRIBUTE_NAME, range));\n  }\n\n  applyBlockAttribute() {\n    let offset = 0;\n    this.findRangesOfPieces().forEach(range => {\n      if (range[1] - range[0] > 1) {\n        range[0] += offset;\n        range[1] += offset;\n\n        if (this.document.getCharacterAtPosition(range[1]) !== \"\\n\") {\n          this.document = this.document.insertBlockBreakAtRange(range[1]);\n\n          if (range[1] < this.selectedRange[1]) {\n            this.moveSelectedRangeForward();\n          }\n\n          range[1]++;\n          offset++;\n        }\n\n        if (range[0] !== 0) {\n          if (this.document.getCharacterAtPosition(range[0] - 1) !== \"\\n\") {\n            this.document = this.document.insertBlockBreakAtRange(range[0]);\n\n            if (range[0] < this.selectedRange[0]) {\n              this.moveSelectedRangeForward();\n            }\n\n            range[0]++;\n            offset++;\n          }\n        }\n\n        this.document = this.document.applyBlockAttributeAtRange(BLOCK_ATTRIBUTE_NAME, true, range);\n      }\n    });\n  }\n\n  findRangesOfBlocks() {\n    return this.document.findRangesForBlockAttribute(BLOCK_ATTRIBUTE_NAME);\n  }\n\n  findRangesOfPieces() {\n    return this.document.findRangesForTextAttribute(TEXT_ATTRIBUTE_NAME, {\n      withValue: TEXT_ATTRIBUTE_VALUE\n    });\n  }\n\n  moveSelectedRangeForward() {\n    this.selectedRange[0] += 1;\n    this.selectedRange[1] += 1;\n  }\n\n}\n\nconst DEFAULT_FILTERS = [attachmentGalleryFilter];\nclass Editor {\n  constructor(composition, selectionManager, element) {\n    this.insertFiles = this.insertFiles.bind(this);\n    this.composition = composition;\n    this.selectionManager = selectionManager;\n    this.element = element;\n    this.undoManager = new UndoManager(this.composition);\n    this.filters = DEFAULT_FILTERS.slice(0);\n  }\n\n  loadDocument(document) {\n    return this.loadSnapshot({\n      document,\n      selectedRange: [0, 0]\n    });\n  }\n\n  loadHTML() {\n    let html = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n    const document = HTMLParser.parse(html, {\n      referenceElement: this.element\n    }).getDocument();\n    return this.loadDocument(document);\n  }\n\n  loadJSON(_ref) {\n    let {\n      document,\n      selectedRange\n    } = _ref;\n    document = Document.fromJSON(document);\n    return this.loadSnapshot({\n      document,\n      selectedRange\n    });\n  }\n\n  loadSnapshot(snapshot) {\n    this.undoManager = new UndoManager(this.composition);\n    return this.composition.loadSnapshot(snapshot);\n  }\n\n  getDocument() {\n    return this.composition.document;\n  }\n\n  getSelectedDocument() {\n    return this.composition.getSelectedDocument();\n  }\n\n  getSnapshot() {\n    return this.composition.getSnapshot();\n  }\n\n  toJSON() {\n    return this.getSnapshot();\n  } // Document manipulation\n\n\n  deleteInDirection(direction) {\n    return this.composition.deleteInDirection(direction);\n  }\n\n  insertAttachment(attachment) {\n    return this.composition.insertAttachment(attachment);\n  }\n\n  insertAttachments(attachments) {\n    return this.composition.insertAttachments(attachments);\n  }\n\n  insertDocument(document) {\n    return this.composition.insertDocument(document);\n  }\n\n  insertFile(file) {\n    return this.composition.insertFile(file);\n  }\n\n  insertFiles(files) {\n    return this.composition.insertFiles(files);\n  }\n\n  insertHTML(html) {\n    return this.composition.insertHTML(html);\n  }\n\n  insertString(string) {\n    return this.composition.insertString(string);\n  }\n\n  insertText(text) {\n    return this.composition.insertText(text);\n  }\n\n  insertLineBreak() {\n    return this.composition.insertLineBreak();\n  } // Selection\n\n\n  getSelectedRange() {\n    return this.composition.getSelectedRange();\n  }\n\n  getPosition() {\n    return this.composition.getPosition();\n  }\n\n  getClientRectAtPosition(position) {\n    const locationRange = this.getDocument().locationRangeFromRange([position, position + 1]);\n    return this.selectionManager.getClientRectAtLocationRange(locationRange);\n  }\n\n  expandSelectionInDirection(direction) {\n    return this.composition.expandSelectionInDirection(direction);\n  }\n\n  moveCursorInDirection(direction) {\n    return this.composition.moveCursorInDirection(direction);\n  }\n\n  setSelectedRange(selectedRange) {\n    return this.composition.setSelectedRange(selectedRange);\n  } // Attributes\n\n\n  activateAttribute(name) {\n    let value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    return this.composition.setCurrentAttribute(name, value);\n  }\n\n  attributeIsActive(name) {\n    return this.composition.hasCurrentAttribute(name);\n  }\n\n  canActivateAttribute(name) {\n    return this.composition.canSetCurrentAttribute(name);\n  }\n\n  deactivateAttribute(name) {\n    return this.composition.removeCurrentAttribute(name);\n  } // Nesting level\n\n\n  canDecreaseNestingLevel() {\n    return this.composition.canDecreaseNestingLevel();\n  }\n\n  canIncreaseNestingLevel() {\n    return this.composition.canIncreaseNestingLevel();\n  }\n\n  decreaseNestingLevel() {\n    if (this.canDecreaseNestingLevel()) {\n      return this.composition.decreaseNestingLevel();\n    }\n  }\n\n  increaseNestingLevel() {\n    if (this.canIncreaseNestingLevel()) {\n      return this.composition.increaseNestingLevel();\n    }\n  } // Undo/redo\n\n\n  canRedo() {\n    return this.undoManager.canRedo();\n  }\n\n  canUndo() {\n    return this.undoManager.canUndo();\n  }\n\n  recordUndoEntry(description) {\n    let {\n      context,\n      consolidatable\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    return this.undoManager.recordUndoEntry(description, {\n      context,\n      consolidatable\n    });\n  }\n\n  redo() {\n    if (this.canRedo()) {\n      return this.undoManager.redo();\n    }\n  }\n\n  undo() {\n    if (this.canUndo()) {\n      return this.undoManager.undo();\n    }\n  }\n\n}\n\n/* eslint-disable\n    no-var,\n    prefer-const,\n*/\nclass LocationMapper {\n  constructor(element) {\n    this.element = element;\n  }\n\n  findLocationFromContainerAndOffset(container, offset) {\n    let {\n      strict\n    } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n      strict: true\n    };\n    let childIndex = 0;\n    let foundBlock = false;\n    const location = {\n      index: 0,\n      offset: 0\n    };\n    const attachmentElement = this.findAttachmentElementParentForNode(container);\n\n    if (attachmentElement) {\n      container = attachmentElement.parentNode;\n      offset = findChildIndexOfNode(attachmentElement);\n    }\n\n    const walker = walkTree(this.element, {\n      usingFilter: rejectAttachmentContents\n    });\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode;\n\n      if (node === container && nodeIsTextNode(container)) {\n        if (!nodeIsCursorTarget(node)) {\n          location.offset += offset;\n        }\n\n        break;\n      } else {\n        if (node.parentNode === container) {\n          if (childIndex++ === offset) {\n            break;\n          }\n        } else if (!elementContainsNode(container, node)) {\n          if (childIndex > 0) {\n            break;\n          }\n        }\n\n        if (nodeIsBlockStart(node, {\n          strict\n        })) {\n          if (foundBlock) {\n            location.index++;\n          }\n\n          location.offset = 0;\n          foundBlock = true;\n        } else {\n          location.offset += nodeLength(node);\n        }\n      }\n    }\n\n    return location;\n  }\n\n  findContainerAndOffsetFromLocation(location) {\n    let container, offset;\n\n    if (location.index === 0 && location.offset === 0) {\n      container = this.element;\n      offset = 0;\n\n      while (container.firstChild) {\n        container = container.firstChild;\n\n        if (nodeIsBlockContainer(container)) {\n          offset = 1;\n          break;\n        }\n      }\n\n      return [container, offset];\n    }\n\n    let [node, nodeOffset] = this.findNodeAndOffsetFromLocation(location);\n    if (!node) return;\n\n    if (nodeIsTextNode(node)) {\n      if (nodeLength(node) === 0) {\n        container = node.parentNode.parentNode;\n        offset = findChildIndexOfNode(node.parentNode);\n\n        if (nodeIsCursorTarget(node, {\n          name: \"right\"\n        })) {\n          offset++;\n        }\n      } else {\n        container = node;\n        offset = location.offset - nodeOffset;\n      }\n    } else {\n      container = node.parentNode;\n\n      if (!nodeIsBlockStart(node.previousSibling)) {\n        if (!nodeIsBlockContainer(container)) {\n          while (node === container.lastChild) {\n            node = container;\n            container = container.parentNode;\n\n            if (nodeIsBlockContainer(container)) {\n              break;\n            }\n          }\n        }\n      }\n\n      offset = findChildIndexOfNode(node);\n\n      if (location.offset !== 0) {\n        offset++;\n      }\n    }\n\n    return [container, offset];\n  }\n\n  findNodeAndOffsetFromLocation(location) {\n    let node, nodeOffset;\n    let offset = 0;\n\n    for (const currentNode of this.getSignificantNodesForIndex(location.index)) {\n      const length = nodeLength(currentNode);\n\n      if (location.offset <= offset + length) {\n        if (nodeIsTextNode(currentNode)) {\n          node = currentNode;\n          nodeOffset = offset;\n\n          if (location.offset === nodeOffset && nodeIsCursorTarget(node)) {\n            break;\n          }\n        } else if (!node) {\n          node = currentNode;\n          nodeOffset = offset;\n        }\n      }\n\n      offset += length;\n\n      if (offset > location.offset) {\n        break;\n      }\n    }\n\n    return [node, nodeOffset];\n  } // Private\n\n\n  findAttachmentElementParentForNode(node) {\n    while (node && node !== this.element) {\n      if (nodeIsAttachmentElement(node)) {\n        return node;\n      }\n\n      node = node.parentNode;\n    }\n  }\n\n  getSignificantNodesForIndex(index) {\n    const nodes = [];\n    const walker = walkTree(this.element, {\n      usingFilter: acceptSignificantNodes\n    });\n    let recordingNodes = false;\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode;\n\n      if (nodeIsBlockStartComment(node)) {\n        var blockIndex;\n\n        if (blockIndex != null) {\n          blockIndex++;\n        } else {\n          blockIndex = 0;\n        }\n\n        if (blockIndex === index) {\n          recordingNodes = true;\n        } else if (recordingNodes) {\n          break;\n        }\n      } else if (recordingNodes) {\n        nodes.push(node);\n      }\n    }\n\n    return nodes;\n  }\n\n}\n\nconst nodeLength = function (node) {\n  if (node.nodeType === Node.TEXT_NODE) {\n    if (nodeIsCursorTarget(node)) {\n      return 0;\n    } else {\n      const string = node.textContent;\n      return string.length;\n    }\n  } else if (tagName(node) === \"br\" || nodeIsAttachmentElement(node)) {\n    return 1;\n  } else {\n    return 0;\n  }\n};\n\nconst acceptSignificantNodes = function (node) {\n  if (rejectEmptyTextNodes(node) === NodeFilter.FILTER_ACCEPT) {\n    return rejectAttachmentContents(node);\n  } else {\n    return NodeFilter.FILTER_REJECT;\n  }\n};\n\nconst rejectEmptyTextNodes = function (node) {\n  if (nodeIsEmptyTextNode(node)) {\n    return NodeFilter.FILTER_REJECT;\n  } else {\n    return NodeFilter.FILTER_ACCEPT;\n  }\n};\n\nconst rejectAttachmentContents = function (node) {\n  if (nodeIsAttachmentElement(node.parentNode)) {\n    return NodeFilter.FILTER_REJECT;\n  } else {\n    return NodeFilter.FILTER_ACCEPT;\n  }\n};\n\n/* eslint-disable\n    id-length,\n    no-empty,\n*/\nclass PointMapper {\n  createDOMRangeFromPoint(_ref) {\n    let {\n      x,\n      y\n    } = _ref;\n    let domRange;\n\n    if (document.caretPositionFromPoint) {\n      const {\n        offsetNode,\n        offset\n      } = document.caretPositionFromPoint(x, y);\n      domRange = document.createRange();\n      domRange.setStart(offsetNode, offset);\n      return domRange;\n    } else if (document.caretRangeFromPoint) {\n      return document.caretRangeFromPoint(x, y);\n    } else if (document.body.createTextRange) {\n      const originalDOMRange = getDOMRange();\n\n      try {\n        // IE 11 throws \"Unspecified error\" when using moveToPoint\n        // during a drag-and-drop operation.\n        const textRange = document.body.createTextRange();\n        textRange.moveToPoint(x, y);\n        textRange.select();\n      } catch (error) {}\n\n      domRange = getDOMRange();\n      setDOMRange(originalDOMRange);\n      return domRange;\n    }\n  }\n\n  getClientRectsForDOMRange(domRange) {\n    const array = Array.from(domRange.getClientRects());\n    const start = array[0];\n    const end = array[array.length - 1];\n    return [start, end];\n  }\n\n}\n\n/* eslint-disable\n*/\nclass SelectionManager extends BasicObject {\n  constructor(element) {\n    super(...arguments);\n    this.didMouseDown = this.didMouseDown.bind(this);\n    this.selectionDidChange = this.selectionDidChange.bind(this);\n    this.element = element;\n    this.locationMapper = new LocationMapper(this.element);\n    this.pointMapper = new PointMapper();\n    this.lockCount = 0;\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      withCallback: this.didMouseDown\n    });\n  }\n\n  getLocationRange() {\n    let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    if (options.strict === false) {\n      return this.createLocationRangeFromDOMRange(getDOMRange());\n    } else if (options.ignoreLock) {\n      return this.currentLocationRange;\n    } else if (this.lockedLocationRange) {\n      return this.lockedLocationRange;\n    } else {\n      return this.currentLocationRange;\n    }\n  }\n\n  setLocationRange(locationRange) {\n    if (this.lockedLocationRange) return;\n    locationRange = normalizeRange(locationRange);\n    const domRange = this.createDOMRangeFromLocationRange(locationRange);\n\n    if (domRange) {\n      setDOMRange(domRange);\n      this.updateCurrentLocationRange(locationRange);\n    }\n  }\n\n  setLocationRangeFromPointRange(pointRange) {\n    pointRange = normalizeRange(pointRange);\n    const startLocation = this.getLocationAtPoint(pointRange[0]);\n    const endLocation = this.getLocationAtPoint(pointRange[1]);\n    this.setLocationRange([startLocation, endLocation]);\n  }\n\n  getClientRectAtLocationRange(locationRange) {\n    const domRange = this.createDOMRangeFromLocationRange(locationRange);\n\n    if (domRange) {\n      return this.getClientRectsForDOMRange(domRange)[1];\n    }\n  }\n\n  locationIsCursorTarget(location) {\n    const node = Array.from(this.findNodeAndOffsetFromLocation(location))[0];\n    return nodeIsCursorTarget(node);\n  }\n\n  lock() {\n    if (this.lockCount++ === 0) {\n      this.updateCurrentLocationRange();\n      this.lockedLocationRange = this.getLocationRange();\n    }\n  }\n\n  unlock() {\n    if (--this.lockCount === 0) {\n      const {\n        lockedLocationRange\n      } = this;\n      this.lockedLocationRange = null;\n\n      if (lockedLocationRange != null) {\n        return this.setLocationRange(lockedLocationRange);\n      }\n    }\n  }\n\n  clearSelection() {\n    var _getDOMSelection;\n\n    return (_getDOMSelection = getDOMSelection()) === null || _getDOMSelection === void 0 ? void 0 : _getDOMSelection.removeAllRanges();\n  }\n\n  selectionIsCollapsed() {\n    var _getDOMRange;\n\n    return ((_getDOMRange = getDOMRange()) === null || _getDOMRange === void 0 ? void 0 : _getDOMRange.collapsed) === true;\n  }\n\n  selectionIsExpanded() {\n    return !this.selectionIsCollapsed();\n  }\n\n  createLocationRangeFromDOMRange(domRange, options) {\n    if (domRange == null || !this.domRangeWithinElement(domRange)) return;\n    const start = this.findLocationFromContainerAndOffset(domRange.startContainer, domRange.startOffset, options);\n    if (!start) return;\n    const end = domRange.collapsed ? undefined : this.findLocationFromContainerAndOffset(domRange.endContainer, domRange.endOffset, options);\n    return normalizeRange([start, end]);\n  }\n\n  didMouseDown() {\n    return this.pauseTemporarily();\n  }\n\n  pauseTemporarily() {\n    let resumeHandlers;\n    this.paused = true;\n\n    const resume = () => {\n      this.paused = false;\n      clearTimeout(resumeTimeout);\n      Array.from(resumeHandlers).forEach(handler => {\n        handler.destroy();\n      });\n\n      if (elementContainsNode(document, this.element)) {\n        return this.selectionDidChange();\n      }\n    };\n\n    const resumeTimeout = setTimeout(resume, 200);\n    resumeHandlers = [\"mousemove\", \"keydown\"].map(eventName => handleEvent(eventName, {\n      onElement: document,\n      withCallback: resume\n    }));\n  }\n\n  selectionDidChange() {\n    if (!this.paused && !innerElementIsActive(this.element)) {\n      return this.updateCurrentLocationRange();\n    }\n  }\n\n  updateCurrentLocationRange(locationRange) {\n    if (locationRange != null ? locationRange : locationRange = this.createLocationRangeFromDOMRange(getDOMRange())) {\n      if (!rangesAreEqual(locationRange, this.currentLocationRange)) {\n        var _this$delegate, _this$delegate$locati;\n\n        this.currentLocationRange = locationRange;\n        return (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$locati = _this$delegate.locationRangeDidChange) === null || _this$delegate$locati === void 0 ? void 0 : _this$delegate$locati.call(_this$delegate, this.currentLocationRange.slice(0));\n      }\n    }\n  }\n\n  createDOMRangeFromLocationRange(locationRange) {\n    const rangeStart = this.findContainerAndOffsetFromLocation(locationRange[0]);\n    const rangeEnd = rangeIsCollapsed(locationRange) ? rangeStart : this.findContainerAndOffsetFromLocation(locationRange[1]) || rangeStart;\n\n    if (rangeStart != null && rangeEnd != null) {\n      const domRange = document.createRange();\n      domRange.setStart(...Array.from(rangeStart || []));\n      domRange.setEnd(...Array.from(rangeEnd || []));\n      return domRange;\n    }\n  }\n\n  getLocationAtPoint(point) {\n    const domRange = this.createDOMRangeFromPoint(point);\n\n    if (domRange) {\n      var _this$createLocationR;\n\n      return (_this$createLocationR = this.createLocationRangeFromDOMRange(domRange)) === null || _this$createLocationR === void 0 ? void 0 : _this$createLocationR[0];\n    }\n  }\n\n  domRangeWithinElement(domRange) {\n    if (domRange.collapsed) {\n      return elementContainsNode(this.element, domRange.startContainer);\n    } else {\n      return elementContainsNode(this.element, domRange.startContainer) && elementContainsNode(this.element, domRange.endContainer);\n    }\n  }\n\n}\nSelectionManager.proxyMethod(\"locationMapper.findLocationFromContainerAndOffset\");\nSelectionManager.proxyMethod(\"locationMapper.findContainerAndOffsetFromLocation\");\nSelectionManager.proxyMethod(\"locationMapper.findNodeAndOffsetFromLocation\");\nSelectionManager.proxyMethod(\"pointMapper.createDOMRangeFromPoint\");\nSelectionManager.proxyMethod(\"pointMapper.getClientRectsForDOMRange\");\n\nvar models = {\n  Attachment,\n  AttachmentManager,\n  AttachmentPiece,\n  Block,\n  Composition,\n  Cocument: Document,\n  Editor,\n  HtmlParser: HTMLParser,\n  HtmlSanitizer: HTMLSanitizer,\n  LineBreakInsertion,\n  LocationMapper,\n  ManagedAttachment,\n  Piece,\n  PointMapper,\n  SelectionManager,\n  SplittableList,\n  StringPiece,\n  Text,\n  UndoManager\n};\n\nconst Trix = {\n  VERSION: version,\n  config\n};\nObject.assign(Trix, models);\nwindow.Trix = Trix;\n\nclass ObjectGroup {\n  static groupObjects() {\n    let ungroupedObjects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    let {\n      depth,\n      asTree\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let group;\n\n    if (asTree) {\n      if (depth == null) {\n        depth = 0;\n      }\n    }\n\n    const objects = [];\n    Array.from(ungroupedObjects).forEach(object => {\n      var _object$canBeGrouped2;\n\n      if (group) {\n        var _object$canBeGrouped, _group$canBeGroupedWi, _group;\n\n        if ((_object$canBeGrouped = object.canBeGrouped) !== null && _object$canBeGrouped !== void 0 && _object$canBeGrouped.call(object, depth) && (_group$canBeGroupedWi = (_group = group[group.length - 1]).canBeGroupedWith) !== null && _group$canBeGroupedWi !== void 0 && _group$canBeGroupedWi.call(_group, object, depth)) {\n          group.push(object);\n          return;\n        } else {\n          objects.push(new this(group, {\n            depth,\n            asTree\n          }));\n          group = null;\n        }\n      }\n\n      if ((_object$canBeGrouped2 = object.canBeGrouped) !== null && _object$canBeGrouped2 !== void 0 && _object$canBeGrouped2.call(object, depth)) {\n        group = [object];\n      } else {\n        objects.push(object);\n      }\n    });\n\n    if (group) {\n      objects.push(new this(group, {\n        depth,\n        asTree\n      }));\n    }\n\n    return objects;\n  }\n\n  constructor() {\n    let objects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    let {\n      depth,\n      asTree\n    } = arguments.length > 1 ? arguments[1] : undefined;\n    this.objects = objects;\n\n    if (asTree) {\n      this.depth = depth;\n      this.objects = this.constructor.groupObjects(this.objects, {\n        asTree,\n        depth: this.depth + 1\n      });\n    }\n  }\n\n  getObjects() {\n    return this.objects;\n  }\n\n  getDepth() {\n    return this.depth;\n  }\n\n  getCacheKey() {\n    const keys = [\"objectGroup\"];\n    Array.from(this.getObjects()).forEach(object => {\n      keys.push(object.getCacheKey());\n    });\n    return keys.join(\"/\");\n  }\n\n}\n\nclass ElementStore {\n  constructor(elements) {\n    this.reset(elements);\n  }\n\n  add(element) {\n    const key = getKey(element);\n    this.elements[key] = element;\n  }\n\n  remove(element) {\n    const key = getKey(element);\n    const value = this.elements[key];\n\n    if (value) {\n      delete this.elements[key];\n      return value;\n    }\n  }\n\n  reset() {\n    let elements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    this.elements = {};\n    Array.from(elements).forEach(element => {\n      this.add(element);\n    });\n    return elements;\n  }\n\n}\n\nconst getKey = element => element.dataset.trixStoreKey;\n\nclass ObjectView extends BasicObject {\n  constructor(object) {\n    let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    super(...arguments);\n    this.object = object;\n    this.options = options;\n    this.childViews = [];\n    this.rootView = this;\n  }\n\n  getNodes() {\n    if (!this.nodes) {\n      this.nodes = this.createNodes();\n    }\n\n    return this.nodes.map(node => node.cloneNode(true));\n  }\n\n  invalidate() {\n    var _this$parentView;\n\n    this.nodes = null;\n    this.childViews = [];\n    return (_this$parentView = this.parentView) === null || _this$parentView === void 0 ? void 0 : _this$parentView.invalidate();\n  }\n\n  invalidateViewForObject(object) {\n    var _this$findViewForObje;\n\n    return (_this$findViewForObje = this.findViewForObject(object)) === null || _this$findViewForObje === void 0 ? void 0 : _this$findViewForObje.invalidate();\n  }\n\n  findOrCreateCachedChildView(viewClass, object, options) {\n    let view = this.getCachedViewForObject(object);\n\n    if (view) {\n      this.recordChildView(view);\n    } else {\n      view = this.createChildView(...arguments);\n      this.cacheViewForObject(view, object);\n    }\n\n    return view;\n  }\n\n  createChildView(viewClass, object) {\n    let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    if (object instanceof ObjectGroup) {\n      options.viewClass = viewClass;\n      viewClass = ObjectGroupView;\n    }\n\n    const view = new viewClass(object, options);\n    return this.recordChildView(view);\n  }\n\n  recordChildView(view) {\n    view.parentView = this;\n    view.rootView = this.rootView;\n    this.childViews.push(view);\n    return view;\n  }\n\n  getAllChildViews() {\n    let views = [];\n    this.childViews.forEach(childView => {\n      views.push(childView);\n      views = views.concat(childView.getAllChildViews());\n    });\n    return views;\n  }\n\n  findElement() {\n    return this.findElementForObject(this.object);\n  }\n\n  findElementForObject(object) {\n    const id = object === null || object === void 0 ? void 0 : object.id;\n\n    if (id) {\n      return this.rootView.element.querySelector(\"[data-trix-id='\".concat(id, \"']\"));\n    }\n  }\n\n  findViewForObject(object) {\n    for (const view of this.getAllChildViews()) {\n      if (view.object === object) {\n        return view;\n      }\n    }\n  }\n\n  getViewCache() {\n    if (this.rootView === this) {\n      if (this.isViewCachingEnabled()) {\n        if (!this.viewCache) {\n          this.viewCache = {};\n        }\n\n        return this.viewCache;\n      }\n    } else {\n      return this.rootView.getViewCache();\n    }\n  }\n\n  isViewCachingEnabled() {\n    return this.shouldCacheViews !== false;\n  }\n\n  enableViewCaching() {\n    this.shouldCacheViews = true;\n  }\n\n  disableViewCaching() {\n    this.shouldCacheViews = false;\n  }\n\n  getCachedViewForObject(object) {\n    var _this$getViewCache;\n\n    return (_this$getViewCache = this.getViewCache()) === null || _this$getViewCache === void 0 ? void 0 : _this$getViewCache[object.getCacheKey()];\n  }\n\n  cacheViewForObject(view, object) {\n    const cache = this.getViewCache();\n\n    if (cache) {\n      cache[object.getCacheKey()] = view;\n    }\n  }\n\n  garbageCollectCachedViews() {\n    const cache = this.getViewCache();\n\n    if (cache) {\n      const views = this.getAllChildViews().concat(this);\n      const objectKeys = views.map(view => view.object.getCacheKey());\n\n      for (const key in cache) {\n        if (!objectKeys.includes(key)) {\n          delete cache[key];\n        }\n      }\n    }\n  }\n\n}\nclass ObjectGroupView extends ObjectView {\n  constructor() {\n    super(...arguments);\n    this.objectGroup = this.object;\n    this.viewClass = this.options.viewClass;\n    delete this.options.viewClass;\n  }\n\n  getChildViews() {\n    if (!this.childViews.length) {\n      Array.from(this.objectGroup.getObjects()).forEach(object => {\n        this.findOrCreateCachedChildView(this.viewClass, object, this.options);\n      });\n    }\n\n    return this.childViews;\n  }\n\n  createNodes() {\n    const element = this.createContainerElement();\n    this.getChildViews().forEach(view => {\n      Array.from(view.getNodes()).forEach(node => {\n        element.appendChild(node);\n      });\n    });\n    return [element];\n  }\n\n  createContainerElement() {\n    let depth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.objectGroup.getDepth();\n    return this.getChildViews()[0].createContainerElement(depth);\n  }\n\n}\n\nconst {\n  css: css$2\n} = config;\nclass AttachmentView extends ObjectView {\n  constructor() {\n    super(...arguments);\n    this.attachment = this.object;\n    this.attachment.uploadProgressDelegate = this;\n    this.attachmentPiece = this.options.piece;\n  }\n\n  createContentNodes() {\n    return [];\n  }\n\n  createNodes() {\n    let innerElement;\n    const figure = innerElement = makeElement({\n      tagName: \"figure\",\n      className: this.getClassName(),\n      data: this.getData(),\n      editable: false\n    });\n    const href = this.getHref();\n\n    if (href) {\n      innerElement = makeElement({\n        tagName: \"a\",\n        editable: false,\n        attributes: {\n          href,\n          tabindex: -1\n        }\n      });\n      figure.appendChild(innerElement);\n    }\n\n    if (this.attachment.hasContent()) {\n      innerElement.innerHTML = this.attachment.getContent();\n    } else {\n      this.createContentNodes().forEach(node => {\n        innerElement.appendChild(node);\n      });\n    }\n\n    innerElement.appendChild(this.createCaptionElement());\n\n    if (this.attachment.isPending()) {\n      this.progressElement = makeElement({\n        tagName: \"progress\",\n        attributes: {\n          class: css$2.attachmentProgress,\n          value: this.attachment.getUploadProgress(),\n          max: 100\n        },\n        data: {\n          trixMutable: true,\n          trixStoreKey: [\"progressElement\", this.attachment.id].join(\"/\")\n        }\n      });\n      figure.appendChild(this.progressElement);\n    }\n\n    return [createCursorTarget(\"left\"), figure, createCursorTarget(\"right\")];\n  }\n\n  createCaptionElement() {\n    const figcaption = makeElement({\n      tagName: \"figcaption\",\n      className: css$2.attachmentCaption\n    });\n    const caption = this.attachmentPiece.getCaption();\n\n    if (caption) {\n      figcaption.classList.add(\"\".concat(css$2.attachmentCaption, \"--edited\"));\n      figcaption.textContent = caption;\n    } else {\n      let name, size;\n      const captionConfig = this.getCaptionConfig();\n\n      if (captionConfig.name) {\n        name = this.attachment.getFilename();\n      }\n\n      if (captionConfig.size) {\n        size = this.attachment.getFormattedFilesize();\n      }\n\n      if (name) {\n        const nameElement = makeElement({\n          tagName: \"span\",\n          className: css$2.attachmentName,\n          textContent: name\n        });\n        figcaption.appendChild(nameElement);\n      }\n\n      if (size) {\n        if (name) {\n          figcaption.appendChild(document.createTextNode(\" \"));\n        }\n\n        const sizeElement = makeElement({\n          tagName: \"span\",\n          className: css$2.attachmentSize,\n          textContent: size\n        });\n        figcaption.appendChild(sizeElement);\n      }\n    }\n\n    return figcaption;\n  }\n\n  getClassName() {\n    const names = [css$2.attachment, \"\".concat(css$2.attachment, \"--\").concat(this.attachment.getType())];\n    const extension = this.attachment.getExtension();\n\n    if (extension) {\n      names.push(\"\".concat(css$2.attachment, \"--\").concat(extension));\n    }\n\n    return names.join(\" \");\n  }\n\n  getData() {\n    const data = {\n      trixAttachment: JSON.stringify(this.attachment),\n      trixContentType: this.attachment.getContentType(),\n      trixId: this.attachment.id\n    };\n    const {\n      attributes\n    } = this.attachmentPiece;\n\n    if (!attributes.isEmpty()) {\n      data.trixAttributes = JSON.stringify(attributes);\n    }\n\n    if (this.attachment.isPending()) {\n      data.trixSerialize = false;\n    }\n\n    return data;\n  }\n\n  getHref() {\n    if (!htmlContainsTagName(this.attachment.getContent(), \"a\")) {\n      return this.attachment.getHref();\n    }\n  }\n\n  getCaptionConfig() {\n    var _config$attachments$t;\n\n    const type = this.attachment.getType();\n    const captionConfig = copyObject((_config$attachments$t = config.attachments[type]) === null || _config$attachments$t === void 0 ? void 0 : _config$attachments$t.caption);\n\n    if (type === \"file\") {\n      captionConfig.name = true;\n    }\n\n    return captionConfig;\n  }\n\n  findProgressElement() {\n    var _this$findElement;\n\n    return (_this$findElement = this.findElement()) === null || _this$findElement === void 0 ? void 0 : _this$findElement.querySelector(\"progress\");\n  } // Attachment delegate\n\n\n  attachmentDidChangeUploadProgress() {\n    const value = this.attachment.getUploadProgress();\n    const progressElement = this.findProgressElement();\n\n    if (progressElement) {\n      progressElement.value = value;\n    }\n  }\n\n}\n\nconst createCursorTarget = name => makeElement({\n  tagName: \"span\",\n  textContent: ZERO_WIDTH_SPACE,\n  data: {\n    trixCursorTarget: name,\n    trixSerialize: false\n  }\n});\n\nconst htmlContainsTagName = function (html, tagName) {\n  const div = makeElement(\"div\");\n  div.innerHTML = html || \"\";\n  return div.querySelector(tagName);\n};\n\nclass PreviewableAttachmentView extends AttachmentView {\n  constructor() {\n    super(...arguments);\n    this.attachment.previewDelegate = this;\n  }\n\n  createContentNodes() {\n    this.image = makeElement({\n      tagName: \"img\",\n      attributes: {\n        src: \"\"\n      },\n      data: {\n        trixMutable: true\n      }\n    });\n    this.refresh(this.image);\n    return [this.image];\n  }\n\n  createCaptionElement() {\n    const figcaption = super.createCaptionElement(...arguments);\n\n    if (!figcaption.textContent) {\n      figcaption.setAttribute(\"data-trix-placeholder\", config.lang.captionPlaceholder);\n    }\n\n    return figcaption;\n  }\n\n  refresh(image) {\n    if (!image) {\n      var _this$findElement;\n\n      image = (_this$findElement = this.findElement()) === null || _this$findElement === void 0 ? void 0 : _this$findElement.querySelector(\"img\");\n    }\n\n    if (image) {\n      return this.updateAttributesForImage(image);\n    }\n  }\n\n  updateAttributesForImage(image) {\n    const url = this.attachment.getURL();\n    const previewURL = this.attachment.getPreviewURL();\n    image.src = previewURL || url;\n\n    if (previewURL === url) {\n      image.removeAttribute(\"data-trix-serialized-attributes\");\n    } else {\n      const serializedAttributes = JSON.stringify({\n        src: url\n      });\n      image.setAttribute(\"data-trix-serialized-attributes\", serializedAttributes);\n    }\n\n    const width = this.attachment.getWidth();\n    const height = this.attachment.getHeight();\n\n    if (width != null) {\n      image.width = width;\n    }\n\n    if (height != null) {\n      image.height = height;\n    }\n\n    const storeKey = [\"imageElement\", this.attachment.id, image.src, image.width, image.height].join(\"/\");\n    image.dataset.trixStoreKey = storeKey;\n  } // Attachment delegate\n\n\n  attachmentDidChangeAttributes() {\n    this.refresh(this.image);\n    return this.refresh();\n  }\n\n}\n\n/* eslint-disable\n    no-useless-escape,\n    no-var,\n*/\nclass PieceView extends ObjectView {\n  constructor() {\n    super(...arguments);\n    this.piece = this.object;\n    this.attributes = this.piece.getAttributes();\n    this.textConfig = this.options.textConfig;\n    this.context = this.options.context;\n\n    if (this.piece.attachment) {\n      this.attachment = this.piece.attachment;\n    } else {\n      this.string = this.piece.toString();\n    }\n  }\n\n  createNodes() {\n    let nodes = this.attachment ? this.createAttachmentNodes() : this.createStringNodes();\n    const element = this.createElement();\n\n    if (element) {\n      const innerElement = findInnerElement(element);\n      Array.from(nodes).forEach(node => {\n        innerElement.appendChild(node);\n      });\n      nodes = [element];\n    }\n\n    return nodes;\n  }\n\n  createAttachmentNodes() {\n    const constructor = this.attachment.isPreviewable() ? PreviewableAttachmentView : AttachmentView;\n    const view = this.createChildView(constructor, this.piece.attachment, {\n      piece: this.piece\n    });\n    return view.getNodes();\n  }\n\n  createStringNodes() {\n    var _this$textConfig;\n\n    if ((_this$textConfig = this.textConfig) !== null && _this$textConfig !== void 0 && _this$textConfig.plaintext) {\n      return [document.createTextNode(this.string)];\n    } else {\n      const nodes = [];\n      const iterable = this.string.split(\"\\n\");\n\n      for (let index = 0; index < iterable.length; index++) {\n        const substring = iterable[index];\n\n        if (index > 0) {\n          const element = makeElement(\"br\");\n          nodes.push(element);\n        }\n\n        if (substring.length) {\n          const node = document.createTextNode(this.preserveSpaces(substring));\n          nodes.push(node);\n        }\n      }\n\n      return nodes;\n    }\n  }\n\n  createElement() {\n    let element, key, value;\n    const styles = {};\n\n    for (key in this.attributes) {\n      value = this.attributes[key];\n      const config = getTextConfig(key);\n\n      if (config) {\n        if (config.tagName) {\n          var innerElement;\n          const pendingElement = makeElement(config.tagName);\n\n          if (innerElement) {\n            innerElement.appendChild(pendingElement);\n            innerElement = pendingElement;\n          } else {\n            element = innerElement = pendingElement;\n          }\n        }\n\n        if (config.styleProperty) {\n          styles[config.styleProperty] = value;\n        }\n\n        if (config.style) {\n          for (key in config.style) {\n            value = config.style[key];\n            styles[key] = value;\n          }\n        }\n      }\n    }\n\n    if (Object.keys(styles).length) {\n      if (!element) {\n        element = makeElement(\"span\");\n      }\n\n      for (key in styles) {\n        value = styles[key];\n        element.style[key] = value;\n      }\n    }\n\n    return element;\n  }\n\n  createContainerElement() {\n    for (const key in this.attributes) {\n      const value = this.attributes[key];\n      const config = getTextConfig(key);\n\n      if (config) {\n        if (config.groupTagName) {\n          const attributes = {};\n          attributes[key] = value;\n          return makeElement(config.groupTagName, attributes);\n        }\n      }\n    }\n  }\n\n  preserveSpaces(string) {\n    if (this.context.isLast) {\n      string = string.replace(/\\ $/, NON_BREAKING_SPACE);\n    }\n\n    string = string.replace(/(\\S)\\ {3}(\\S)/g, \"$1 \".concat(NON_BREAKING_SPACE, \" $2\")).replace(/\\ {2}/g, \"\".concat(NON_BREAKING_SPACE, \" \")).replace(/\\ {2}/g, \" \".concat(NON_BREAKING_SPACE));\n\n    if (this.context.isFirst || this.context.followsWhitespace) {\n      string = string.replace(/^\\ /, NON_BREAKING_SPACE);\n    }\n\n    return string;\n  }\n\n}\n\n/* eslint-disable\n    no-var,\n*/\nclass TextView extends ObjectView {\n  constructor() {\n    super(...arguments);\n    this.text = this.object;\n    this.textConfig = this.options.textConfig;\n  }\n\n  createNodes() {\n    const nodes = [];\n    const pieces = ObjectGroup.groupObjects(this.getPieces());\n    const lastIndex = pieces.length - 1;\n\n    for (let index = 0; index < pieces.length; index++) {\n      const piece = pieces[index];\n      const context = {};\n\n      if (index === 0) {\n        context.isFirst = true;\n      }\n\n      if (index === lastIndex) {\n        context.isLast = true;\n      }\n\n      if (endsWithWhitespace(previousPiece)) {\n        context.followsWhitespace = true;\n      }\n\n      const view = this.findOrCreateCachedChildView(PieceView, piece, {\n        textConfig: this.textConfig,\n        context\n      });\n      nodes.push(...Array.from(view.getNodes() || []));\n      var previousPiece = piece;\n    }\n\n    return nodes;\n  }\n\n  getPieces() {\n    return Array.from(this.text.getPieces()).filter(piece => !piece.hasAttribute(\"blockBreak\"));\n  }\n\n}\n\nconst endsWithWhitespace = piece => /\\s$/.test(piece === null || piece === void 0 ? void 0 : piece.toString());\n\nconst {\n  css: css$1\n} = config;\nclass BlockView extends ObjectView {\n  constructor() {\n    super(...arguments);\n    this.block = this.object;\n    this.attributes = this.block.getAttributes();\n  }\n\n  createNodes() {\n    const comment = document.createComment(\"block\");\n    const nodes = [comment];\n\n    if (this.block.isEmpty()) {\n      nodes.push(makeElement(\"br\"));\n    } else {\n      var _getBlockConfig;\n\n      const textConfig = (_getBlockConfig = getBlockConfig(this.block.getLastAttribute())) === null || _getBlockConfig === void 0 ? void 0 : _getBlockConfig.text;\n      const textView = this.findOrCreateCachedChildView(TextView, this.block.text, {\n        textConfig\n      });\n      nodes.push(...Array.from(textView.getNodes() || []));\n\n      if (this.shouldAddExtraNewlineElement()) {\n        nodes.push(makeElement(\"br\"));\n      }\n    }\n\n    if (this.attributes.length) {\n      return nodes;\n    } else {\n      let attributes;\n      const {\n        tagName\n      } = config.blockAttributes.default;\n\n      if (this.block.isRTL()) {\n        attributes = {\n          dir: \"rtl\"\n        };\n      }\n\n      const element = makeElement({\n        tagName,\n        attributes\n      });\n      nodes.forEach(node => element.appendChild(node));\n      return [element];\n    }\n  }\n\n  createContainerElement(depth) {\n    let attributes, className;\n    const attributeName = this.attributes[depth];\n    const {\n      tagName\n    } = getBlockConfig(attributeName);\n\n    if (depth === 0 && this.block.isRTL()) {\n      attributes = {\n        dir: \"rtl\"\n      };\n    }\n\n    if (attributeName === \"attachmentGallery\") {\n      const size = this.block.getBlockBreakPosition();\n      className = \"\".concat(css$1.attachmentGallery, \" \").concat(css$1.attachmentGallery, \"--\").concat(size);\n    }\n\n    return makeElement({\n      tagName,\n      className,\n      attributes\n    });\n  } // A single <br> at the end of a block element has no visual representation\n  // so add an extra one.\n\n\n  shouldAddExtraNewlineElement() {\n    return /\\n\\n$/.test(this.block.toString());\n  }\n\n}\n\nclass DocumentView extends ObjectView {\n  static render(document) {\n    const element = makeElement(\"div\");\n    const view = new this(document, {\n      element\n    });\n    view.render();\n    view.sync();\n    return element;\n  }\n\n  constructor() {\n    super(...arguments);\n    this.element = this.options.element;\n    this.elementStore = new ElementStore();\n    this.setDocument(this.object);\n  }\n\n  setDocument(document) {\n    if (!document.isEqualTo(this.document)) {\n      this.document = this.object = document;\n    }\n  }\n\n  render() {\n    this.childViews = [];\n    this.shadowElement = makeElement(\"div\");\n\n    if (!this.document.isEmpty()) {\n      const objects = ObjectGroup.groupObjects(this.document.getBlocks(), {\n        asTree: true\n      });\n      Array.from(objects).forEach(object => {\n        const view = this.findOrCreateCachedChildView(BlockView, object);\n        Array.from(view.getNodes()).map(node => this.shadowElement.appendChild(node));\n      });\n    }\n  }\n\n  isSynced() {\n    return elementsHaveEqualHTML(this.shadowElement, this.element);\n  }\n\n  sync() {\n    const fragment = this.createDocumentFragmentForSync();\n\n    while (this.element.lastChild) {\n      this.element.removeChild(this.element.lastChild);\n    }\n\n    this.element.appendChild(fragment);\n    return this.didSync();\n  } // Private\n\n\n  didSync() {\n    this.elementStore.reset(findStoredElements(this.element));\n    return defer(() => this.garbageCollectCachedViews());\n  }\n\n  createDocumentFragmentForSync() {\n    const fragment = document.createDocumentFragment();\n    Array.from(this.shadowElement.childNodes).forEach(node => {\n      fragment.appendChild(node.cloneNode(true));\n    });\n    Array.from(findStoredElements(fragment)).forEach(element => {\n      const storedElement = this.elementStore.remove(element);\n\n      if (storedElement) {\n        element.parentNode.replaceChild(storedElement, element);\n      }\n    });\n    return fragment;\n  }\n\n}\n\nconst findStoredElements = element => element.querySelectorAll(\"[data-trix-store-key]\");\n\nconst elementsHaveEqualHTML = (element, otherElement) => ignoreSpaces(element.innerHTML) === ignoreSpaces(otherElement.innerHTML);\n\nconst ignoreSpaces = html => html.replace(/&nbsp;/g, \" \");\n\n/* eslint-disable\n    no-empty,\n*/\nconst unserializableElementSelector = \"[data-trix-serialize=false]\";\nconst unserializableAttributeNames = [\"contenteditable\", \"data-trix-id\", \"data-trix-store-key\", \"data-trix-mutable\", \"data-trix-placeholder\", \"tabindex\"];\nconst serializedAttributesAttribute = \"data-trix-serialized-attributes\";\nconst serializedAttributesSelector = \"[\".concat(serializedAttributesAttribute, \"]\");\nconst blockCommentPattern = new RegExp(\"<!--block-->\", \"g\");\nconst serializers = {\n  \"application/json\": function (serializable) {\n    let document;\n\n    if (serializable instanceof Document) {\n      document = serializable;\n    } else if (serializable instanceof HTMLElement) {\n      document = HTMLParser.parse(serializable.innerHTML).getDocument();\n    } else {\n      throw new Error(\"unserializable object\");\n    }\n\n    return document.toSerializableDocument().toJSONString();\n  },\n  \"text/html\": function (serializable) {\n    let element;\n\n    if (serializable instanceof Document) {\n      element = DocumentView.render(serializable);\n    } else if (serializable instanceof HTMLElement) {\n      element = serializable.cloneNode(true);\n    } else {\n      throw new Error(\"unserializable object\");\n    } // Remove unserializable elements\n\n\n    Array.from(element.querySelectorAll(unserializableElementSelector)).forEach(el => {\n      removeNode(el);\n    }); // Remove unserializable attributes\n\n    unserializableAttributeNames.forEach(attribute => {\n      Array.from(element.querySelectorAll(\"[\".concat(attribute, \"]\"))).forEach(el => {\n        el.removeAttribute(attribute);\n      });\n    }); // Rewrite elements with serialized attribute overrides\n\n    Array.from(element.querySelectorAll(serializedAttributesSelector)).forEach(el => {\n      try {\n        const attributes = JSON.parse(el.getAttribute(serializedAttributesAttribute));\n        el.removeAttribute(serializedAttributesAttribute);\n\n        for (const name in attributes) {\n          const value = attributes[name];\n          el.setAttribute(name, value);\n        }\n      } catch (error) {}\n    });\n    return element.innerHTML.replace(blockCommentPattern, \"\");\n  }\n};\nconst deserializers = {\n  \"application/json\": function (string) {\n    return Document.fromJSONString(string);\n  },\n  \"text/html\": function (string) {\n    return HTMLParser.parse(string).getDocument();\n  }\n};\nconst serializeToContentType = function (serializable, contentType) {\n  const serializer = serializers[contentType];\n\n  if (serializer) {\n    return serializer(serializable);\n  } else {\n    throw new Error(\"unknown content type: \".concat(contentType));\n  }\n};\nconst deserializeFromContentType = function (string, contentType) {\n  const deserializer = deserializers[contentType];\n\n  if (deserializer) {\n    return deserializer(string);\n  } else {\n    throw new Error(\"unknown content type: \".concat(contentType));\n  }\n};\n\nconst mutableAttributeName = \"data-trix-mutable\";\nconst mutableSelector = \"[\".concat(mutableAttributeName, \"]\");\nconst options = {\n  attributes: true,\n  childList: true,\n  characterData: true,\n  characterDataOldValue: true,\n  subtree: true\n};\nclass MutationObserver extends BasicObject {\n  constructor(element) {\n    super(element);\n    this.didMutate = this.didMutate.bind(this);\n    this.element = element;\n    this.observer = new window.MutationObserver(this.didMutate);\n    this.start();\n  }\n\n  start() {\n    this.reset();\n    return this.observer.observe(this.element, options);\n  }\n\n  stop() {\n    return this.observer.disconnect();\n  }\n\n  didMutate(mutations) {\n    this.mutations.push(...Array.from(this.findSignificantMutations(mutations) || []));\n\n    if (this.mutations.length) {\n      var _this$delegate, _this$delegate$elemen;\n\n      (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$elemen = _this$delegate.elementDidMutate) === null || _this$delegate$elemen === void 0 ? void 0 : _this$delegate$elemen.call(_this$delegate, this.getMutationSummary());\n      return this.reset();\n    }\n  } // Private\n\n\n  reset() {\n    this.mutations = [];\n  }\n\n  findSignificantMutations(mutations) {\n    return mutations.filter(mutation => {\n      return this.mutationIsSignificant(mutation);\n    });\n  }\n\n  mutationIsSignificant(mutation) {\n    if (this.nodeIsMutable(mutation.target)) {\n      return false;\n    }\n\n    for (const node of Array.from(this.nodesModifiedByMutation(mutation))) {\n      if (this.nodeIsSignificant(node)) return true;\n    }\n\n    return false;\n  }\n\n  nodeIsSignificant(node) {\n    return node !== this.element && !this.nodeIsMutable(node) && !nodeIsEmptyTextNode(node);\n  }\n\n  nodeIsMutable(node) {\n    return findClosestElementFromNode(node, {\n      matchingSelector: mutableSelector\n    });\n  }\n\n  nodesModifiedByMutation(mutation) {\n    const nodes = [];\n\n    switch (mutation.type) {\n      case \"attributes\":\n        if (mutation.attributeName !== mutableAttributeName) {\n          nodes.push(mutation.target);\n        }\n\n        break;\n\n      case \"characterData\":\n        // Changes to text nodes should consider the parent element\n        nodes.push(mutation.target.parentNode);\n        nodes.push(mutation.target);\n        break;\n\n      case \"childList\":\n        // Consider each added or removed node\n        nodes.push(...Array.from(mutation.addedNodes || []));\n        nodes.push(...Array.from(mutation.removedNodes || []));\n        break;\n    }\n\n    return nodes;\n  }\n\n  getMutationSummary() {\n    return this.getTextMutationSummary();\n  }\n\n  getTextMutationSummary() {\n    const {\n      additions,\n      deletions\n    } = this.getTextChangesFromCharacterData();\n    const textChanges = this.getTextChangesFromChildList();\n    Array.from(textChanges.additions).forEach(addition => {\n      if (!Array.from(additions).includes(addition)) {\n        additions.push(addition);\n      }\n    });\n    deletions.push(...Array.from(textChanges.deletions || []));\n    const summary = {};\n    const added = additions.join(\"\");\n\n    if (added) {\n      summary.textAdded = added;\n    }\n\n    const deleted = deletions.join(\"\");\n\n    if (deleted) {\n      summary.textDeleted = deleted;\n    }\n\n    return summary;\n  }\n\n  getMutationsByType(type) {\n    return Array.from(this.mutations).filter(mutation => mutation.type === type);\n  }\n\n  getTextChangesFromChildList() {\n    let textAdded, textRemoved;\n    const addedNodes = [];\n    const removedNodes = [];\n    Array.from(this.getMutationsByType(\"childList\")).forEach(mutation => {\n      addedNodes.push(...Array.from(mutation.addedNodes || []));\n      removedNodes.push(...Array.from(mutation.removedNodes || []));\n    });\n    const singleBlockCommentRemoved = addedNodes.length === 0 && removedNodes.length === 1 && nodeIsBlockStartComment(removedNodes[0]);\n\n    if (singleBlockCommentRemoved) {\n      textAdded = [];\n      textRemoved = [\"\\n\"];\n    } else {\n      textAdded = getTextForNodes(addedNodes);\n      textRemoved = getTextForNodes(removedNodes);\n    }\n\n    const additions = textAdded.filter((text, index) => text !== textRemoved[index]).map(normalizeSpaces);\n    const deletions = textRemoved.filter((text, index) => text !== textAdded[index]).map(normalizeSpaces);\n    return {\n      additions,\n      deletions\n    };\n  }\n\n  getTextChangesFromCharacterData() {\n    let added, removed;\n    const characterMutations = this.getMutationsByType(\"characterData\");\n\n    if (characterMutations.length) {\n      const startMutation = characterMutations[0],\n            endMutation = characterMutations[characterMutations.length - 1];\n      const oldString = normalizeSpaces(startMutation.oldValue);\n      const newString = normalizeSpaces(endMutation.target.data);\n      const summarized = summarizeStringChange(oldString, newString);\n      added = summarized.added;\n      removed = summarized.removed;\n    }\n\n    return {\n      additions: added ? [added] : [],\n      deletions: removed ? [removed] : []\n    };\n  }\n\n}\n\nconst getTextForNodes = function () {\n  let nodes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  const text = [];\n\n  for (const node of Array.from(nodes)) {\n    switch (node.nodeType) {\n      case Node.TEXT_NODE:\n        text.push(node.data);\n        break;\n\n      case Node.ELEMENT_NODE:\n        if (tagName(node) === \"br\") {\n          text.push(\"\\n\");\n        } else {\n          text.push(...Array.from(getTextForNodes(node.childNodes) || []));\n        }\n\n        break;\n    }\n  }\n\n  return text;\n};\n\nclass Controller extends BasicObject {}\n\n/* eslint-disable\n    no-empty,\n*/\nclass FileVerificationOperation extends Operation {\n  constructor(file) {\n    super(...arguments);\n    this.file = file;\n  }\n\n  perform(callback) {\n    const reader = new FileReader();\n\n    reader.onerror = () => callback(false);\n\n    reader.onload = () => {\n      reader.onerror = null;\n\n      try {\n        reader.abort();\n      } catch (error) {}\n\n      return callback(true, this.file);\n    };\n\n    return reader.readAsArrayBuffer(this.file);\n  }\n\n}\n\nclass InputController extends BasicObject {\n  constructor(element) {\n    super(...arguments);\n    this.element = element;\n    this.mutationObserver = new MutationObserver(this.element);\n    this.mutationObserver.delegate = this;\n\n    for (const eventName in this.constructor.events) {\n      handleEvent(eventName, {\n        onElement: this.element,\n        withCallback: this.handlerFor(eventName)\n      });\n    }\n  }\n\n  elementDidMutate(mutationSummary) {}\n\n  editorWillSyncDocumentView() {\n    return this.mutationObserver.stop();\n  }\n\n  editorDidSyncDocumentView() {\n    return this.mutationObserver.start();\n  }\n\n  requestRender() {\n    var _this$delegate, _this$delegate$inputC;\n\n    return (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$inputC = _this$delegate.inputControllerDidRequestRender) === null || _this$delegate$inputC === void 0 ? void 0 : _this$delegate$inputC.call(_this$delegate);\n  }\n\n  requestReparse() {\n    var _this$delegate2, _this$delegate2$input;\n\n    (_this$delegate2 = this.delegate) === null || _this$delegate2 === void 0 ? void 0 : (_this$delegate2$input = _this$delegate2.inputControllerDidRequestReparse) === null || _this$delegate2$input === void 0 ? void 0 : _this$delegate2$input.call(_this$delegate2);\n    return this.requestRender();\n  }\n\n  attachFiles(files) {\n    const operations = Array.from(files).map(file => new FileVerificationOperation(file));\n    return Promise.all(operations).then(files => {\n      this.handleInput(function () {\n        var _this$delegate3, _this$responder;\n\n        (_this$delegate3 = this.delegate) === null || _this$delegate3 === void 0 ? void 0 : _this$delegate3.inputControllerWillAttachFiles();\n        (_this$responder = this.responder) === null || _this$responder === void 0 ? void 0 : _this$responder.insertFiles(files);\n        return this.requestRender();\n      });\n    });\n  } // Private\n\n\n  handlerFor(eventName) {\n    return event => {\n      if (!event.defaultPrevented) {\n        this.handleInput(() => {\n          if (!innerElementIsActive(this.element)) {\n            this.eventName = eventName;\n            this.constructor.events[eventName].call(this, event);\n          }\n        });\n      }\n    };\n  }\n\n  handleInput(callback) {\n    try {\n      var _this$delegate4;\n\n      (_this$delegate4 = this.delegate) === null || _this$delegate4 === void 0 ? void 0 : _this$delegate4.inputControllerWillHandleInput();\n      callback.call(this);\n    } finally {\n      var _this$delegate5;\n\n      (_this$delegate5 = this.delegate) === null || _this$delegate5 === void 0 ? void 0 : _this$delegate5.inputControllerDidHandleInput();\n    }\n  }\n\n  createLinkHTML(href, text) {\n    const link = document.createElement(\"a\");\n    link.href = href;\n    link.textContent = text ? text : href;\n    return link.outerHTML;\n  }\n\n}\n\n_defineProperty(InputController, \"events\", {});\n\nvar _$codePointAt, _;\nconst {\n  browser,\n  keyNames: keyNames$1\n} = config;\nlet pastedFileCount = 0;\nclass Level0InputController extends InputController {\n  constructor() {\n    super(...arguments);\n    this.resetInputSummary();\n  }\n\n  setInputSummary() {\n    let summary = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    this.inputSummary.eventName = this.eventName;\n\n    for (const key in summary) {\n      const value = summary[key];\n      this.inputSummary[key] = value;\n    }\n\n    return this.inputSummary;\n  }\n\n  resetInputSummary() {\n    this.inputSummary = {};\n  }\n\n  reset() {\n    this.resetInputSummary();\n    return selectionChangeObserver.reset();\n  } // Mutation observer delegate\n\n\n  elementDidMutate(mutationSummary) {\n    if (this.isComposing()) {\n      var _this$delegate, _this$delegate$inputC;\n\n      return (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$inputC = _this$delegate.inputControllerDidAllowUnhandledInput) === null || _this$delegate$inputC === void 0 ? void 0 : _this$delegate$inputC.call(_this$delegate);\n    } else {\n      return this.handleInput(function () {\n        if (this.mutationIsSignificant(mutationSummary)) {\n          if (this.mutationIsExpected(mutationSummary)) {\n            this.requestRender();\n          } else {\n            this.requestReparse();\n          }\n        }\n\n        return this.reset();\n      });\n    }\n  }\n\n  mutationIsExpected(_ref) {\n    let {\n      textAdded,\n      textDeleted\n    } = _ref;\n\n    if (this.inputSummary.preferDocument) {\n      return true;\n    }\n\n    const mutationAdditionMatchesSummary = textAdded != null ? textAdded === this.inputSummary.textAdded : !this.inputSummary.textAdded;\n    const mutationDeletionMatchesSummary = textDeleted != null ? this.inputSummary.didDelete : !this.inputSummary.didDelete;\n    const unexpectedNewlineAddition = [\"\\n\", \" \\n\"].includes(textAdded) && !mutationAdditionMatchesSummary;\n    const unexpectedNewlineDeletion = textDeleted === \"\\n\" && !mutationDeletionMatchesSummary;\n    const singleUnexpectedNewline = unexpectedNewlineAddition && !unexpectedNewlineDeletion || unexpectedNewlineDeletion && !unexpectedNewlineAddition;\n\n    if (singleUnexpectedNewline) {\n      const range = this.getSelectedRange();\n\n      if (range) {\n        var _this$responder;\n\n        const offset = unexpectedNewlineAddition ? textAdded.replace(/\\n$/, \"\").length || -1 : (textAdded === null || textAdded === void 0 ? void 0 : textAdded.length) || 1;\n\n        if ((_this$responder = this.responder) !== null && _this$responder !== void 0 && _this$responder.positionIsBlockBreak(range[1] + offset)) {\n          return true;\n        }\n      }\n    }\n\n    return mutationAdditionMatchesSummary && mutationDeletionMatchesSummary;\n  }\n\n  mutationIsSignificant(mutationSummary) {\n    var _this$compositionInpu;\n\n    const textChanged = Object.keys(mutationSummary).length > 0;\n    const composedEmptyString = ((_this$compositionInpu = this.compositionInput) === null || _this$compositionInpu === void 0 ? void 0 : _this$compositionInpu.getEndData()) === \"\";\n    return textChanged || !composedEmptyString;\n  } // Private\n\n\n  getCompositionInput() {\n    if (this.isComposing()) {\n      return this.compositionInput;\n    } else {\n      this.compositionInput = new CompositionInput(this);\n    }\n  }\n\n  isComposing() {\n    return this.compositionInput && !this.compositionInput.isEnded();\n  }\n\n  deleteInDirection(direction, event) {\n    var _this$responder2;\n\n    if (((_this$responder2 = this.responder) === null || _this$responder2 === void 0 ? void 0 : _this$responder2.deleteInDirection(direction)) === false) {\n      if (event) {\n        event.preventDefault();\n        return this.requestRender();\n      }\n    } else {\n      return this.setInputSummary({\n        didDelete: true\n      });\n    }\n  }\n\n  serializeSelectionToDataTransfer(dataTransfer) {\n    var _this$responder3;\n\n    if (!dataTransferIsWritable(dataTransfer)) return;\n    const document = (_this$responder3 = this.responder) === null || _this$responder3 === void 0 ? void 0 : _this$responder3.getSelectedDocument().toSerializableDocument();\n    dataTransfer.setData(\"application/x-trix-document\", JSON.stringify(document));\n    dataTransfer.setData(\"text/html\", DocumentView.render(document).innerHTML);\n    dataTransfer.setData(\"text/plain\", document.toString().replace(/\\n$/, \"\"));\n    return true;\n  }\n\n  canAcceptDataTransfer(dataTransfer) {\n    const types = {};\n    Array.from((dataTransfer === null || dataTransfer === void 0 ? void 0 : dataTransfer.types) || []).forEach(type => {\n      types[type] = true;\n    });\n    return types.Files || types[\"application/x-trix-document\"] || types[\"text/html\"] || types[\"text/plain\"];\n  }\n\n  getPastedHTMLUsingHiddenElement(callback) {\n    const selectedRange = this.getSelectedRange();\n    const style = {\n      position: \"absolute\",\n      left: \"\".concat(window.pageXOffset, \"px\"),\n      top: \"\".concat(window.pageYOffset, \"px\"),\n      opacity: 0\n    };\n    const element = makeElement({\n      style,\n      tagName: \"div\",\n      editable: true\n    });\n    document.body.appendChild(element);\n    element.focus();\n    return requestAnimationFrame(() => {\n      const html = element.innerHTML;\n      removeNode(element);\n      this.setSelectedRange(selectedRange);\n      return callback(html);\n    });\n  }\n\n}\n\n_defineProperty(Level0InputController, \"events\", {\n  keydown(event) {\n    if (!this.isComposing()) {\n      this.resetInputSummary();\n    }\n\n    this.inputSummary.didInput = true;\n    const keyName = keyNames$1[event.keyCode];\n\n    if (keyName) {\n      var _context2;\n\n      let context = this.keys;\n      [\"ctrl\", \"alt\", \"shift\", \"meta\"].forEach(modifier => {\n        if (event[\"\".concat(modifier, \"Key\")]) {\n          var _context;\n\n          if (modifier === \"ctrl\") {\n            modifier = \"control\";\n          }\n\n          context = (_context = context) === null || _context === void 0 ? void 0 : _context[modifier];\n        }\n      });\n\n      if (((_context2 = context) === null || _context2 === void 0 ? void 0 : _context2[keyName]) != null) {\n        this.setInputSummary({\n          keyName\n        });\n        selectionChangeObserver.reset();\n        context[keyName].call(this, event);\n      }\n    }\n\n    if (keyEventIsKeyboardCommand(event)) {\n      const character = String.fromCharCode(event.keyCode).toLowerCase();\n\n      if (character) {\n        var _this$delegate3;\n\n        const keys = [\"alt\", \"shift\"].map(modifier => {\n          if (event[\"\".concat(modifier, \"Key\")]) {\n            return modifier;\n          }\n        }).filter(key => key);\n        keys.push(character);\n\n        if ((_this$delegate3 = this.delegate) !== null && _this$delegate3 !== void 0 && _this$delegate3.inputControllerDidReceiveKeyboardCommand(keys)) {\n          event.preventDefault();\n        }\n      }\n    }\n  },\n\n  keypress(event) {\n    if (this.inputSummary.eventName != null) return;\n    if (event.metaKey) return;\n    if (event.ctrlKey && !event.altKey) return;\n    const string = stringFromKeyEvent(event);\n\n    if (string) {\n      var _this$delegate4, _this$responder9;\n\n      (_this$delegate4 = this.delegate) === null || _this$delegate4 === void 0 ? void 0 : _this$delegate4.inputControllerWillPerformTyping();\n      (_this$responder9 = this.responder) === null || _this$responder9 === void 0 ? void 0 : _this$responder9.insertString(string);\n      return this.setInputSummary({\n        textAdded: string,\n        didDelete: this.selectionIsExpanded()\n      });\n    }\n  },\n\n  textInput(event) {\n    // Handle autocapitalization\n    const {\n      data\n    } = event;\n    const {\n      textAdded\n    } = this.inputSummary;\n\n    if (textAdded && textAdded !== data && textAdded.toUpperCase() === data) {\n      var _this$responder10;\n\n      const range = this.getSelectedRange();\n      this.setSelectedRange([range[0], range[1] + textAdded.length]);\n      (_this$responder10 = this.responder) === null || _this$responder10 === void 0 ? void 0 : _this$responder10.insertString(data);\n      this.setInputSummary({\n        textAdded: data\n      });\n      return this.setSelectedRange(range);\n    }\n  },\n\n  dragenter(event) {\n    event.preventDefault();\n  },\n\n  dragstart(event) {\n    var _this$delegate5, _this$delegate5$input;\n\n    this.serializeSelectionToDataTransfer(event.dataTransfer);\n    this.draggedRange = this.getSelectedRange();\n    return (_this$delegate5 = this.delegate) === null || _this$delegate5 === void 0 ? void 0 : (_this$delegate5$input = _this$delegate5.inputControllerDidStartDrag) === null || _this$delegate5$input === void 0 ? void 0 : _this$delegate5$input.call(_this$delegate5);\n  },\n\n  dragover(event) {\n    if (this.draggedRange || this.canAcceptDataTransfer(event.dataTransfer)) {\n      event.preventDefault();\n      const draggingPoint = {\n        x: event.clientX,\n        y: event.clientY\n      };\n\n      if (!objectsAreEqual(draggingPoint, this.draggingPoint)) {\n        var _this$delegate6, _this$delegate6$input;\n\n        this.draggingPoint = draggingPoint;\n        return (_this$delegate6 = this.delegate) === null || _this$delegate6 === void 0 ? void 0 : (_this$delegate6$input = _this$delegate6.inputControllerDidReceiveDragOverPoint) === null || _this$delegate6$input === void 0 ? void 0 : _this$delegate6$input.call(_this$delegate6, this.draggingPoint);\n      }\n    }\n  },\n\n  dragend(event) {\n    var _this$delegate7, _this$delegate7$input;\n\n    (_this$delegate7 = this.delegate) === null || _this$delegate7 === void 0 ? void 0 : (_this$delegate7$input = _this$delegate7.inputControllerDidCancelDrag) === null || _this$delegate7$input === void 0 ? void 0 : _this$delegate7$input.call(_this$delegate7);\n    this.draggedRange = null;\n    this.draggingPoint = null;\n  },\n\n  drop(event) {\n    var _event$dataTransfer, _this$responder11;\n\n    event.preventDefault();\n    const files = (_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.files;\n    const documentJSON = event.dataTransfer.getData(\"application/x-trix-document\");\n    const point = {\n      x: event.clientX,\n      y: event.clientY\n    };\n    (_this$responder11 = this.responder) === null || _this$responder11 === void 0 ? void 0 : _this$responder11.setLocationRangeFromPointRange(point);\n\n    if (files !== null && files !== void 0 && files.length) {\n      this.attachFiles(files);\n    } else if (this.draggedRange) {\n      var _this$delegate8, _this$responder12;\n\n      (_this$delegate8 = this.delegate) === null || _this$delegate8 === void 0 ? void 0 : _this$delegate8.inputControllerWillMoveText();\n      (_this$responder12 = this.responder) === null || _this$responder12 === void 0 ? void 0 : _this$responder12.moveTextFromRange(this.draggedRange);\n      this.draggedRange = null;\n      this.requestRender();\n    } else if (documentJSON) {\n      var _this$responder13;\n\n      const document = Document.fromJSONString(documentJSON);\n      (_this$responder13 = this.responder) === null || _this$responder13 === void 0 ? void 0 : _this$responder13.insertDocument(document);\n      this.requestRender();\n    }\n\n    this.draggedRange = null;\n    this.draggingPoint = null;\n  },\n\n  cut(event) {\n    var _this$responder14;\n\n    if ((_this$responder14 = this.responder) !== null && _this$responder14 !== void 0 && _this$responder14.selectionIsExpanded()) {\n      var _this$delegate9;\n\n      if (this.serializeSelectionToDataTransfer(event.clipboardData)) {\n        event.preventDefault();\n      }\n\n      (_this$delegate9 = this.delegate) === null || _this$delegate9 === void 0 ? void 0 : _this$delegate9.inputControllerWillCutText();\n      this.deleteInDirection(\"backward\");\n\n      if (event.defaultPrevented) {\n        return this.requestRender();\n      }\n    }\n  },\n\n  copy(event) {\n    var _this$responder15;\n\n    if ((_this$responder15 = this.responder) !== null && _this$responder15 !== void 0 && _this$responder15.selectionIsExpanded()) {\n      if (this.serializeSelectionToDataTransfer(event.clipboardData)) {\n        event.preventDefault();\n      }\n    }\n  },\n\n  paste(event) {\n    const clipboard = event.clipboardData || event.testClipboardData;\n    const paste = {\n      clipboard\n    };\n\n    if (!clipboard || pasteEventIsCrippledSafariHTMLPaste(event)) {\n      this.getPastedHTMLUsingHiddenElement(html => {\n        var _this$delegate10, _this$responder16, _this$delegate11;\n\n        paste.type = \"text/html\";\n        paste.html = html;\n        (_this$delegate10 = this.delegate) === null || _this$delegate10 === void 0 ? void 0 : _this$delegate10.inputControllerWillPaste(paste);\n        (_this$responder16 = this.responder) === null || _this$responder16 === void 0 ? void 0 : _this$responder16.insertHTML(paste.html);\n        this.requestRender();\n        return (_this$delegate11 = this.delegate) === null || _this$delegate11 === void 0 ? void 0 : _this$delegate11.inputControllerDidPaste(paste);\n      });\n      return;\n    }\n\n    const href = clipboard.getData(\"URL\");\n    const html = clipboard.getData(\"text/html\");\n    const name = clipboard.getData(\"public.url-name\");\n\n    if (href) {\n      var _this$delegate12, _this$responder17, _this$delegate13;\n\n      let string;\n      paste.type = \"text/html\";\n\n      if (name) {\n        string = squishBreakableWhitespace(name).trim();\n      } else {\n        string = href;\n      }\n\n      paste.html = this.createLinkHTML(href, string);\n      (_this$delegate12 = this.delegate) === null || _this$delegate12 === void 0 ? void 0 : _this$delegate12.inputControllerWillPaste(paste);\n      this.setInputSummary({\n        textAdded: string,\n        didDelete: this.selectionIsExpanded()\n      });\n      (_this$responder17 = this.responder) === null || _this$responder17 === void 0 ? void 0 : _this$responder17.insertHTML(paste.html);\n      this.requestRender();\n      (_this$delegate13 = this.delegate) === null || _this$delegate13 === void 0 ? void 0 : _this$delegate13.inputControllerDidPaste(paste);\n    } else if (dataTransferIsPlainText(clipboard)) {\n      var _this$delegate14, _this$responder18, _this$delegate15;\n\n      paste.type = \"text/plain\";\n      paste.string = clipboard.getData(\"text/plain\");\n      (_this$delegate14 = this.delegate) === null || _this$delegate14 === void 0 ? void 0 : _this$delegate14.inputControllerWillPaste(paste);\n      this.setInputSummary({\n        textAdded: paste.string,\n        didDelete: this.selectionIsExpanded()\n      });\n      (_this$responder18 = this.responder) === null || _this$responder18 === void 0 ? void 0 : _this$responder18.insertString(paste.string);\n      this.requestRender();\n      (_this$delegate15 = this.delegate) === null || _this$delegate15 === void 0 ? void 0 : _this$delegate15.inputControllerDidPaste(paste);\n    } else if (html) {\n      var _this$delegate16, _this$responder19, _this$delegate17;\n\n      paste.type = \"text/html\";\n      paste.html = html;\n      (_this$delegate16 = this.delegate) === null || _this$delegate16 === void 0 ? void 0 : _this$delegate16.inputControllerWillPaste(paste);\n      (_this$responder19 = this.responder) === null || _this$responder19 === void 0 ? void 0 : _this$responder19.insertHTML(paste.html);\n      this.requestRender();\n      (_this$delegate17 = this.delegate) === null || _this$delegate17 === void 0 ? void 0 : _this$delegate17.inputControllerDidPaste(paste);\n    } else if (Array.from(clipboard.types).includes(\"Files\")) {\n      var _clipboard$items, _clipboard$items$, _clipboard$items$$get;\n\n      const file = (_clipboard$items = clipboard.items) === null || _clipboard$items === void 0 ? void 0 : (_clipboard$items$ = _clipboard$items[0]) === null || _clipboard$items$ === void 0 ? void 0 : (_clipboard$items$$get = _clipboard$items$.getAsFile) === null || _clipboard$items$$get === void 0 ? void 0 : _clipboard$items$$get.call(_clipboard$items$);\n\n      if (file) {\n        var _this$delegate18, _this$responder20, _this$delegate19;\n\n        const extension = extensionForFile(file);\n\n        if (!file.name && extension) {\n          file.name = \"pasted-file-\".concat(++pastedFileCount, \".\").concat(extension);\n        }\n\n        paste.type = \"File\";\n        paste.file = file;\n        (_this$delegate18 = this.delegate) === null || _this$delegate18 === void 0 ? void 0 : _this$delegate18.inputControllerWillAttachFiles();\n        (_this$responder20 = this.responder) === null || _this$responder20 === void 0 ? void 0 : _this$responder20.insertFile(paste.file);\n        this.requestRender();\n        (_this$delegate19 = this.delegate) === null || _this$delegate19 === void 0 ? void 0 : _this$delegate19.inputControllerDidPaste(paste);\n      }\n    }\n\n    event.preventDefault();\n  },\n\n  compositionstart(event) {\n    return this.getCompositionInput().start(event.data);\n  },\n\n  compositionupdate(event) {\n    return this.getCompositionInput().update(event.data);\n  },\n\n  compositionend(event) {\n    return this.getCompositionInput().end(event.data);\n  },\n\n  beforeinput(event) {\n    this.inputSummary.didInput = true;\n  },\n\n  input(event) {\n    this.inputSummary.didInput = true;\n    return event.stopPropagation();\n  }\n\n});\n\n_defineProperty(Level0InputController, \"keys\", {\n  backspace(event) {\n    var _this$delegate20;\n\n    (_this$delegate20 = this.delegate) === null || _this$delegate20 === void 0 ? void 0 : _this$delegate20.inputControllerWillPerformTyping();\n    return this.deleteInDirection(\"backward\", event);\n  },\n\n  delete(event) {\n    var _this$delegate21;\n\n    (_this$delegate21 = this.delegate) === null || _this$delegate21 === void 0 ? void 0 : _this$delegate21.inputControllerWillPerformTyping();\n    return this.deleteInDirection(\"forward\", event);\n  },\n\n  return(event) {\n    var _this$delegate22, _this$responder21;\n\n    this.setInputSummary({\n      preferDocument: true\n    });\n    (_this$delegate22 = this.delegate) === null || _this$delegate22 === void 0 ? void 0 : _this$delegate22.inputControllerWillPerformTyping();\n    return (_this$responder21 = this.responder) === null || _this$responder21 === void 0 ? void 0 : _this$responder21.insertLineBreak();\n  },\n\n  tab(event) {\n    var _this$responder22;\n\n    if ((_this$responder22 = this.responder) !== null && _this$responder22 !== void 0 && _this$responder22.canIncreaseNestingLevel()) {\n      var _this$responder23;\n\n      (_this$responder23 = this.responder) === null || _this$responder23 === void 0 ? void 0 : _this$responder23.increaseNestingLevel();\n      this.requestRender();\n      event.preventDefault();\n    }\n  },\n\n  left(event) {\n    if (this.selectionIsInCursorTarget()) {\n      var _this$responder24;\n\n      event.preventDefault();\n      return (_this$responder24 = this.responder) === null || _this$responder24 === void 0 ? void 0 : _this$responder24.moveCursorInDirection(\"backward\");\n    }\n  },\n\n  right(event) {\n    if (this.selectionIsInCursorTarget()) {\n      var _this$responder25;\n\n      event.preventDefault();\n      return (_this$responder25 = this.responder) === null || _this$responder25 === void 0 ? void 0 : _this$responder25.moveCursorInDirection(\"forward\");\n    }\n  },\n\n  control: {\n    d(event) {\n      var _this$delegate23;\n\n      (_this$delegate23 = this.delegate) === null || _this$delegate23 === void 0 ? void 0 : _this$delegate23.inputControllerWillPerformTyping();\n      return this.deleteInDirection(\"forward\", event);\n    },\n\n    h(event) {\n      var _this$delegate24;\n\n      (_this$delegate24 = this.delegate) === null || _this$delegate24 === void 0 ? void 0 : _this$delegate24.inputControllerWillPerformTyping();\n      return this.deleteInDirection(\"backward\", event);\n    },\n\n    o(event) {\n      var _this$delegate25, _this$responder26;\n\n      event.preventDefault();\n      (_this$delegate25 = this.delegate) === null || _this$delegate25 === void 0 ? void 0 : _this$delegate25.inputControllerWillPerformTyping();\n      (_this$responder26 = this.responder) === null || _this$responder26 === void 0 ? void 0 : _this$responder26.insertString(\"\\n\", {\n        updatePosition: false\n      });\n      return this.requestRender();\n    }\n\n  },\n  shift: {\n    return(event) {\n      var _this$delegate26, _this$responder27;\n\n      (_this$delegate26 = this.delegate) === null || _this$delegate26 === void 0 ? void 0 : _this$delegate26.inputControllerWillPerformTyping();\n      (_this$responder27 = this.responder) === null || _this$responder27 === void 0 ? void 0 : _this$responder27.insertString(\"\\n\");\n      this.requestRender();\n      event.preventDefault();\n    },\n\n    tab(event) {\n      var _this$responder28;\n\n      if ((_this$responder28 = this.responder) !== null && _this$responder28 !== void 0 && _this$responder28.canDecreaseNestingLevel()) {\n        var _this$responder29;\n\n        (_this$responder29 = this.responder) === null || _this$responder29 === void 0 ? void 0 : _this$responder29.decreaseNestingLevel();\n        this.requestRender();\n        event.preventDefault();\n      }\n    },\n\n    left(event) {\n      if (this.selectionIsInCursorTarget()) {\n        event.preventDefault();\n        return this.expandSelectionInDirection(\"backward\");\n      }\n    },\n\n    right(event) {\n      if (this.selectionIsInCursorTarget()) {\n        event.preventDefault();\n        return this.expandSelectionInDirection(\"forward\");\n      }\n    }\n\n  },\n  alt: {\n    backspace(event) {\n      var _this$delegate27;\n\n      this.setInputSummary({\n        preferDocument: false\n      });\n      return (_this$delegate27 = this.delegate) === null || _this$delegate27 === void 0 ? void 0 : _this$delegate27.inputControllerWillPerformTyping();\n    }\n\n  },\n  meta: {\n    backspace(event) {\n      var _this$delegate28;\n\n      this.setInputSummary({\n        preferDocument: false\n      });\n      return (_this$delegate28 = this.delegate) === null || _this$delegate28 === void 0 ? void 0 : _this$delegate28.inputControllerWillPerformTyping();\n    }\n\n  }\n});\n\nLevel0InputController.proxyMethod(\"responder?.getSelectedRange\");\nLevel0InputController.proxyMethod(\"responder?.setSelectedRange\");\nLevel0InputController.proxyMethod(\"responder?.expandSelectionInDirection\");\nLevel0InputController.proxyMethod(\"responder?.selectionIsInCursorTarget\");\nLevel0InputController.proxyMethod(\"responder?.selectionIsExpanded\");\n\nconst extensionForFile = file => {\n  var _file$type, _file$type$match;\n\n  return (_file$type = file.type) === null || _file$type === void 0 ? void 0 : (_file$type$match = _file$type.match(/\\/(\\w+)$/)) === null || _file$type$match === void 0 ? void 0 : _file$type$match[1];\n};\n\nconst hasStringCodePointAt = !!((_$codePointAt = (_ = \" \").codePointAt) !== null && _$codePointAt !== void 0 && _$codePointAt.call(_, 0));\n\nconst stringFromKeyEvent = function (event) {\n  if (event.key && hasStringCodePointAt && event.key.codePointAt(0) === event.keyCode) {\n    return event.key;\n  } else {\n    let code;\n\n    if (event.which === null) {\n      code = event.keyCode;\n    } else if (event.which !== 0 && event.charCode !== 0) {\n      code = event.charCode;\n    }\n\n    if (code != null && keyNames$1[code] !== \"escape\") {\n      return UTF16String.fromCodepoints([code]).toString();\n    }\n  }\n};\n\nconst pasteEventIsCrippledSafariHTMLPaste = function (event) {\n  const paste = event.clipboardData;\n\n  if (paste) {\n    if (paste.types.includes(\"text/html\")) {\n      // Answer is yes if there's any possibility of Paste and Match Style in Safari,\n      // which is nearly impossible to detect confidently: https://bugs.webkit.org/show_bug.cgi?id=174165\n      for (const type of paste.types) {\n        const hasPasteboardFlavor = /^CorePasteboardFlavorType/.test(type);\n        const hasReadableDynamicData = /^dyn\\./.test(type) && paste.getData(type);\n        const mightBePasteAndMatchStyle = hasPasteboardFlavor || hasReadableDynamicData;\n\n        if (mightBePasteAndMatchStyle) {\n          return true;\n        }\n      }\n\n      return false;\n    } else {\n      const isExternalHTMLPaste = paste.types.includes(\"com.apple.webarchive\");\n      const isExternalRichTextPaste = paste.types.includes(\"com.apple.flat-rtfd\");\n      return isExternalHTMLPaste || isExternalRichTextPaste;\n    }\n  }\n};\n\nclass CompositionInput extends BasicObject {\n  constructor(inputController) {\n    super(...arguments);\n    this.inputController = inputController;\n    this.responder = this.inputController.responder;\n    this.delegate = this.inputController.delegate;\n    this.inputSummary = this.inputController.inputSummary;\n    this.data = {};\n  }\n\n  start(data) {\n    this.data.start = data;\n\n    if (this.isSignificant()) {\n      var _this$responder5;\n\n      if (this.inputSummary.eventName === \"keypress\" && this.inputSummary.textAdded) {\n        var _this$responder4;\n\n        (_this$responder4 = this.responder) === null || _this$responder4 === void 0 ? void 0 : _this$responder4.deleteInDirection(\"left\");\n      }\n\n      if (!this.selectionIsExpanded()) {\n        this.insertPlaceholder();\n        this.requestRender();\n      }\n\n      this.range = (_this$responder5 = this.responder) === null || _this$responder5 === void 0 ? void 0 : _this$responder5.getSelectedRange();\n    }\n  }\n\n  update(data) {\n    this.data.update = data;\n\n    if (this.isSignificant()) {\n      const range = this.selectPlaceholder();\n\n      if (range) {\n        this.forgetPlaceholder();\n        this.range = range;\n      }\n    }\n  }\n\n  end(data) {\n    this.data.end = data;\n\n    if (this.isSignificant()) {\n      this.forgetPlaceholder();\n\n      if (this.canApplyToDocument()) {\n        var _this$delegate2, _this$responder6, _this$responder7, _this$responder8;\n\n        this.setInputSummary({\n          preferDocument: true,\n          didInput: false\n        });\n        (_this$delegate2 = this.delegate) === null || _this$delegate2 === void 0 ? void 0 : _this$delegate2.inputControllerWillPerformTyping();\n        (_this$responder6 = this.responder) === null || _this$responder6 === void 0 ? void 0 : _this$responder6.setSelectedRange(this.range);\n        (_this$responder7 = this.responder) === null || _this$responder7 === void 0 ? void 0 : _this$responder7.insertString(this.data.end);\n        return (_this$responder8 = this.responder) === null || _this$responder8 === void 0 ? void 0 : _this$responder8.setSelectedRange(this.range[0] + this.data.end.length);\n      } else if (this.data.start != null || this.data.update != null) {\n        this.requestReparse();\n        return this.inputController.reset();\n      }\n    } else {\n      return this.inputController.reset();\n    }\n  }\n\n  getEndData() {\n    return this.data.end;\n  }\n\n  isEnded() {\n    return this.getEndData() != null;\n  }\n\n  isSignificant() {\n    if (browser.composesExistingText) {\n      return this.inputSummary.didInput;\n    } else {\n      return true;\n    }\n  } // Private\n\n\n  canApplyToDocument() {\n    var _this$data$start, _this$data$end;\n\n    return ((_this$data$start = this.data.start) === null || _this$data$start === void 0 ? void 0 : _this$data$start.length) === 0 && ((_this$data$end = this.data.end) === null || _this$data$end === void 0 ? void 0 : _this$data$end.length) > 0 && this.range;\n  }\n\n}\n\nCompositionInput.proxyMethod(\"inputController.setInputSummary\");\nCompositionInput.proxyMethod(\"inputController.requestRender\");\nCompositionInput.proxyMethod(\"inputController.requestReparse\");\nCompositionInput.proxyMethod(\"responder?.selectionIsExpanded\");\nCompositionInput.proxyMethod(\"responder?.insertPlaceholder\");\nCompositionInput.proxyMethod(\"responder?.selectPlaceholder\");\nCompositionInput.proxyMethod(\"responder?.forgetPlaceholder\");\n\nclass Level2InputController extends InputController {\n  constructor() {\n    super(...arguments);\n    this.render = this.render.bind(this);\n  }\n\n  elementDidMutate() {\n    if (this.scheduledRender) {\n      if (this.composing) {\n        var _this$delegate, _this$delegate$inputC;\n\n        return (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$inputC = _this$delegate.inputControllerDidAllowUnhandledInput) === null || _this$delegate$inputC === void 0 ? void 0 : _this$delegate$inputC.call(_this$delegate);\n      }\n    } else {\n      return this.reparse();\n    }\n  }\n\n  scheduleRender() {\n    return this.scheduledRender ? this.scheduledRender : this.scheduledRender = requestAnimationFrame(this.render);\n  }\n\n  render() {\n    var _this$afterRender;\n\n    cancelAnimationFrame(this.scheduledRender);\n    this.scheduledRender = null;\n\n    if (!this.composing) {\n      var _this$delegate2;\n\n      (_this$delegate2 = this.delegate) === null || _this$delegate2 === void 0 ? void 0 : _this$delegate2.render();\n    }\n\n    (_this$afterRender = this.afterRender) === null || _this$afterRender === void 0 ? void 0 : _this$afterRender.call(this);\n    this.afterRender = null;\n  }\n\n  reparse() {\n    var _this$delegate3;\n\n    return (_this$delegate3 = this.delegate) === null || _this$delegate3 === void 0 ? void 0 : _this$delegate3.reparse();\n  } // Responder helpers\n\n\n  insertString() {\n    var _this$delegate4;\n\n    let string = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n    let options = arguments.length > 1 ? arguments[1] : undefined;\n    (_this$delegate4 = this.delegate) === null || _this$delegate4 === void 0 ? void 0 : _this$delegate4.inputControllerWillPerformTyping();\n    return this.withTargetDOMRange(function () {\n      var _this$responder;\n\n      return (_this$responder = this.responder) === null || _this$responder === void 0 ? void 0 : _this$responder.insertString(string, options);\n    });\n  }\n\n  toggleAttributeIfSupported(attributeName) {\n    if (getAllAttributeNames().includes(attributeName)) {\n      var _this$delegate5;\n\n      (_this$delegate5 = this.delegate) === null || _this$delegate5 === void 0 ? void 0 : _this$delegate5.inputControllerWillPerformFormatting(attributeName);\n      return this.withTargetDOMRange(function () {\n        var _this$responder2;\n\n        return (_this$responder2 = this.responder) === null || _this$responder2 === void 0 ? void 0 : _this$responder2.toggleCurrentAttribute(attributeName);\n      });\n    }\n  }\n\n  activateAttributeIfSupported(attributeName, value) {\n    if (getAllAttributeNames().includes(attributeName)) {\n      var _this$delegate6;\n\n      (_this$delegate6 = this.delegate) === null || _this$delegate6 === void 0 ? void 0 : _this$delegate6.inputControllerWillPerformFormatting(attributeName);\n      return this.withTargetDOMRange(function () {\n        var _this$responder3;\n\n        return (_this$responder3 = this.responder) === null || _this$responder3 === void 0 ? void 0 : _this$responder3.setCurrentAttribute(attributeName, value);\n      });\n    }\n  }\n\n  deleteInDirection(direction) {\n    let {\n      recordUndoEntry\n    } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n      recordUndoEntry: true\n    };\n\n    if (recordUndoEntry) {\n      var _this$delegate7;\n\n      (_this$delegate7 = this.delegate) === null || _this$delegate7 === void 0 ? void 0 : _this$delegate7.inputControllerWillPerformTyping();\n    }\n\n    const perform = () => {\n      var _this$responder4;\n\n      return (_this$responder4 = this.responder) === null || _this$responder4 === void 0 ? void 0 : _this$responder4.deleteInDirection(direction);\n    };\n\n    const domRange = this.getTargetDOMRange({\n      minLength: 2\n    });\n\n    if (domRange) {\n      return this.withTargetDOMRange(domRange, perform);\n    } else {\n      return perform();\n    }\n  } // Selection helpers\n\n\n  withTargetDOMRange(domRange, fn) {\n    if (typeof domRange === \"function\") {\n      fn = domRange;\n      domRange = this.getTargetDOMRange();\n    }\n\n    if (domRange) {\n      var _this$responder5;\n\n      return (_this$responder5 = this.responder) === null || _this$responder5 === void 0 ? void 0 : _this$responder5.withTargetDOMRange(domRange, fn.bind(this));\n    } else {\n      selectionChangeObserver.reset();\n      return fn.call(this);\n    }\n  }\n\n  getTargetDOMRange() {\n    var _this$event$getTarget, _this$event;\n\n    let {\n      minLength\n    } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n      minLength: 0\n    };\n    const targetRanges = (_this$event$getTarget = (_this$event = this.event).getTargetRanges) === null || _this$event$getTarget === void 0 ? void 0 : _this$event$getTarget.call(_this$event);\n\n    if (targetRanges) {\n      if (targetRanges.length) {\n        const domRange = staticRangeToRange(targetRanges[0]);\n\n        if (minLength === 0 || domRange.toString().length >= minLength) {\n          return domRange;\n        }\n      }\n    }\n  }\n\n  withEvent(event, fn) {\n    let result;\n    this.event = event;\n\n    try {\n      result = fn.call(this);\n    } finally {\n      this.event = null;\n    }\n\n    return result;\n  }\n\n}\n\n_defineProperty(Level2InputController, \"events\", {\n  keydown(event) {\n    if (keyEventIsKeyboardCommand(event)) {\n      var _this$delegate8;\n\n      const command = keyboardCommandFromKeyEvent(event);\n\n      if ((_this$delegate8 = this.delegate) !== null && _this$delegate8 !== void 0 && _this$delegate8.inputControllerDidReceiveKeyboardCommand(command)) {\n        event.preventDefault();\n      }\n    } else {\n      let name = event.key;\n\n      if (event.altKey) {\n        name += \"+Alt\";\n      }\n\n      if (event.shiftKey) {\n        name += \"+Shift\";\n      }\n\n      const handler = this.constructor.keys[name];\n\n      if (handler) {\n        return this.withEvent(event, handler);\n      }\n    }\n  },\n\n  // Handle paste event to work around beforeinput.insertFromPaste browser bugs.\n  // Safe to remove each condition once fixed upstream.\n  paste(event) {\n    var _event$clipboardData;\n\n    // https://bugs.webkit.org/show_bug.cgi?id=194921\n    let paste;\n    const href = (_event$clipboardData = event.clipboardData) === null || _event$clipboardData === void 0 ? void 0 : _event$clipboardData.getData(\"URL\");\n\n    if (pasteEventHasFilesOnly(event)) {\n      event.preventDefault();\n      return this.attachFiles(event.clipboardData.files); // https://bugs.chromium.org/p/chromium/issues/detail?id=934448\n    } else if (pasteEventHasPlainTextOnly(event)) {\n      var _this$delegate9, _this$responder6, _this$delegate10;\n\n      event.preventDefault();\n      paste = {\n        type: \"text/plain\",\n        string: event.clipboardData.getData(\"text/plain\")\n      };\n      (_this$delegate9 = this.delegate) === null || _this$delegate9 === void 0 ? void 0 : _this$delegate9.inputControllerWillPaste(paste);\n      (_this$responder6 = this.responder) === null || _this$responder6 === void 0 ? void 0 : _this$responder6.insertString(paste.string);\n      this.render();\n      return (_this$delegate10 = this.delegate) === null || _this$delegate10 === void 0 ? void 0 : _this$delegate10.inputControllerDidPaste(paste); // https://bugs.webkit.org/show_bug.cgi?id=196702\n    } else if (href) {\n      var _this$delegate11, _this$responder7, _this$delegate12;\n\n      event.preventDefault();\n      paste = {\n        type: \"text/html\",\n        html: this.createLinkHTML(href)\n      };\n      (_this$delegate11 = this.delegate) === null || _this$delegate11 === void 0 ? void 0 : _this$delegate11.inputControllerWillPaste(paste);\n      (_this$responder7 = this.responder) === null || _this$responder7 === void 0 ? void 0 : _this$responder7.insertHTML(paste.html);\n      this.render();\n      return (_this$delegate12 = this.delegate) === null || _this$delegate12 === void 0 ? void 0 : _this$delegate12.inputControllerDidPaste(paste);\n    }\n  },\n\n  beforeinput(event) {\n    const handler = this.constructor.inputTypes[event.inputType];\n\n    if (handler) {\n      this.withEvent(event, handler);\n      return this.scheduleRender();\n    }\n  },\n\n  input(event) {\n    return selectionChangeObserver.reset();\n  },\n\n  dragstart(event) {\n    var _this$responder8;\n\n    if ((_this$responder8 = this.responder) !== null && _this$responder8 !== void 0 && _this$responder8.selectionContainsAttachments()) {\n      var _this$responder9;\n\n      event.dataTransfer.setData(\"application/x-trix-dragging\", true);\n      this.dragging = {\n        range: (_this$responder9 = this.responder) === null || _this$responder9 === void 0 ? void 0 : _this$responder9.getSelectedRange(),\n        point: pointFromEvent(event)\n      };\n    }\n  },\n\n  dragenter(event) {\n    if (dragEventHasFiles(event)) {\n      event.preventDefault();\n    }\n  },\n\n  dragover(event) {\n    if (this.dragging) {\n      event.preventDefault();\n      const point = pointFromEvent(event);\n\n      if (!objectsAreEqual(point, this.dragging.point)) {\n        var _this$responder10;\n\n        this.dragging.point = point;\n        return (_this$responder10 = this.responder) === null || _this$responder10 === void 0 ? void 0 : _this$responder10.setLocationRangeFromPointRange(point);\n      }\n    } else if (dragEventHasFiles(event)) {\n      event.preventDefault();\n    }\n  },\n\n  drop(event) {\n    if (this.dragging) {\n      var _this$delegate13, _this$responder11;\n\n      event.preventDefault();\n      (_this$delegate13 = this.delegate) === null || _this$delegate13 === void 0 ? void 0 : _this$delegate13.inputControllerWillMoveText();\n      (_this$responder11 = this.responder) === null || _this$responder11 === void 0 ? void 0 : _this$responder11.moveTextFromRange(this.dragging.range);\n      this.dragging = null;\n      return this.scheduleRender();\n    } else if (dragEventHasFiles(event)) {\n      var _this$responder12;\n\n      event.preventDefault();\n      const point = pointFromEvent(event);\n      (_this$responder12 = this.responder) === null || _this$responder12 === void 0 ? void 0 : _this$responder12.setLocationRangeFromPointRange(point);\n      return this.attachFiles(event.dataTransfer.files);\n    }\n  },\n\n  dragend() {\n    if (this.dragging) {\n      var _this$responder13;\n\n      (_this$responder13 = this.responder) === null || _this$responder13 === void 0 ? void 0 : _this$responder13.setSelectedRange(this.dragging.range);\n      this.dragging = null;\n    }\n  },\n\n  compositionend(event) {\n    if (this.composing) {\n      this.composing = false;\n      return this.scheduleRender();\n    }\n  }\n\n});\n\n_defineProperty(Level2InputController, \"keys\", {\n  ArrowLeft() {\n    var _this$responder14;\n\n    if ((_this$responder14 = this.responder) !== null && _this$responder14 !== void 0 && _this$responder14.shouldManageMovingCursorInDirection(\"backward\")) {\n      var _this$responder15;\n\n      this.event.preventDefault();\n      return (_this$responder15 = this.responder) === null || _this$responder15 === void 0 ? void 0 : _this$responder15.moveCursorInDirection(\"backward\");\n    }\n  },\n\n  ArrowRight() {\n    var _this$responder16;\n\n    if ((_this$responder16 = this.responder) !== null && _this$responder16 !== void 0 && _this$responder16.shouldManageMovingCursorInDirection(\"forward\")) {\n      var _this$responder17;\n\n      this.event.preventDefault();\n      return (_this$responder17 = this.responder) === null || _this$responder17 === void 0 ? void 0 : _this$responder17.moveCursorInDirection(\"forward\");\n    }\n  },\n\n  Backspace() {\n    var _this$responder18;\n\n    if ((_this$responder18 = this.responder) !== null && _this$responder18 !== void 0 && _this$responder18.shouldManageDeletingInDirection(\"backward\")) {\n      var _this$delegate14, _this$responder19;\n\n      this.event.preventDefault();\n      (_this$delegate14 = this.delegate) === null || _this$delegate14 === void 0 ? void 0 : _this$delegate14.inputControllerWillPerformTyping();\n      (_this$responder19 = this.responder) === null || _this$responder19 === void 0 ? void 0 : _this$responder19.deleteInDirection(\"backward\");\n      return this.render();\n    }\n  },\n\n  Tab() {\n    var _this$responder20;\n\n    if ((_this$responder20 = this.responder) !== null && _this$responder20 !== void 0 && _this$responder20.canIncreaseNestingLevel()) {\n      var _this$responder21;\n\n      this.event.preventDefault();\n      (_this$responder21 = this.responder) === null || _this$responder21 === void 0 ? void 0 : _this$responder21.increaseNestingLevel();\n      return this.render();\n    }\n  },\n\n  \"Tab+Shift\"() {\n    var _this$responder22;\n\n    if ((_this$responder22 = this.responder) !== null && _this$responder22 !== void 0 && _this$responder22.canDecreaseNestingLevel()) {\n      var _this$responder23;\n\n      this.event.preventDefault();\n      (_this$responder23 = this.responder) === null || _this$responder23 === void 0 ? void 0 : _this$responder23.decreaseNestingLevel();\n      return this.render();\n    }\n  }\n\n});\n\n_defineProperty(Level2InputController, \"inputTypes\", {\n  deleteByComposition() {\n    return this.deleteInDirection(\"backward\", {\n      recordUndoEntry: false\n    });\n  },\n\n  deleteByCut() {\n    return this.deleteInDirection(\"backward\");\n  },\n\n  deleteByDrag() {\n    this.event.preventDefault();\n    return this.withTargetDOMRange(function () {\n      var _this$responder24;\n\n      this.deleteByDragRange = (_this$responder24 = this.responder) === null || _this$responder24 === void 0 ? void 0 : _this$responder24.getSelectedRange();\n    });\n  },\n\n  deleteCompositionText() {\n    return this.deleteInDirection(\"backward\", {\n      recordUndoEntry: false\n    });\n  },\n\n  deleteContent() {\n    return this.deleteInDirection(\"backward\");\n  },\n\n  deleteContentBackward() {\n    return this.deleteInDirection(\"backward\");\n  },\n\n  deleteContentForward() {\n    return this.deleteInDirection(\"forward\");\n  },\n\n  deleteEntireSoftLine() {\n    return this.deleteInDirection(\"forward\");\n  },\n\n  deleteHardLineBackward() {\n    return this.deleteInDirection(\"backward\");\n  },\n\n  deleteHardLineForward() {\n    return this.deleteInDirection(\"forward\");\n  },\n\n  deleteSoftLineBackward() {\n    return this.deleteInDirection(\"backward\");\n  },\n\n  deleteSoftLineForward() {\n    return this.deleteInDirection(\"forward\");\n  },\n\n  deleteWordBackward() {\n    return this.deleteInDirection(\"backward\");\n  },\n\n  deleteWordForward() {\n    return this.deleteInDirection(\"forward\");\n  },\n\n  formatBackColor() {\n    return this.activateAttributeIfSupported(\"backgroundColor\", this.event.data);\n  },\n\n  formatBold() {\n    return this.toggleAttributeIfSupported(\"bold\");\n  },\n\n  formatFontColor() {\n    return this.activateAttributeIfSupported(\"color\", this.event.data);\n  },\n\n  formatFontName() {\n    return this.activateAttributeIfSupported(\"font\", this.event.data);\n  },\n\n  formatIndent() {\n    var _this$responder25;\n\n    if ((_this$responder25 = this.responder) !== null && _this$responder25 !== void 0 && _this$responder25.canIncreaseNestingLevel()) {\n      return this.withTargetDOMRange(function () {\n        var _this$responder26;\n\n        return (_this$responder26 = this.responder) === null || _this$responder26 === void 0 ? void 0 : _this$responder26.increaseNestingLevel();\n      });\n    }\n  },\n\n  formatItalic() {\n    return this.toggleAttributeIfSupported(\"italic\");\n  },\n\n  formatJustifyCenter() {\n    return this.toggleAttributeIfSupported(\"justifyCenter\");\n  },\n\n  formatJustifyFull() {\n    return this.toggleAttributeIfSupported(\"justifyFull\");\n  },\n\n  formatJustifyLeft() {\n    return this.toggleAttributeIfSupported(\"justifyLeft\");\n  },\n\n  formatJustifyRight() {\n    return this.toggleAttributeIfSupported(\"justifyRight\");\n  },\n\n  formatOutdent() {\n    var _this$responder27;\n\n    if ((_this$responder27 = this.responder) !== null && _this$responder27 !== void 0 && _this$responder27.canDecreaseNestingLevel()) {\n      return this.withTargetDOMRange(function () {\n        var _this$responder28;\n\n        return (_this$responder28 = this.responder) === null || _this$responder28 === void 0 ? void 0 : _this$responder28.decreaseNestingLevel();\n      });\n    }\n  },\n\n  formatRemove() {\n    this.withTargetDOMRange(function () {\n      for (const attributeName in (_this$responder29 = this.responder) === null || _this$responder29 === void 0 ? void 0 : _this$responder29.getCurrentAttributes()) {\n        var _this$responder29, _this$responder30;\n\n        (_this$responder30 = this.responder) === null || _this$responder30 === void 0 ? void 0 : _this$responder30.removeCurrentAttribute(attributeName);\n      }\n    });\n  },\n\n  formatSetBlockTextDirection() {\n    return this.activateAttributeIfSupported(\"blockDir\", this.event.data);\n  },\n\n  formatSetInlineTextDirection() {\n    return this.activateAttributeIfSupported(\"textDir\", this.event.data);\n  },\n\n  formatStrikeThrough() {\n    return this.toggleAttributeIfSupported(\"strike\");\n  },\n\n  formatSubscript() {\n    return this.toggleAttributeIfSupported(\"sub\");\n  },\n\n  formatSuperscript() {\n    return this.toggleAttributeIfSupported(\"sup\");\n  },\n\n  formatUnderline() {\n    return this.toggleAttributeIfSupported(\"underline\");\n  },\n\n  historyRedo() {\n    var _this$delegate15;\n\n    return (_this$delegate15 = this.delegate) === null || _this$delegate15 === void 0 ? void 0 : _this$delegate15.inputControllerWillPerformRedo();\n  },\n\n  historyUndo() {\n    var _this$delegate16;\n\n    return (_this$delegate16 = this.delegate) === null || _this$delegate16 === void 0 ? void 0 : _this$delegate16.inputControllerWillPerformUndo();\n  },\n\n  insertCompositionText() {\n    this.composing = true;\n    return this.insertString(this.event.data);\n  },\n\n  insertFromComposition() {\n    this.composing = false;\n    return this.insertString(this.event.data);\n  },\n\n  insertFromDrop() {\n    const range = this.deleteByDragRange;\n\n    if (range) {\n      var _this$delegate17;\n\n      this.deleteByDragRange = null;\n      (_this$delegate17 = this.delegate) === null || _this$delegate17 === void 0 ? void 0 : _this$delegate17.inputControllerWillMoveText();\n      return this.withTargetDOMRange(function () {\n        var _this$responder31;\n\n        return (_this$responder31 = this.responder) === null || _this$responder31 === void 0 ? void 0 : _this$responder31.moveTextFromRange(range);\n      });\n    }\n  },\n\n  insertFromPaste() {\n    var _dataTransfer$files;\n\n    const {\n      dataTransfer\n    } = this.event;\n    const paste = {\n      dataTransfer\n    };\n    const href = dataTransfer.getData(\"URL\");\n    const html = dataTransfer.getData(\"text/html\");\n\n    if (href) {\n      var _this$delegate18;\n\n      let string;\n      this.event.preventDefault();\n      paste.type = \"text/html\";\n      const name = dataTransfer.getData(\"public.url-name\");\n\n      if (name) {\n        string = squishBreakableWhitespace(name).trim();\n      } else {\n        string = href;\n      }\n\n      paste.html = this.createLinkHTML(href, string);\n      (_this$delegate18 = this.delegate) === null || _this$delegate18 === void 0 ? void 0 : _this$delegate18.inputControllerWillPaste(paste);\n      this.withTargetDOMRange(function () {\n        var _this$responder32;\n\n        return (_this$responder32 = this.responder) === null || _this$responder32 === void 0 ? void 0 : _this$responder32.insertHTML(paste.html);\n      });\n\n      this.afterRender = () => {\n        var _this$delegate19;\n\n        return (_this$delegate19 = this.delegate) === null || _this$delegate19 === void 0 ? void 0 : _this$delegate19.inputControllerDidPaste(paste);\n      };\n    } else if (dataTransferIsPlainText(dataTransfer)) {\n      var _this$delegate20;\n\n      paste.type = \"text/plain\";\n      paste.string = dataTransfer.getData(\"text/plain\");\n      (_this$delegate20 = this.delegate) === null || _this$delegate20 === void 0 ? void 0 : _this$delegate20.inputControllerWillPaste(paste);\n      this.withTargetDOMRange(function () {\n        var _this$responder33;\n\n        return (_this$responder33 = this.responder) === null || _this$responder33 === void 0 ? void 0 : _this$responder33.insertString(paste.string);\n      });\n\n      this.afterRender = () => {\n        var _this$delegate21;\n\n        return (_this$delegate21 = this.delegate) === null || _this$delegate21 === void 0 ? void 0 : _this$delegate21.inputControllerDidPaste(paste);\n      };\n    } else if (html) {\n      var _this$delegate22;\n\n      this.event.preventDefault();\n      paste.type = \"text/html\";\n      paste.html = html;\n      (_this$delegate22 = this.delegate) === null || _this$delegate22 === void 0 ? void 0 : _this$delegate22.inputControllerWillPaste(paste);\n      this.withTargetDOMRange(function () {\n        var _this$responder34;\n\n        return (_this$responder34 = this.responder) === null || _this$responder34 === void 0 ? void 0 : _this$responder34.insertHTML(paste.html);\n      });\n\n      this.afterRender = () => {\n        var _this$delegate23;\n\n        return (_this$delegate23 = this.delegate) === null || _this$delegate23 === void 0 ? void 0 : _this$delegate23.inputControllerDidPaste(paste);\n      };\n    } else if ((_dataTransfer$files = dataTransfer.files) !== null && _dataTransfer$files !== void 0 && _dataTransfer$files.length) {\n      var _this$delegate24;\n\n      paste.type = \"File\";\n      paste.file = dataTransfer.files[0];\n      (_this$delegate24 = this.delegate) === null || _this$delegate24 === void 0 ? void 0 : _this$delegate24.inputControllerWillPaste(paste);\n      this.withTargetDOMRange(function () {\n        var _this$responder35;\n\n        return (_this$responder35 = this.responder) === null || _this$responder35 === void 0 ? void 0 : _this$responder35.insertFile(paste.file);\n      });\n\n      this.afterRender = () => {\n        var _this$delegate25;\n\n        return (_this$delegate25 = this.delegate) === null || _this$delegate25 === void 0 ? void 0 : _this$delegate25.inputControllerDidPaste(paste);\n      };\n    }\n  },\n\n  insertFromYank() {\n    return this.insertString(this.event.data);\n  },\n\n  insertLineBreak() {\n    return this.insertString(\"\\n\");\n  },\n\n  insertLink() {\n    return this.activateAttributeIfSupported(\"href\", this.event.data);\n  },\n\n  insertOrderedList() {\n    return this.toggleAttributeIfSupported(\"number\");\n  },\n\n  insertParagraph() {\n    var _this$delegate26;\n\n    (_this$delegate26 = this.delegate) === null || _this$delegate26 === void 0 ? void 0 : _this$delegate26.inputControllerWillPerformTyping();\n    return this.withTargetDOMRange(function () {\n      var _this$responder36;\n\n      return (_this$responder36 = this.responder) === null || _this$responder36 === void 0 ? void 0 : _this$responder36.insertLineBreak();\n    });\n  },\n\n  insertReplacementText() {\n    return this.insertString(this.event.dataTransfer.getData(\"text/plain\"), {\n      updatePosition: false\n    });\n  },\n\n  insertText() {\n    var _this$event$dataTrans;\n\n    return this.insertString(this.event.data || ((_this$event$dataTrans = this.event.dataTransfer) === null || _this$event$dataTrans === void 0 ? void 0 : _this$event$dataTrans.getData(\"text/plain\")));\n  },\n\n  insertTranspose() {\n    return this.insertString(this.event.data);\n  },\n\n  insertUnorderedList() {\n    return this.toggleAttributeIfSupported(\"bullet\");\n  }\n\n});\n\nconst staticRangeToRange = function (staticRange) {\n  const range = document.createRange();\n  range.setStart(staticRange.startContainer, staticRange.startOffset);\n  range.setEnd(staticRange.endContainer, staticRange.endOffset);\n  return range;\n}; // Event helpers\n\n\nconst dragEventHasFiles = event => {\n  var _event$dataTransfer;\n\n  return Array.from(((_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.types) || []).includes(\"Files\");\n};\n\nconst pasteEventHasFilesOnly = function (event) {\n  const clipboard = event.clipboardData;\n\n  if (clipboard) {\n    return clipboard.types.includes(\"Files\") && clipboard.types.length === 1 && clipboard.files.length >= 1;\n  }\n};\n\nconst pasteEventHasPlainTextOnly = function (event) {\n  const clipboard = event.clipboardData;\n\n  if (clipboard) {\n    return clipboard.types.includes(\"text/plain\") && clipboard.types.length === 1;\n  }\n};\n\nconst keyboardCommandFromKeyEvent = function (event) {\n  const command = [];\n\n  if (event.altKey) {\n    command.push(\"alt\");\n  }\n\n  if (event.shiftKey) {\n    command.push(\"shift\");\n  }\n\n  command.push(event.key);\n  return command;\n};\n\nconst pointFromEvent = event => ({\n  x: event.clientX,\n  y: event.clientY\n});\n\nconst {\n  lang,\n  css,\n  keyNames\n} = config;\n\nconst undoable = function (fn) {\n  return function () {\n    const commands = fn.apply(this, arguments);\n    commands.do();\n\n    if (!this.undos) {\n      this.undos = [];\n    }\n\n    this.undos.push(commands.undo);\n  };\n};\n\nclass AttachmentEditorController extends BasicObject {\n  constructor(attachmentPiece, _element, container) {\n    let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    super(...arguments);\n\n    _defineProperty(this, \"makeElementMutable\", undoable(() => {\n      return {\n        do: () => {\n          this.element.dataset.trixMutable = true;\n        },\n        undo: () => delete this.element.dataset.trixMutable\n      };\n    }));\n\n    _defineProperty(this, \"addToolbar\", undoable(() => {\n      // <div class=\"#{css.attachmentMetadataContainer}\" data-trix-mutable=\"true\">\n      //   <div class=\"trix-button-row\">\n      //     <span class=\"trix-button-group trix-button-group--actions\">\n      //       <button type=\"button\" class=\"trix-button trix-button--remove\" title=\"#{lang.remove}\" data-trix-action=\"remove\">#{lang.remove}</button>\n      //     </span>\n      //   </div>\n      // </div>\n      const element = makeElement({\n        tagName: \"div\",\n        className: css.attachmentToolbar,\n        data: {\n          trixMutable: true\n        },\n        childNodes: makeElement({\n          tagName: \"div\",\n          className: \"trix-button-row\",\n          childNodes: makeElement({\n            tagName: \"span\",\n            className: \"trix-button-group trix-button-group--actions\",\n            childNodes: makeElement({\n              tagName: \"button\",\n              className: \"trix-button trix-button--remove\",\n              textContent: lang.remove,\n              attributes: {\n                title: lang.remove\n              },\n              data: {\n                trixAction: \"remove\"\n              }\n            })\n          })\n        })\n      });\n\n      if (this.attachment.isPreviewable()) {\n        // <div class=\"#{css.attachmentMetadataContainer}\">\n        //   <span class=\"#{css.attachmentMetadata}\">\n        //     <span class=\"#{css.attachmentName}\" title=\"#{name}\">#{name}</span>\n        //     <span class=\"#{css.attachmentSize}\">#{size}</span>\n        //   </span>\n        // </div>\n        element.appendChild(makeElement({\n          tagName: \"div\",\n          className: css.attachmentMetadataContainer,\n          childNodes: makeElement({\n            tagName: \"span\",\n            className: css.attachmentMetadata,\n            childNodes: [makeElement({\n              tagName: \"span\",\n              className: css.attachmentName,\n              textContent: this.attachment.getFilename(),\n              attributes: {\n                title: this.attachment.getFilename()\n              }\n            }), makeElement({\n              tagName: \"span\",\n              className: css.attachmentSize,\n              textContent: this.attachment.getFormattedFilesize()\n            })]\n          })\n        }));\n      }\n\n      handleEvent(\"click\", {\n        onElement: element,\n        withCallback: this.didClickToolbar\n      });\n      handleEvent(\"click\", {\n        onElement: element,\n        matchingSelector: \"[data-trix-action]\",\n        withCallback: this.didClickActionButton\n      });\n      return {\n        do: () => this.element.appendChild(element),\n        undo: () => removeNode(element)\n      };\n    }));\n\n    _defineProperty(this, \"installCaptionEditor\", undoable(() => {\n      const textarea = makeElement({\n        tagName: \"textarea\",\n        className: css.attachmentCaptionEditor,\n        attributes: {\n          placeholder: lang.captionPlaceholder\n        },\n        data: {\n          trixMutable: true\n        }\n      });\n      textarea.value = this.attachmentPiece.getCaption();\n      const textareaClone = textarea.cloneNode();\n      textareaClone.classList.add(\"trix-autoresize-clone\");\n      textareaClone.tabIndex = -1;\n\n      const autoresize = function () {\n        textareaClone.value = textarea.value;\n        textarea.style.height = textareaClone.scrollHeight + \"px\";\n      };\n\n      handleEvent(\"input\", {\n        onElement: textarea,\n        withCallback: autoresize\n      });\n      handleEvent(\"input\", {\n        onElement: textarea,\n        withCallback: this.didInputCaption\n      });\n      handleEvent(\"keydown\", {\n        onElement: textarea,\n        withCallback: this.didKeyDownCaption\n      });\n      handleEvent(\"change\", {\n        onElement: textarea,\n        withCallback: this.didChangeCaption\n      });\n      handleEvent(\"blur\", {\n        onElement: textarea,\n        withCallback: this.didBlurCaption\n      });\n      const figcaption = this.element.querySelector(\"figcaption\");\n      const editingFigcaption = figcaption.cloneNode();\n      return {\n        do: () => {\n          figcaption.style.display = \"none\";\n          editingFigcaption.appendChild(textarea);\n          editingFigcaption.appendChild(textareaClone);\n          editingFigcaption.classList.add(\"\".concat(css.attachmentCaption, \"--editing\"));\n          figcaption.parentElement.insertBefore(editingFigcaption, figcaption);\n          autoresize();\n\n          if (this.options.editCaption) {\n            return defer(() => textarea.focus());\n          }\n        },\n\n        undo() {\n          removeNode(editingFigcaption);\n          figcaption.style.display = null;\n        }\n\n      };\n    }));\n\n    this.didClickToolbar = this.didClickToolbar.bind(this);\n    this.didClickActionButton = this.didClickActionButton.bind(this);\n    this.didKeyDownCaption = this.didKeyDownCaption.bind(this);\n    this.didInputCaption = this.didInputCaption.bind(this);\n    this.didChangeCaption = this.didChangeCaption.bind(this);\n    this.didBlurCaption = this.didBlurCaption.bind(this);\n    this.attachmentPiece = attachmentPiece;\n    this.element = _element;\n    this.container = container;\n    this.options = options;\n    this.attachment = this.attachmentPiece.attachment;\n\n    if (tagName(this.element) === \"a\") {\n      this.element = this.element.firstChild;\n    }\n\n    this.install();\n  }\n\n  install() {\n    this.makeElementMutable();\n    this.addToolbar();\n\n    if (this.attachment.isPreviewable()) {\n      this.installCaptionEditor();\n    }\n  }\n\n  uninstall() {\n    var _this$delegate;\n\n    let undo = this.undos.pop();\n    this.savePendingCaption();\n\n    while (undo) {\n      undo();\n      undo = this.undos.pop();\n    }\n\n    (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : _this$delegate.didUninstallAttachmentEditor(this);\n  } // Private\n\n\n  savePendingCaption() {\n    if (this.pendingCaption) {\n      const caption = this.pendingCaption;\n      this.pendingCaption = null;\n\n      if (caption) {\n        var _this$delegate2, _this$delegate2$attac;\n\n        (_this$delegate2 = this.delegate) === null || _this$delegate2 === void 0 ? void 0 : (_this$delegate2$attac = _this$delegate2.attachmentEditorDidRequestUpdatingAttributesForAttachment) === null || _this$delegate2$attac === void 0 ? void 0 : _this$delegate2$attac.call(_this$delegate2, {\n          caption\n        }, this.attachment);\n      } else {\n        var _this$delegate3, _this$delegate3$attac;\n\n        (_this$delegate3 = this.delegate) === null || _this$delegate3 === void 0 ? void 0 : (_this$delegate3$attac = _this$delegate3.attachmentEditorDidRequestRemovingAttributeForAttachment) === null || _this$delegate3$attac === void 0 ? void 0 : _this$delegate3$attac.call(_this$delegate3, \"caption\", this.attachment);\n      }\n    }\n  } // Installing and uninstalling\n\n\n  // Event handlers\n  didClickToolbar(event) {\n    event.preventDefault();\n    return event.stopPropagation();\n  }\n\n  didClickActionButton(event) {\n    var _this$delegate4;\n\n    const action = event.target.getAttribute(\"data-trix-action\");\n\n    switch (action) {\n      case \"remove\":\n        return (_this$delegate4 = this.delegate) === null || _this$delegate4 === void 0 ? void 0 : _this$delegate4.attachmentEditorDidRequestRemovalOfAttachment(this.attachment);\n    }\n  }\n\n  didKeyDownCaption(event) {\n    if (keyNames[event.keyCode] === \"return\") {\n      var _this$delegate5, _this$delegate5$attac;\n\n      event.preventDefault();\n      this.savePendingCaption();\n      return (_this$delegate5 = this.delegate) === null || _this$delegate5 === void 0 ? void 0 : (_this$delegate5$attac = _this$delegate5.attachmentEditorDidRequestDeselectingAttachment) === null || _this$delegate5$attac === void 0 ? void 0 : _this$delegate5$attac.call(_this$delegate5, this.attachment);\n    }\n  }\n\n  didInputCaption(event) {\n    this.pendingCaption = event.target.value.replace(/\\s/g, \" \").trim();\n  }\n\n  didChangeCaption(event) {\n    return this.savePendingCaption();\n  }\n\n  didBlurCaption(event) {\n    return this.savePendingCaption();\n  }\n\n}\n\nclass CompositionController extends BasicObject {\n  constructor(element, composition) {\n    super(...arguments);\n    this.didFocus = this.didFocus.bind(this);\n    this.didBlur = this.didBlur.bind(this);\n    this.didClickAttachment = this.didClickAttachment.bind(this);\n    this.element = element;\n    this.composition = composition;\n    this.documentView = new DocumentView(this.composition.document, {\n      element: this.element\n    });\n    handleEvent(\"focus\", {\n      onElement: this.element,\n      withCallback: this.didFocus\n    });\n    handleEvent(\"blur\", {\n      onElement: this.element,\n      withCallback: this.didBlur\n    });\n    handleEvent(\"click\", {\n      onElement: this.element,\n      matchingSelector: \"a[contenteditable=false]\",\n      preventDefault: true\n    });\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: attachmentSelector,\n      withCallback: this.didClickAttachment\n    });\n    handleEvent(\"click\", {\n      onElement: this.element,\n      matchingSelector: \"a\".concat(attachmentSelector),\n      preventDefault: true\n    });\n  }\n\n  didFocus(event) {\n    var _this$blurPromise;\n\n    const perform = () => {\n      if (!this.focused) {\n        var _this$delegate, _this$delegate$compos;\n\n        this.focused = true;\n        return (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : (_this$delegate$compos = _this$delegate.compositionControllerDidFocus) === null || _this$delegate$compos === void 0 ? void 0 : _this$delegate$compos.call(_this$delegate);\n      }\n    };\n\n    return ((_this$blurPromise = this.blurPromise) === null || _this$blurPromise === void 0 ? void 0 : _this$blurPromise.then(perform)) || perform();\n  }\n\n  didBlur(event) {\n    this.blurPromise = new Promise(resolve => {\n      return defer(() => {\n        if (!innerElementIsActive(this.element)) {\n          var _this$delegate2, _this$delegate2$compo;\n\n          this.focused = null;\n          (_this$delegate2 = this.delegate) === null || _this$delegate2 === void 0 ? void 0 : (_this$delegate2$compo = _this$delegate2.compositionControllerDidBlur) === null || _this$delegate2$compo === void 0 ? void 0 : _this$delegate2$compo.call(_this$delegate2);\n        }\n\n        this.blurPromise = null;\n        return resolve();\n      });\n    });\n  }\n\n  didClickAttachment(event, target) {\n    var _this$delegate3, _this$delegate3$compo;\n\n    const attachment = this.findAttachmentForElement(target);\n    const editCaption = !!findClosestElementFromNode(event.target, {\n      matchingSelector: \"figcaption\"\n    });\n    return (_this$delegate3 = this.delegate) === null || _this$delegate3 === void 0 ? void 0 : (_this$delegate3$compo = _this$delegate3.compositionControllerDidSelectAttachment) === null || _this$delegate3$compo === void 0 ? void 0 : _this$delegate3$compo.call(_this$delegate3, attachment, {\n      editCaption\n    });\n  }\n\n  getSerializableElement() {\n    if (this.isEditingAttachment()) {\n      return this.documentView.shadowElement;\n    } else {\n      return this.element;\n    }\n  }\n\n  render() {\n    var _this$delegate6, _this$delegate6$compo;\n\n    if (this.revision !== this.composition.revision) {\n      this.documentView.setDocument(this.composition.document);\n      this.documentView.render();\n      this.revision = this.composition.revision;\n    }\n\n    if (this.canSyncDocumentView() && !this.documentView.isSynced()) {\n      var _this$delegate4, _this$delegate4$compo, _this$delegate5, _this$delegate5$compo;\n\n      (_this$delegate4 = this.delegate) === null || _this$delegate4 === void 0 ? void 0 : (_this$delegate4$compo = _this$delegate4.compositionControllerWillSyncDocumentView) === null || _this$delegate4$compo === void 0 ? void 0 : _this$delegate4$compo.call(_this$delegate4);\n      this.documentView.sync();\n      (_this$delegate5 = this.delegate) === null || _this$delegate5 === void 0 ? void 0 : (_this$delegate5$compo = _this$delegate5.compositionControllerDidSyncDocumentView) === null || _this$delegate5$compo === void 0 ? void 0 : _this$delegate5$compo.call(_this$delegate5);\n    }\n\n    return (_this$delegate6 = this.delegate) === null || _this$delegate6 === void 0 ? void 0 : (_this$delegate6$compo = _this$delegate6.compositionControllerDidRender) === null || _this$delegate6$compo === void 0 ? void 0 : _this$delegate6$compo.call(_this$delegate6);\n  }\n\n  rerenderViewForObject(object) {\n    this.invalidateViewForObject(object);\n    return this.render();\n  }\n\n  invalidateViewForObject(object) {\n    return this.documentView.invalidateViewForObject(object);\n  }\n\n  isViewCachingEnabled() {\n    return this.documentView.isViewCachingEnabled();\n  }\n\n  enableViewCaching() {\n    return this.documentView.enableViewCaching();\n  }\n\n  disableViewCaching() {\n    return this.documentView.disableViewCaching();\n  }\n\n  refreshViewCache() {\n    return this.documentView.garbageCollectCachedViews();\n  } // Attachment editor management\n\n\n  isEditingAttachment() {\n    return !!this.attachmentEditor;\n  }\n\n  installAttachmentEditorForAttachment(attachment, options) {\n    var _this$attachmentEdito;\n\n    if (((_this$attachmentEdito = this.attachmentEditor) === null || _this$attachmentEdito === void 0 ? void 0 : _this$attachmentEdito.attachment) === attachment) return;\n    const element = this.documentView.findElementForObject(attachment);\n    if (!element) return;\n    this.uninstallAttachmentEditor();\n    const attachmentPiece = this.composition.document.getAttachmentPieceForAttachment(attachment);\n    this.attachmentEditor = new AttachmentEditorController(attachmentPiece, element, this.element, options);\n    this.attachmentEditor.delegate = this;\n  }\n\n  uninstallAttachmentEditor() {\n    var _this$attachmentEdito2;\n\n    return (_this$attachmentEdito2 = this.attachmentEditor) === null || _this$attachmentEdito2 === void 0 ? void 0 : _this$attachmentEdito2.uninstall();\n  } // Attachment controller delegate\n\n\n  didUninstallAttachmentEditor() {\n    this.attachmentEditor = null;\n    return this.render();\n  }\n\n  attachmentEditorDidRequestUpdatingAttributesForAttachment(attributes, attachment) {\n    var _this$delegate7, _this$delegate7$compo;\n\n    (_this$delegate7 = this.delegate) === null || _this$delegate7 === void 0 ? void 0 : (_this$delegate7$compo = _this$delegate7.compositionControllerWillUpdateAttachment) === null || _this$delegate7$compo === void 0 ? void 0 : _this$delegate7$compo.call(_this$delegate7, attachment);\n    return this.composition.updateAttributesForAttachment(attributes, attachment);\n  }\n\n  attachmentEditorDidRequestRemovingAttributeForAttachment(attribute, attachment) {\n    var _this$delegate8, _this$delegate8$compo;\n\n    (_this$delegate8 = this.delegate) === null || _this$delegate8 === void 0 ? void 0 : (_this$delegate8$compo = _this$delegate8.compositionControllerWillUpdateAttachment) === null || _this$delegate8$compo === void 0 ? void 0 : _this$delegate8$compo.call(_this$delegate8, attachment);\n    return this.composition.removeAttributeForAttachment(attribute, attachment);\n  }\n\n  attachmentEditorDidRequestRemovalOfAttachment(attachment) {\n    var _this$delegate9, _this$delegate9$compo;\n\n    return (_this$delegate9 = this.delegate) === null || _this$delegate9 === void 0 ? void 0 : (_this$delegate9$compo = _this$delegate9.compositionControllerDidRequestRemovalOfAttachment) === null || _this$delegate9$compo === void 0 ? void 0 : _this$delegate9$compo.call(_this$delegate9, attachment);\n  }\n\n  attachmentEditorDidRequestDeselectingAttachment(attachment) {\n    var _this$delegate10, _this$delegate10$comp;\n\n    return (_this$delegate10 = this.delegate) === null || _this$delegate10 === void 0 ? void 0 : (_this$delegate10$comp = _this$delegate10.compositionControllerDidRequestDeselectingAttachment) === null || _this$delegate10$comp === void 0 ? void 0 : _this$delegate10$comp.call(_this$delegate10, attachment);\n  } // Private\n\n\n  canSyncDocumentView() {\n    return !this.isEditingAttachment();\n  }\n\n  findAttachmentForElement(element) {\n    return this.composition.document.getAttachmentById(parseInt(element.dataset.trixId, 10));\n  }\n\n}\n\nconst attributeButtonSelector = \"[data-trix-attribute]\";\nconst actionButtonSelector = \"[data-trix-action]\";\nconst toolbarButtonSelector = \"\".concat(attributeButtonSelector, \", \").concat(actionButtonSelector);\nconst dialogSelector = \"[data-trix-dialog]\";\nconst activeDialogSelector = \"\".concat(dialogSelector, \"[data-trix-active]\");\nconst dialogButtonSelector = \"\".concat(dialogSelector, \" [data-trix-method]\");\nconst dialogInputSelector = \"\".concat(dialogSelector, \" [data-trix-input]\");\n\nconst getInputForDialog = (element, attributeName) => {\n  if (!attributeName) {\n    attributeName = getAttributeName(element);\n  }\n\n  return element.querySelector(\"[data-trix-input][name='\".concat(attributeName, \"']\"));\n};\n\nconst getActionName = element => element.getAttribute(\"data-trix-action\");\n\nconst getAttributeName = element => {\n  return element.getAttribute(\"data-trix-attribute\") || element.getAttribute(\"data-trix-dialog-attribute\");\n};\n\nconst getDialogName = element => element.getAttribute(\"data-trix-dialog\");\n\nclass ToolbarController extends BasicObject {\n  constructor(element) {\n    super(element);\n    this.didClickActionButton = this.didClickActionButton.bind(this);\n    this.didClickAttributeButton = this.didClickAttributeButton.bind(this);\n    this.didClickDialogButton = this.didClickDialogButton.bind(this);\n    this.didKeyDownDialogInput = this.didKeyDownDialogInput.bind(this);\n    this.element = element;\n    this.attributes = {};\n    this.actions = {};\n    this.resetDialogInputs();\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: actionButtonSelector,\n      withCallback: this.didClickActionButton\n    });\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: attributeButtonSelector,\n      withCallback: this.didClickAttributeButton\n    });\n    handleEvent(\"click\", {\n      onElement: this.element,\n      matchingSelector: toolbarButtonSelector,\n      preventDefault: true\n    });\n    handleEvent(\"click\", {\n      onElement: this.element,\n      matchingSelector: dialogButtonSelector,\n      withCallback: this.didClickDialogButton\n    });\n    handleEvent(\"keydown\", {\n      onElement: this.element,\n      matchingSelector: dialogInputSelector,\n      withCallback: this.didKeyDownDialogInput\n    });\n  } // Event handlers\n\n\n  didClickActionButton(event, element) {\n    var _this$delegate;\n\n    (_this$delegate = this.delegate) === null || _this$delegate === void 0 ? void 0 : _this$delegate.toolbarDidClickButton();\n    event.preventDefault();\n    const actionName = getActionName(element);\n\n    if (this.getDialog(actionName)) {\n      return this.toggleDialog(actionName);\n    } else {\n      var _this$delegate2;\n\n      return (_this$delegate2 = this.delegate) === null || _this$delegate2 === void 0 ? void 0 : _this$delegate2.toolbarDidInvokeAction(actionName);\n    }\n  }\n\n  didClickAttributeButton(event, element) {\n    var _this$delegate3;\n\n    (_this$delegate3 = this.delegate) === null || _this$delegate3 === void 0 ? void 0 : _this$delegate3.toolbarDidClickButton();\n    event.preventDefault();\n    const attributeName = getAttributeName(element);\n\n    if (this.getDialog(attributeName)) {\n      this.toggleDialog(attributeName);\n    } else {\n      var _this$delegate4;\n\n      (_this$delegate4 = this.delegate) === null || _this$delegate4 === void 0 ? void 0 : _this$delegate4.toolbarDidToggleAttribute(attributeName);\n    }\n\n    return this.refreshAttributeButtons();\n  }\n\n  didClickDialogButton(event, element) {\n    const dialogElement = findClosestElementFromNode(element, {\n      matchingSelector: dialogSelector\n    });\n    const method = element.getAttribute(\"data-trix-method\");\n    return this[method].call(this, dialogElement);\n  }\n\n  didKeyDownDialogInput(event, element) {\n    if (event.keyCode === 13) {\n      // Enter key\n      event.preventDefault();\n      const attribute = element.getAttribute(\"name\");\n      const dialog = this.getDialog(attribute);\n      this.setAttribute(dialog);\n    }\n\n    if (event.keyCode === 27) {\n      // Escape key\n      event.preventDefault();\n      return this.hideDialog();\n    }\n  } // Action buttons\n\n\n  updateActions(actions) {\n    this.actions = actions;\n    return this.refreshActionButtons();\n  }\n\n  refreshActionButtons() {\n    return this.eachActionButton((element, actionName) => {\n      element.disabled = this.actions[actionName] === false;\n    });\n  }\n\n  eachActionButton(callback) {\n    return Array.from(this.element.querySelectorAll(actionButtonSelector)).map(element => callback(element, getActionName(element)));\n  } // Attribute buttons\n\n\n  updateAttributes(attributes) {\n    this.attributes = attributes;\n    return this.refreshAttributeButtons();\n  }\n\n  refreshAttributeButtons() {\n    return this.eachAttributeButton((element, attributeName) => {\n      element.disabled = this.attributes[attributeName] === false;\n\n      if (this.attributes[attributeName] || this.dialogIsVisible(attributeName)) {\n        element.setAttribute(\"data-trix-active\", \"\");\n        return element.classList.add(\"trix-active\");\n      } else {\n        element.removeAttribute(\"data-trix-active\");\n        return element.classList.remove(\"trix-active\");\n      }\n    });\n  }\n\n  eachAttributeButton(callback) {\n    return Array.from(this.element.querySelectorAll(attributeButtonSelector)).map(element => callback(element, getAttributeName(element)));\n  }\n\n  applyKeyboardCommand(keys) {\n    const keyString = JSON.stringify(keys.sort());\n\n    for (const button of Array.from(this.element.querySelectorAll(\"[data-trix-key]\"))) {\n      const buttonKeys = button.getAttribute(\"data-trix-key\").split(\"+\");\n      const buttonKeyString = JSON.stringify(buttonKeys.sort());\n\n      if (buttonKeyString === keyString) {\n        triggerEvent(\"mousedown\", {\n          onElement: button\n        });\n        return true;\n      }\n    }\n\n    return false;\n  } // Dialogs\n\n\n  dialogIsVisible(dialogName) {\n    const element = this.getDialog(dialogName);\n\n    if (element) {\n      return element.hasAttribute(\"data-trix-active\");\n    }\n  }\n\n  toggleDialog(dialogName) {\n    if (this.dialogIsVisible(dialogName)) {\n      return this.hideDialog();\n    } else {\n      return this.showDialog(dialogName);\n    }\n  }\n\n  showDialog(dialogName) {\n    var _this$delegate5, _this$delegate6;\n\n    this.hideDialog();\n    (_this$delegate5 = this.delegate) === null || _this$delegate5 === void 0 ? void 0 : _this$delegate5.toolbarWillShowDialog();\n    const element = this.getDialog(dialogName);\n    element.setAttribute(\"data-trix-active\", \"\");\n    element.classList.add(\"trix-active\");\n    Array.from(element.querySelectorAll(\"input[disabled]\")).forEach(disabledInput => {\n      disabledInput.removeAttribute(\"disabled\");\n    });\n    const attributeName = getAttributeName(element);\n\n    if (attributeName) {\n      const input = getInputForDialog(element, dialogName);\n\n      if (input) {\n        input.value = this.attributes[attributeName] || \"\";\n        input.select();\n      }\n    }\n\n    return (_this$delegate6 = this.delegate) === null || _this$delegate6 === void 0 ? void 0 : _this$delegate6.toolbarDidShowDialog(dialogName);\n  }\n\n  setAttribute(dialogElement) {\n    const attributeName = getAttributeName(dialogElement);\n    const input = getInputForDialog(dialogElement, attributeName);\n\n    if (input.willValidate && !input.checkValidity()) {\n      input.setAttribute(\"data-trix-validate\", \"\");\n      input.classList.add(\"trix-validate\");\n      return input.focus();\n    } else {\n      var _this$delegate7;\n\n      (_this$delegate7 = this.delegate) === null || _this$delegate7 === void 0 ? void 0 : _this$delegate7.toolbarDidUpdateAttribute(attributeName, input.value);\n      return this.hideDialog();\n    }\n  }\n\n  removeAttribute(dialogElement) {\n    var _this$delegate8;\n\n    const attributeName = getAttributeName(dialogElement);\n    (_this$delegate8 = this.delegate) === null || _this$delegate8 === void 0 ? void 0 : _this$delegate8.toolbarDidRemoveAttribute(attributeName);\n    return this.hideDialog();\n  }\n\n  hideDialog() {\n    const element = this.element.querySelector(activeDialogSelector);\n\n    if (element) {\n      var _this$delegate9;\n\n      element.removeAttribute(\"data-trix-active\");\n      element.classList.remove(\"trix-active\");\n      this.resetDialogInputs();\n      return (_this$delegate9 = this.delegate) === null || _this$delegate9 === void 0 ? void 0 : _this$delegate9.toolbarDidHideDialog(getDialogName(element));\n    }\n  }\n\n  resetDialogInputs() {\n    Array.from(this.element.querySelectorAll(dialogInputSelector)).forEach(input => {\n      input.setAttribute(\"disabled\", \"disabled\");\n      input.removeAttribute(\"data-trix-validate\");\n      input.classList.remove(\"trix-validate\");\n    });\n  }\n\n  getDialog(dialogName) {\n    return this.element.querySelector(\"[data-trix-dialog=\".concat(dialogName, \"]\"));\n  }\n\n}\n\nconst snapshotsAreEqual = (a, b) => rangesAreEqual(a.selectedRange, b.selectedRange) && a.document.isEqualTo(b.document);\n\nclass EditorController extends Controller {\n  constructor(_ref) {\n    let {\n      editorElement,\n      document,\n      html\n    } = _ref;\n    super(...arguments);\n    this.editorElement = editorElement;\n    this.selectionManager = new SelectionManager(this.editorElement);\n    this.selectionManager.delegate = this;\n    this.composition = new Composition();\n    this.composition.delegate = this;\n    this.attachmentManager = new AttachmentManager(this.composition.getAttachments());\n    this.attachmentManager.delegate = this;\n    this.inputController = config.input.getLevel() === 2 ? new Level2InputController(this.editorElement) : new Level0InputController(this.editorElement);\n    this.inputController.delegate = this;\n    this.inputController.responder = this.composition;\n    this.compositionController = new CompositionController(this.editorElement, this.composition);\n    this.compositionController.delegate = this;\n    this.toolbarController = new ToolbarController(this.editorElement.toolbarElement);\n    this.toolbarController.delegate = this;\n    this.editor = new Editor(this.composition, this.selectionManager, this.editorElement);\n\n    if (document) {\n      this.editor.loadDocument(document);\n    } else {\n      this.editor.loadHTML(html);\n    }\n  }\n\n  registerSelectionManager() {\n    return selectionChangeObserver.registerSelectionManager(this.selectionManager);\n  }\n\n  unregisterSelectionManager() {\n    return selectionChangeObserver.unregisterSelectionManager(this.selectionManager);\n  }\n\n  render() {\n    return this.compositionController.render();\n  }\n\n  reparse() {\n    return this.composition.replaceHTML(this.editorElement.innerHTML);\n  } // Composition delegate\n\n\n  compositionDidChangeDocument(document) {\n    this.notifyEditorElement(\"document-change\");\n\n    if (!this.handlingInput) {\n      return this.render();\n    }\n  }\n\n  compositionDidChangeCurrentAttributes(currentAttributes) {\n    this.currentAttributes = currentAttributes;\n    this.toolbarController.updateAttributes(this.currentAttributes);\n    this.updateCurrentActions();\n    return this.notifyEditorElement(\"attributes-change\", {\n      attributes: this.currentAttributes\n    });\n  }\n\n  compositionDidPerformInsertionAtRange(range) {\n    if (this.pasting) {\n      this.pastedRange = range;\n    }\n  }\n\n  compositionShouldAcceptFile(file) {\n    return this.notifyEditorElement(\"file-accept\", {\n      file\n    });\n  }\n\n  compositionDidAddAttachment(attachment) {\n    const managedAttachment = this.attachmentManager.manageAttachment(attachment);\n    return this.notifyEditorElement(\"attachment-add\", {\n      attachment: managedAttachment\n    });\n  }\n\n  compositionDidEditAttachment(attachment) {\n    this.compositionController.rerenderViewForObject(attachment);\n    const managedAttachment = this.attachmentManager.manageAttachment(attachment);\n    this.notifyEditorElement(\"attachment-edit\", {\n      attachment: managedAttachment\n    });\n    return this.notifyEditorElement(\"change\");\n  }\n\n  compositionDidChangeAttachmentPreviewURL(attachment) {\n    this.compositionController.invalidateViewForObject(attachment);\n    return this.notifyEditorElement(\"change\");\n  }\n\n  compositionDidRemoveAttachment(attachment) {\n    const managedAttachment = this.attachmentManager.unmanageAttachment(attachment);\n    return this.notifyEditorElement(\"attachment-remove\", {\n      attachment: managedAttachment\n    });\n  }\n\n  compositionDidStartEditingAttachment(attachment, options) {\n    this.attachmentLocationRange = this.composition.document.getLocationRangeOfAttachment(attachment);\n    this.compositionController.installAttachmentEditorForAttachment(attachment, options);\n    return this.selectionManager.setLocationRange(this.attachmentLocationRange);\n  }\n\n  compositionDidStopEditingAttachment(attachment) {\n    this.compositionController.uninstallAttachmentEditor();\n    this.attachmentLocationRange = null;\n  }\n\n  compositionDidRequestChangingSelectionToLocationRange(locationRange) {\n    if (this.loadingSnapshot && !this.isFocused()) return;\n    this.requestedLocationRange = locationRange;\n    this.compositionRevisionWhenLocationRangeRequested = this.composition.revision;\n\n    if (!this.handlingInput) {\n      return this.render();\n    }\n  }\n\n  compositionWillLoadSnapshot() {\n    this.loadingSnapshot = true;\n  }\n\n  compositionDidLoadSnapshot() {\n    this.compositionController.refreshViewCache();\n    this.render();\n    this.loadingSnapshot = false;\n  }\n\n  getSelectionManager() {\n    return this.selectionManager;\n  } // Attachment manager delegate\n\n\n  attachmentManagerDidRequestRemovalOfAttachment(attachment) {\n    return this.removeAttachment(attachment);\n  } // Document controller delegate\n\n\n  compositionControllerWillSyncDocumentView() {\n    this.inputController.editorWillSyncDocumentView();\n    this.selectionManager.lock();\n    return this.selectionManager.clearSelection();\n  }\n\n  compositionControllerDidSyncDocumentView() {\n    this.inputController.editorDidSyncDocumentView();\n    this.selectionManager.unlock();\n    this.updateCurrentActions();\n    return this.notifyEditorElement(\"sync\");\n  }\n\n  compositionControllerDidRender() {\n    if (this.requestedLocationRange) {\n      if (this.compositionRevisionWhenLocationRangeRequested === this.composition.revision) {\n        this.selectionManager.setLocationRange(this.requestedLocationRange);\n      }\n\n      this.requestedLocationRange = null;\n      this.compositionRevisionWhenLocationRangeRequested = null;\n    }\n\n    if (this.renderedCompositionRevision !== this.composition.revision) {\n      this.runEditorFilters();\n      this.composition.updateCurrentAttributes();\n      this.notifyEditorElement(\"render\");\n    }\n\n    this.renderedCompositionRevision = this.composition.revision;\n  }\n\n  compositionControllerDidFocus() {\n    if (this.isFocusedInvisibly()) {\n      this.setLocationRange({\n        index: 0,\n        offset: 0\n      });\n    }\n\n    this.toolbarController.hideDialog();\n    return this.notifyEditorElement(\"focus\");\n  }\n\n  compositionControllerDidBlur() {\n    return this.notifyEditorElement(\"blur\");\n  }\n\n  compositionControllerDidSelectAttachment(attachment, options) {\n    this.toolbarController.hideDialog();\n    return this.composition.editAttachment(attachment, options);\n  }\n\n  compositionControllerDidRequestDeselectingAttachment(attachment) {\n    const locationRange = this.attachmentLocationRange || this.composition.document.getLocationRangeOfAttachment(attachment);\n    return this.selectionManager.setLocationRange(locationRange[1]);\n  }\n\n  compositionControllerWillUpdateAttachment(attachment) {\n    return this.editor.recordUndoEntry(\"Edit Attachment\", {\n      context: attachment.id,\n      consolidatable: true\n    });\n  }\n\n  compositionControllerDidRequestRemovalOfAttachment(attachment) {\n    return this.removeAttachment(attachment);\n  } // Input controller delegate\n\n\n  inputControllerWillHandleInput() {\n    this.handlingInput = true;\n    this.requestedRender = false;\n  }\n\n  inputControllerDidRequestRender() {\n    this.requestedRender = true;\n  }\n\n  inputControllerDidHandleInput() {\n    this.handlingInput = false;\n\n    if (this.requestedRender) {\n      this.requestedRender = false;\n      return this.render();\n    }\n  }\n\n  inputControllerDidAllowUnhandledInput() {\n    return this.notifyEditorElement(\"change\");\n  }\n\n  inputControllerDidRequestReparse() {\n    return this.reparse();\n  }\n\n  inputControllerWillPerformTyping() {\n    return this.recordTypingUndoEntry();\n  }\n\n  inputControllerWillPerformFormatting(attributeName) {\n    return this.recordFormattingUndoEntry(attributeName);\n  }\n\n  inputControllerWillCutText() {\n    return this.editor.recordUndoEntry(\"Cut\");\n  }\n\n  inputControllerWillPaste(paste) {\n    this.editor.recordUndoEntry(\"Paste\");\n    this.pasting = true;\n    return this.notifyEditorElement(\"before-paste\", {\n      paste\n    });\n  }\n\n  inputControllerDidPaste(paste) {\n    paste.range = this.pastedRange;\n    this.pastedRange = null;\n    this.pasting = null;\n    return this.notifyEditorElement(\"paste\", {\n      paste\n    });\n  }\n\n  inputControllerWillMoveText() {\n    return this.editor.recordUndoEntry(\"Move\");\n  }\n\n  inputControllerWillAttachFiles() {\n    return this.editor.recordUndoEntry(\"Drop Files\");\n  }\n\n  inputControllerWillPerformUndo() {\n    return this.editor.undo();\n  }\n\n  inputControllerWillPerformRedo() {\n    return this.editor.redo();\n  }\n\n  inputControllerDidReceiveKeyboardCommand(keys) {\n    return this.toolbarController.applyKeyboardCommand(keys);\n  }\n\n  inputControllerDidStartDrag() {\n    this.locationRangeBeforeDrag = this.selectionManager.getLocationRange();\n  }\n\n  inputControllerDidReceiveDragOverPoint(point) {\n    return this.selectionManager.setLocationRangeFromPointRange(point);\n  }\n\n  inputControllerDidCancelDrag() {\n    this.selectionManager.setLocationRange(this.locationRangeBeforeDrag);\n    this.locationRangeBeforeDrag = null;\n  } // Selection manager delegate\n\n\n  locationRangeDidChange(locationRange) {\n    this.composition.updateCurrentAttributes();\n    this.updateCurrentActions();\n\n    if (this.attachmentLocationRange && !rangesAreEqual(this.attachmentLocationRange, locationRange)) {\n      this.composition.stopEditingAttachment();\n    }\n\n    return this.notifyEditorElement(\"selection-change\");\n  } // Toolbar controller delegate\n\n\n  toolbarDidClickButton() {\n    if (!this.getLocationRange()) {\n      return this.setLocationRange({\n        index: 0,\n        offset: 0\n      });\n    }\n  }\n\n  toolbarDidInvokeAction(actionName) {\n    return this.invokeAction(actionName);\n  }\n\n  toolbarDidToggleAttribute(attributeName) {\n    this.recordFormattingUndoEntry(attributeName);\n    this.composition.toggleCurrentAttribute(attributeName);\n    this.render();\n\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus();\n    }\n  }\n\n  toolbarDidUpdateAttribute(attributeName, value) {\n    this.recordFormattingUndoEntry(attributeName);\n    this.composition.setCurrentAttribute(attributeName, value);\n    this.render();\n\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus();\n    }\n  }\n\n  toolbarDidRemoveAttribute(attributeName) {\n    this.recordFormattingUndoEntry(attributeName);\n    this.composition.removeCurrentAttribute(attributeName);\n    this.render();\n\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus();\n    }\n  }\n\n  toolbarWillShowDialog(dialogElement) {\n    this.composition.expandSelectionForEditing();\n    return this.freezeSelection();\n  }\n\n  toolbarDidShowDialog(dialogName) {\n    return this.notifyEditorElement(\"toolbar-dialog-show\", {\n      dialogName\n    });\n  }\n\n  toolbarDidHideDialog(dialogName) {\n    this.thawSelection();\n    this.editorElement.focus();\n    return this.notifyEditorElement(\"toolbar-dialog-hide\", {\n      dialogName\n    });\n  } // Selection\n\n\n  freezeSelection() {\n    if (!this.selectionFrozen) {\n      this.selectionManager.lock();\n      this.composition.freezeSelection();\n      this.selectionFrozen = true;\n      return this.render();\n    }\n  }\n\n  thawSelection() {\n    if (this.selectionFrozen) {\n      this.composition.thawSelection();\n      this.selectionManager.unlock();\n      this.selectionFrozen = false;\n      return this.render();\n    }\n  }\n\n  canInvokeAction(actionName) {\n    if (this.actionIsExternal(actionName)) {\n      return true;\n    } else {\n      var _this$actions$actionN, _this$actions$actionN2;\n\n      return !!((_this$actions$actionN = this.actions[actionName]) !== null && _this$actions$actionN !== void 0 && (_this$actions$actionN2 = _this$actions$actionN.test) !== null && _this$actions$actionN2 !== void 0 && _this$actions$actionN2.call(this));\n    }\n  }\n\n  invokeAction(actionName) {\n    if (this.actionIsExternal(actionName)) {\n      return this.notifyEditorElement(\"action-invoke\", {\n        actionName\n      });\n    } else {\n      var _this$actions$actionN3, _this$actions$actionN4;\n\n      return (_this$actions$actionN3 = this.actions[actionName]) === null || _this$actions$actionN3 === void 0 ? void 0 : (_this$actions$actionN4 = _this$actions$actionN3.perform) === null || _this$actions$actionN4 === void 0 ? void 0 : _this$actions$actionN4.call(this);\n    }\n  }\n\n  actionIsExternal(actionName) {\n    return /^x-./.test(actionName);\n  }\n\n  getCurrentActions() {\n    const result = {};\n\n    for (const actionName in this.actions) {\n      result[actionName] = this.canInvokeAction(actionName);\n    }\n\n    return result;\n  }\n\n  updateCurrentActions() {\n    const currentActions = this.getCurrentActions();\n\n    if (!objectsAreEqual(currentActions, this.currentActions)) {\n      this.currentActions = currentActions;\n      this.toolbarController.updateActions(this.currentActions);\n      return this.notifyEditorElement(\"actions-change\", {\n        actions: this.currentActions\n      });\n    }\n  } // Editor filters\n\n\n  runEditorFilters() {\n    let snapshot = this.composition.getSnapshot();\n    Array.from(this.editor.filters).forEach(filter => {\n      const {\n        document,\n        selectedRange\n      } = snapshot;\n      snapshot = filter.call(this.editor, snapshot) || {};\n\n      if (!snapshot.document) {\n        snapshot.document = document;\n      }\n\n      if (!snapshot.selectedRange) {\n        snapshot.selectedRange = selectedRange;\n      }\n    });\n\n    if (!snapshotsAreEqual(snapshot, this.composition.getSnapshot())) {\n      return this.composition.loadSnapshot(snapshot);\n    }\n  } // Private\n\n\n  updateInputElement() {\n    const element = this.compositionController.getSerializableElement();\n    const value = serializeToContentType(element, \"text/html\");\n    return this.editorElement.setInputElementValue(value);\n  }\n\n  notifyEditorElement(message, data) {\n    switch (message) {\n      case \"document-change\":\n        this.documentChangedSinceLastRender = true;\n        break;\n\n      case \"render\":\n        if (this.documentChangedSinceLastRender) {\n          this.documentChangedSinceLastRender = false;\n          this.notifyEditorElement(\"change\");\n        }\n\n        break;\n\n      case \"change\":\n      case \"attachment-add\":\n      case \"attachment-edit\":\n      case \"attachment-remove\":\n        this.updateInputElement();\n        break;\n    }\n\n    return this.editorElement.notify(message, data);\n  }\n\n  removeAttachment(attachment) {\n    this.editor.recordUndoEntry(\"Delete Attachment\");\n    this.composition.removeAttachment(attachment);\n    return this.render();\n  }\n\n  recordFormattingUndoEntry(attributeName) {\n    const blockConfig = getBlockConfig(attributeName);\n    const locationRange = this.selectionManager.getLocationRange();\n\n    if (blockConfig || !rangeIsCollapsed(locationRange)) {\n      return this.editor.recordUndoEntry(\"Formatting\", {\n        context: this.getUndoContext(),\n        consolidatable: true\n      });\n    }\n  }\n\n  recordTypingUndoEntry() {\n    return this.editor.recordUndoEntry(\"Typing\", {\n      context: this.getUndoContext(this.currentAttributes),\n      consolidatable: true\n    });\n  }\n\n  getUndoContext() {\n    for (var _len = arguments.length, context = new Array(_len), _key = 0; _key < _len; _key++) {\n      context[_key] = arguments[_key];\n    }\n\n    return [this.getLocationContext(), this.getTimeContext(), ...Array.from(context)];\n  }\n\n  getLocationContext() {\n    const locationRange = this.selectionManager.getLocationRange();\n\n    if (rangeIsCollapsed(locationRange)) {\n      return locationRange[0].index;\n    } else {\n      return locationRange;\n    }\n  }\n\n  getTimeContext() {\n    if (config.undoInterval > 0) {\n      return Math.floor(new Date().getTime() / config.undoInterval);\n    } else {\n      return 0;\n    }\n  }\n\n  isFocused() {\n    var _this$editorElement$o;\n\n    return this.editorElement === ((_this$editorElement$o = this.editorElement.ownerDocument) === null || _this$editorElement$o === void 0 ? void 0 : _this$editorElement$o.activeElement);\n  } // Detect \"Cursor disappears sporadically\" Firefox bug.\n  // - https://bugzilla.mozilla.org/show_bug.cgi?id=226301\n\n\n  isFocusedInvisibly() {\n    return this.isFocused() && !this.getLocationRange();\n  }\n\n  get actions() {\n    return this.constructor.actions;\n  }\n\n}\n\n_defineProperty(EditorController, \"actions\", {\n  undo: {\n    test() {\n      return this.editor.canUndo();\n    },\n\n    perform() {\n      return this.editor.undo();\n    }\n\n  },\n  redo: {\n    test() {\n      return this.editor.canRedo();\n    },\n\n    perform() {\n      return this.editor.redo();\n    }\n\n  },\n  link: {\n    test() {\n      return this.editor.canActivateAttribute(\"href\");\n    }\n\n  },\n  increaseNestingLevel: {\n    test() {\n      return this.editor.canIncreaseNestingLevel();\n    },\n\n    perform() {\n      return this.editor.increaseNestingLevel() && this.render();\n    }\n\n  },\n  decreaseNestingLevel: {\n    test() {\n      return this.editor.canDecreaseNestingLevel();\n    },\n\n    perform() {\n      return this.editor.decreaseNestingLevel() && this.render();\n    }\n\n  },\n  attachFiles: {\n    test() {\n      return true;\n    },\n\n    perform() {\n      return config.input.pickFiles(this.editor.insertFiles);\n    }\n\n  }\n});\n\nEditorController.proxyMethod(\"getSelectionManager().setLocationRange\");\nEditorController.proxyMethod(\"getSelectionManager().getLocationRange\");\n\ninstallDefaultCSSForTagName(\"trix-toolbar\", \"%t {\\n  display: block;\\n}\\n\\n%t {\\n  white-space: nowrap;\\n}\\n\\n%t [data-trix-dialog] {\\n  display: none;\\n}\\n\\n%t [data-trix-dialog][data-trix-active] {\\n  display: block;\\n}\\n\\n%t [data-trix-dialog] [data-trix-validate]:invalid {\\n  background-color: #ffdddd;\\n}\");\nclass TrixToolbarElement extends HTMLElement {\n  // Element lifecycle\n  connectedCallback() {\n    if (this.innerHTML === \"\") {\n      this.innerHTML = config.toolbar.getDefaultHTML();\n    }\n  }\n\n}\nwindow.customElements.define(\"trix-toolbar\", TrixToolbarElement);\n\nlet id = 0; // Contenteditable support helpers\n\nconst autofocus = function (element) {\n  if (!document.querySelector(\":focus\")) {\n    if (element.hasAttribute(\"autofocus\") && document.querySelector(\"[autofocus]\") === element) {\n      return element.focus();\n    }\n  }\n};\n\nconst makeEditable = function (element) {\n  if (element.hasAttribute(\"contenteditable\")) {\n    return;\n  }\n\n  element.setAttribute(\"contenteditable\", \"\");\n  return handleEventOnce(\"focus\", {\n    onElement: element,\n\n    withCallback() {\n      return configureContentEditable(element);\n    }\n\n  });\n};\n\nconst configureContentEditable = function (element) {\n  disableObjectResizing(element);\n  return setDefaultParagraphSeparator(element);\n};\n\nconst disableObjectResizing = function (element) {\n  var _document$queryComman, _document;\n\n  if ((_document$queryComman = (_document = document).queryCommandSupported) !== null && _document$queryComman !== void 0 && _document$queryComman.call(_document, \"enableObjectResizing\")) {\n    document.execCommand(\"enableObjectResizing\", false, false);\n    return handleEvent(\"mscontrolselect\", {\n      onElement: element,\n      preventDefault: true\n    });\n  }\n};\n\nconst setDefaultParagraphSeparator = function (element) {\n  var _document$queryComman2, _document2;\n\n  if ((_document$queryComman2 = (_document2 = document).queryCommandSupported) !== null && _document$queryComman2 !== void 0 && _document$queryComman2.call(_document2, \"DefaultParagraphSeparator\")) {\n    const {\n      tagName\n    } = config.blockAttributes.default;\n\n    if ([\"div\", \"p\"].includes(tagName)) {\n      return document.execCommand(\"DefaultParagraphSeparator\", false, tagName);\n    }\n  }\n}; // Accessibility helpers\n\n\nconst addAccessibilityRole = function (element) {\n  if (element.hasAttribute(\"role\")) {\n    return;\n  }\n\n  return element.setAttribute(\"role\", \"textbox\");\n};\n\nconst ensureAriaLabel = function (element) {\n  if (element.hasAttribute(\"aria-label\") || element.hasAttribute(\"aria-labelledby\")) {\n    return;\n  }\n\n  const update = function () {\n    const texts = Array.from(element.labels).map(label => {\n      if (!label.contains(element)) return label.textContent;\n    }).filter(text => text);\n    const text = texts.join(\" \");\n\n    if (text) {\n      return element.setAttribute(\"aria-label\", text);\n    } else {\n      return element.removeAttribute(\"aria-label\");\n    }\n  };\n\n  update();\n  return handleEvent(\"focus\", {\n    onElement: element,\n    withCallback: update\n  });\n}; // Style\n\n\nconst cursorTargetStyles = function () {\n  if (config.browser.forcesObjectResizing) {\n    return {\n      display: \"inline\",\n      width: \"auto\"\n    };\n  } else {\n    return {\n      display: \"inline-block\",\n      width: \"1px\"\n    };\n  }\n}();\n\ninstallDefaultCSSForTagName(\"trix-editor\", \"%t {\\n    display: block;\\n}\\n\\n%t:empty:not(:focus)::before {\\n    content: attr(placeholder);\\n    color: graytext;\\n    cursor: text;\\n    pointer-events: none;\\n    white-space: pre-line;\\n}\\n\\n%t a[contenteditable=false] {\\n    cursor: text;\\n}\\n\\n%t img {\\n    max-width: 100%;\\n    height: auto;\\n}\\n\\n%t \".concat(attachmentSelector, \" figcaption textarea {\\n    resize: none;\\n}\\n\\n%t \").concat(attachmentSelector, \" figcaption textarea.trix-autoresize-clone {\\n    position: absolute;\\n    left: -9999px;\\n    max-height: 0px;\\n}\\n\\n%t \").concat(attachmentSelector, \" figcaption[data-trix-placeholder]:empty::before {\\n    content: attr(data-trix-placeholder);\\n    color: graytext;\\n}\\n\\n%t [data-trix-cursor-target] {\\n    display: \").concat(cursorTargetStyles.display, \" !important;\\n    width: \").concat(cursorTargetStyles.width, \" !important;\\n    padding: 0 !important;\\n    margin: 0 !important;\\n    border: none !important;\\n}\\n\\n%t [data-trix-cursor-target=left] {\\n    vertical-align: top !important;\\n    margin-left: -1px !important;\\n}\\n\\n%t [data-trix-cursor-target=right] {\\n    vertical-align: bottom !important;\\n    margin-right: -1px !important;\\n}\"));\nclass TrixEditorElement extends HTMLElement {\n  // Properties\n  get trixId() {\n    if (this.hasAttribute(\"trix-id\")) {\n      return this.getAttribute(\"trix-id\");\n    } else {\n      this.setAttribute(\"trix-id\", ++id);\n      return this.trixId;\n    }\n  }\n\n  get labels() {\n    const labels = [];\n\n    if (this.id && this.ownerDocument) {\n      labels.push(...Array.from(this.ownerDocument.querySelectorAll(\"label[for='\".concat(this.id, \"']\")) || []));\n    }\n\n    const label = findClosestElementFromNode(this, {\n      matchingSelector: \"label\"\n    });\n\n    if (label) {\n      if ([this, null].includes(label.control)) {\n        labels.push(label);\n      }\n    }\n\n    return labels;\n  }\n\n  get toolbarElement() {\n    if (this.hasAttribute(\"toolbar\")) {\n      var _this$ownerDocument;\n\n      return (_this$ownerDocument = this.ownerDocument) === null || _this$ownerDocument === void 0 ? void 0 : _this$ownerDocument.getElementById(this.getAttribute(\"toolbar\"));\n    } else if (this.parentNode) {\n      const toolbarId = \"trix-toolbar-\".concat(this.trixId);\n      this.setAttribute(\"toolbar\", toolbarId);\n      const element = makeElement(\"trix-toolbar\", {\n        id: toolbarId\n      });\n      this.parentNode.insertBefore(element, this);\n      return element;\n    } else {\n      return undefined;\n    }\n  }\n\n  get form() {\n    var _this$inputElement;\n\n    return (_this$inputElement = this.inputElement) === null || _this$inputElement === void 0 ? void 0 : _this$inputElement.form;\n  }\n\n  get inputElement() {\n    if (this.hasAttribute(\"input\")) {\n      var _this$ownerDocument2;\n\n      return (_this$ownerDocument2 = this.ownerDocument) === null || _this$ownerDocument2 === void 0 ? void 0 : _this$ownerDocument2.getElementById(this.getAttribute(\"input\"));\n    } else if (this.parentNode) {\n      const inputId = \"trix-input-\".concat(this.trixId);\n      this.setAttribute(\"input\", inputId);\n      const element = makeElement(\"input\", {\n        type: \"hidden\",\n        id: inputId\n      });\n      this.parentNode.insertBefore(element, this.nextElementSibling);\n      return element;\n    } else {\n      return undefined;\n    }\n  }\n\n  get editor() {\n    var _this$editorControlle;\n\n    return (_this$editorControlle = this.editorController) === null || _this$editorControlle === void 0 ? void 0 : _this$editorControlle.editor;\n  }\n\n  get name() {\n    var _this$inputElement2;\n\n    return (_this$inputElement2 = this.inputElement) === null || _this$inputElement2 === void 0 ? void 0 : _this$inputElement2.name;\n  }\n\n  get value() {\n    var _this$inputElement3;\n\n    return (_this$inputElement3 = this.inputElement) === null || _this$inputElement3 === void 0 ? void 0 : _this$inputElement3.value;\n  }\n\n  set value(defaultValue) {\n    var _this$editor;\n\n    this.defaultValue = defaultValue;\n    (_this$editor = this.editor) === null || _this$editor === void 0 ? void 0 : _this$editor.loadHTML(this.defaultValue);\n  } // Controller delegate methods\n\n\n  notify(message, data) {\n    if (this.editorController) {\n      return triggerEvent(\"trix-\".concat(message), {\n        onElement: this,\n        attributes: data\n      });\n    }\n  }\n\n  setInputElementValue(value) {\n    if (this.inputElement) {\n      this.inputElement.value = value;\n    }\n  } // Element lifecycle\n\n\n  connectedCallback() {\n    if (!this.hasAttribute(\"data-trix-internal\")) {\n      makeEditable(this);\n      addAccessibilityRole(this);\n      ensureAriaLabel(this);\n\n      if (!this.editorController) {\n        triggerEvent(\"trix-before-initialize\", {\n          onElement: this\n        });\n        this.editorController = new EditorController({\n          editorElement: this,\n          html: this.defaultValue = this.value\n        });\n        requestAnimationFrame(() => triggerEvent(\"trix-initialize\", {\n          onElement: this\n        }));\n      }\n\n      this.editorController.registerSelectionManager();\n      this.registerResetListener();\n      this.registerClickListener();\n      autofocus(this);\n    }\n  }\n\n  disconnectedCallback() {\n    var _this$editorControlle2;\n\n    (_this$editorControlle2 = this.editorController) === null || _this$editorControlle2 === void 0 ? void 0 : _this$editorControlle2.unregisterSelectionManager();\n    this.unregisterResetListener();\n    return this.unregisterClickListener();\n  } // Form support\n\n\n  registerResetListener() {\n    this.resetListener = this.resetBubbled.bind(this);\n    return window.addEventListener(\"reset\", this.resetListener, false);\n  }\n\n  unregisterResetListener() {\n    return window.removeEventListener(\"reset\", this.resetListener, false);\n  }\n\n  registerClickListener() {\n    this.clickListener = this.clickBubbled.bind(this);\n    return window.addEventListener(\"click\", this.clickListener, false);\n  }\n\n  unregisterClickListener() {\n    return window.removeEventListener(\"click\", this.clickListener, false);\n  }\n\n  resetBubbled(event) {\n    if (event.defaultPrevented) return;\n    if (event.target !== this.form) return;\n    return this.reset();\n  }\n\n  clickBubbled(event) {\n    if (event.defaultPrevented) return;\n    if (this.contains(event.target)) return;\n    const label = findClosestElementFromNode(event.target, {\n      matchingSelector: \"label\"\n    });\n    if (!label) return;\n    if (!Array.from(this.labels).includes(label)) return;\n    return this.focus();\n  }\n\n  reset() {\n    this.value = this.defaultValue;\n  }\n\n}\nwindow.customElements.define(\"trix-editor\", TrixEditorElement);\n\nexport { Trix as default };\n","/*\nStimulus 3.0.1\nCopyright © 2021 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    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())\n            .reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\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).sort().forEach(key => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst descriptorPattern = /^((.+?)(@(window|document))?->)?(.+?)(#([^:]+?))(:(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName: matches[2],\n        eventOptions: matches[9] ? parseEventOptions(matches[9]) : {},\n        identifier: matches[5],\n        methodName: matches[7]\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.split(\":\").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 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\nclass Action {\n    constructor(element, index, descriptor) {\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    }\n    static forToken(token) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content));\n    }\n    toString() {\n        const eventNameSuffix = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventNameSuffix}->${this.identifier}#${this.methodName}`;\n    }\n    get params() {\n        if (this.eventTarget instanceof Element) {\n            return this.getParamsFromEventTargetAttributes(this.eventTarget);\n        }\n        else {\n            return {};\n        }\n    }\n    getParamsFromEventTargetAttributes(eventTarget) {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`);\n        const attributes = Array.from(eventTarget.attributes);\n        attributes.forEach(({ name, value }) => {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                Object.assign(params, { [camelize(key)]: typecast(value) });\n            }\n        });\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n}\nconst defaultEventNames = {\n    \"a\": e => \"click\",\n    \"button\": e => \"click\",\n    \"form\": e => \"submit\",\n    \"details\": e => \"toggle\",\n    \"input\": e => e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\",\n    \"select\": e => \"change\",\n    \"textarea\": e => \"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        if (this.willBeInvokedByEvent(event)) {\n            this.invokeWithEvent(event);\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    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            const { params } = this.action;\n            const actionEvent = Object.assign(event, { params });\n            this.method.call(this.controller, actionEvent);\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 (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(node, attributeName) {\n        const element = node;\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\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\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 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)\n            .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.trim().split(/\\s+/).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));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token);\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        this.invokeChangedCallbacksForDefaultValues();\n    }\n    start() {\n        this.stringMapObserver.start();\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            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    }\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\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        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        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\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.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    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\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\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) => [\n            ...Object.getOwnPropertyNames(object),\n            ...Object.getOwnPropertySymbols(object)\n        ];\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 () { this.a.call(this); };\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\n            || this.findTarget(targetName)\n            || 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 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    }\n    findElement(selector) {\n        return this.element.matches(selector)\n            ? this.element\n            : 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}\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        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    }\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    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};\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    }\n    static start(element, schema) {\n        const application = new Application(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        if (controllerConstructor.shouldLoad) {\n            this.load({ identifier, controllerConstructor });\n        }\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach(definition => this.router.loadDefinition(definition));\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 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);\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) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair);\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]) {\n    return valueDescriptorForTokenAndTypeDefinition(token, typeDefinition);\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array: return \"array\";\n        case Boolean: return \"boolean\";\n        case Number: return \"number\";\n        case Object: return \"object\";\n        case String: return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\": return \"boolean\";\n        case \"number\": return \"number\";\n        case \"string\": 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(typeObject) {\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    if (typeFromObject) {\n        const defaultValueType = parseValueTypeDefault(typeObject.default);\n        if (typeFromObject !== defaultValueType) {\n            throw new Error(`Type \"${typeFromObject}\" must match the type of the default value. Given default value: \"${typeObject.default}\" as \"${defaultValueType}\"`);\n        }\n        return typeFromObject;\n    }\n}\nfunction parseValueTypeDefinition(typeDefinition) {\n    const typeFromObject = parseValueTypeObject(typeDefinition);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    throw new Error(`Unknown value type \"${typeDefinition}\"`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const defaultValue = typeDefinition.default;\n    if (defaultValue !== undefined)\n        return defaultValue;\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(token, typeDefinition) {\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(typeDefinition);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() { return defaultValueForDefinition(typeDefinition); },\n        get hasCustomDefaultValue() { return parseValueTypeDefault(typeDefinition) !== undefined; },\n        reader: readers[type],\n        writer: writers[type] || writers.default\n    };\n}\nconst defaultValuesByType = {\n    get array() { return []; },\n    boolean: false,\n    number: 0,\n    get object() { return {}; },\n    string: \"\"\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(\"Expected array\");\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || value == \"false\");\n    },\n    number(value) {\n        return Number(value);\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 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    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 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 = [ClassPropertiesBlessing, TargetPropertiesBlessing, ValuePropertiesBlessing];\nController.targets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, 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","/*!\n\tBy André Rinas, www.andrerinas.de\n\tDocumentation, www.simplelightbox.de\n\tAvailable for use under the MIT License\n\tVersion 2.10.2\n*/\nclass SimpleLightbox {\n\n    defaultOptions = {\n        sourceAttr: 'href',\n        overlay: true,\n        overlayOpacity: 0.7,\n        spinner: true,\n        nav: true,\n        navText: ['&lsaquo;', '&rsaquo;'],\n        captions: true,\n        captionDelay: 0,\n        captionSelector: 'img',\n        captionType: 'attr',\n        captionsData: 'title',\n        captionPosition: 'bottom',\n        captionClass: '',\n        close: true,\n        closeText: '&times;',\n        swipeClose: true,\n        showCounter: true,\n        fileExt: 'png|jpg|jpeg|gif|webp',\n        animationSlide: true,\n        animationSpeed: 250,\n        preloading: true,\n        enableKeyboard: true,\n        loop: true,\n        rel: false,\n        docClose: true,\n        swipeTolerance: 50,\n        className: 'simple-lightbox',\n        widthRatio: 0.8,\n        heightRatio: 0.9,\n        scaleImageToRatio: false,\n        disableRightClick: false,\n        disableScroll: true,\n        alertError: true,\n        alertErrorMessage: 'Image not found, next image will be loaded',\n        additionalHtml: false,\n        history: true,\n        throttleInterval: 0,\n        doubleTapZoom: 2,\n        maxZoom: 10,\n        htmlClass: 'has-lightbox',\n        rtl: false,\n        fixedClass: 'sl-fixed',\n        fadeSpeed: 300,\n        uniqueImages: true,\n        focus: true,\n        scrollZoom: true,\n        scrollZoomFactor: 0.5\n    };\n\n    transitionPrefix;\n    isPassiveEventsSupported;\n    transitionCapable = false;\n\n    isTouchDevice = ('ontouchstart' in window);\n    isAppleDevice = /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);\n\n    initialLocationHash;\n\n    pushStateSupport = ('pushState' in history);\n\n    isOpen = false;\n    isAnimating = false;\n    isClosing = false;\n    isFadeIn = false;\n    urlChangedOnce = false;\n    hashReseted = false;\n    historyHasChanges = false;\n    historyUpdateTimeout = null;\n\n    currentImage;\n    eventNamespace = 'simplelightbox';\n    domNodes = {};\n\n    loadedImages = [];\n    initialImageIndex = 0;\n    currentImageIndex = 0;\n\n    initialSelector = null;\n    globalScrollbarWidth = 0;\n\n    controlCoordinates = {\n        swipeDiff: 0,\n        swipeYDiff: 0,\n        swipeStart: 0,\n        swipeEnd: 0,\n        swipeYStart: 0,\n        swipeYEnd: 0,\n        mousedown: false,\n        imageLeft: 0,\n        zoomed: false,\n        containerHeight: 0,\n        containerWidth: 0,\n        containerOffsetX: 0,\n        containerOffsetY: 0,\n        imgHeight: 0,\n        imgWidth: 0,\n        capture: false,\n        initialOffsetX: 0,\n        initialOffsetY: 0,\n        initialPointerOffsetX: 0,\n        initialPointerOffsetY: 0,\n        initialPointerOffsetX2: 0,\n        initialPointerOffsetY2: 0,\n        initialScale: 1,\n        initialPinchDistance: 0,\n        pointerOffsetX: 0,\n        pointerOffsetY: 0,\n        pointerOffsetX2: 0,\n        pointerOffsetY2: 0,\n        targetOffsetX: 0,\n        targetOffsetY: 0,\n        targetScale: 0,\n        pinchOffsetX: 0,\n        pinchOffsetY: 0,\n        limitOffsetX: 0,\n        limitOffsetY: 0,\n        scaleDifference: 0,\n        targetPinchDistance: 0,\n        touchCount: 0,\n        doubleTapped: false,\n        touchmoveCount: 0\n    };\n\n    constructor(elements, options) {\n\n        this.options = Object.assign(this.defaultOptions, options);\n        this.isPassiveEventsSupported = this.checkPassiveEventsSupport();\n\n        if (typeof elements === 'string') {\n            this.initialSelector = elements;\n            this.elements = Array.from(document.querySelectorAll(elements));\n        } else {\n            this.elements = ((typeof elements.length !== 'undefined') && elements.length > 0) ? Array.from(elements) : [elements];\n        }\n\n        this.relatedElements = [];\n\n        this.transitionPrefix = this.calculateTransitionPrefix();\n        this.transitionCapable = this.transitionPrefix !== false;\n        this.initialLocationHash = this.hash;\n\n        // this should be handled by attribute selector IMHO! => 'a[rel=bla]'...\n        if (this.options.rel) {\n            this.elements = this.getRelated(this.options.rel);\n        }\n\n        if (this.options.uniqueImages) {\n            let imgArr = [];\n            this.elements = Array.from(this.elements).filter(\n                element => {\n                    let src = element.getAttribute(this.options.sourceAttr);\n                    if(imgArr.indexOf(src) === -1) {\n                        imgArr.push(src);\n                        return true;\n                    }\n                    return false;\n                }\n            );\n        }\n\n        this.createDomNodes();\n\n        if (this.options.close) {\n            this.domNodes.wrapper.appendChild(this.domNodes.closeButton);\n        }\n\n        if (this.options.nav) {\n            this.domNodes.wrapper.appendChild(this.domNodes.navigation);\n        }\n\n        if (this.options.spinner) {\n            this.domNodes.wrapper.appendChild(this.domNodes.spinner);\n        }\n\n        this.addEventListener(this.elements, 'click.' + this.eventNamespace, (event) => {\n            event.preventDefault();\n            if (this.isAnimating) {\n                return false;\n            }\n\n            this.initialImageIndex = this.elements.indexOf(event.currentTarget);\n            this.openImage(event.currentTarget);\n        });\n\n        // close addEventListener click addEventListener doc\n        if (this.options.docClose) {\n            this.addEventListener(this.domNodes.wrapper, ['click.' + this.eventNamespace, 'touchstart.' + this.eventNamespace], (event) => {\n                if (this.isOpen && event.target === event.currentTarget) {\n                    this.close();\n                }\n            });\n        }\n\n        // disable rightclick\n        if (this.options.disableRightClick) {\n            this.addEventListener(document.body, 'contextmenu.' + this.eventNamespace, (event) => {\n                if (event.target.parentElement.classList.contains(\"sl-image\")) {\n                    event.preventDefault();\n                }\n            });\n        }\n\n        // keyboard-control\n        if (this.options.enableKeyboard) {\n            this.addEventListener(document.body, 'keyup.' + this.eventNamespace, this.throttle((event) => {\n                this.controlCoordinates.swipeDiff = 0;\n                // keyboard control only if lightbox is open\n\n                if (this.isAnimating && event.key === 'Escape') {\n                    this.currentImage.setAttribute('src', '');\n                    this.isAnimating = false;\n                    return this.close();\n                }\n\n                if (this.isOpen) {\n                    event.preventDefault();\n                    if (event.key === 'Escape') {\n                        this.close();\n                    }\n                    if(!this.isAnimating && ['ArrowLeft', 'ArrowRight'].indexOf(event.key) > -1) {\n                        this.loadImage(event.key === 'ArrowRight' ? 1 : -1);\n                    }\n                }\n            }, this.options.throttleInterval));\n        }\n\n        this.addEvents();\n    }\n\n    checkPassiveEventsSupport() {\n        // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n        // Test via a getter in the options object to see if the passive property is accessed\n        let supportsPassive = false;\n        try {\n            let opts = Object.defineProperty({}, 'passive', {\n                get: function() {\n                    supportsPassive = true;\n                }\n            });\n            window.addEventListener(\"testPassive\", null, opts);\n            window.removeEventListener(\"testPassive\", null, opts);\n        } catch (e) {}\n        return supportsPassive;\n    }\n\n    createDomNodes() {\n        this.domNodes.overlay = document.createElement('div');\n        this.domNodes.overlay.classList.add('sl-overlay');\n        this.domNodes.overlay.dataset.opacityTarget = this.options.overlayOpacity;\n\n        this.domNodes.closeButton = document.createElement('button');\n        this.domNodes.closeButton.classList.add('sl-close');\n        this.domNodes.closeButton.innerHTML = this.options.closeText;\n\n        this.domNodes.spinner = document.createElement('div');\n        this.domNodes.spinner.classList.add('sl-spinner');\n        this.domNodes.spinner.innerHTML = '<div></div>';\n\n        this.domNodes.navigation = document.createElement('div');\n        this.domNodes.navigation.classList.add('sl-navigation');\n        this.domNodes.navigation.innerHTML = `<button class=\"sl-prev\">${this.options.navText[0]}</button><button class=\"sl-next\">${this.options.navText[1]}</button>`;\n\n        this.domNodes.counter = document.createElement('div');\n        this.domNodes.counter.classList.add('sl-counter');\n        this.domNodes.counter.innerHTML = '<span class=\"sl-current\"></span>/<span class=\"sl-total\"></span>';\n\n        this.domNodes.caption = document.createElement('div');\n        this.domNodes.caption.classList.add('sl-caption', 'pos-' + this.options.captionPosition);\n        if (this.options.captionClass) {\n            this.domNodes.caption.classList.add(this.options.captionClass);\n        }\n\n        this.domNodes.image = document.createElement('div');\n        this.domNodes.image.classList.add('sl-image');\n\n        this.domNodes.wrapper = document.createElement('div');\n        this.domNodes.wrapper.classList.add('sl-wrapper');\n        this.domNodes.wrapper.setAttribute('tabindex',-1);\n        this.domNodes.wrapper.setAttribute('role','dialog');\n        this.domNodes.wrapper.setAttribute('aria-hidden',false);\n        if (this.options.className) {\n            this.domNodes.wrapper.classList.add(this.options.className);\n        }\n        if(this.options.rtl) {\n            this.domNodes.wrapper.classList.add('sl-dir-rtl');\n        }\n    }\n\n    throttle(func, limit) {\n        let inThrottle;\n        return function () {\n            if (!inThrottle) {\n                func.apply(this, arguments);\n                inThrottle = true;\n                setTimeout(function () {\n                    return inThrottle = false;\n                }, limit);\n            }\n        };\n    }\n\n    isValidLink(element) {\n        return (!this.options.fileExt) || ( element.getAttribute(this.options.sourceAttr) && (new RegExp('(' + this.options.fileExt + ')$', 'i')).test(element.getAttribute(this.options.sourceAttr)));\n    }\n\n    calculateTransitionPrefix() {\n        let s = (document.body || document.documentElement).style;\n\n        return 'transition' in s ? '' :\n            'WebkitTransition' in s ? '-webkit-' :\n                'MozTransition' in s ? '-moz-' :\n                    'OTransition' in s ? '-o' :\n                        false;\n    }\n\n    toggleScrollbar(type) {\n        let scrollbarWidth = 0;\n        let fixedElements =  [].slice.call(document.querySelectorAll('.'+this.options.fixedClass))\n        if (type === 'hide') {\n            let fullWindowWidth = window.innerWidth;\n            if (!fullWindowWidth) {\n                let documentElementRect = document.documentElement.getBoundingClientRect();\n                fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left);\n            }\n            if (document.body.clientWidth < fullWindowWidth || this.isAppleDevice) {\n                let scrollDiv = document.createElement('div'),\n                    paddingRight = parseInt(document.body.style.paddingRight || 0, 10);\n\n                scrollDiv.classList.add('sl-scrollbar-measure');\n\n                document.body.appendChild(scrollDiv);\n                scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n                document.body.removeChild(scrollDiv);\n\n                document.body.dataset.originalPaddingRight = paddingRight;\n                if (scrollbarWidth > 0 || (scrollbarWidth == 0 && this.isAppleDevice)) {\n                    document.body.classList.add('hidden-scroll');\n                    document.body.style.paddingRight = (paddingRight + scrollbarWidth) + 'px';\n\n                    fixedElements.forEach(element => {\n                        const actualPadding = element.style.paddingRight\n                        const calculatedPadding = window.getComputedStyle(element)['padding-right']\n                        element.dataset.originalPaddingRight = actualPadding;\n                        element.style.paddingRight = `${parseFloat(calculatedPadding) + scrollbarWidth}px`\n                    });\n\n                }\n            }\n        } else {\n            document.body.classList.remove('hidden-scroll');\n            document.body.style.paddingRight = document.body.dataset.originalPaddingRight;\n\n            fixedElements.forEach(element => {\n                const padding = element.dataset.originalPaddingRight;\n                if (typeof padding !== 'undefined') {\n                    element.style.paddingRight = padding\n                }\n            });\n        }\n        return scrollbarWidth;\n    }\n\n    close() {\n        if (!this.isOpen || this.isAnimating || this.isClosing) {\n            return false;\n        }\n\n        this.isClosing = true;\n        let element = this.relatedElements[this.currentImageIndex];\n        element.dispatchEvent(new Event('close.simplelightbox'));\n\n        if (this.options.history) {\n            this.historyHasChanges = false;\n            if(!this.hashReseted) {\n                this.resetHash();\n            }\n        }\n\n        this.removeEventListener(document, 'focusin.' + this.eventNamespace);\n\n        this.fadeOut(this.domNodes.overlay, this.options.fadeSpeed);\n        this.fadeOut(document.querySelectorAll('.sl-image img,  .sl-close, .sl-navigation, .sl-image .sl-caption, .sl-counter'), this.options.fadeSpeed, () => {\n            if (this.options.disableScroll) {\n                this.toggleScrollbar('show');\n            }\n\n            if (this.options.htmlClass && this.options.htmlClass !== '') {\n                document.querySelector('html').classList.remove(this.options.htmlClass);\n            }\n\n            document.body.removeChild(this.domNodes.wrapper);\n            document.body.removeChild(this.domNodes.overlay);\n            this.domNodes.additionalHtml = null;\n\n            element.dispatchEvent(new Event('closed.simplelightbox'));\n\n            this.isClosing = false;\n        });\n\n        this.currentImage = null;\n        this.isOpen = false;\n        this.isAnimating = false;\n\n        // reset touchcontrol coordinates\n        for (let key in this.controlCoordinates) {\n            this.controlCoordinates[key] = 0;\n        }\n        this.controlCoordinates.mousedown = false;\n        this.controlCoordinates.zoomed = false;\n        this.controlCoordinates.capture = false;\n        this.controlCoordinates.initialScale = this.minMax(1, 1, this.options.maxZoom);\n        this.controlCoordinates.doubleTapped = false;\n    }\n\n    get hash() {\n        return window.location.hash.substring(1);\n    }\n\n    preload() {\n        let index = this.currentImageIndex,\n            length = this.relatedElements.length,\n            next = (index + 1 < 0) ? length - 1 : (index + 1 >= length - 1) ? 0 : index + 1,\n            prev = (index - 1 < 0) ? length - 1 : (index - 1 >= length - 1) ? 0 : index - 1,\n            nextImage = new Image(),\n            prevImage = new Image();\n\n        nextImage.addEventListener('load', (event) => {\n            let src = event.target.getAttribute('src');\n            if (this.loadedImages.indexOf(src) === -1) { //is this condition even required... setting multiple times will not change usage...\n                this.loadedImages.push(src);\n            }\n            this.relatedElements[index].dispatchEvent(new Event('nextImageLoaded.' + this.eventNamespace));\n        });\n        nextImage.setAttribute('src', this.relatedElements[next].getAttribute(this.options.sourceAttr));\n\n        prevImage.addEventListener('load', (event) => {\n            let src = event.target.getAttribute('src');\n            if (this.loadedImages.indexOf(src) === -1) {\n                this.loadedImages.push(src);\n            }\n            this.relatedElements[index].dispatchEvent(new Event('prevImageLoaded.' + this.eventNamespace));\n        });\n        prevImage.setAttribute('src', this.relatedElements[prev].getAttribute(this.options.sourceAttr));\n    }\n\n    loadImage(direction) {\n        let slideDirection = direction;\n        if(this.options.rtl) {\n            direction = -direction;\n        }\n\n        this.relatedElements[this.currentImageIndex].dispatchEvent(new Event('change.' + this.eventNamespace));\n        this.relatedElements[this.currentImageIndex].dispatchEvent(new Event((direction === 1 ? 'next' : 'prev') + '.' + this.eventNamespace));\n\n        let newIndex = this.currentImageIndex + direction;\n\n        if (this.isAnimating || (newIndex < 0 || newIndex >= this.relatedElements.length) && this.options.loop === false) {\n            return false;\n        }\n\n        this.currentImageIndex = (newIndex < 0) ? this.relatedElements.length - 1 : (newIndex > this.relatedElements.length - 1) ? 0 : newIndex;\n\n        this.domNodes.counter.querySelector('.sl-current').innerHTML = this.currentImageIndex + 1;\n\n\n        if (this.options.animationSlide) {\n            this.slide(this.options.animationSpeed / 1000, (-100 * slideDirection) - this.controlCoordinates.swipeDiff + 'px');\n        }\n        this.fadeOut(this.domNodes.image, this.options.fadeSpeed, () => {\n            this.isAnimating = true;\n            if(!this.isClosing) {\n                setTimeout(() => {\n                    let element = this.relatedElements[this.currentImageIndex];\n                    this.currentImage.setAttribute('src', element.getAttribute(this.options.sourceAttr));\n\n                    if (this.loadedImages.indexOf(element.getAttribute(this.options.sourceAttr)) === -1) {\n                        this.show(this.domNodes.spinner);\n                    }\n\n                    if(this.domNodes.image.contains(this.domNodes.caption)) {\n                        this.domNodes.image.removeChild(this.domNodes.caption);\n                    }\n\n                    this.adjustImage(slideDirection);\n                    if (this.options.preloading) this.preload();\n                }, 100);\n            } else {\n                this.isAnimating = false;\n            }\n        });\n    }\n\n    adjustImage(direction) {\n        if (!this.currentImage) {\n            return false;\n        }\n\n        let tmpImage = new Image(),\n            windowWidth = window.innerWidth * this.options.widthRatio,\n            windowHeight = window.innerHeight * this.options.heightRatio;\n\n        tmpImage.setAttribute('src', this.currentImage.getAttribute('src'));\n\n        this.currentImage.dataset.scale = 1;\n        this.currentImage.dataset.translateX = 0;\n        this.currentImage.dataset.translateY = 0;\n        this.zoomPanElement(0, 0, 1);\n\n        tmpImage.addEventListener('error', (event) => {\n            this.relatedElements[this.currentImageIndex].dispatchEvent(new Event('error.' + this.eventNamespace));\n            this.isAnimating = false;\n            this.isOpen = true;\n            this.domNodes.spinner.style.display = 'none';\n\n            let dirIsDefined = direction === 1 || direction === -1;\n            if (this.initialImageIndex === this.currentImageIndex && dirIsDefined) {\n                return this.close();\n            }\n\n            if (this.options.alertError) {\n                alert(this.options.alertErrorMessage);\n            }\n\n            this.loadImage(dirIsDefined ? direction : 1);\n        });\n\n\n        tmpImage.addEventListener('load', (event) => {\n            if (typeof direction !== 'undefined') {\n                this.relatedElements[this.currentImageIndex].dispatchEvent(new Event('changed.' + this.eventNamespace));\n                this.relatedElements[this.currentImageIndex].dispatchEvent(new Event((direction === 1 ? 'nextDone' : 'prevDone') + '.' + this.eventNamespace));\n            }\n\n            // history\n            if (this.options.history) {\n                this.updateURL();\n            }\n\n            if (this.loadedImages.indexOf(this.currentImage.getAttribute('src')) === -1) {\n                this.loadedImages.push(this.currentImage.getAttribute('src'));\n            }\n\n            let imageWidth = event.target.width,\n                imageHeight = event.target.height;\n\n            if (this.options.scaleImageToRatio || imageWidth > windowWidth || imageHeight > windowHeight) {\n                let ratio = imageWidth / imageHeight > windowWidth / windowHeight ? imageWidth / windowWidth : imageHeight / windowHeight;\n                imageWidth /= ratio;\n                imageHeight /= ratio;\n            }\n\n            this.domNodes.image.style.top = (window.innerHeight - imageHeight) / 2 + 'px';\n            this.domNodes.image.style.left = (window.innerWidth - imageWidth - this.globalScrollbarWidth) / 2 + 'px';\n            this.domNodes.image.style.width = imageWidth + 'px';\n            this.domNodes.image.style.height = imageHeight + 'px';\n\n            this.domNodes.spinner.style.display = 'none';\n            if( this.options.focus ) {\n                this.forceFocus();\n            }\n            this.fadeIn(this.currentImage, this.options.fadeSpeed, () => {\n                if( this.options.focus ) {\n                    this.domNodes.wrapper.focus();\n                }\n            });\n\n            this.isOpen = true;\n\n            let captionContainer,\n                captionText;\n\n            if (typeof this.options.captionSelector === 'string') {\n                captionContainer = this.options.captionSelector === 'self' ? this.relatedElements[this.currentImageIndex] : this.relatedElements[this.currentImageIndex].querySelector(this.options.captionSelector);\n            } else if (typeof this.options.captionSelector === 'function') {\n                captionContainer = this.options.captionSelector(this.relatedElements[this.currentImageIndex]);\n            }\n\n            if(this.options.captions && captionContainer) {\n                if (this.options.captionType === 'data') {\n                    captionText = captionContainer.dataset[this.options.captionsData];\n                } else if (this.options.captionType === 'text') {\n                    captionText = captionContainer.innerHTML;\n                } else {\n                    captionText = captionContainer.getAttribute(this.options.captionsData);\n                }\n            }\n\n            if (!this.options.loop) {\n                if (this.currentImageIndex === 0) {\n                    this.hide(this.domNodes.navigation.querySelector('.sl-prev'));\n                }\n                if (this.currentImageIndex >= this.relatedElements.length - 1) {\n                    this.hide(this.domNodes.navigation.querySelector('.sl-next'));\n                }\n                if (this.currentImageIndex > 0) {\n                    this.show(this.domNodes.navigation.querySelector('.sl-prev'));\n                }\n                if (this.currentImageIndex < this.relatedElements.length - 1) {\n                    this.show(this.domNodes.navigation.querySelector('.sl-next'));\n                }\n            } else {\n                if (this.relatedElements.length === 1) {\n                    this.hide(this.domNodes.navigation.querySelectorAll('.sl-prev, .sl-next'));\n                } else {\n                    this.show(this.domNodes.navigation.querySelectorAll('.sl-prev, .sl-next'));\n                }\n            }\n\n\n            if (direction === 1 || direction === -1) {\n                if (this.options.animationSlide) {\n                    this.slide(0, 100 * direction + 'px');\n                    setTimeout(() => {\n                        this.slide(this.options.animationSpeed / 1000, 0 + 'px');\n                    }, 50);\n                }\n                this.fadeIn(this.domNodes.image, this.options.fadeSpeed, () => {\n                    this.isAnimating = false;\n                    this.setCaption(captionText, imageWidth);\n                });\n\n            } else {\n                this.isAnimating = false;\n                this.setCaption(captionText, imageWidth);\n            }\n\n            if (this.options.additionalHtml && !this.domNodes.additionalHtml) {\n                this.domNodes.additionalHtml = document.createElement('div');\n                this.domNodes.additionalHtml.classList.add('sl-additional-html');\n                this.domNodes.additionalHtml.innerHTML = this.options.additionalHtml;\n                this.domNodes.image.appendChild(this.domNodes.additionalHtml);\n            }\n\n        });\n    }\n\n    zoomPanElement(targetOffsetX, targetOffsetY, targetScale) {\n\n        this.currentImage.style[this.transitionPrefix + 'transform'] = 'translate(' + targetOffsetX + ',' + targetOffsetY + ') scale(' + targetScale + ')';\n\n    };\n\n    minMax(value, min, max) {\n        return (value < min) ? min : (value > max) ? max : value;\n    };\n\n    setZoomData(initialScale, targetOffsetX, targetOffsetY) {\n        this.currentImage.dataset.scale = initialScale;\n        this.currentImage.dataset.translateX = targetOffsetX;\n        this.currentImage.dataset.translateY = targetOffsetY;\n    };\n\n\n    hashchangeHandler() {\n        if (this.isOpen && this.hash === this.initialLocationHash) {\n            this.hashReseted = true;\n            this.close();\n        }\n    }\n\n    addEvents() {\n\n        // resize/responsive\n        this.addEventListener(window, 'resize.' + this.eventNamespace, (event) => {\n            //this.adjustImage.bind(this)\n            if (this.isOpen) {\n                this.adjustImage();\n            }\n        });\n\n        this.addEventListener(this.domNodes.closeButton, ['click.' + this.eventNamespace, 'touchstart.' + this.eventNamespace], this.close.bind(this));\n\n        if (this.options.history) {\n            setTimeout(() => {\n                this.addEventListener(window, 'hashchange.' + this.eventNamespace, (event) => {\n                    if (this.isOpen) {\n                        this.hashchangeHandler();\n                    }\n                });\n            }, 40);\n        }\n\n        this.addEventListener(this.domNodes.navigation.getElementsByTagName('button'), 'click.' + this.eventNamespace, (event) => {\n            if (!event.currentTarget.tagName.match(/button/i)) {\n                return true;\n            }\n\n            event.preventDefault();\n            this.controlCoordinates.swipeDiff = 0;\n            this.loadImage(event.currentTarget.classList.contains('sl-next') ? 1 : -1);\n        });\n\n        if (this.options.scrollZoom) {\n            let scale = 1\n\n            this.addEventListener(this.domNodes.image, ['mousewheel','DOMMouseScroll'], (event) => {\n                if (this.controlCoordinates.mousedown || this.isAnimating || this.isClosing || !this.isOpen) {\n                    return true;\n                }\n                if(this.controlCoordinates.containerHeight == 0) {\n                    this.controlCoordinates.containerHeight = this.getDimensions(this.domNodes.image).height;\n                    this.controlCoordinates.containerWidth = this.getDimensions(this.domNodes.image).width;\n                    this.controlCoordinates.imgHeight = this.getDimensions(this.currentImage).height;\n                    this.controlCoordinates.imgWidth = this.getDimensions(this.currentImage).width;\n                    this.controlCoordinates.containerOffsetX = this.domNodes.image.offsetLeft;\n                    this.controlCoordinates.containerOffsetY = this.domNodes.image.offsetTop;\n\n                    this.controlCoordinates.initialOffsetX = parseFloat(this.currentImage.dataset.translateX);\n                    this.controlCoordinates.initialOffsetY = parseFloat(this.currentImage.dataset.translateY);\n                }\n                event.preventDefault();\n\n                let delta = event.delta || event.wheelDelta;\n                if (delta === undefined) {\n                    //we are on firefox\n                    delta = event.detail;\n                }\n                delta = Math.max(-1,Math.min(1,delta)); // cap the delta to [-1,1] for cross browser consistency\n\n                // apply zoom\n                scale += delta * this.options.scrollZoomFactor * scale;\n                scale = Math.max(1, Math.min( this.options.maxZoom, scale));\n\n                this.controlCoordinates.targetScale = scale;\n\n                this.controlCoordinates.pinchOffsetX = event.pageX;\n                this.controlCoordinates.pinchOffsetY = event.pageY;\n\n                this.controlCoordinates.limitOffsetX = ((this.controlCoordinates.imgWidth * this.controlCoordinates.targetScale) - this.controlCoordinates.containerWidth) / 2;\n                this.controlCoordinates.limitOffsetY = ((this.controlCoordinates.imgHeight * this.controlCoordinates.targetScale) - this.controlCoordinates.containerHeight) / 2;\n                this.controlCoordinates.scaleDifference = this.controlCoordinates.targetScale - this.controlCoordinates.initialScale;\n                this.controlCoordinates.targetOffsetX = (this.controlCoordinates.imgWidth * this.controlCoordinates.targetScale) <= this.controlCoordinates.containerWidth ? 0 : this.minMax(this.controlCoordinates.initialOffsetX - ((((((this.controlCoordinates.pinchOffsetX - this.controlCoordinates.containerOffsetX) - (this.controlCoordinates.containerWidth / 2)) - this.controlCoordinates.initialOffsetX) / (this.controlCoordinates.targetScale - this.controlCoordinates.scaleDifference))) * this.controlCoordinates.scaleDifference), this.controlCoordinates.limitOffsetX * (-1), this.controlCoordinates.limitOffsetX);\n                this.controlCoordinates.targetOffsetY = (this.controlCoordinates.imgHeight * this.controlCoordinates.targetScale) <= this.controlCoordinates.containerHeight ? 0 : this.minMax(this.controlCoordinates.initialOffsetY - ((((((this.controlCoordinates.pinchOffsetY - this.controlCoordinates.containerOffsetY) - (this.controlCoordinates.containerHeight / 2)) - this.controlCoordinates.initialOffsetY) / (this.controlCoordinates.targetScale - this.controlCoordinates.scaleDifference))) * this.controlCoordinates.scaleDifference), this.controlCoordinates.limitOffsetY * (-1), this.controlCoordinates.limitOffsetY);\n\n                this.zoomPanElement(this.controlCoordinates.targetOffsetX + \"px\", this.controlCoordinates.targetOffsetY + \"px\", this.controlCoordinates.targetScale);\n\n                if (this.controlCoordinates.targetScale > 1) {\n                    this.controlCoordinates.zoomed = true;\n                    if (!this.domNodes.caption.style.opacity && this.domNodes.caption.style.display !== 'none') {\n                        this.fadeOut(this.domNodes.caption, this.options.fadeSpeed);\n                    }\n                } else {\n                    if (this.controlCoordinates.initialScale === 1) {\n                        this.controlCoordinates.zoomed = false;\n                        if (this.domNodes.caption.style.display === 'none') {\n                            this.fadeIn(this.domNodes.caption, this.options.fadeSpeed);\n                        }\n                    }\n                    this.controlCoordinates.initialPinchDistance = null;\n                    this.controlCoordinates.capture = false;\n                }\n\n                this.controlCoordinates.initialPinchDistance = this.controlCoordinates.targetPinchDistance;\n                this.controlCoordinates.initialScale = this.controlCoordinates.targetScale;\n                this.controlCoordinates.initialOffsetX = this.controlCoordinates.targetOffsetX;\n                this.controlCoordinates.initialOffsetY = this.controlCoordinates.targetOffsetY;\n\n                this.setZoomData(this.controlCoordinates.targetScale, this.controlCoordinates.targetOffsetX, this.controlCoordinates.targetOffsetY);\n                this.zoomPanElement(this.controlCoordinates.targetOffsetX + \"px\", this.controlCoordinates.targetOffsetY + \"px\", this.controlCoordinates.targetScale);\n\n            });\n        }\n\n        this.addEventListener(this.domNodes.image, ['touchstart.' + this.eventNamespace, 'mousedown.' + this.eventNamespace], (event) => {\n            if (event.target.tagName === 'A' && event.type === 'touchstart') {\n                return true;\n            }\n\n            if (event.type === 'mousedown') {\n                event.preventDefault();\n                this.controlCoordinates.initialPointerOffsetX = event.clientX;\n                this.controlCoordinates.initialPointerOffsetY = event.clientY;\n                this.controlCoordinates.containerHeight = this.getDimensions(this.domNodes.image).height;\n                this.controlCoordinates.containerWidth = this.getDimensions(this.domNodes.image).width;\n                this.controlCoordinates.imgHeight = this.getDimensions(this.currentImage).height;\n                this.controlCoordinates.imgWidth = this.getDimensions(this.currentImage).width;\n                this.controlCoordinates.containerOffsetX = this.domNodes.image.offsetLeft;\n                this.controlCoordinates.containerOffsetY = this.domNodes.image.offsetTop;\n\n                this.controlCoordinates.initialOffsetX = parseFloat(this.currentImage.dataset.translateX);\n                this.controlCoordinates.initialOffsetY = parseFloat(this.currentImage.dataset.translateY);\n                this.controlCoordinates.capture = true;\n            } else {\n                this.controlCoordinates.touchCount = event.touches.length;\n                this.controlCoordinates.initialPointerOffsetX = event.touches[0].clientX;\n                this.controlCoordinates.initialPointerOffsetY = event.touches[0].clientY;\n                this.controlCoordinates.containerHeight = this.getDimensions(this.domNodes.image).height;\n                this.controlCoordinates.containerWidth = this.getDimensions(this.domNodes.image).width;\n                this.controlCoordinates.imgHeight = this.getDimensions(this.currentImage).height;\n                this.controlCoordinates.imgWidth = this.getDimensions(this.currentImage).width;\n                this.controlCoordinates.containerOffsetX = this.domNodes.image.offsetLeft;\n                this.controlCoordinates.containerOffsetY = this.domNodes.image.offsetTop;\n\n                if (this.controlCoordinates.touchCount === 1) /* Single touch */ {\n                    if (!this.controlCoordinates.doubleTapped) {\n                        this.controlCoordinates.doubleTapped = true;\n                        setTimeout(() => {\n                            this.controlCoordinates.doubleTapped = false;\n                        }, 300);\n                    } else {\n\n                        this.currentImage.classList.add('sl-transition');\n                        if (!this.controlCoordinates.zoomed) {\n                            this.controlCoordinates.initialScale = this.options.doubleTapZoom;\n                            this.setZoomData(this.controlCoordinates.initialScale,0, 0);\n                            this.zoomPanElement(0 + \"px\", 0 + \"px\", this.controlCoordinates.initialScale);\n\n\n                            if (!this.domNodes.caption.style.opacity && this.domNodes.caption.style.display !== 'none') {\n                                this.fadeOut(this.domNodes.caption, this.options.fadeSpeed);\n                            }\n\n                            this.controlCoordinates.zoomed = true;\n                        } else {\n                            this.controlCoordinates.initialScale = 1;\n                            this.setZoomData(this.controlCoordinates.initialScale,0, 0);\n                            this.zoomPanElement(0 + \"px\", 0 + \"px\", this.controlCoordinates.initialScale);\n                            this.controlCoordinates.zoomed = false;\n                        }\n\n                        setTimeout(() => {\n                            if (this.currentImage) {\n                                this.currentImage.classList.remove('sl-transition');\n                            }\n                        }, 200);\n                        return false;\n                    }\n\n                    this.controlCoordinates.initialOffsetX  = parseFloat(this.currentImage.dataset.translateX);\n                    this.controlCoordinates.initialOffsetY = parseFloat(this.currentImage.dataset.translateY);\n                }\n                else if (this.controlCoordinates.touchCount === 2) /* Pinch */ {\n                    this.controlCoordinates.initialPointerOffsetX2 = event.touches[1].clientX;\n                    this.controlCoordinates.initialPointerOffsetY2 = event.touches[1].clientY;\n                    this.controlCoordinates.initialOffsetX = parseFloat(this.currentImage.dataset.translateX);\n                    this.controlCoordinates.initialOffsetY = parseFloat(this.currentImage.dataset.translateY);\n                    this.controlCoordinates.pinchOffsetX = (this.controlCoordinates.initialPointerOffsetX + this.controlCoordinates.initialPointerOffsetX2) / 2;\n                    this.controlCoordinates.pinchOffsetY = (this.controlCoordinates.initialPointerOffsetY + this.controlCoordinates.initialPointerOffsetY2) / 2;\n                    this.controlCoordinates.initialPinchDistance = Math.sqrt(((this.controlCoordinates.initialPointerOffsetX - this.controlCoordinates.initialPointerOffsetX2) * (this.controlCoordinates.initialPointerOffsetX - this.controlCoordinates.initialPointerOffsetX2)) + ((this.controlCoordinates.initialPointerOffsetY - this.controlCoordinates.initialPointerOffsetY2) * (this.controlCoordinates.initialPointerOffsetY - this.controlCoordinates.initialPointerOffsetY2)));\n                }\n                this.controlCoordinates.capture = true;\n            }\n            if(this.controlCoordinates.mousedown) return true;\n            if (this.transitionCapable) {\n                this.controlCoordinates.imageLeft = parseInt(this.domNodes.image.style.left, 10);\n            }\n            this.controlCoordinates.mousedown = true;\n            this.controlCoordinates.swipeDiff = 0;\n            this.controlCoordinates.swipeYDiff = 0;\n            this.controlCoordinates.swipeStart = event.pageX || event.touches[0].pageX;\n            this.controlCoordinates.swipeYStart = event.pageY || event.touches[0].pageY;\n\n            return false;\n        });\n\n        this.addEventListener(this.domNodes.image, ['touchmove.' + this.eventNamespace, 'mousemove.' + this.eventNamespace, 'MSPointerMove'], (event) => {\n\n\n            if (!this.controlCoordinates.mousedown) {\n                return true;\n            }\n\n            if (event.type === 'touchmove') {\n                if (this.controlCoordinates.capture === false) {\n                    return false;\n                }\n\n                this.controlCoordinates.pointerOffsetX = event.touches[0].clientX;\n                this.controlCoordinates.pointerOffsetY = event.touches[0].clientY;\n                this.controlCoordinates.touchCount = event.touches.length;\n                this.controlCoordinates.touchmoveCount++;\n\n                if (this.controlCoordinates.touchCount > 1) /* Pinch */ {\n                    this.controlCoordinates.pointerOffsetX2 = event.touches[1].clientX;\n                    this.controlCoordinates.pointerOffsetY2 = event.touches[1].clientY;\n                    this.controlCoordinates.targetPinchDistance = Math.sqrt(((this.controlCoordinates.pointerOffsetX - this.controlCoordinates.pointerOffsetX2) * (this.controlCoordinates.pointerOffsetX - this.controlCoordinates.pointerOffsetX2)) + ((this.controlCoordinates.pointerOffsetY - this.controlCoordinates.pointerOffsetY2) * (this.controlCoordinates.pointerOffsetY - this.controlCoordinates.pointerOffsetY2)));\n                    if (this.controlCoordinates.initialPinchDistance === null) {\n                        this.controlCoordinates.initialPinchDistance = this.controlCoordinates.targetPinchDistance;\n                    }\n\n                    if (Math.abs(this.controlCoordinates.initialPinchDistance - this.controlCoordinates.targetPinchDistance) >= 1) {\n                        /* Initialize helpers */\n                        this.controlCoordinates.targetScale = this.minMax(this.controlCoordinates.targetPinchDistance / this.controlCoordinates.initialPinchDistance * this.controlCoordinates.initialScale, 1, this.options.maxZoom);\n                        this.controlCoordinates.limitOffsetX = ((this.controlCoordinates.imgWidth * this.controlCoordinates.targetScale) - this.controlCoordinates.containerWidth) / 2;\n                        this.controlCoordinates.limitOffsetY = ((this.controlCoordinates.imgHeight * this.controlCoordinates.targetScale) - this.controlCoordinates.containerHeight) / 2;\n                        this.controlCoordinates.scaleDifference = this.controlCoordinates.targetScale - this.controlCoordinates.initialScale;\n                        this.controlCoordinates.targetOffsetX = (this.controlCoordinates.imgWidth * this.controlCoordinates.targetScale) <= this.controlCoordinates.containerWidth ? 0 : this.minMax(this.controlCoordinates.initialOffsetX - ((((((this.controlCoordinates.pinchOffsetX - this.controlCoordinates.containerOffsetX) - (this.controlCoordinates.containerWidth / 2)) - this.controlCoordinates.initialOffsetX) / (this.controlCoordinates.targetScale - this.controlCoordinates.scaleDifference))) * this.controlCoordinates.scaleDifference), this.controlCoordinates.limitOffsetX * (-1), this.controlCoordinates.limitOffsetX);\n                        this.controlCoordinates.targetOffsetY = (this.controlCoordinates.imgHeight * this.controlCoordinates.targetScale) <= this.controlCoordinates.containerHeight ? 0 : this.minMax(this.controlCoordinates.initialOffsetY - ((((((this.controlCoordinates.pinchOffsetY - this.controlCoordinates.containerOffsetY) - (this.controlCoordinates.containerHeight / 2)) - this.controlCoordinates.initialOffsetY) / (this.controlCoordinates.targetScale - this.controlCoordinates.scaleDifference))) * this.controlCoordinates.scaleDifference), this.controlCoordinates.limitOffsetY * (-1), this.controlCoordinates.limitOffsetY);\n\n                        this.zoomPanElement(this.controlCoordinates.targetOffsetX + \"px\", this.controlCoordinates.targetOffsetY + \"px\", this.controlCoordinates.targetScale);\n\n                        if (this.controlCoordinates.targetScale > 1) {\n                            this.controlCoordinates.zoomed = true;\n                            if (!this.domNodes.caption.style.opacity && this.domNodes.caption.style.display !== 'none') {\n                                this.fadeOut(this.domNodes.caption, this.options.fadeSpeed);\n                            }\n                        }\n\n                        this.controlCoordinates.initialPinchDistance = this.controlCoordinates.targetPinchDistance;\n                        this.controlCoordinates.initialScale = this.controlCoordinates.targetScale;\n                        this.controlCoordinates.initialOffsetX = this.controlCoordinates.targetOffsetX;\n                        this.controlCoordinates.initialOffsetY = this.controlCoordinates.targetOffsetY;\n                    }\n                } else {\n                    this.controlCoordinates.targetScale = this.controlCoordinates.initialScale;\n                    this.controlCoordinates.limitOffsetX = ((this.controlCoordinates.imgWidth * this.controlCoordinates.targetScale) - this.controlCoordinates.containerWidth) / 2;\n                    this.controlCoordinates.limitOffsetY = ((this.controlCoordinates.imgHeight * this.controlCoordinates.targetScale) - this.controlCoordinates.containerHeight) / 2;\n                    this.controlCoordinates.targetOffsetX = (this.controlCoordinates.imgWidth * this.controlCoordinates.targetScale) <= this.controlCoordinates.containerWidth ? 0 : this.minMax(this.controlCoordinates.pointerOffsetX - (this.controlCoordinates.initialPointerOffsetX - this.controlCoordinates.initialOffsetX), this.controlCoordinates.limitOffsetX * (-1), this.controlCoordinates.limitOffsetX);\n                    this.controlCoordinates.targetOffsetY = (this.controlCoordinates.imgHeight * this.controlCoordinates.targetScale) <= this.controlCoordinates.containerHeight ? 0 : this.minMax(this.controlCoordinates.pointerOffsetY - (this.controlCoordinates.initialPointerOffsetY - this.controlCoordinates.initialOffsetY), this.controlCoordinates.limitOffsetY * (-1), this.controlCoordinates.limitOffsetY);\n\n                    if (Math.abs(this.controlCoordinates.targetOffsetX) === Math.abs(this.controlCoordinates.limitOffsetX)) {\n                        this.controlCoordinates.initialOffsetX = this.controlCoordinates.targetOffsetX;\n                        this.controlCoordinates.initialPointerOffsetX = this.controlCoordinates.pointerOffsetX;\n                    }\n\n                    if (Math.abs(this.controlCoordinates.targetOffsetY) === Math.abs(this.controlCoordinates.limitOffsetY)) {\n                        this.controlCoordinates.initialOffsetY = this.controlCoordinates.targetOffsetY;\n                        this.controlCoordinates.initialPointerOffsetY = this.controlCoordinates.pointerOffsetY;\n                    }\n\n                    this.setZoomData(this.controlCoordinates.initialScale, this.controlCoordinates.targetOffsetX, this.controlCoordinates.targetOffsetY);\n                    this.zoomPanElement(this.controlCoordinates.targetOffsetX + \"px\", this.controlCoordinates.targetOffsetY + \"px\", this.controlCoordinates.targetScale);\n                }\n            }\n\n            /* Mouse Move implementation */\n            if (event.type === 'mousemove' && this.controlCoordinates.mousedown) {\n                if(event.type == 'touchmove') return true;\n\n                event.preventDefault();\n\n                if(this.controlCoordinates.capture === false) return false;\n\n                this.controlCoordinates.pointerOffsetX = event.clientX;\n                this.controlCoordinates.pointerOffsetY = event.clientY;\n\n                this.controlCoordinates.targetScale = this.controlCoordinates.initialScale;\n                this.controlCoordinates.limitOffsetX = ((this.controlCoordinates.imgWidth * this.controlCoordinates.targetScale) - this.controlCoordinates.containerWidth) / 2;\n                this.controlCoordinates.limitOffsetY = ((this.controlCoordinates.imgHeight * this.controlCoordinates.targetScale) - this.controlCoordinates.containerHeight) / 2;\n                this.controlCoordinates.targetOffsetX = (this.controlCoordinates.imgWidth * this.controlCoordinates.targetScale) <= this.controlCoordinates.containerWidth ? 0 : this.minMax(this.controlCoordinates.pointerOffsetX - (this.controlCoordinates.initialPointerOffsetX - this.controlCoordinates.initialOffsetX), this.controlCoordinates.limitOffsetX * (-1), this.controlCoordinates.limitOffsetX);\n                this.controlCoordinates.targetOffsetY = (this.controlCoordinates.imgHeight * this.controlCoordinates.targetScale) <= this.controlCoordinates.containerHeight ? 0 : this.minMax(this.controlCoordinates.pointerOffsetY - (this.controlCoordinates.initialPointerOffsetY - this.controlCoordinates.initialOffsetY), this.controlCoordinates.limitOffsetY * (-1), this.controlCoordinates.limitOffsetY);\n\n                if (Math.abs(this.controlCoordinates.targetOffsetX) === Math.abs(this.controlCoordinates.limitOffsetX)) {\n                    this.controlCoordinates.initialOffsetX = this.controlCoordinates.targetOffsetX;\n                    this.controlCoordinates.initialPointerOffsetX = this.controlCoordinates.pointerOffsetX;\n                }\n\n                if (Math.abs(this.controlCoordinates.targetOffsetY) === Math.abs(this.controlCoordinates.limitOffsetY)) {\n                    this.controlCoordinates.initialOffsetY = this.controlCoordinates.targetOffsetY;\n                    this.controlCoordinates.initialPointerOffsetY = this.controlCoordinates.pointerOffsetY;\n                }\n\n                this.setZoomData(this.controlCoordinates.initialScale, this.controlCoordinates.targetOffsetX, this.controlCoordinates.targetOffsetY);\n                this.zoomPanElement(this.controlCoordinates.targetOffsetX + \"px\", this.controlCoordinates.targetOffsetY + \"px\", this.controlCoordinates.targetScale);\n\n            }\n\n            if (!this.controlCoordinates.zoomed) {\n\n                this.controlCoordinates.swipeEnd = event.pageX || event.touches[0].pageX;\n                this.controlCoordinates.swipeYEnd = event.pageY || event.touches[0].pageY;\n                this.controlCoordinates.swipeDiff = this.controlCoordinates.swipeStart - this.controlCoordinates.swipeEnd;\n                this.controlCoordinates.swipeYDiff = this.controlCoordinates.swipeYStart - this.controlCoordinates.swipeYEnd;\n                if (this.options.animationSlide) {\n                    this.slide(0, -this.controlCoordinates.swipeDiff + 'px');\n                }\n            }\n\n        });\n\n\n        this.addEventListener(this.domNodes.image, ['touchend.' + this.eventNamespace, 'mouseup.' + this.eventNamespace, 'touchcancel.' + this.eventNamespace, 'mouseleave.' + this.eventNamespace, 'pointerup', 'pointercancel', 'MSPointerUp', 'MSPointerCancel'], (event) => {\n\n\n            if (this.isTouchDevice && event.type === 'touchend') {\n                this.controlCoordinates.touchCount = event.touches.length;\n                if (this.controlCoordinates.touchCount === 0) /* No touch */ {\n                    /* Set attributes */\n                    if (this.currentImage) {\n                        this.setZoomData(this.controlCoordinates.initialScale, this.controlCoordinates.targetOffsetX, this.controlCoordinates.targetOffsetY);\n                    }\n                    if (this.controlCoordinates.initialScale === 1) {\n                        this.controlCoordinates.zoomed = false;\n                        if (this.domNodes.caption.style.display === 'none') {\n                            this.fadeIn(this.domNodes.caption, this.options.fadeSpeed);\n                        }\n                    }\n                    this.controlCoordinates.initialPinchDistance = null;\n                    this.controlCoordinates.capture = false;\n                } else if (this.controlCoordinates.touchCount === 1) /* Single touch */ {\n                    this.controlCoordinates.initialPointerOffsetX = event.touches[0].clientX;\n                    this.controlCoordinates.initialPointerOffsetY = event.touches[0].clientY;\n                } else if (this.controlCoordinates.touchCount > 1) /* Pinch */ {\n                    this.controlCoordinates.initialPinchDistance = null;\n                }\n            }\n\n\n            if (this.controlCoordinates.mousedown) {\n                this.controlCoordinates.mousedown = false;\n                let possibleDir = true;\n                if (!this.options.loop) {\n                    if (this.currentImageIndex === 0 && this.controlCoordinates.swipeDiff < 0) {\n                        possibleDir = false;\n                    }\n                    if (this.currentImageIndex >= this.relatedElements.length - 1 && this.controlCoordinates.swipeDiff > 0) {\n                        possibleDir = false;\n                    }\n                }\n                if (Math.abs(this.controlCoordinates.swipeDiff) > this.options.swipeTolerance && possibleDir) {\n                    this.loadImage(this.controlCoordinates.swipeDiff > 0 ? 1 : -1);\n                }\n                else if (this.options.animationSlide) {\n                    this.slide(this.options.animationSpeed / 1000, 0 + 'px');\n                }\n\n                if (this.options.swipeClose && Math.abs(this.controlCoordinates.swipeYDiff) > 50 && Math.abs(this.controlCoordinates.swipeDiff) < this.options.swipeTolerance) {\n                    this.close();\n                }\n            }\n        });\n\n        this.addEventListener(this.domNodes.image, ['dblclick'], (event) => {\n            if(this.isTouchDevice) return;\n            this.controlCoordinates.initialPointerOffsetX = event.clientX;\n            this.controlCoordinates.initialPointerOffsetY = event.clientY;\n            this.controlCoordinates.containerHeight = this.getDimensions(this.domNodes.image).height;\n            this.controlCoordinates.containerWidth = this.getDimensions(this.domNodes.image).width;\n            this.controlCoordinates.imgHeight = this.getDimensions(this.currentImage).height;\n            this.controlCoordinates.imgWidth = this.getDimensions(this.currentImage).width;\n            this.controlCoordinates.containerOffsetX = this.domNodes.image.offsetLeft;\n            this.controlCoordinates.containerOffsetY = this.domNodes.image.offsetTop;\n\n            this.currentImage.classList.add('sl-transition');\n\n            if(!this.controlCoordinates.zoomed) {\n                this.controlCoordinates.initialScale = this.options.doubleTapZoom;\n                this.setZoomData(this.controlCoordinates.initialScale, 0, 0);\n                this.zoomPanElement(0 + \"px\", 0 + \"px\", this.controlCoordinates.initialScale);\n                if (!this.domNodes.caption.style.opacity && this.domNodes.caption.style.display !== 'none') {\n                    this.fadeOut(this.domNodes.caption, this.options.fadeSpeed);\n                }\n                this.controlCoordinates.zoomed = true;\n            } else {\n                this.controlCoordinates.initialScale = 1;\n                this.setZoomData(this.controlCoordinates.initialScale, 0, 0);\n                this.zoomPanElement(0 + \"px\", 0 + \"px\", this.controlCoordinates.initialScale);\n                this.controlCoordinates.zoomed = false;\n                if (this.domNodes.caption.style.display === 'none') {\n                    this.fadeIn(this.domNodes.caption, this.options.fadeSpeed);\n                }\n\n            }\n            setTimeout(() => {\n                if (this.currentImage) {\n                    this.currentImage.classList.remove('sl-transition');\n                    this.currentImage.style[this.transitionPrefix + 'transform-origin'] = null;\n                }\n            }, 200);\n\n            this.controlCoordinates.capture = true;\n            return false;\n        });\n\n    }\n\n    getDimensions(element) {\n        let styles = window.getComputedStyle(element),\n            height = element.offsetHeight,\n            width = element.offsetWidth,\n            borderTopWidth = parseFloat(styles.borderTopWidth),\n            borderBottomWidth = parseFloat(styles.borderBottomWidth),\n            paddingTop = parseFloat(styles.paddingTop),\n            paddingBottom = parseFloat(styles.paddingBottom),\n            borderLeftWidth = parseFloat(styles.borderLeftWidth),\n            borderRightWidth = parseFloat(styles.borderRightWidth),\n            paddingLeft = parseFloat(styles.paddingLeft),\n            paddingRight = parseFloat(styles.paddingRight);\n        return {\n            height: height - borderBottomWidth - borderTopWidth - paddingTop - paddingBottom,\n            width: width - borderLeftWidth - borderRightWidth - paddingLeft - paddingRight\n        };\n    }\n\n    updateHash() {\n        let newHash = 'pid=' + (this.currentImageIndex + 1),\n            newURL = window.location.href.split('#')[0] + '#' + newHash;\n\n        this.hashReseted = false;\n\n        if (this.pushStateSupport) {\n            window.history[this.historyHasChanges ? 'replaceState' : 'pushState']('', document.title, newURL);\n        } else {\n            // what is the browser target of this?\n            if (this.historyHasChanges) {\n                window.location.replace(newURL);\n            } else {\n                window.location.hash = newHash;\n            }\n        }\n        if(!this.historyHasChanges) {\n            this.urlChangedOnce = true;\n        }\n\n        this.historyHasChanges = true;\n    }\n\n    resetHash() {\n        this.hashReseted = true;\n        if(this.urlChangedOnce) {\n            history.back();\n        } else {\n            if (this.pushStateSupport) {\n                history.pushState('', document.title, window.location.pathname + window.location.search);\n            } else {\n                window.location.hash = '';\n            }\n        }\n        //\n        //in case an history operation is still pending\n        clearTimeout(this.historyUpdateTimeout);\n    }\n\n    updateURL() {\n        clearTimeout(this.historyUpdateTimeout);\n        if (!this.historyHasChanges) {\n            this.updateHash(); // first time\n        } else {\n            this.historyUpdateTimeout = setTimeout(this.updateHash.bind(this), 800);\n        }\n    }\n\n    setCaption(captionText, imageWidth) {\n        if (this.options.captions && captionText && captionText !== '' && typeof captionText !== \"undefined\") {\n            this.hide(this.domNodes.caption);\n            this.domNodes.caption.style.width = imageWidth + 'px';\n            this.domNodes.caption.innerHTML = captionText;\n\n            this.domNodes.image.appendChild(this.domNodes.caption);\n\n            setTimeout(() => {\n                this.fadeIn(this.domNodes.caption, this.options.fadeSpeed);\n            }, this.options.captionDelay);\n        }\n    }\n\n    slide(speed, pos) {\n        if (!this.transitionCapable) {\n            return this.domNodes.image.style.left = pos;\n        }\n\n        this.domNodes.image.style[this.transitionPrefix + 'transform'] = 'translateX(' + pos + ')';\n        this.domNodes.image.style[this.transitionPrefix + 'transition'] = this.transitionPrefix + 'transform ' + speed + 's linear';\n    }\n\n    getRelated(rel) {\n        let elems;\n        if (rel && rel !== false && rel !== 'nofollow') {\n            elems = Array.from(this.elements).filter(element => element.getAttribute('rel') === rel);\n        } else {\n            elems = this.elements;\n        }\n        return elems;\n    }\n\n    openImage(element) {\n        element.dispatchEvent(new Event('show.' + this.eventNamespace));\n\n        if (this.options.disableScroll) {\n            this.globalScrollbarWidth = this.toggleScrollbar('hide');\n        }\n\n        if (this.options.htmlClass && this.options.htmlClass !== '') {\n            document.querySelector('html').classList.add(this.options.htmlClass);\n        }\n\n        document.body.appendChild(this.domNodes.wrapper);\n\n        this.domNodes.wrapper.appendChild(this.domNodes.image);\n        if (this.options.overlay) {\n            document.body.appendChild(this.domNodes.overlay);\n        }\n\n        this.relatedElements = this.getRelated(element.rel);\n\n        if (this.options.showCounter) {\n            if (this.relatedElements.length == 1 && this.domNodes.wrapper.contains(this.domNodes.counter)) {\n                this.domNodes.wrapper.removeChild(this.domNodes.counter);\n            } else if(this.relatedElements.length > 1 && !this.domNodes.wrapper.contains(this.domNodes.counter)) {\n                this.domNodes.wrapper.appendChild(this.domNodes.counter);\n            }\n        }\n\n        this.isAnimating = true;\n\n        this.currentImageIndex = this.relatedElements.indexOf(element);\n\n        let targetURL = element.getAttribute(this.options.sourceAttr);\n\n        this.currentImage = document.createElement('img');\n        this.currentImage.style.display = 'none';\n        this.currentImage.setAttribute('src', targetURL);\n        this.currentImage.dataset.scale = 1;\n        this.currentImage.dataset.translateX = 0;\n        this.currentImage.dataset.translateY = 0;\n\n        if (this.loadedImages.indexOf(targetURL) === -1) {\n            this.loadedImages.push(targetURL);\n        }\n\n        this.domNodes.image.innerHTML = '';\n        this.domNodes.image.setAttribute('style', '');\n\n        this.domNodes.image.appendChild(this.currentImage);\n\n\n        this.fadeIn(this.domNodes.overlay, this.options.fadeSpeed);\n        this.fadeIn([this.domNodes.counter, this.domNodes.navigation, this.domNodes.closeButton], this.options.fadeSpeed);\n\n        this.show(this.domNodes.spinner);\n        this.domNodes.counter.querySelector('.sl-current').innerHTML = this.currentImageIndex + 1;\n        this.domNodes.counter.querySelector('.sl-total').innerHTML = this.relatedElements.length;\n\n        this.adjustImage();\n        if (this.options.preloading) {\n            this.preload();\n        }\n\n        setTimeout(() => {\n            element.dispatchEvent(new Event('shown.' + this.eventNamespace));\n        }, this.options.animationSpeed);\n    }\n\n    forceFocus() {\n        this.removeEventListener(document, 'focusin.' + this.eventNamespace);\n        this.addEventListener(document, 'focusin.' + this.eventNamespace, event => {\n            if (document !== event.target &&\n                this.domNodes.wrapper !== event.target &&\n                !this.domNodes.wrapper.contains(event.target)) {\n                this.domNodes.wrapper.focus();\n            }\n        });\n    }\n\n    // utility\n    addEventListener(elements, events, callback, opts) {\n        elements = this.wrap(elements);\n        events = this.wrap(events);\n\n        for (let element of elements) {\n            if (!element.namespaces) {\n                element.namespaces = {};\n            } // save the namespaces addEventListener the DOM element itself\n\n            for (let event of events) {\n                let options = opts || false;\n                let needsPassiveFix = ['touchstart', 'touchmove'].indexOf(event.split('.')[0]) >= 0;\n                if (needsPassiveFix && this.isPassiveEventsSupported) {\n                    if (typeof options === 'object') {\n                        options.passive = true;\n                    } else {\n                        options = {passive: true};\n                    }\n                }\n                element.namespaces[event] = callback;\n                element.addEventListener(event.split('.')[0], callback, options);\n            }\n        }\n    }\n\n    removeEventListener(elements, events) {\n        elements = this.wrap(elements);\n        events = this.wrap(events);\n        for (let element of elements) {\n            for (let event of events) {\n                if(element.namespaces && element.namespaces[event]) {\n                    element.removeEventListener(event.split('.')[0], element.namespaces[event]);\n                    delete element.namespaces[event];\n                }\n            }\n        }\n    }\n\n    fadeOut(elements, duration, callback) {\n        elements = this.wrap(elements);\n        for (let element of elements) {\n            element.style.opacity = parseFloat(element) || window.getComputedStyle(element).getPropertyValue(\"opacity\");\n        }\n\n        this.isFadeIn = false;\n\n        let step = 16.66666 / (duration || this.options.fadeSpeed),\n            fade = () => {\n                let currentOpacity = parseFloat(elements[0].style.opacity);\n                if ((currentOpacity -= step) < 0) {\n                    for (let element of elements) {\n                        element.style.display = \"none\";\n                        // element.style.opacity = '';\n                        element.style.opacity = 1;\n                    }\n                    callback && callback.call(this, elements);\n                } else {\n                    for (let element of elements) {\n                        element.style.opacity = currentOpacity;\n                    }\n                    requestAnimationFrame(fade);\n                }\n            };\n\n        fade();\n    }\n\n    fadeIn(elements, duration, callback, display) {\n        elements = this.wrap(elements);\n        for (let element of elements) {\n            element.style.opacity = 0;\n            element.style.display = display || \"block\";\n        }\n\n        this.isFadeIn = true;\n\n        let opacityTarget = parseFloat(elements[0].dataset.opacityTarget || 1),\n            step = (16.66666 * opacityTarget) / (duration || this.options.fadeSpeed),\n            fade = () => {\n                let currentOpacity = parseFloat(elements[0].style.opacity);\n                if (!((currentOpacity += step) > opacityTarget)) {\n                    for (let element of elements) {\n                        element.style.opacity = currentOpacity;\n                    }\n                    if(!this.isFadeIn) return;\n                    requestAnimationFrame(fade);\n                } else {\n                    for (let element of elements) {\n                        element.style.opacity = opacityTarget;\n                    }\n                    callback && callback.call(this, elements);\n                }\n            };\n\n        fade();\n    }\n\n    hide(elements) {\n        elements = this.wrap(elements);\n        for (let element of elements) {\n            if(element.style.display != 'none') {\n                element.dataset.initialDisplay = element.style.display;\n            }\n            element.style.display = 'none';\n        }\n    }\n\n    show(elements, display) {\n        elements = this.wrap(elements);\n        for (let element of elements) {\n            element.style.display = element.dataset.initialDisplay || display || 'block';\n        }\n    }\n\n    wrap(input) {\n        return typeof input[Symbol.iterator] === 'function' && typeof input !== 'string' ? input : [input];\n    }\n\n    on(events, callback) {\n        events = this.wrap(events);\n        for (let element of this.elements) {\n            if (!element.fullyNamespacedEvents) {\n                element.fullyNamespacedEvents = {};\n            }\n            for (let event of events) {\n                element.fullyNamespacedEvents[event] = callback;\n                element.addEventListener(event, callback);\n            }\n        }\n        return this;\n    }\n\n    off(events) {\n        events = this.wrap(events);\n        for (let element of this.elements) {\n            for (let event of events) {\n                if (typeof element.fullyNamespacedEvents !== 'undefined' && event in element.fullyNamespacedEvents) {\n                    element.removeEventListener(event, element.fullyNamespacedEvents[event]);\n                }\n            }\n        }\n        return this;\n    }\n\n    // api\n\n    open(elem) {\n        elem = elem || this.elements[0];\n        if(typeof jQuery !== \"undefined\" && elem instanceof jQuery) {\n            elem = elem.get(0);\n        }\n        this.initialImageIndex = this.elements.indexOf(elem);\n        if(this.initialImageIndex > -1) {\n            this.openImage(elem);\n        }\n    }\n\n    next() {\n        this.loadImage(1);\n    }\n\n    prev() {\n        this.loadImage(-1);\n    }\n\n    // get some useful data\n    getLighboxData() {\n        return {\n            currentImageIndex: this.currentImageIndex,\n            currentImage: this.currentImage,\n            globalScrollbarWidth: this.globalScrollbarWidth\n        };\n    }\n\n    //close is exposed anyways..\n\n    destroy() {\n        //remove all custom event listeners from elements\n        this.off([\n            'close.' + this.eventNamespace,\n            'closed.' + this.eventNamespace,\n            'nextImageLoaded.' + this.eventNamespace,\n            'prevImageLoaded.' + this.eventNamespace,\n            'change.' + this.eventNamespace,\n            'nextDone.' + this.eventNamespace,\n            'prevDone.' + this.eventNamespace,\n            'error.' + this.eventNamespace,\n            'changed.' + this.eventNamespace,\n            'next.' + this.eventNamespace,\n            'prev.' + this.eventNamespace,\n            'show.' + this.eventNamespace,\n            'shown.' + this.eventNamespace\n        ]);\n\n        this.removeEventListener(this.elements, 'click.' + this.eventNamespace);\n        this.removeEventListener(document, 'focusin.' + this.eventNamespace);\n        this.removeEventListener(document.body, 'contextmenu.' + this.eventNamespace);\n        this.removeEventListener(document.body, 'keyup.' + this.eventNamespace);\n\n        this.removeEventListener(this.domNodes.navigation.getElementsByTagName('button'), 'click.' + this.eventNamespace);\n        this.removeEventListener(this.domNodes.closeButton, 'click.' + this.eventNamespace);\n        this.removeEventListener(window, 'resize.' + this.eventNamespace);\n        this.removeEventListener(window, 'hashchange.' + this.eventNamespace);\n\n        this.close();\n        if (this.isOpen) {\n            document.body.removeChild(this.domNodes.wrapper);\n            document.body.removeChild(this.domNodes.overlay);\n        }\n\n        this.elements = null;\n    }\n\n    refresh() {\n        if (!this.initialSelector) {\n            throw 'refreshing only works when you initialize using a selector!';\n        }\n\n        let options = this.options,\n            selector = this.initialSelector;\n\n        this.destroy();\n\n        this.constructor(selector, options);\n\n        return this;\n    }\n}\nexport default SimpleLightbox;\n\nglobal.SimpleLightbox = SimpleLightbox;","/**\n * SSR Window 4.0.2\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: December 13, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n    return (obj !== null &&\n        typeof obj === 'object' &&\n        'constructor' in obj &&\n        obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n    Object.keys(src).forEach((key) => {\n        if (typeof target[key] === 'undefined')\n            target[key] = src[key];\n        else if (isObject(src[key]) &&\n            isObject(target[key]) &&\n            Object.keys(src[key]).length > 0) {\n            extend(target[key], src[key]);\n        }\n    });\n}\n\nconst ssrDocument = {\n    body: {},\n    addEventListener() { },\n    removeEventListener() { },\n    activeElement: {\n        blur() { },\n        nodeName: '',\n    },\n    querySelector() {\n        return null;\n    },\n    querySelectorAll() {\n        return [];\n    },\n    getElementById() {\n        return null;\n    },\n    createEvent() {\n        return {\n            initEvent() { },\n        };\n    },\n    createElement() {\n        return {\n            children: [],\n            childNodes: [],\n            style: {},\n            setAttribute() { },\n            getElementsByTagName() {\n                return [];\n            },\n        };\n    },\n    createElementNS() {\n        return {};\n    },\n    importNode() {\n        return null;\n    },\n    location: {\n        hash: '',\n        host: '',\n        hostname: '',\n        href: '',\n        origin: '',\n        pathname: '',\n        protocol: '',\n        search: '',\n    },\n};\nfunction getDocument() {\n    const doc = typeof document !== 'undefined' ? document : {};\n    extend(doc, ssrDocument);\n    return doc;\n}\n\nconst ssrWindow = {\n    document: ssrDocument,\n    navigator: {\n        userAgent: '',\n    },\n    location: {\n        hash: '',\n        host: '',\n        hostname: '',\n        href: '',\n        origin: '',\n        pathname: '',\n        protocol: '',\n        search: '',\n    },\n    history: {\n        replaceState() { },\n        pushState() { },\n        go() { },\n        back() { },\n    },\n    CustomEvent: function CustomEvent() {\n        return this;\n    },\n    addEventListener() { },\n    removeEventListener() { },\n    getComputedStyle() {\n        return {\n            getPropertyValue() {\n                return '';\n            },\n        };\n    },\n    Image() { },\n    Date() { },\n    screen: {},\n    setTimeout() { },\n    clearTimeout() { },\n    matchMedia() {\n        return {};\n    },\n    requestAnimationFrame(callback) {\n        if (typeof setTimeout === 'undefined') {\n            callback();\n            return null;\n        }\n        return setTimeout(callback, 0);\n    },\n    cancelAnimationFrame(id) {\n        if (typeof setTimeout === 'undefined') {\n            return;\n        }\n        clearTimeout(id);\n    },\n};\nfunction getWindow() {\n    const win = typeof window !== 'undefined' ? window : {};\n    extend(win, ssrWindow);\n    return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.4\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2022, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: January 11, 2022\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n  const proto = obj.__proto__;\n  Object.defineProperty(obj, '__proto__', {\n    get() {\n      return proto;\n    },\n\n    set(value) {\n      proto.__proto__ = value;\n    }\n\n  });\n}\n\nclass Dom7 extends Array {\n  constructor(items) {\n    if (typeof items === 'number') {\n      super(items);\n    } else {\n      super(...(items || []));\n      makeReactive(this);\n    }\n  }\n\n}\n\nfunction arrayFlat(arr = []) {\n  const res = [];\n  arr.forEach(el => {\n    if (Array.isArray(el)) {\n      res.push(...arrayFlat(el));\n    } else {\n      res.push(el);\n    }\n  });\n  return res;\n}\nfunction arrayFilter(arr, callback) {\n  return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n  const uniqueArray = [];\n\n  for (let i = 0; i < arr.length; i += 1) {\n    if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n  }\n\n  return uniqueArray;\n}\nfunction toCamelCase(string) {\n  return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n  if (typeof selector !== 'string') {\n    return [selector];\n  }\n\n  const a = [];\n  const res = context.querySelectorAll(selector);\n\n  for (let i = 0; i < res.length; i += 1) {\n    a.push(res[i]);\n  }\n\n  return a;\n}\n\nfunction $(selector, context) {\n  const window = getWindow();\n  const document = getDocument();\n  let arr = [];\n\n  if (!context && selector instanceof Dom7) {\n    return selector;\n  }\n\n  if (!selector) {\n    return new Dom7(arr);\n  }\n\n  if (typeof selector === 'string') {\n    const html = selector.trim();\n\n    if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n      let toCreate = 'div';\n      if (html.indexOf('<li') === 0) toCreate = 'ul';\n      if (html.indexOf('<tr') === 0) toCreate = 'tbody';\n      if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';\n      if (html.indexOf('<tbody') === 0) toCreate = 'table';\n      if (html.indexOf('<option') === 0) toCreate = 'select';\n      const tempParent = document.createElement(toCreate);\n      tempParent.innerHTML = html;\n\n      for (let i = 0; i < tempParent.childNodes.length; i += 1) {\n        arr.push(tempParent.childNodes[i]);\n      }\n    } else {\n      arr = qsa(selector.trim(), context || document);\n    } // arr = qsa(selector, document);\n\n  } else if (selector.nodeType || selector === window || selector === document) {\n    arr.push(selector);\n  } else if (Array.isArray(selector)) {\n    if (selector instanceof Dom7) return selector;\n    arr = selector;\n  }\n\n  return new Dom7(arrayUnique(arr));\n}\n\n$.fn = Dom7.prototype;\n\n// eslint-disable-next-line\n\nfunction addClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.add(...classNames);\n  });\n  return this;\n}\n\nfunction removeClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.remove(...classNames);\n  });\n  return this;\n}\n\nfunction toggleClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    classNames.forEach(className => {\n      el.classList.toggle(className);\n    });\n  });\n}\n\nfunction hasClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  return arrayFilter(this, el => {\n    return classNames.filter(className => el.classList.contains(className)).length > 0;\n  }).length > 0;\n}\n\nfunction attr(attrs, value) {\n  if (arguments.length === 1 && typeof attrs === 'string') {\n    // Get attr\n    if (this[0]) return this[0].getAttribute(attrs);\n    return undefined;\n  } // Set attrs\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (arguments.length === 2) {\n      // String\n      this[i].setAttribute(attrs, value);\n    } else {\n      // Object\n      for (const attrName in attrs) {\n        this[i][attrName] = attrs[attrName];\n        this[i].setAttribute(attrName, attrs[attrName]);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction removeAttr(attr) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].removeAttribute(attr);\n  }\n\n  return this;\n}\n\nfunction prop(props, value) {\n  if (arguments.length === 1 && typeof props === 'string') {\n    // Get prop\n    if (this[0]) return this[0][props];\n  } else {\n    // Set props\n    for (let i = 0; i < this.length; i += 1) {\n      if (arguments.length === 2) {\n        // String\n        this[i][props] = value;\n      } else {\n        // Object\n        for (const propName in props) {\n          this[i][propName] = props[propName];\n        }\n      }\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction data(key, value) {\n  let el;\n\n  if (typeof value === 'undefined') {\n    el = this[0];\n    if (!el) return undefined; // Get value\n\n    if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n      return el.dom7ElementDataStorage[key];\n    }\n\n    const dataKey = el.getAttribute(`data-${key}`);\n\n    if (dataKey) {\n      return dataKey;\n    }\n\n    return undefined;\n  } // Set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    el = this[i];\n    if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n    el.dom7ElementDataStorage[key] = value;\n  }\n\n  return this;\n}\n\nfunction removeData(key) {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n      el.dom7ElementDataStorage[key] = null;\n      delete el.dom7ElementDataStorage[key];\n    }\n  }\n}\n\nfunction dataset() {\n  const el = this[0];\n  if (!el) return undefined;\n  const dataset = {}; // eslint-disable-line\n\n  if (el.dataset) {\n    for (const dataKey in el.dataset) {\n      dataset[dataKey] = el.dataset[dataKey];\n    }\n  } else {\n    for (let i = 0; i < el.attributes.length; i += 1) {\n      const attr = el.attributes[i];\n\n      if (attr.name.indexOf('data-') >= 0) {\n        dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n      }\n    }\n  }\n\n  for (const key in dataset) {\n    if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n  }\n\n  return dataset;\n}\n\nfunction val(value) {\n  if (typeof value === 'undefined') {\n    // get value\n    const el = this[0];\n    if (!el) return undefined;\n\n    if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n      const values = [];\n\n      for (let i = 0; i < el.selectedOptions.length; i += 1) {\n        values.push(el.selectedOptions[i].value);\n      }\n\n      return values;\n    }\n\n    return el.value;\n  } // set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n      for (let j = 0; j < el.options.length; j += 1) {\n        el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n      }\n    } else {\n      el.value = value;\n    }\n  }\n\n  return this;\n}\n\nfunction value(value) {\n  return this.val(value);\n}\n\nfunction transform(transform) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transform = transform;\n  }\n\n  return this;\n}\n\nfunction transition(duration) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n  }\n\n  return this;\n}\n\nfunction on(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n\n  function handleLiveEvent(e) {\n    const target = e.target;\n    if (!target) return;\n    const eventData = e.target.dom7EventData || [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n      const parents = $(target).parents(); // eslint-disable-line\n\n      for (let k = 0; k < parents.length; k += 1) {\n        if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n      }\n    }\n  }\n\n  function handleEvent(e) {\n    const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    listener.apply(this, eventData);\n  }\n\n  const events = eventType.split(' ');\n  let j;\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (!targetSelector) {\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7Listeners) el.dom7Listeners = {};\n        if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n        el.dom7Listeners[event].push({\n          listener,\n          proxyListener: handleEvent\n        });\n        el.addEventListener(event, handleEvent, capture);\n      }\n    } else {\n      // Live events\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n        if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n        el.dom7LiveListeners[event].push({\n          listener,\n          proxyListener: handleLiveEvent\n        });\n        el.addEventListener(event, handleLiveEvent, capture);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction off(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n  const events = eventType.split(' ');\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n      let handlers;\n\n      if (!targetSelector && el.dom7Listeners) {\n        handlers = el.dom7Listeners[event];\n      } else if (targetSelector && el.dom7LiveListeners) {\n        handlers = el.dom7LiveListeners[event];\n      }\n\n      if (handlers && handlers.length) {\n        for (let k = handlers.length - 1; k >= 0; k -= 1) {\n          const handler = handlers[k];\n\n          if (listener && handler.listener === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (!listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          }\n        }\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction once(...args) {\n  const dom = this;\n  let [eventName, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventName, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  function onceHandler(...eventArgs) {\n    listener.apply(this, eventArgs);\n    dom.off(eventName, targetSelector, onceHandler, capture);\n\n    if (onceHandler.dom7proxy) {\n      delete onceHandler.dom7proxy;\n    }\n  }\n\n  onceHandler.dom7proxy = listener;\n  return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n  const window = getWindow();\n  const events = args[0].split(' ');\n  const eventData = args[1];\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n\n      if (window.CustomEvent) {\n        const evt = new window.CustomEvent(event, {\n          detail: eventData,\n          bubbles: true,\n          cancelable: true\n        });\n        el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n        el.dispatchEvent(evt);\n        el.dom7EventData = [];\n        delete el.dom7EventData;\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction transitionEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('transitionend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('transitionend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction animationEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('animationend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('animationend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction width() {\n  const window = getWindow();\n\n  if (this[0] === window) {\n    return window.innerWidth;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('width'));\n  }\n\n  return null;\n}\n\nfunction outerWidth(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n    }\n\n    return this[0].offsetWidth;\n  }\n\n  return null;\n}\n\nfunction height() {\n  const window = getWindow();\n\n  if (this[0] === window) {\n    return window.innerHeight;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('height'));\n  }\n\n  return null;\n}\n\nfunction outerHeight(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n    }\n\n    return this[0].offsetHeight;\n  }\n\n  return null;\n}\n\nfunction offset() {\n  if (this.length > 0) {\n    const window = getWindow();\n    const document = getDocument();\n    const el = this[0];\n    const box = el.getBoundingClientRect();\n    const body = document.body;\n    const clientTop = el.clientTop || body.clientTop || 0;\n    const clientLeft = el.clientLeft || body.clientLeft || 0;\n    const scrollTop = el === window ? window.scrollY : el.scrollTop;\n    const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n    return {\n      top: box.top + scrollTop - clientTop,\n      left: box.left + scrollLeft - clientLeft\n    };\n  }\n\n  return null;\n}\n\nfunction hide() {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.display = 'none';\n  }\n\n  return this;\n}\n\nfunction show() {\n  const window = getWindow();\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.style.display === 'none') {\n      el.style.display = '';\n    }\n\n    if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n      // Still not visible\n      el.style.display = 'block';\n    }\n  }\n\n  return this;\n}\n\nfunction styles() {\n  const window = getWindow();\n  if (this[0]) return window.getComputedStyle(this[0], null);\n  return {};\n}\n\nfunction css(props, value) {\n  const window = getWindow();\n  let i;\n\n  if (arguments.length === 1) {\n    if (typeof props === 'string') {\n      // .css('width')\n      if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n    } else {\n      // .css({ width: '100px' })\n      for (i = 0; i < this.length; i += 1) {\n        for (const prop in props) {\n          this[i].style[prop] = props[prop];\n        }\n      }\n\n      return this;\n    }\n  }\n\n  if (arguments.length === 2 && typeof props === 'string') {\n    // .css('width', '100px')\n    for (i = 0; i < this.length; i += 1) {\n      this[i].style[props] = value;\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction each(callback) {\n  if (!callback) return this;\n  this.forEach((el, index) => {\n    callback.apply(el, [el, index]);\n  });\n  return this;\n}\n\nfunction filter(callback) {\n  const result = arrayFilter(this, callback);\n  return $(result);\n}\n\nfunction html(html) {\n  if (typeof html === 'undefined') {\n    return this[0] ? this[0].innerHTML : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].innerHTML = html;\n  }\n\n  return this;\n}\n\nfunction text(text) {\n  if (typeof text === 'undefined') {\n    return this[0] ? this[0].textContent.trim() : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].textContent = text;\n  }\n\n  return this;\n}\n\nfunction is(selector) {\n  const window = getWindow();\n  const document = getDocument();\n  const el = this[0];\n  let compareWith;\n  let i;\n  if (!el || typeof selector === 'undefined') return false;\n\n  if (typeof selector === 'string') {\n    if (el.matches) return el.matches(selector);\n    if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n    if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n    compareWith = $(selector);\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  if (selector === document) {\n    return el === document;\n  }\n\n  if (selector === window) {\n    return el === window;\n  }\n\n  if (selector.nodeType || selector instanceof Dom7) {\n    compareWith = selector.nodeType ? [selector] : selector;\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  return false;\n}\n\nfunction index() {\n  let child = this[0];\n  let i;\n\n  if (child) {\n    i = 0; // eslint-disable-next-line\n\n    while ((child = child.previousSibling) !== null) {\n      if (child.nodeType === 1) i += 1;\n    }\n\n    return i;\n  }\n\n  return undefined;\n}\n\nfunction eq(index) {\n  if (typeof index === 'undefined') return this;\n  const length = this.length;\n\n  if (index > length - 1) {\n    return $([]);\n  }\n\n  if (index < 0) {\n    const returnIndex = length + index;\n    if (returnIndex < 0) return $([]);\n    return $([this[returnIndex]]);\n  }\n\n  return $([this[index]]);\n}\n\nfunction append(...els) {\n  let newChild;\n  const document = getDocument();\n\n  for (let k = 0; k < els.length; k += 1) {\n    newChild = els[k];\n\n    for (let i = 0; i < this.length; i += 1) {\n      if (typeof newChild === 'string') {\n        const tempDiv = document.createElement('div');\n        tempDiv.innerHTML = newChild;\n\n        while (tempDiv.firstChild) {\n          this[i].appendChild(tempDiv.firstChild);\n        }\n      } else if (newChild instanceof Dom7) {\n        for (let j = 0; j < newChild.length; j += 1) {\n          this[i].appendChild(newChild[j]);\n        }\n      } else {\n        this[i].appendChild(newChild);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction appendTo(parent) {\n  $(parent).append(this);\n  return this;\n}\n\nfunction prepend(newChild) {\n  const document = getDocument();\n  let i;\n  let j;\n\n  for (i = 0; i < this.length; i += 1) {\n    if (typeof newChild === 'string') {\n      const tempDiv = document.createElement('div');\n      tempDiv.innerHTML = newChild;\n\n      for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n        this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n      }\n    } else if (newChild instanceof Dom7) {\n      for (j = 0; j < newChild.length; j += 1) {\n        this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n      }\n    } else {\n      this[i].insertBefore(newChild, this[i].childNodes[0]);\n    }\n  }\n\n  return this;\n}\n\nfunction prependTo(parent) {\n  $(parent).prepend(this);\n  return this;\n}\n\nfunction insertBefore(selector) {\n  const before = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (before.length === 1) {\n      before[0].parentNode.insertBefore(this[i], before[0]);\n    } else if (before.length > 1) {\n      for (let j = 0; j < before.length; j += 1) {\n        before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n      }\n    }\n  }\n}\n\nfunction insertAfter(selector) {\n  const after = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (after.length === 1) {\n      after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n    } else if (after.length > 1) {\n      for (let j = 0; j < after.length; j += 1) {\n        after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n      }\n    }\n  }\n}\n\nfunction next(selector) {\n  if (this.length > 0) {\n    if (selector) {\n      if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n        return $([this[0].nextElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction nextAll(selector) {\n  const nextEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.nextElementSibling) {\n    const next = el.nextElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(next).is(selector)) nextEls.push(next);\n    } else nextEls.push(next);\n\n    el = next;\n  }\n\n  return $(nextEls);\n}\n\nfunction prev(selector) {\n  if (this.length > 0) {\n    const el = this[0];\n\n    if (selector) {\n      if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n        return $([el.previousElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (el.previousElementSibling) return $([el.previousElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction prevAll(selector) {\n  const prevEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.previousElementSibling) {\n    const prev = el.previousElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(prev).is(selector)) prevEls.push(prev);\n    } else prevEls.push(prev);\n\n    el = prev;\n  }\n\n  return $(prevEls);\n}\n\nfunction siblings(selector) {\n  return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode !== null) {\n      if (selector) {\n        if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n      } else {\n        parents.push(this[i].parentNode);\n      }\n    }\n  }\n\n  return $(parents);\n}\n\nfunction parents(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    let parent = this[i].parentNode; // eslint-disable-line\n\n    while (parent) {\n      if (selector) {\n        if ($(parent).is(selector)) parents.push(parent);\n      } else {\n        parents.push(parent);\n      }\n\n      parent = parent.parentNode;\n    }\n  }\n\n  return $(parents);\n}\n\nfunction closest(selector) {\n  let closest = this; // eslint-disable-line\n\n  if (typeof selector === 'undefined') {\n    return $([]);\n  }\n\n  if (!closest.is(selector)) {\n    closest = closest.parents(selector).eq(0);\n  }\n\n  return closest;\n}\n\nfunction find(selector) {\n  const foundElements = [];\n\n  for (let i = 0; i < this.length; i += 1) {\n    const found = this[i].querySelectorAll(selector);\n\n    for (let j = 0; j < found.length; j += 1) {\n      foundElements.push(found[j]);\n    }\n  }\n\n  return $(foundElements);\n}\n\nfunction children(selector) {\n  const children = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    const childNodes = this[i].children;\n\n    for (let j = 0; j < childNodes.length; j += 1) {\n      if (!selector || $(childNodes[j]).is(selector)) {\n        children.push(childNodes[j]);\n      }\n    }\n  }\n\n  return $(children);\n}\n\nfunction remove() {\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n  }\n\n  return this;\n}\n\nfunction detach() {\n  return this.remove();\n}\n\nfunction add(...els) {\n  const dom = this;\n  let i;\n  let j;\n\n  for (i = 0; i < els.length; i += 1) {\n    const toAdd = $(els[i]);\n\n    for (j = 0; j < toAdd.length; j += 1) {\n      dom.push(toAdd[j]);\n    }\n  }\n\n  return dom;\n}\n\nfunction empty() {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.nodeType === 1) {\n      for (let j = 0; j < el.childNodes.length; j += 1) {\n        if (el.childNodes[j].parentNode) {\n          el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n        }\n      }\n\n      el.textContent = '';\n    }\n  }\n\n  return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n  const window = getWindow();\n  let [left, top, duration, easing, callback] = args;\n\n  if (args.length === 4 && typeof easing === 'function') {\n    callback = easing;\n    [left, top, duration, callback, easing] = args;\n  }\n\n  if (typeof easing === 'undefined') easing = 'swing';\n  return this.each(function animate() {\n    const el = this;\n    let currentTop;\n    let currentLeft;\n    let maxTop;\n    let maxLeft;\n    let newTop;\n    let newLeft;\n    let scrollTop; // eslint-disable-line\n\n    let scrollLeft; // eslint-disable-line\n\n    let animateTop = top > 0 || top === 0;\n    let animateLeft = left > 0 || left === 0;\n\n    if (typeof easing === 'undefined') {\n      easing = 'swing';\n    }\n\n    if (animateTop) {\n      currentTop = el.scrollTop;\n\n      if (!duration) {\n        el.scrollTop = top;\n      }\n    }\n\n    if (animateLeft) {\n      currentLeft = el.scrollLeft;\n\n      if (!duration) {\n        el.scrollLeft = left;\n      }\n    }\n\n    if (!duration) return;\n\n    if (animateTop) {\n      maxTop = el.scrollHeight - el.offsetHeight;\n      newTop = Math.max(Math.min(top, maxTop), 0);\n    }\n\n    if (animateLeft) {\n      maxLeft = el.scrollWidth - el.offsetWidth;\n      newLeft = Math.max(Math.min(left, maxLeft), 0);\n    }\n\n    let startTime = null;\n    if (animateTop && newTop === currentTop) animateTop = false;\n    if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n    function render(time = new Date().getTime()) {\n      if (startTime === null) {\n        startTime = time;\n      }\n\n      const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n      const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n      let done;\n      if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n      if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n      if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (done) {\n        if (callback) callback();\n        return;\n      }\n\n      if (animateTop) el.scrollTop = scrollTop;\n      if (animateLeft) el.scrollLeft = scrollLeft;\n      window.requestAnimationFrame(render);\n    }\n\n    window.requestAnimationFrame(render);\n  });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n  let [top, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [top, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof top === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollTop;\n    return null;\n  }\n\n  return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n  let [left, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [left, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof left === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollLeft;\n    return null;\n  }\n\n  return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n  const window = getWindow();\n  const els = this;\n  const a = {\n    props: Object.assign({}, initialProps),\n    params: Object.assign({\n      duration: 300,\n      easing: 'swing' // or 'linear'\n\n      /* Callbacks\n      begin(elements)\n      complete(elements)\n      progress(elements, complete, remaining, start, tweenValue)\n      */\n\n    }, initialParams),\n    elements: els,\n    animating: false,\n    que: [],\n\n    easingProgress(easing, progress) {\n      if (easing === 'swing') {\n        return 0.5 - Math.cos(progress * Math.PI) / 2;\n      }\n\n      if (typeof easing === 'function') {\n        return easing(progress);\n      }\n\n      return progress;\n    },\n\n    stop() {\n      if (a.frameId) {\n        window.cancelAnimationFrame(a.frameId);\n      }\n\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      a.que = [];\n    },\n\n    done(complete) {\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      if (complete) complete(els);\n\n      if (a.que.length > 0) {\n        const que = a.que.shift();\n        a.animate(que[0], que[1]);\n      }\n    },\n\n    animate(props, params) {\n      if (a.animating) {\n        a.que.push([props, params]);\n        return a;\n      }\n\n      const elements = []; // Define & Cache Initials & Units\n\n      a.elements.each((el, index) => {\n        let initialFullValue;\n        let initialValue;\n        let unit;\n        let finalValue;\n        let finalFullValue;\n        if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n        elements[index] = {\n          container: el\n        };\n        Object.keys(props).forEach(prop => {\n          initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n          initialValue = parseFloat(initialFullValue);\n          unit = initialFullValue.replace(initialValue, '');\n          finalValue = parseFloat(props[prop]);\n          finalFullValue = props[prop] + unit;\n          elements[index][prop] = {\n            initialFullValue,\n            initialValue,\n            unit,\n            finalValue,\n            finalFullValue,\n            currentValue: initialValue\n          };\n        });\n      });\n      let startTime = null;\n      let time;\n      let elementsDone = 0;\n      let propsDone = 0;\n      let done;\n      let began = false;\n      a.animating = true;\n\n      function render() {\n        time = new Date().getTime();\n        let progress;\n        let easeProgress; // let el;\n\n        if (!began) {\n          began = true;\n          if (params.begin) params.begin(els);\n        }\n\n        if (startTime === null) {\n          startTime = time;\n        }\n\n        if (params.progress) {\n          // eslint-disable-next-line\n          params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n        }\n\n        elements.forEach(element => {\n          const el = element;\n          if (done || el.done) return;\n          Object.keys(props).forEach(prop => {\n            if (done || el.done) return;\n            progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n            easeProgress = a.easingProgress(params.easing, progress);\n            const {\n              initialValue,\n              finalValue,\n              unit\n            } = el[prop];\n            el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n            const currentValue = el[prop].currentValue;\n\n            if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n              el.container.style[prop] = finalValue + unit;\n              propsDone += 1;\n\n              if (propsDone === Object.keys(props).length) {\n                el.done = true;\n                elementsDone += 1;\n              }\n\n              if (elementsDone === elements.length) {\n                done = true;\n              }\n            }\n\n            if (done) {\n              a.done(params.complete);\n              return;\n            }\n\n            el.container.style[prop] = currentValue + unit;\n          });\n        });\n        if (done) return; // Then call\n\n        a.frameId = window.requestAnimationFrame(render);\n      }\n\n      a.frameId = window.requestAnimationFrame(render);\n      return a;\n    }\n\n  };\n\n  if (a.elements.length === 0) {\n    return els;\n  }\n\n  let animateInstance;\n\n  for (let i = 0; i < a.elements.length; i += 1) {\n    if (a.elements[i].dom7AnimateInstance) {\n      animateInstance = a.elements[i].dom7AnimateInstance;\n    } else a.elements[i].dom7AnimateInstance = a;\n  }\n\n  if (!animateInstance) {\n    animateInstance = a;\n  }\n\n  if (initialProps === 'stop') {\n    animateInstance.stop();\n  } else {\n    animateInstance.animate(a.props, a.params);\n  }\n\n  return els;\n}\n\nfunction stop() {\n  const els = this;\n\n  for (let i = 0; i < els.length; i += 1) {\n    if (els[i].dom7AnimateInstance) {\n      els[i].dom7AnimateInstance.stop();\n    }\n  }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n  function eventHandler(...args) {\n    if (typeof args[0] === 'undefined') {\n      for (let i = 0; i < this.length; i += 1) {\n        if (noTrigger.indexOf(name) < 0) {\n          if (name in this[i]) this[i][name]();else {\n            $(this[i]).trigger(name);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    return this.on(name, ...args);\n  }\n\n  return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import { $, addClass, removeClass, hasClass, toggleClass, attr, removeAttr, transform, transition, on, off, trigger, transitionEnd, outerWidth, outerHeight, styles, offset, css, each, html, text, is, index, eq, append, prepend, next, nextAll, prev, prevAll, parent, parents, closest, find, children, filter, remove } from 'dom7';\nconst Methods = {\n  addClass,\n  removeClass,\n  hasClass,\n  toggleClass,\n  attr,\n  removeAttr,\n  transform,\n  transition,\n  on,\n  off,\n  trigger,\n  transitionEnd,\n  outerWidth,\n  outerHeight,\n  styles,\n  offset,\n  css,\n  each,\n  html,\n  text,\n  is,\n  index,\n  eq,\n  append,\n  prepend,\n  next,\n  nextAll,\n  prev,\n  prevAll,\n  parent,\n  parents,\n  closest,\n  find,\n  children,\n  filter,\n  remove\n};\nObject.keys(Methods).forEach(methodName => {\n  Object.defineProperty($.fn, methodName, {\n    value: Methods[methodName],\n    writable: true\n  });\n});\nexport default $;","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n  const object = obj;\n  Object.keys(object).forEach(key => {\n    try {\n      object[key] = null;\n    } catch (e) {// no getter for object\n    }\n\n    try {\n      delete object[key];\n    } catch (e) {// something got wrong\n    }\n  });\n}\n\nfunction nextTick(callback, delay) {\n  if (delay === void 0) {\n    delay = 0;\n  }\n\n  return setTimeout(callback, delay);\n}\n\nfunction now() {\n  return Date.now();\n}\n\nfunction getComputedStyle(el) {\n  const window = getWindow();\n  let style;\n\n  if (window.getComputedStyle) {\n    style = window.getComputedStyle(el, null);\n  }\n\n  if (!style && el.currentStyle) {\n    style = el.currentStyle;\n  }\n\n  if (!style) {\n    style = el.style;\n  }\n\n  return style;\n}\n\nfunction getTranslate(el, axis) {\n  if (axis === void 0) {\n    axis = 'x';\n  }\n\n  const window = getWindow();\n  let matrix;\n  let curTransform;\n  let transformMatrix;\n  const curStyle = getComputedStyle(el, null);\n\n  if (window.WebKitCSSMatrix) {\n    curTransform = curStyle.transform || curStyle.webkitTransform;\n\n    if (curTransform.split(',').length > 6) {\n      curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');\n    } // Some old versions of Webkit choke when 'none' is passed; pass\n    // empty string instead in this case\n\n\n    transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n  } else {\n    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n    matrix = transformMatrix.toString().split(',');\n  }\n\n  if (axis === 'x') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers\n    else curTransform = parseFloat(matrix[4]);\n  }\n\n  if (axis === 'y') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers\n    else curTransform = parseFloat(matrix[5]);\n  }\n\n  return curTransform || 0;\n}\n\nfunction isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\n\nfunction isNode(node) {\n  // eslint-disable-next-line\n  if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n    return node instanceof HTMLElement;\n  }\n\n  return node && (node.nodeType === 1 || node.nodeType === 11);\n}\n\nfunction extend() {\n  const to = Object(arguments.length <= 0 ? undefined : arguments[0]);\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n\n  for (let i = 1; i < arguments.length; i += 1) {\n    const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];\n\n    if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n      const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);\n\n      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n        const nextKey = keysArray[nextIndex];\n        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n\n        if (desc !== undefined && desc.enumerable) {\n          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            to[nextKey] = {};\n\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else {\n            to[nextKey] = nextSource[nextKey];\n          }\n        }\n      }\n    }\n  }\n\n  return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n  el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll(_ref) {\n  let {\n    swiper,\n    targetPosition,\n    side\n  } = _ref;\n  const window = getWindow();\n  const startPosition = -swiper.translate;\n  let startTime = null;\n  let time;\n  const duration = swiper.params.speed;\n  swiper.wrapperEl.style.scrollSnapType = 'none';\n  window.cancelAnimationFrame(swiper.cssModeFrameID);\n  const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n  const isOutOfBound = (current, target) => {\n    return dir === 'next' && current >= target || dir === 'prev' && current <= target;\n  };\n\n  const animate = () => {\n    time = new Date().getTime();\n\n    if (startTime === null) {\n      startTime = time;\n    }\n\n    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      currentPosition = targetPosition;\n    }\n\n    swiper.wrapperEl.scrollTo({\n      [side]: currentPosition\n    });\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.scrollSnapType = '';\n      setTimeout(() => {\n        swiper.wrapperEl.style.overflow = '';\n        swiper.wrapperEl.scrollTo({\n          [side]: currentPosition\n        });\n      });\n      window.cancelAnimationFrame(swiper.cssModeFrameID);\n      return;\n    }\n\n    swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n  };\n\n  animate();\n}\n\nexport { animateCSSModeScroll, deleteProps, nextTick, now, getTranslate, isObject, extend, getComputedStyle, setCSSProperty };","import { getWindow, getDocument } from 'ssr-window';\nlet support;\n\nfunction calcSupport() {\n  const window = getWindow();\n  const document = getDocument();\n  return {\n    smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n    touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch),\n    passiveListener: function checkPassiveListener() {\n      let supportsPassive = false;\n\n      try {\n        const opts = Object.defineProperty({}, 'passive', {\n          // eslint-disable-next-line\n          get() {\n            supportsPassive = true;\n          }\n\n        });\n        window.addEventListener('testPassiveListener', null, opts);\n      } catch (e) {// No support\n      }\n\n      return supportsPassive;\n    }(),\n    gestures: function checkGestures() {\n      return 'ongesturestart' in window;\n    }()\n  };\n}\n\nfunction getSupport() {\n  if (!support) {\n    support = calcSupport();\n  }\n\n  return support;\n}\n\nexport { getSupport };","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\nlet deviceCached;\n\nfunction calcDevice(_temp) {\n  let {\n    userAgent\n  } = _temp === void 0 ? {} : _temp;\n  const support = getSupport();\n  const window = getWindow();\n  const platform = window.navigator.platform;\n  const ua = userAgent || window.navigator.userAgent;\n  const device = {\n    ios: false,\n    android: false\n  };\n  const screenWidth = window.screen.width;\n  const screenHeight = window.screen.height;\n  const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n\n  let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n  const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n  const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n  const windows = platform === 'Win32';\n  let macos = platform === 'MacIntel'; // iPadOs 13 fix\n\n  const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];\n\n  if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {\n    ipad = ua.match(/(Version)\\/([\\d.]+)/);\n    if (!ipad) ipad = [0, 1, '13_0_0'];\n    macos = false;\n  } // Android\n\n\n  if (android && !windows) {\n    device.os = 'android';\n    device.android = true;\n  }\n\n  if (ipad || iphone || ipod) {\n    device.os = 'ios';\n    device.ios = true;\n  } // Export object\n\n\n  return device;\n}\n\nfunction getDevice(overrides) {\n  if (overrides === void 0) {\n    overrides = {};\n  }\n\n  if (!deviceCached) {\n    deviceCached = calcDevice(overrides);\n  }\n\n  return deviceCached;\n}\n\nexport { getDevice };","import { getWindow } from 'ssr-window';\nlet browser;\n\nfunction calcBrowser() {\n  const window = getWindow();\n\n  function isSafari() {\n    const ua = window.navigator.userAgent.toLowerCase();\n    return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n  }\n\n  return {\n    isSafari: isSafari(),\n    isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)\n  };\n}\n\nfunction getBrowser() {\n  if (!browser) {\n    browser = calcBrowser();\n  }\n\n  return browser;\n}\n\nexport { getBrowser };","/* eslint-disable no-underscore-dangle */\nexport default {\n  on(events, handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    events.split(' ').forEach(event => {\n      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n      self.eventsListeners[event][method](handler);\n    });\n    return self;\n  },\n\n  once(events, handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n\n    function onceHandler() {\n      self.off(events, onceHandler);\n\n      if (onceHandler.__emitterProxy) {\n        delete onceHandler.__emitterProxy;\n      }\n\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      handler.apply(self, args);\n    }\n\n    onceHandler.__emitterProxy = handler;\n    return self.on(events, onceHandler, priority);\n  },\n\n  onAny(handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n\n    if (self.eventsAnyListeners.indexOf(handler) < 0) {\n      self.eventsAnyListeners[method](handler);\n    }\n\n    return self;\n  },\n\n  offAny(handler) {\n    const self = this;\n    if (!self.eventsAnyListeners) return self;\n    const index = self.eventsAnyListeners.indexOf(handler);\n\n    if (index >= 0) {\n      self.eventsAnyListeners.splice(index, 1);\n    }\n\n    return self;\n  },\n\n  off(events, handler) {\n    const self = this;\n    if (!self.eventsListeners) return self;\n    events.split(' ').forEach(event => {\n      if (typeof handler === 'undefined') {\n        self.eventsListeners[event] = [];\n      } else if (self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach((eventHandler, index) => {\n          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  },\n\n  emit() {\n    const self = this;\n    if (!self.eventsListeners) return self;\n    let events;\n    let data;\n    let context;\n\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n      events = args[0];\n      data = args.slice(1, args.length);\n      context = self;\n    } else {\n      events = args[0].events;\n      data = args[0].data;\n      context = args[0].context || self;\n    }\n\n    data.unshift(context);\n    const eventsArray = Array.isArray(events) ? events : events.split(' ');\n    eventsArray.forEach(event => {\n      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n        self.eventsAnyListeners.forEach(eventHandler => {\n          eventHandler.apply(context, [event, ...data]);\n        });\n      }\n\n      if (self.eventsListeners && self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach(eventHandler => {\n          eventHandler.apply(context, data);\n        });\n      }\n    });\n    return self;\n  }\n\n};","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\nexport default {\n  updateSize,\n  updateSlides,\n  updateAutoHeight,\n  updateSlidesOffset,\n  updateSlidesProgress,\n  updateProgress,\n  updateSlidesClasses,\n  updateActiveIndex,\n  updateClickedSlide\n};","export default function updateSize() {\n  const swiper = this;\n  let width;\n  let height;\n  const $el = swiper.$el;\n\n  if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n    width = swiper.params.width;\n  } else {\n    width = $el[0].clientWidth;\n  }\n\n  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n    height = swiper.params.height;\n  } else {\n    height = $el[0].clientHeight;\n  }\n\n  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {\n    return;\n  } // Subtract paddings\n\n\n  width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10);\n  height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10);\n  if (Number.isNaN(width)) width = 0;\n  if (Number.isNaN(height)) height = 0;\n  Object.assign(swiper, {\n    width,\n    height,\n    size: swiper.isHorizontal() ? width : height\n  });\n}","import { setCSSProperty } from '../../shared/utils.js';\nexport default function updateSlides() {\n  const swiper = this;\n\n  function getDirectionLabel(property) {\n    if (swiper.isHorizontal()) {\n      return property;\n    } // prettier-ignore\n\n\n    return {\n      'width': 'height',\n      'margin-top': 'margin-left',\n      'margin-bottom ': 'margin-right',\n      'margin-left': 'margin-top',\n      'margin-right': 'margin-bottom',\n      'padding-left': 'padding-top',\n      'padding-right': 'padding-bottom',\n      'marginRight': 'marginBottom'\n    }[property];\n  }\n\n  function getDirectionPropertyValue(node, label) {\n    return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n  }\n\n  const params = swiper.params;\n  const {\n    $wrapperEl,\n    size: swiperSize,\n    rtlTranslate: rtl,\n    wrongRTL\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n  const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n  let snapGrid = [];\n  const slidesGrid = [];\n  const slidesSizesGrid = [];\n  let offsetBefore = params.slidesOffsetBefore;\n\n  if (typeof offsetBefore === 'function') {\n    offsetBefore = params.slidesOffsetBefore.call(swiper);\n  }\n\n  let offsetAfter = params.slidesOffsetAfter;\n\n  if (typeof offsetAfter === 'function') {\n    offsetAfter = params.slidesOffsetAfter.call(swiper);\n  }\n\n  const previousSnapGridLength = swiper.snapGrid.length;\n  const previousSlidesGridLength = swiper.slidesGrid.length;\n  let spaceBetween = params.spaceBetween;\n  let slidePosition = -offsetBefore;\n  let prevSlideSize = 0;\n  let index = 0;\n\n  if (typeof swiperSize === 'undefined') {\n    return;\n  }\n\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;\n  }\n\n  swiper.virtualSize = -spaceBetween; // reset margins\n\n  if (rtl) slides.css({\n    marginLeft: '',\n    marginBottom: '',\n    marginTop: ''\n  });else slides.css({\n    marginRight: '',\n    marginBottom: '',\n    marginTop: ''\n  }); // reset cssMode offsets\n\n  if (params.centeredSlides && params.cssMode) {\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n  }\n\n  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n\n  if (gridEnabled) {\n    swiper.grid.initSlides(slidesLength);\n  } // Calc slides\n\n\n  let slideSize;\n  const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {\n    return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n  }).length > 0;\n\n  for (let i = 0; i < slidesLength; i += 1) {\n    slideSize = 0;\n    const slide = slides.eq(i);\n\n    if (gridEnabled) {\n      swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n    }\n\n    if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n    if (params.slidesPerView === 'auto') {\n      if (shouldResetSlideSize) {\n        slides[i].style[getDirectionLabel('width')] = ``;\n      }\n\n      const slideStyles = getComputedStyle(slide[0]);\n      const currentTransform = slide[0].style.transform;\n      const currentWebKitTransform = slide[0].style.webkitTransform;\n\n      if (currentTransform) {\n        slide[0].style.transform = 'none';\n      }\n\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = 'none';\n      }\n\n      if (params.roundLengths) {\n        slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n      } else {\n        // eslint-disable-next-line\n        const width = getDirectionPropertyValue(slideStyles, 'width');\n        const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n        const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n        const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n        const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n        const boxSizing = slideStyles.getPropertyValue('box-sizing');\n\n        if (boxSizing && boxSizing === 'border-box') {\n          slideSize = width + marginLeft + marginRight;\n        } else {\n          const {\n            clientWidth,\n            offsetWidth\n          } = slide[0];\n          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);\n        }\n      }\n\n      if (currentTransform) {\n        slide[0].style.transform = currentTransform;\n      }\n\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = currentWebKitTransform;\n      }\n\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n    } else {\n      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n      if (slides[i]) {\n        slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    }\n\n    if (slides[i]) {\n      slides[i].swiperSlideSize = slideSize;\n    }\n\n    slidesSizesGrid.push(slideSize);\n\n    if (params.centeredSlides) {\n      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n      if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n    } else {\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n      slidePosition = slidePosition + slideSize + spaceBetween;\n    }\n\n    swiper.virtualSize += slideSize + spaceBetween;\n    prevSlideSize = slideSize;\n    index += 1;\n  }\n\n  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n    $wrapperEl.css({\n      width: `${swiper.virtualSize + params.spaceBetween}px`\n    });\n  }\n\n  if (params.setWrapperSize) {\n    $wrapperEl.css({\n      [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`\n    });\n  }\n\n  if (gridEnabled) {\n    swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n  } // Remove last grid elements depending on width\n\n\n  if (!params.centeredSlides) {\n    const newSlidesGrid = [];\n\n    for (let i = 0; i < snapGrid.length; i += 1) {\n      let slidesGridItem = snapGrid[i];\n      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n\n      if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n        newSlidesGrid.push(slidesGridItem);\n      }\n    }\n\n    snapGrid = newSlidesGrid;\n\n    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n      snapGrid.push(swiper.virtualSize - swiperSize);\n    }\n  }\n\n  if (snapGrid.length === 0) snapGrid = [0];\n\n  if (params.spaceBetween !== 0) {\n    const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n    slides.filter((_, slideIndex) => {\n      if (!params.cssMode) return true;\n\n      if (slideIndex === slides.length - 1) {\n        return false;\n      }\n\n      return true;\n    }).css({\n      [key]: `${spaceBetween}px`\n    });\n  }\n\n  if (params.centeredSlides && params.centeredSlidesBounds) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n    const maxSnap = allSlidesSize - swiperSize;\n    snapGrid = snapGrid.map(snap => {\n      if (snap < 0) return -offsetBefore;\n      if (snap > maxSnap) return maxSnap + offsetAfter;\n      return snap;\n    });\n  }\n\n  if (params.centerInsufficientSlides) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n\n    if (allSlidesSize < swiperSize) {\n      const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n      snapGrid.forEach((snap, snapIndex) => {\n        snapGrid[snapIndex] = snap - allSlidesOffset;\n      });\n      slidesGrid.forEach((snap, snapIndex) => {\n        slidesGrid[snapIndex] = snap + allSlidesOffset;\n      });\n    }\n  }\n\n  Object.assign(swiper, {\n    slides,\n    snapGrid,\n    slidesGrid,\n    slidesSizesGrid\n  });\n\n  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);\n    const addToSnapGrid = -swiper.snapGrid[0];\n    const addToSlidesGrid = -swiper.slidesGrid[0];\n    swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);\n    swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);\n  }\n\n  if (slidesLength !== previousSlidesLength) {\n    swiper.emit('slidesLengthChange');\n  }\n\n  if (snapGrid.length !== previousSnapGridLength) {\n    if (swiper.params.watchOverflow) swiper.checkOverflow();\n    swiper.emit('snapGridLengthChange');\n  }\n\n  if (slidesGrid.length !== previousSlidesGridLength) {\n    swiper.emit('slidesGridLengthChange');\n  }\n\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n\n  if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {\n    const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;\n    const hasClassBackfaceClassAdded = swiper.$el.hasClass(backFaceHiddenClass);\n\n    if (slidesLength <= params.maxBackfaceHiddenSlides) {\n      if (!hasClassBackfaceClassAdded) swiper.$el.addClass(backFaceHiddenClass);\n    } else if (hasClassBackfaceClassAdded) {\n      swiper.$el.removeClass(backFaceHiddenClass);\n    }\n  }\n}","export default function updateAutoHeight(speed) {\n  const swiper = this;\n  const activeSlides = [];\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  let newHeight = 0;\n  let i;\n\n  if (typeof speed === 'number') {\n    swiper.setTransition(speed);\n  } else if (speed === true) {\n    swiper.setTransition(swiper.params.speed);\n  }\n\n  const getSlideByIndex = index => {\n    if (isVirtual) {\n      return swiper.slides.filter(el => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index)[0];\n    }\n\n    return swiper.slides.eq(index)[0];\n  }; // Find slides currently in view\n\n\n  if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n    if (swiper.params.centeredSlides) {\n      swiper.visibleSlides.each(slide => {\n        activeSlides.push(slide);\n      });\n    } else {\n      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n        const index = swiper.activeIndex + i;\n        if (index > swiper.slides.length && !isVirtual) break;\n        activeSlides.push(getSlideByIndex(index));\n      }\n    }\n  } else {\n    activeSlides.push(getSlideByIndex(swiper.activeIndex));\n  } // Find new height from highest slide in view\n\n\n  for (i = 0; i < activeSlides.length; i += 1) {\n    if (typeof activeSlides[i] !== 'undefined') {\n      const height = activeSlides[i].offsetHeight;\n      newHeight = height > newHeight ? height : newHeight;\n    }\n  } // Update Height\n\n\n  if (newHeight || newHeight === 0) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}","export default function updateSlidesOffset() {\n  const swiper = this;\n  const slides = swiper.slides;\n\n  for (let i = 0; i < slides.length; i += 1) {\n    slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;\n  }\n}","import $ from '../../shared/dom.js';\nexport default function updateSlidesProgress(translate) {\n  if (translate === void 0) {\n    translate = this && this.translate || 0;\n  }\n\n  const swiper = this;\n  const params = swiper.params;\n  const {\n    slides,\n    rtlTranslate: rtl,\n    snapGrid\n  } = swiper;\n  if (slides.length === 0) return;\n  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n  let offsetCenter = -translate;\n  if (rtl) offsetCenter = translate; // Visible Slides\n\n  slides.removeClass(params.slideVisibleClass);\n  swiper.visibleSlidesIndexes = [];\n  swiper.visibleSlides = [];\n\n  for (let i = 0; i < slides.length; i += 1) {\n    const slide = slides[i];\n    let slideOffset = slide.swiperSlideOffset;\n\n    if (params.cssMode && params.centeredSlides) {\n      slideOffset -= slides[0].swiperSlideOffset;\n    }\n\n    const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween);\n    const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween);\n    const slideBefore = -(offsetCenter - slideOffset);\n    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n    const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;\n\n    if (isVisible) {\n      swiper.visibleSlides.push(slide);\n      swiper.visibleSlidesIndexes.push(i);\n      slides.eq(i).addClass(params.slideVisibleClass);\n    }\n\n    slide.progress = rtl ? -slideProgress : slideProgress;\n    slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n  }\n\n  swiper.visibleSlides = $(swiper.visibleSlides);\n}","export default function updateProgress(translate) {\n  const swiper = this;\n\n  if (typeof translate === 'undefined') {\n    const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line\n\n    translate = swiper && swiper.translate && swiper.translate * multiplier || 0;\n  }\n\n  const params = swiper.params;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  let {\n    progress,\n    isBeginning,\n    isEnd\n  } = swiper;\n  const wasBeginning = isBeginning;\n  const wasEnd = isEnd;\n\n  if (translatesDiff === 0) {\n    progress = 0;\n    isBeginning = true;\n    isEnd = true;\n  } else {\n    progress = (translate - swiper.minTranslate()) / translatesDiff;\n    isBeginning = progress <= 0;\n    isEnd = progress >= 1;\n  }\n\n  Object.assign(swiper, {\n    progress,\n    isBeginning,\n    isEnd\n  });\n  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);\n\n  if (isBeginning && !wasBeginning) {\n    swiper.emit('reachBeginning toEdge');\n  }\n\n  if (isEnd && !wasEnd) {\n    swiper.emit('reachEnd toEdge');\n  }\n\n  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {\n    swiper.emit('fromEdge');\n  }\n\n  swiper.emit('progress', progress);\n}","export default function updateSlidesClasses() {\n  const swiper = this;\n  const {\n    slides,\n    params,\n    $wrapperEl,\n    activeIndex,\n    realIndex\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`);\n  let activeSlide;\n\n  if (isVirtual) {\n    activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`);\n  } else {\n    activeSlide = slides.eq(activeIndex);\n  } // Active classes\n\n\n  activeSlide.addClass(params.slideActiveClass);\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (activeSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`).addClass(params.slideDuplicateActiveClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`).addClass(params.slideDuplicateActiveClass);\n    }\n  } // Next Slide\n\n\n  let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass);\n\n  if (params.loop && nextSlide.length === 0) {\n    nextSlide = slides.eq(0);\n    nextSlide.addClass(params.slideNextClass);\n  } // Prev Slide\n\n\n  let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass);\n\n  if (params.loop && prevSlide.length === 0) {\n    prevSlide = slides.eq(-1);\n    prevSlide.addClass(params.slidePrevClass);\n  }\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (nextSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicateNextClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicateNextClass);\n    }\n\n    if (prevSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicatePrevClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicatePrevClass);\n    }\n  }\n\n  swiper.emitSlidesClasses();\n}","export default function updateActiveIndex(newActiveIndex) {\n  const swiper = this;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  const {\n    slidesGrid,\n    snapGrid,\n    params,\n    activeIndex: previousIndex,\n    realIndex: previousRealIndex,\n    snapIndex: previousSnapIndex\n  } = swiper;\n  let activeIndex = newActiveIndex;\n  let snapIndex;\n\n  if (typeof activeIndex === 'undefined') {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {\n          activeIndex = i;\n        } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n          activeIndex = i + 1;\n        }\n      } else if (translate >= slidesGrid[i]) {\n        activeIndex = i;\n      }\n    } // Normalize slideIndex\n\n\n    if (params.normalizeSlideIndex) {\n      if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n    }\n  }\n\n  if (snapGrid.indexOf(translate) >= 0) {\n    snapIndex = snapGrid.indexOf(translate);\n  } else {\n    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n  }\n\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n  if (activeIndex === previousIndex) {\n    if (snapIndex !== previousSnapIndex) {\n      swiper.snapIndex = snapIndex;\n      swiper.emit('snapIndexChange');\n    }\n\n    return;\n  } // Get real index\n\n\n  const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);\n  Object.assign(swiper, {\n    snapIndex,\n    realIndex,\n    previousIndex,\n    activeIndex\n  });\n  swiper.emit('activeIndexChange');\n  swiper.emit('snapIndexChange');\n\n  if (previousRealIndex !== realIndex) {\n    swiper.emit('realIndexChange');\n  }\n\n  if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n    swiper.emit('slideChange');\n  }\n}","import $ from '../../shared/dom.js';\nexport default function updateClickedSlide(e) {\n  const swiper = this;\n  const params = swiper.params;\n  const slide = $(e).closest(`.${params.slideClass}`)[0];\n  let slideFound = false;\n  let slideIndex;\n\n  if (slide) {\n    for (let i = 0; i < swiper.slides.length; i += 1) {\n      if (swiper.slides[i] === slide) {\n        slideFound = true;\n        slideIndex = i;\n        break;\n      }\n    }\n  }\n\n  if (slide && slideFound) {\n    swiper.clickedSlide = slide;\n\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n    } else {\n      swiper.clickedIndex = slideIndex;\n    }\n  } else {\n    swiper.clickedSlide = undefined;\n    swiper.clickedIndex = undefined;\n    return;\n  }\n\n  if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n    swiper.slideToClickedSlide();\n  }\n}","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\nexport default {\n  getTranslate,\n  setTranslate,\n  minTranslate,\n  maxTranslate,\n  translateTo\n};","import { getTranslate } from '../../shared/utils.js';\nexport default function getSwiperTranslate(axis) {\n  if (axis === void 0) {\n    axis = this.isHorizontal() ? 'x' : 'y';\n  }\n\n  const swiper = this;\n  const {\n    params,\n    rtlTranslate: rtl,\n    translate,\n    $wrapperEl\n  } = swiper;\n\n  if (params.virtualTranslate) {\n    return rtl ? -translate : translate;\n  }\n\n  if (params.cssMode) {\n    return translate;\n  }\n\n  let currentTranslate = getTranslate($wrapperEl[0], axis);\n  if (rtl) currentTranslate = -currentTranslate;\n  return currentTranslate || 0;\n}","export default function setTranslate(translate, byController) {\n  const swiper = this;\n  const {\n    rtlTranslate: rtl,\n    params,\n    $wrapperEl,\n    wrapperEl,\n    progress\n  } = swiper;\n  let x = 0;\n  let y = 0;\n  const z = 0;\n\n  if (swiper.isHorizontal()) {\n    x = rtl ? -translate : translate;\n  } else {\n    y = translate;\n  }\n\n  if (params.roundLengths) {\n    x = Math.floor(x);\n    y = Math.floor(y);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n  } else if (!params.virtualTranslate) {\n    $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n  }\n\n  swiper.previousTranslate = swiper.translate;\n  swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress\n\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n  }\n\n  if (newProgress !== progress) {\n    swiper.updateProgress(translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, byController);\n}","export default function minTranslate() {\n  return -this.snapGrid[0];\n}","export default function maxTranslate() {\n  return -this.snapGrid[this.snapGrid.length - 1];\n}","import { animateCSSModeScroll } from '../../shared/utils.js';\nexport default function translateTo(translate, speed, runCallbacks, translateBounds, internal) {\n  if (translate === void 0) {\n    translate = 0;\n  }\n\n  if (speed === void 0) {\n    speed = this.params.speed;\n  }\n\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  if (translateBounds === void 0) {\n    translateBounds = true;\n  }\n\n  const swiper = this;\n  const {\n    params,\n    wrapperEl\n  } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n\n  const minTranslate = swiper.minTranslate();\n  const maxTranslate = swiper.maxTranslate();\n  let newTranslate;\n  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress\n\n  swiper.updateProgress(newTranslate);\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n\n    if (speed === 0) {\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: -newTranslate,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: -newTranslate,\n        behavior: 'smooth'\n      });\n    }\n\n    return true;\n  }\n\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(newTranslate);\n\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionEnd');\n    }\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(newTranslate);\n\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionStart');\n    }\n\n    if (!swiper.animating) {\n      swiper.animating = true;\n\n      if (!swiper.onTranslateToWrapperTransitionEnd) {\n        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.onTranslateToWrapperTransitionEnd = null;\n          delete swiper.onTranslateToWrapperTransitionEnd;\n\n          if (runCallbacks) {\n            swiper.emit('transitionEnd');\n          }\n        };\n      }\n\n      swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n      swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);\n    }\n  }\n\n  return true;\n}","export default function transitionEmit(_ref) {\n  let {\n    swiper,\n    runCallbacks,\n    direction,\n    step\n  } = _ref;\n  const {\n    activeIndex,\n    previousIndex\n  } = swiper;\n  let dir = direction;\n\n  if (!dir) {\n    if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';\n  }\n\n  swiper.emit(`transition${step}`);\n\n  if (runCallbacks && activeIndex !== previousIndex) {\n    if (dir === 'reset') {\n      swiper.emit(`slideResetTransition${step}`);\n      return;\n    }\n\n    swiper.emit(`slideChangeTransition${step}`);\n\n    if (dir === 'next') {\n      swiper.emit(`slideNextTransition${step}`);\n    } else {\n      swiper.emit(`slidePrevTransition${step}`);\n    }\n  }\n}","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\nexport default {\n  slideTo,\n  slideToLoop,\n  slideNext,\n  slidePrev,\n  slideReset,\n  slideToClosest,\n  slideToClickedSlide\n};","import { animateCSSModeScroll } from '../../shared/utils.js';\nexport default function slideTo(index, speed, runCallbacks, internal, initial) {\n  if (index === void 0) {\n    index = 0;\n  }\n\n  if (speed === void 0) {\n    speed = this.params.speed;\n  }\n\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  if (typeof index !== 'number' && typeof index !== 'string') {\n    throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`);\n  }\n\n  if (typeof index === 'string') {\n    /**\n     * The `index` argument converted from `string` to `number`.\n     * @type {number}\n     */\n    const indexAsNumber = parseInt(index, 10);\n    /**\n     * Determines whether the `index` argument is a valid `number`\n     * after being converted from the `string` type.\n     * @type {boolean}\n     */\n\n    const isValidNumber = isFinite(indexAsNumber);\n\n    if (!isValidNumber) {\n      throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`);\n    } // Knowing that the converted `index` is a valid number,\n    // we can update the original argument's value.\n\n\n    index = indexAsNumber;\n  }\n\n  const swiper = this;\n  let slideIndex = index;\n  if (slideIndex < 0) slideIndex = 0;\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    previousIndex,\n    activeIndex,\n    rtlTranslate: rtl,\n    wrapperEl,\n    enabled\n  } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {\n    return false;\n  }\n\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n  if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n    swiper.emit('beforeSlideChangeStart');\n  }\n\n  const translate = -snapGrid[snapIndex]; // Update progress\n\n  swiper.updateProgress(translate); // Normalize slideIndex\n\n  if (params.normalizeSlideIndex) {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      const normalizedTranslate = -Math.floor(translate * 100);\n      const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {\n          slideIndex = i;\n        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {\n          slideIndex = i + 1;\n        }\n      } else if (normalizedTranslate >= normalizedGrid) {\n        slideIndex = i;\n      }\n    }\n  } // Directions locks\n\n\n  if (swiper.initialized && slideIndex !== activeIndex) {\n    if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {\n      return false;\n    }\n\n    if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n      if ((activeIndex || 0) !== slideIndex) return false;\n    }\n  }\n\n  let direction;\n  if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index\n\n  if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {\n    swiper.updateActiveIndex(slideIndex); // Update Height\n\n    if (params.autoHeight) {\n      swiper.updateAutoHeight();\n    }\n\n    swiper.updateSlidesClasses();\n\n    if (params.effect !== 'slide') {\n      swiper.setTranslate(translate);\n    }\n\n    if (direction !== 'reset') {\n      swiper.transitionStart(runCallbacks, direction);\n      swiper.transitionEnd(runCallbacks, direction);\n    }\n\n    return false;\n  }\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    const t = rtl ? translate : -translate;\n\n    if (speed === 0) {\n      const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n      if (isVirtual) {\n        swiper.wrapperEl.style.scrollSnapType = 'none';\n        swiper._immediateVirtual = true;\n      }\n\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n\n      if (isVirtual) {\n        requestAnimationFrame(() => {\n          swiper.wrapperEl.style.scrollSnapType = '';\n          swiper._swiperImmediateVirtual = false;\n        });\n      }\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: t,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: t,\n        behavior: 'smooth'\n      });\n    }\n\n    return true;\n  }\n\n  swiper.setTransition(speed);\n  swiper.setTranslate(translate);\n  swiper.updateActiveIndex(slideIndex);\n  swiper.updateSlidesClasses();\n  swiper.emit('beforeTransitionStart', speed, internal);\n  swiper.transitionStart(runCallbacks, direction);\n\n  if (speed === 0) {\n    swiper.transitionEnd(runCallbacks, direction);\n  } else if (!swiper.animating) {\n    swiper.animating = true;\n\n    if (!swiper.onSlideToWrapperTransitionEnd) {\n      swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n        if (!swiper || swiper.destroyed) return;\n        if (e.target !== this) return;\n        swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n        swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n        swiper.onSlideToWrapperTransitionEnd = null;\n        delete swiper.onSlideToWrapperTransitionEnd;\n        swiper.transitionEnd(runCallbacks, direction);\n      };\n    }\n\n    swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n    swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n  }\n\n  return true;\n}","export default function slideToLoop(index, speed, runCallbacks, internal) {\n  if (index === void 0) {\n    index = 0;\n  }\n\n  if (speed === void 0) {\n    speed = this.params.speed;\n  }\n\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  const swiper = this;\n  let newIndex = index;\n\n  if (swiper.params.loop) {\n    newIndex += swiper.loopedSlides;\n  }\n\n  return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed, runCallbacks, internal) {\n  if (speed === void 0) {\n    speed = this.params.speed;\n  }\n\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  const swiper = this;\n  const {\n    animating,\n    enabled,\n    params\n  } = swiper;\n  if (!enabled) return swiper;\n  let perGroup = params.slidesPerGroup;\n\n  if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n    perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n  }\n\n  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix(); // eslint-disable-next-line\n\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n\n  if (params.rewind && swiper.isEnd) {\n    return swiper.slideTo(0, speed, runCallbacks, internal);\n  }\n\n  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed, runCallbacks, internal) {\n  if (speed === void 0) {\n    speed = this.params.speed;\n  }\n\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  const swiper = this;\n  const {\n    params,\n    animating,\n    snapGrid,\n    slidesGrid,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return swiper;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix(); // eslint-disable-next-line\n\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n\n  const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n  function normalize(val) {\n    if (val < 0) return -Math.floor(Math.abs(val));\n    return Math.floor(val);\n  }\n\n  const normalizedTranslate = normalize(translate);\n  const normalizedSnapGrid = snapGrid.map(val => normalize(val));\n  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n\n  if (typeof prevSnap === 'undefined' && params.cssMode) {\n    let prevSnapIndex;\n    snapGrid.forEach((snap, snapIndex) => {\n      if (normalizedTranslate >= snap) {\n        // prevSnap = snap;\n        prevSnapIndex = snapIndex;\n      }\n    });\n\n    if (typeof prevSnapIndex !== 'undefined') {\n      prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n    }\n  }\n\n  let prevIndex = 0;\n\n  if (typeof prevSnap !== 'undefined') {\n    prevIndex = slidesGrid.indexOf(prevSnap);\n    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n\n    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n      prevIndex = Math.max(prevIndex, 0);\n    }\n  }\n\n  if (params.rewind && swiper.isBeginning) {\n    const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n    return swiper.slideTo(lastIndex, speed, runCallbacks, internal);\n  }\n\n  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed, runCallbacks, internal) {\n  if (speed === void 0) {\n    speed = this.params.speed;\n  }\n\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  const swiper = this;\n  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(speed, runCallbacks, internal, threshold) {\n  if (speed === void 0) {\n    speed = this.params.speed;\n  }\n\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  if (threshold === void 0) {\n    threshold = 0.5;\n  }\n\n  const swiper = this;\n  let index = swiper.activeIndex;\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n  if (translate >= swiper.snapGrid[snapIndex]) {\n    // The current translate is on or after the current snap index, so the choice\n    // is between the current index and the one after it.\n    const currentSnap = swiper.snapGrid[snapIndex];\n    const nextSnap = swiper.snapGrid[snapIndex + 1];\n\n    if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n      index += swiper.params.slidesPerGroup;\n    }\n  } else {\n    // The current translate is before the current snap index, so the choice\n    // is between the current index and the one before it.\n    const prevSnap = swiper.snapGrid[snapIndex - 1];\n    const currentSnap = swiper.snapGrid[snapIndex];\n\n    if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n      index -= swiper.params.slidesPerGroup;\n    }\n  }\n\n  index = Math.max(index, 0);\n  index = Math.min(index, swiper.slidesGrid.length - 1);\n  return swiper.slideTo(index, speed, runCallbacks, internal);\n}","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nexport default function slideToClickedSlide() {\n  const swiper = this;\n  const {\n    params,\n    $wrapperEl\n  } = swiper;\n  const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n  let slideToIndex = swiper.clickedIndex;\n  let realIndex;\n\n  if (params.loop) {\n    if (swiper.animating) return;\n    realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n\n    if (params.centeredSlides) {\n      if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {\n        swiper.loopFix();\n        slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`).eq(0).index();\n        nextTick(() => {\n          swiper.slideTo(slideToIndex);\n        });\n      } else {\n        swiper.slideTo(slideToIndex);\n      }\n    } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n      swiper.loopFix();\n      slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`).eq(0).index();\n      nextTick(() => {\n        swiper.slideTo(slideToIndex);\n      });\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  } else {\n    swiper.slideTo(slideToIndex);\n  }\n}","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\nexport default {\n  loopCreate,\n  loopFix,\n  loopDestroy\n};","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nexport default function loopCreate() {\n  const swiper = this;\n  const document = getDocument();\n  const {\n    params,\n    $wrapperEl\n  } = swiper; // Remove duplicated slides\n\n  const $selector = $wrapperEl.children().length > 0 ? $($wrapperEl.children()[0].parentNode) : $wrapperEl;\n  $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n  let slides = $selector.children(`.${params.slideClass}`);\n\n  if (params.loopFillGroupWithBlank) {\n    const blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup;\n\n    if (blankSlidesNum !== params.slidesPerGroup) {\n      for (let i = 0; i < blankSlidesNum; i += 1) {\n        const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`);\n        $selector.append(blankNode);\n      }\n\n      slides = $selector.children(`.${params.slideClass}`);\n    }\n  }\n\n  if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n  swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n  swiper.loopedSlides += params.loopAdditionalSlides;\n\n  if (swiper.loopedSlides > slides.length) {\n    swiper.loopedSlides = slides.length;\n  }\n\n  const prependSlides = [];\n  const appendSlides = [];\n  slides.each((el, index) => {\n    const slide = $(el);\n\n    if (index < swiper.loopedSlides) {\n      appendSlides.push(el);\n    }\n\n    if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n      prependSlides.push(el);\n    }\n\n    slide.attr('data-swiper-slide-index', index);\n  });\n\n  for (let i = 0; i < appendSlides.length; i += 1) {\n    $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n\n  for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n    $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n}","export default function loopFix() {\n  const swiper = this;\n  swiper.emit('beforeLoopFix');\n  const {\n    activeIndex,\n    slides,\n    loopedSlides,\n    allowSlidePrev,\n    allowSlideNext,\n    snapGrid,\n    rtlTranslate: rtl\n  } = swiper;\n  let newIndex;\n  swiper.allowSlidePrev = true;\n  swiper.allowSlideNext = true;\n  const snapTranslate = -snapGrid[activeIndex];\n  const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding\n\n  if (activeIndex < loopedSlides) {\n    newIndex = slides.length - loopedSlides * 3 + activeIndex;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  } else if (activeIndex >= slides.length - loopedSlides) {\n    // Fix For Positive Oversliding\n    newIndex = -slides.length + activeIndex + loopedSlides;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  }\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n  swiper.emit('loopFix');\n}","export default function loopDestroy() {\n  const swiper = this;\n  const {\n    $wrapperEl,\n    params,\n    slides\n  } = swiper;\n  $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove();\n  slides.removeAttr('data-swiper-slide-index');\n}","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js'; // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\n\nfunction closestElement(selector, base) {\n  if (base === void 0) {\n    base = this;\n  }\n\n  function __closestFrom(el) {\n    if (!el || el === getDocument() || el === getWindow()) return null;\n    if (el.assignedSlot) el = el.assignedSlot;\n    const found = el.closest(selector);\n    return found || __closestFrom(el.getRootNode().host);\n  }\n\n  return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n  const swiper = this;\n  const document = getDocument();\n  const window = getWindow();\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return;\n  }\n\n  if (!swiper.animating && params.cssMode && params.loop) {\n    swiper.loopFix();\n  }\n\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  let $targetEl = $(e.target);\n\n  if (params.touchEventsTarget === 'wrapper') {\n    if (!$targetEl.closest(swiper.wrapperEl).length) return;\n  }\n\n  data.isTouchEvent = e.type === 'touchstart';\n  if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n  if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n  if (data.isTouched && data.isMoved) return; // change target el for shadow root component\n\n  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n\n  if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n    $targetEl = $(event.path[0]);\n  }\n\n  const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;\n  const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element\n\n  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, e.target) : $targetEl.closest(noSwipingSelector)[0])) {\n    swiper.allowClick = true;\n    return;\n  }\n\n  if (params.swipeHandler) {\n    if (!$targetEl.closest(params.swipeHandler)[0]) return;\n  }\n\n  touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n  touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n  const startX = touches.currentX;\n  const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n  const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n  const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n\n  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {\n    if (edgeSwipeDetection === 'prevent') {\n      event.preventDefault();\n    } else {\n      return;\n    }\n  }\n\n  Object.assign(data, {\n    isTouched: true,\n    isMoved: false,\n    allowTouchCallbacks: true,\n    isScrolling: undefined,\n    startMoving: undefined\n  });\n  touches.startX = startX;\n  touches.startY = startY;\n  data.touchStartTime = now();\n  swiper.allowClick = true;\n  swiper.updateSize();\n  swiper.swipeDirection = undefined;\n  if (params.threshold > 0) data.allowThresholdMove = false;\n\n  if (e.type !== 'touchstart') {\n    let preventDefault = true;\n\n    if ($targetEl.is(data.focusableElements)) {\n      preventDefault = false;\n\n      if ($targetEl[0].nodeName === 'SELECT') {\n        data.isTouched = false;\n      }\n    }\n\n    if (document.activeElement && $(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) {\n      document.activeElement.blur();\n    }\n\n    const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n\n    if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) {\n      e.preventDefault();\n    }\n  }\n\n  if (swiper.params.freeMode && swiper.params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {\n    swiper.freeMode.onTouchStart();\n  }\n\n  swiper.emit('touchStart', e);\n}","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\nexport default function onTouchMove(event) {\n  const document = getDocument();\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (!data.isTouched) {\n    if (data.startMoving && data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n\n    return;\n  }\n\n  if (data.isTouchEvent && e.type !== 'touchmove') return;\n  const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n  const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n  const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n\n  if (e.preventedByNestedSwiper) {\n    touches.startX = pageX;\n    touches.startY = pageY;\n    return;\n  }\n\n  if (!swiper.allowTouchMove) {\n    if (!$(e.target).is(data.focusableElements)) {\n      swiper.allowClick = false;\n    }\n\n    if (data.isTouched) {\n      Object.assign(touches, {\n        startX: pageX,\n        startY: pageY,\n        currentX: pageX,\n        currentY: pageY\n      });\n      data.touchStartTime = now();\n    }\n\n    return;\n  }\n\n  if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n    if (swiper.isVertical()) {\n      // Vertical\n      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {\n        data.isTouched = false;\n        data.isMoved = false;\n        return;\n      }\n    } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {\n      return;\n    }\n  }\n\n  if (data.isTouchEvent && document.activeElement) {\n    if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n      data.isMoved = true;\n      swiper.allowClick = false;\n      return;\n    }\n  }\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchMove', e);\n  }\n\n  if (e.targetTouches && e.targetTouches.length > 1) return;\n  touches.currentX = pageX;\n  touches.currentY = pageY;\n  const diffX = touches.currentX - touches.startX;\n  const diffY = touches.currentY - touches.startY;\n  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;\n\n  if (typeof data.isScrolling === 'undefined') {\n    let touchAngle;\n\n    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {\n      data.isScrolling = false;\n    } else {\n      // eslint-disable-next-line\n      if (diffX * diffX + diffY * diffY >= 25) {\n        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;\n        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;\n      }\n    }\n  }\n\n  if (data.isScrolling) {\n    swiper.emit('touchMoveOpposite', e);\n  }\n\n  if (typeof data.startMoving === 'undefined') {\n    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n      data.startMoving = true;\n    }\n  }\n\n  if (data.isScrolling) {\n    data.isTouched = false;\n    return;\n  }\n\n  if (!data.startMoving) {\n    return;\n  }\n\n  swiper.allowClick = false;\n\n  if (!params.cssMode && e.cancelable) {\n    e.preventDefault();\n  }\n\n  if (params.touchMoveStopPropagation && !params.nested) {\n    e.stopPropagation();\n  }\n\n  if (!data.isMoved) {\n    if (params.loop && !params.cssMode) {\n      swiper.loopFix();\n    }\n\n    data.startTranslate = swiper.getTranslate();\n    swiper.setTransition(0);\n\n    if (swiper.animating) {\n      swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n    }\n\n    data.allowMomentumBounce = false; // Grab Cursor\n\n    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n      swiper.setGrabCursor(true);\n    }\n\n    swiper.emit('sliderFirstMove', e);\n  }\n\n  swiper.emit('sliderMove', e);\n  data.isMoved = true;\n  let diff = swiper.isHorizontal() ? diffX : diffY;\n  touches.diff = diff;\n  diff *= params.touchRatio;\n  if (rtl) diff = -diff;\n  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n  data.currentTranslate = diff + data.startTranslate;\n  let disableParentSwiper = true;\n  let resistanceRatio = params.resistanceRatio;\n\n  if (params.touchReleaseOnEdges) {\n    resistanceRatio = 0;\n  }\n\n  if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n  } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n  }\n\n  if (disableParentSwiper) {\n    e.preventedByNestedSwiper = true;\n  } // Directions locks\n\n\n  if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n    data.currentTranslate = data.startTranslate;\n  } // Threshold\n\n\n  if (params.threshold > 0) {\n    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n      if (!data.allowThresholdMove) {\n        data.allowThresholdMove = true;\n        touches.startX = touches.currentX;\n        touches.startY = touches.currentY;\n        data.currentTranslate = data.startTranslate;\n        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n        return;\n      }\n    } else {\n      data.currentTranslate = data.startTranslate;\n      return;\n    }\n  }\n\n  if (!params.followFinger || params.cssMode) return; // Update active index in free mode\n\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n    swiper.freeMode.onTouchMove();\n  } // Update progress\n\n\n  swiper.updateProgress(data.currentTranslate); // Update translate\n\n  swiper.setTranslate(data.currentTranslate);\n}","import { now, nextTick } from '../../shared/utils.js';\nexport default function onTouchEnd(event) {\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    slidesGrid,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchEnd', e);\n  }\n\n  data.allowTouchCallbacks = false;\n\n  if (!data.isTouched) {\n    if (data.isMoved && params.grabCursor) {\n      swiper.setGrabCursor(false);\n    }\n\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  } // Return Grab Cursor\n\n\n  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n    swiper.setGrabCursor(false);\n  } // Time diff\n\n\n  const touchEndTime = now();\n  const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click\n\n  if (swiper.allowClick) {\n    const pathTree = e.path || e.composedPath && e.composedPath();\n    swiper.updateClickedSlide(pathTree && pathTree[0] || e.target);\n    swiper.emit('tap click', e);\n\n    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n      swiper.emit('doubleTap doubleClick', e);\n    }\n  }\n\n  data.lastClickTime = now();\n  nextTick(() => {\n    if (!swiper.destroyed) swiper.allowClick = true;\n  });\n\n  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n    data.isTouched = false;\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n\n  data.isTouched = false;\n  data.isMoved = false;\n  data.startMoving = false;\n  let currentPos;\n\n  if (params.followFinger) {\n    currentPos = rtl ? swiper.translate : -swiper.translate;\n  } else {\n    currentPos = -data.currentTranslate;\n  }\n\n  if (params.cssMode) {\n    return;\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled) {\n    swiper.freeMode.onTouchEnd({\n      currentPos\n    });\n    return;\n  } // Find current slide\n\n\n  let stopIndex = 0;\n  let groupSize = swiper.slidesSizesGrid[0];\n\n  for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {\n    const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n    if (typeof slidesGrid[i + increment] !== 'undefined') {\n      if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n        stopIndex = i;\n        groupSize = slidesGrid[i + increment] - slidesGrid[i];\n      }\n    } else if (currentPos >= slidesGrid[i]) {\n      stopIndex = i;\n      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n    }\n  }\n\n  let rewindFirstIndex = null;\n  let rewindLastIndex = null;\n\n  if (params.rewind) {\n    if (swiper.isBeginning) {\n      rewindLastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;\n    } else if (swiper.isEnd) {\n      rewindFirstIndex = 0;\n    }\n  } // Find current slide size\n\n\n  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n  if (timeDiff > params.longSwipesMs) {\n    // Long touches\n    if (!params.longSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    if (swiper.swipeDirection === 'next') {\n      if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);\n    }\n\n    if (swiper.swipeDirection === 'prev') {\n      if (ratio > 1 - params.longSwipesRatio) {\n        swiper.slideTo(stopIndex + increment);\n      } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {\n        swiper.slideTo(rewindLastIndex);\n      } else {\n        swiper.slideTo(stopIndex);\n      }\n    }\n  } else {\n    // Short swipes\n    if (!params.shortSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n\n    if (!isNavButtonTarget) {\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);\n      }\n\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);\n      }\n    } else if (e.target === swiper.navigation.nextEl) {\n      swiper.slideTo(stopIndex + increment);\n    } else {\n      swiper.slideTo(stopIndex);\n    }\n  }\n}","export default function onResize() {\n  const swiper = this;\n  const {\n    params,\n    el\n  } = swiper;\n  if (el && el.offsetWidth === 0) return; // Breakpoints\n\n  if (params.breakpoints) {\n    swiper.setBreakpoint();\n  } // Save locks\n\n\n  const {\n    allowSlideNext,\n    allowSlidePrev,\n    snapGrid\n  } = swiper; // Disable locks on resize\n\n  swiper.allowSlideNext = true;\n  swiper.allowSlidePrev = true;\n  swiper.updateSize();\n  swiper.updateSlides();\n  swiper.updateSlidesClasses();\n\n  if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) {\n    swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n  } else {\n    swiper.slideTo(swiper.activeIndex, 0, false, true);\n  }\n\n  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n    swiper.autoplay.run();\n  } // Return locks after resize\n\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n\n  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n    swiper.checkOverflow();\n  }\n}","export default function onClick(e) {\n  const swiper = this;\n  if (!swiper.enabled) return;\n\n  if (!swiper.allowClick) {\n    if (swiper.params.preventClicks) e.preventDefault();\n\n    if (swiper.params.preventClicksPropagation && swiper.animating) {\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n}","export default function onScroll() {\n  const swiper = this;\n  const {\n    wrapperEl,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  swiper.previousTranslate = swiper.translate;\n\n  if (swiper.isHorizontal()) {\n    swiper.translate = -wrapperEl.scrollLeft;\n  } else {\n    swiper.translate = -wrapperEl.scrollTop;\n  } // eslint-disable-next-line\n\n\n  if (swiper.translate === -0) swiper.translate = 0;\n  swiper.updateActiveIndex();\n  swiper.updateSlidesClasses();\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n  }\n\n  if (newProgress !== swiper.progress) {\n    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, false);\n}","import { getDocument } from 'ssr-window';\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\nlet dummyEventAttached = false;\n\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n  const document = getDocument();\n  const {\n    params,\n    touchEvents,\n    el,\n    wrapperEl,\n    device,\n    support\n  } = swiper;\n  const capture = !!params.nested;\n  const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n  const swiperMethod = method; // Touch Events\n\n  if (!support.touch) {\n    el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n    document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n    document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n  } else {\n    const passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n    el[domMethod](touchEvents.move, swiper.onTouchMove, support.passiveListener ? {\n      passive: false,\n      capture\n    } : capture);\n    el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n\n    if (touchEvents.cancel) {\n      el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n    }\n  } // Prevent Links Clicks\n\n\n  if (params.preventClicks || params.preventClicksPropagation) {\n    el[domMethod]('click', swiper.onClick, true);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[domMethod]('scroll', swiper.onScroll);\n  } // Resize handler\n\n\n  if (params.updateOnWindowResize) {\n    swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);\n  } else {\n    swiper[swiperMethod]('observerUpdate', onResize, true);\n  }\n};\n\nfunction attachEvents() {\n  const swiper = this;\n  const document = getDocument();\n  const {\n    params,\n    support\n  } = swiper;\n  swiper.onTouchStart = onTouchStart.bind(swiper);\n  swiper.onTouchMove = onTouchMove.bind(swiper);\n  swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n  if (params.cssMode) {\n    swiper.onScroll = onScroll.bind(swiper);\n  }\n\n  swiper.onClick = onClick.bind(swiper);\n\n  if (support.touch && !dummyEventAttached) {\n    document.addEventListener('touchstart', dummyEventListener);\n    dummyEventAttached = true;\n  }\n\n  events(swiper, 'on');\n}\n\nfunction detachEvents() {\n  const swiper = this;\n  events(swiper, 'off');\n}\n\nexport default {\n  attachEvents,\n  detachEvents\n};","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n  return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n  const swiper = this;\n  const {\n    activeIndex,\n    initialized,\n    loopedSlides = 0,\n    params,\n    $el\n  } = swiper;\n  const breakpoints = params.breakpoints;\n  if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters\n\n  const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n  const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n  const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n  const wasMultiRow = isGridEnabled(swiper, params);\n  const isMultiRow = isGridEnabled(swiper, breakpointParams);\n  const wasEnabled = params.enabled;\n\n  if (wasMultiRow && !isMultiRow) {\n    $el.removeClass(`${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`);\n    swiper.emitContainerClasses();\n  } else if (!wasMultiRow && isMultiRow) {\n    $el.addClass(`${params.containerModifierClass}grid`);\n\n    if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {\n      $el.addClass(`${params.containerModifierClass}grid-column`);\n    }\n\n    swiper.emitContainerClasses();\n  }\n\n  const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n  const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n  if (directionChanged && initialized) {\n    swiper.changeDirection();\n  }\n\n  extend(swiper.params, breakpointParams);\n  const isEnabled = swiper.params.enabled;\n  Object.assign(swiper, {\n    allowTouchMove: swiper.params.allowTouchMove,\n    allowSlideNext: swiper.params.allowSlideNext,\n    allowSlidePrev: swiper.params.allowSlidePrev\n  });\n\n  if (wasEnabled && !isEnabled) {\n    swiper.disable();\n  } else if (!wasEnabled && isEnabled) {\n    swiper.enable();\n  }\n\n  swiper.currentBreakpoint = breakpoint;\n  swiper.emit('_beforeBreakpoint', breakpointParams);\n\n  if (needsReLoop && initialized) {\n    swiper.loopDestroy();\n    swiper.loopCreate();\n    swiper.updateSlides();\n    swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n  }\n\n  swiper.emit('breakpoint', breakpointParams);\n}","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\nexport default {\n  setBreakpoint,\n  getBreakpoint\n};","import { getWindow } from 'ssr-window';\nexport default function getBreakpoint(breakpoints, base, containerEl) {\n  if (base === void 0) {\n    base = 'window';\n  }\n\n  if (!breakpoints || base === 'container' && !containerEl) return undefined;\n  let breakpoint = false;\n  const window = getWindow();\n  const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n  const points = Object.keys(breakpoints).map(point => {\n    if (typeof point === 'string' && point.indexOf('@') === 0) {\n      const minRatio = parseFloat(point.substr(1));\n      const value = currentHeight * minRatio;\n      return {\n        value,\n        point\n      };\n    }\n\n    return {\n      value: point,\n      point\n    };\n  });\n  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n\n  for (let i = 0; i < points.length; i += 1) {\n    const {\n      point,\n      value\n    } = points[i];\n\n    if (base === 'window') {\n      if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n        breakpoint = point;\n      }\n    } else if (value <= containerEl.clientWidth) {\n      breakpoint = point;\n    }\n  }\n\n  return breakpoint || 'max';\n}","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\nexport default {\n  addClasses,\n  removeClasses\n};","function prepareClasses(entries, prefix) {\n  const resultClasses = [];\n  entries.forEach(item => {\n    if (typeof item === 'object') {\n      Object.keys(item).forEach(classNames => {\n        if (item[classNames]) {\n          resultClasses.push(prefix + classNames);\n        }\n      });\n    } else if (typeof item === 'string') {\n      resultClasses.push(prefix + item);\n    }\n  });\n  return resultClasses;\n}\n\nexport default function addClasses() {\n  const swiper = this;\n  const {\n    classNames,\n    params,\n    rtl,\n    $el,\n    device,\n    support\n  } = swiper; // prettier-ignore\n\n  const suffixes = prepareClasses(['initialized', params.direction, {\n    'pointer-events': !support.touch\n  }, {\n    'free-mode': swiper.params.freeMode && params.freeMode.enabled\n  }, {\n    'autoheight': params.autoHeight\n  }, {\n    'rtl': rtl\n  }, {\n    'grid': params.grid && params.grid.rows > 1\n  }, {\n    'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'\n  }, {\n    'android': device.android\n  }, {\n    'ios': device.ios\n  }, {\n    'css-mode': params.cssMode\n  }, {\n    'centered': params.cssMode && params.centeredSlides\n  }], params.containerModifierClass);\n  classNames.push(...suffixes);\n  $el.addClass([...classNames].join(' '));\n  swiper.emitContainerClasses();\n}","export default function removeClasses() {\n  const swiper = this;\n  const {\n    $el,\n    classNames\n  } = swiper;\n  $el.removeClass(classNames.join(' '));\n  swiper.emitContainerClasses();\n}","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\nexport default {\n  loadImage,\n  preloadImages\n};","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n  const window = getWindow();\n  let image;\n\n  function onReady() {\n    if (callback) callback();\n  }\n\n  const isPicture = $(imageEl).parent('picture')[0];\n\n  if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n    if (src) {\n      image = new window.Image();\n      image.onload = onReady;\n      image.onerror = onReady;\n\n      if (sizes) {\n        image.sizes = sizes;\n      }\n\n      if (srcset) {\n        image.srcset = srcset;\n      }\n\n      if (src) {\n        image.src = src;\n      }\n    } else {\n      onReady();\n    }\n  } else {\n    // image already loaded...\n    onReady();\n  }\n}","export default function preloadImages() {\n  const swiper = this;\n  swiper.imagesToLoad = swiper.$el.find('img');\n\n  function onReady() {\n    if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n    if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n\n    if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n      if (swiper.params.updateOnImagesReady) swiper.update();\n      swiper.emit('imagesReady');\n    }\n  }\n\n  for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n    const imageEl = swiper.imagesToLoad[i];\n    swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady);\n  }\n}","export default {\n  init: true,\n  direction: 'horizontal',\n  touchEventsTarget: 'wrapper',\n  initialSlide: 0,\n  speed: 300,\n  cssMode: false,\n  updateOnWindowResize: true,\n  resizeObserver: true,\n  nested: false,\n  createElements: false,\n  enabled: true,\n  focusableElements: 'input, select, option, textarea, button, video, label',\n  // Overrides\n  width: null,\n  height: null,\n  //\n  preventInteractionOnTransition: false,\n  // ssr\n  userAgent: null,\n  url: null,\n  // To support iOS's swipe-to-go-back gesture (when being used in-app).\n  edgeSwipeDetection: false,\n  edgeSwipeThreshold: 20,\n  // Autoheight\n  autoHeight: false,\n  // Set wrapper width\n  setWrapperSize: false,\n  // Virtual Translate\n  virtualTranslate: false,\n  // Effects\n  effect: 'slide',\n  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n  // Breakpoints\n  breakpoints: undefined,\n  breakpointsBase: 'window',\n  // Slides grid\n  spaceBetween: 0,\n  slidesPerView: 1,\n  slidesPerGroup: 1,\n  slidesPerGroupSkip: 0,\n  slidesPerGroupAuto: false,\n  centeredSlides: false,\n  centeredSlidesBounds: false,\n  slidesOffsetBefore: 0,\n  // in px\n  slidesOffsetAfter: 0,\n  // in px\n  normalizeSlideIndex: true,\n  centerInsufficientSlides: false,\n  // Disable swiper and hide navigation when container not overflow\n  watchOverflow: true,\n  // Round length\n  roundLengths: false,\n  // Touches\n  touchRatio: 1,\n  touchAngle: 45,\n  simulateTouch: true,\n  shortSwipes: true,\n  longSwipes: true,\n  longSwipesRatio: 0.5,\n  longSwipesMs: 300,\n  followFinger: true,\n  allowTouchMove: true,\n  threshold: 0,\n  touchMoveStopPropagation: false,\n  touchStartPreventDefault: true,\n  touchStartForcePreventDefault: false,\n  touchReleaseOnEdges: false,\n  // Unique Navigation Elements\n  uniqueNavElements: true,\n  // Resistance\n  resistance: true,\n  resistanceRatio: 0.85,\n  // Progress\n  watchSlidesProgress: false,\n  // Cursor\n  grabCursor: false,\n  // Clicks\n  preventClicks: true,\n  preventClicksPropagation: true,\n  slideToClickedSlide: false,\n  // Images\n  preloadImages: true,\n  updateOnImagesReady: true,\n  // loop\n  loop: false,\n  loopAdditionalSlides: 0,\n  loopedSlides: null,\n  loopFillGroupWithBlank: false,\n  loopPreventsSlide: true,\n  // rewind\n  rewind: false,\n  // Swiping/no swiping\n  allowSlidePrev: true,\n  allowSlideNext: true,\n  swipeHandler: null,\n  // '.swipe-handler',\n  noSwiping: true,\n  noSwipingClass: 'swiper-no-swiping',\n  noSwipingSelector: null,\n  // Passive Listeners\n  passiveListeners: true,\n  maxBackfaceHiddenSlides: 10,\n  // NS\n  containerModifierClass: 'swiper-',\n  // NEW\n  slideClass: 'swiper-slide',\n  slideBlankClass: 'swiper-slide-invisible-blank',\n  slideActiveClass: 'swiper-slide-active',\n  slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n  slideVisibleClass: 'swiper-slide-visible',\n  slideDuplicateClass: 'swiper-slide-duplicate',\n  slideNextClass: 'swiper-slide-next',\n  slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n  slidePrevClass: 'swiper-slide-prev',\n  slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n  wrapperClass: 'swiper-wrapper',\n  // Callbacks\n  runCallbacksOnInit: true,\n  // Internals\n  _emitClasses: false\n};","import { extend } from '../shared/utils.js';\nexport default function moduleExtendParams(params, allModulesParams) {\n  return function extendParams(obj) {\n    if (obj === void 0) {\n      obj = {};\n    }\n\n    const moduleParamName = Object.keys(obj)[0];\n    const moduleParams = obj[moduleParamName];\n\n    if (typeof moduleParams !== 'object' || moduleParams === null) {\n      extend(allModulesParams, obj);\n      return;\n    }\n\n    if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        auto: true\n      };\n    }\n\n    if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n      extend(allModulesParams, obj);\n      return;\n    }\n\n    if (params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        enabled: true\n      };\n    }\n\n    if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n      params[moduleParamName].enabled = true;\n    }\n\n    if (!params[moduleParamName]) params[moduleParamName] = {\n      enabled: false\n    };\n    extend(allModulesParams, obj);\n  };\n}","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\nimport eventsEmitter from './events-emitter.js';\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\nconst prototypes = {\n  eventsEmitter,\n  update,\n  translate,\n  transition,\n  slide,\n  loop,\n  grabCursor,\n  events,\n  breakpoints,\n  checkOverflow,\n  classes,\n  images\n};\nconst extendedDefaults = {};\n\nclass Swiper {\n  constructor() {\n    let el;\n    let params;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {\n      params = args[0];\n    } else {\n      [el, params] = args;\n    }\n\n    if (!params) params = {};\n    params = extend({}, params);\n    if (el && !params.el) params.el = el;\n\n    if (params.el && $(params.el).length > 1) {\n      const swipers = [];\n      $(params.el).each(containerEl => {\n        const newParams = extend({}, params, {\n          el: containerEl\n        });\n        swipers.push(new Swiper(newParams));\n      });\n      return swipers;\n    } // Swiper Instance\n\n\n    const swiper = this;\n    swiper.__swiper__ = true;\n    swiper.support = getSupport();\n    swiper.device = getDevice({\n      userAgent: params.userAgent\n    });\n    swiper.browser = getBrowser();\n    swiper.eventsListeners = {};\n    swiper.eventsAnyListeners = [];\n    swiper.modules = [...swiper.__modules__];\n\n    if (params.modules && Array.isArray(params.modules)) {\n      swiper.modules.push(...params.modules);\n    }\n\n    const allModulesParams = {};\n    swiper.modules.forEach(mod => {\n      mod({\n        swiper,\n        extendParams: moduleExtendParams(params, allModulesParams),\n        on: swiper.on.bind(swiper),\n        once: swiper.once.bind(swiper),\n        off: swiper.off.bind(swiper),\n        emit: swiper.emit.bind(swiper)\n      });\n    }); // Extend defaults with modules params\n\n    const swiperParams = extend({}, defaults, allModulesParams); // Extend defaults with passed params\n\n    swiper.params = extend({}, swiperParams, extendedDefaults, params);\n    swiper.originalParams = extend({}, swiper.params);\n    swiper.passedParams = extend({}, params); // add event listeners\n\n    if (swiper.params && swiper.params.on) {\n      Object.keys(swiper.params.on).forEach(eventName => {\n        swiper.on(eventName, swiper.params.on[eventName]);\n      });\n    }\n\n    if (swiper.params && swiper.params.onAny) {\n      swiper.onAny(swiper.params.onAny);\n    } // Save Dom lib\n\n\n    swiper.$ = $; // Extend Swiper\n\n    Object.assign(swiper, {\n      enabled: swiper.params.enabled,\n      el,\n      // Classes\n      classNames: [],\n      // Slides\n      slides: $(),\n      slidesGrid: [],\n      snapGrid: [],\n      slidesSizesGrid: [],\n\n      // isDirection\n      isHorizontal() {\n        return swiper.params.direction === 'horizontal';\n      },\n\n      isVertical() {\n        return swiper.params.direction === 'vertical';\n      },\n\n      // Indexes\n      activeIndex: 0,\n      realIndex: 0,\n      //\n      isBeginning: true,\n      isEnd: false,\n      // Props\n      translate: 0,\n      previousTranslate: 0,\n      progress: 0,\n      velocity: 0,\n      animating: false,\n      // Locks\n      allowSlideNext: swiper.params.allowSlideNext,\n      allowSlidePrev: swiper.params.allowSlidePrev,\n      // Touch Events\n      touchEvents: function touchEvents() {\n        const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n        const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n        swiper.touchEventsTouch = {\n          start: touch[0],\n          move: touch[1],\n          end: touch[2],\n          cancel: touch[3]\n        };\n        swiper.touchEventsDesktop = {\n          start: desktop[0],\n          move: desktop[1],\n          end: desktop[2]\n        };\n        return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;\n      }(),\n      touchEventsData: {\n        isTouched: undefined,\n        isMoved: undefined,\n        allowTouchCallbacks: undefined,\n        touchStartTime: undefined,\n        isScrolling: undefined,\n        currentTranslate: undefined,\n        startTranslate: undefined,\n        allowThresholdMove: undefined,\n        // Form elements to match\n        focusableElements: swiper.params.focusableElements,\n        // Last click time\n        lastClickTime: now(),\n        clickTimeout: undefined,\n        // Velocities\n        velocities: [],\n        allowMomentumBounce: undefined,\n        isTouchEvent: undefined,\n        startMoving: undefined\n      },\n      // Clicks\n      allowClick: true,\n      // Touches\n      allowTouchMove: swiper.params.allowTouchMove,\n      touches: {\n        startX: 0,\n        startY: 0,\n        currentX: 0,\n        currentY: 0,\n        diff: 0\n      },\n      // Images\n      imagesToLoad: [],\n      imagesLoaded: 0\n    });\n    swiper.emit('_swiper'); // Init\n\n    if (swiper.params.init) {\n      swiper.init();\n    } // Return app instance\n\n\n    return swiper;\n  }\n\n  enable() {\n    const swiper = this;\n    if (swiper.enabled) return;\n    swiper.enabled = true;\n\n    if (swiper.params.grabCursor) {\n      swiper.setGrabCursor();\n    }\n\n    swiper.emit('enable');\n  }\n\n  disable() {\n    const swiper = this;\n    if (!swiper.enabled) return;\n    swiper.enabled = false;\n\n    if (swiper.params.grabCursor) {\n      swiper.unsetGrabCursor();\n    }\n\n    swiper.emit('disable');\n  }\n\n  setProgress(progress, speed) {\n    const swiper = this;\n    progress = Math.min(Math.max(progress, 0), 1);\n    const min = swiper.minTranslate();\n    const max = swiper.maxTranslate();\n    const current = (max - min) * progress + min;\n    swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  emitContainerClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const cls = swiper.el.className.split(' ').filter(className => {\n      return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;\n    });\n    swiper.emit('_containerClasses', cls.join(' '));\n  }\n\n  getSlideClasses(slideEl) {\n    const swiper = this;\n    return slideEl.className.split(' ').filter(className => {\n      return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;\n    }).join(' ');\n  }\n\n  emitSlidesClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const updates = [];\n    swiper.slides.each(slideEl => {\n      const classNames = swiper.getSlideClasses(slideEl);\n      updates.push({\n        slideEl,\n        classNames\n      });\n      swiper.emit('_slideClass', slideEl, classNames);\n    });\n    swiper.emit('_slideClasses', updates);\n  }\n\n  slidesPerViewDynamic(view, exact) {\n    if (view === void 0) {\n      view = 'current';\n    }\n\n    if (exact === void 0) {\n      exact = false;\n    }\n\n    const swiper = this;\n    const {\n      params,\n      slides,\n      slidesGrid,\n      slidesSizesGrid,\n      size: swiperSize,\n      activeIndex\n    } = swiper;\n    let spv = 1;\n\n    if (params.centeredSlides) {\n      let slideSize = slides[activeIndex].swiperSlideSize;\n      let breakLoop;\n\n      for (let i = activeIndex + 1; i < slides.length; i += 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n\n      for (let i = activeIndex - 1; i >= 0; i -= 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n    } else {\n      // eslint-disable-next-line\n      if (view === 'current') {\n        for (let i = activeIndex + 1; i < slides.length; i += 1) {\n          const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      } else {\n        // previous\n        for (let i = activeIndex - 1; i >= 0; i -= 1) {\n          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      }\n    }\n\n    return spv;\n  }\n\n  update() {\n    const swiper = this;\n    if (!swiper || swiper.destroyed) return;\n    const {\n      snapGrid,\n      params\n    } = swiper; // Breakpoints\n\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    swiper.updateSize();\n    swiper.updateSlides();\n    swiper.updateProgress();\n    swiper.updateSlidesClasses();\n\n    function setTranslate() {\n      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n      const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n\n    let translated;\n\n    if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n      setTranslate();\n\n      if (swiper.params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n        translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n      } else {\n        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n      }\n\n      if (!translated) {\n        setTranslate();\n      }\n    }\n\n    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n      swiper.checkOverflow();\n    }\n\n    swiper.emit('update');\n  }\n\n  changeDirection(newDirection, needUpdate) {\n    if (needUpdate === void 0) {\n      needUpdate = true;\n    }\n\n    const swiper = this;\n    const currentDirection = swiper.params.direction;\n\n    if (!newDirection) {\n      // eslint-disable-next-line\n      newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n    }\n\n    if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {\n      return swiper;\n    }\n\n    swiper.$el.removeClass(`${swiper.params.containerModifierClass}${currentDirection}`).addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n    swiper.emitContainerClasses();\n    swiper.params.direction = newDirection;\n    swiper.slides.each(slideEl => {\n      if (newDirection === 'vertical') {\n        slideEl.style.width = '';\n      } else {\n        slideEl.style.height = '';\n      }\n    });\n    swiper.emit('changeDirection');\n    if (needUpdate) swiper.update();\n    return swiper;\n  }\n\n  mount(el) {\n    const swiper = this;\n    if (swiper.mounted) return true; // Find el\n\n    const $el = $(el || swiper.params.el);\n    el = $el[0];\n\n    if (!el) {\n      return false;\n    }\n\n    el.swiper = swiper;\n\n    const getWrapperSelector = () => {\n      return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n    };\n\n    const getWrapper = () => {\n      if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n        const res = $(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items\n\n        res.children = options => $el.children(options);\n\n        return res;\n      }\n\n      return $el.children(getWrapperSelector());\n    }; // Find Wrapper\n\n\n    let $wrapperEl = getWrapper();\n\n    if ($wrapperEl.length === 0 && swiper.params.createElements) {\n      const document = getDocument();\n      const wrapper = document.createElement('div');\n      $wrapperEl = $(wrapper);\n      wrapper.className = swiper.params.wrapperClass;\n      $el.append(wrapper);\n      $el.children(`.${swiper.params.slideClass}`).each(slideEl => {\n        $wrapperEl.append(slideEl);\n      });\n    }\n\n    Object.assign(swiper, {\n      $el,\n      el,\n      $wrapperEl,\n      wrapperEl: $wrapperEl[0],\n      mounted: true,\n      // RTL\n      rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n      rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n      wrongRTL: $wrapperEl.css('display') === '-webkit-box'\n    });\n    return true;\n  }\n\n  init(el) {\n    const swiper = this;\n    if (swiper.initialized) return swiper;\n    const mounted = swiper.mount(el);\n    if (mounted === false) return swiper;\n    swiper.emit('beforeInit'); // Set breakpoint\n\n    if (swiper.params.breakpoints) {\n      swiper.setBreakpoint();\n    } // Add Classes\n\n\n    swiper.addClasses(); // Create loop\n\n    if (swiper.params.loop) {\n      swiper.loopCreate();\n    } // Update size\n\n\n    swiper.updateSize(); // Update slides\n\n    swiper.updateSlides();\n\n    if (swiper.params.watchOverflow) {\n      swiper.checkOverflow();\n    } // Set Grab Cursor\n\n\n    if (swiper.params.grabCursor && swiper.enabled) {\n      swiper.setGrabCursor();\n    }\n\n    if (swiper.params.preloadImages) {\n      swiper.preloadImages();\n    } // Slide To Initial Slide\n\n\n    if (swiper.params.loop) {\n      swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true);\n    } else {\n      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n    } // Attach events\n\n\n    swiper.attachEvents(); // Init Flag\n\n    swiper.initialized = true; // Emit\n\n    swiper.emit('init');\n    swiper.emit('afterInit');\n    return swiper;\n  }\n\n  destroy(deleteInstance, cleanStyles) {\n    if (deleteInstance === void 0) {\n      deleteInstance = true;\n    }\n\n    if (cleanStyles === void 0) {\n      cleanStyles = true;\n    }\n\n    const swiper = this;\n    const {\n      params,\n      $el,\n      $wrapperEl,\n      slides\n    } = swiper;\n\n    if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n      return null;\n    }\n\n    swiper.emit('beforeDestroy'); // Init Flag\n\n    swiper.initialized = false; // Detach events\n\n    swiper.detachEvents(); // Destroy loop\n\n    if (params.loop) {\n      swiper.loopDestroy();\n    } // Cleanup styles\n\n\n    if (cleanStyles) {\n      swiper.removeClasses();\n      $el.removeAttr('style');\n      $wrapperEl.removeAttr('style');\n\n      if (slides && slides.length) {\n        slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index');\n      }\n    }\n\n    swiper.emit('destroy'); // Detach emitter events\n\n    Object.keys(swiper.eventsListeners).forEach(eventName => {\n      swiper.off(eventName);\n    });\n\n    if (deleteInstance !== false) {\n      swiper.$el[0].swiper = null;\n      deleteProps(swiper);\n    }\n\n    swiper.destroyed = true;\n    return null;\n  }\n\n  static extendDefaults(newDefaults) {\n    extend(extendedDefaults, newDefaults);\n  }\n\n  static get extendedDefaults() {\n    return extendedDefaults;\n  }\n\n  static get defaults() {\n    return defaults;\n  }\n\n  static installModule(mod) {\n    if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n    const modules = Swiper.prototype.__modules__;\n\n    if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n      modules.push(mod);\n    }\n  }\n\n  static use(module) {\n    if (Array.isArray(module)) {\n      module.forEach(m => Swiper.installModule(m));\n      return Swiper;\n    }\n\n    Swiper.installModule(module);\n    return Swiper;\n  }\n\n}\n\nObject.keys(prototypes).forEach(prototypeGroup => {\n  Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {\n    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n  });\n});\nSwiper.use([Resize, Observer]);\nexport default Swiper;","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\nexport default {\n  setTransition,\n  transitionStart,\n  transitionEnd\n};","export default function setTransition(duration, byController) {\n  const swiper = this;\n\n  if (!swiper.params.cssMode) {\n    swiper.$wrapperEl.transition(duration);\n  }\n\n  swiper.emit('setTransition', duration, byController);\n}","import transitionEmit from './transitionEmit.js';\nexport default function transitionStart(runCallbacks, direction) {\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  if (params.cssMode) return;\n\n  if (params.autoHeight) {\n    swiper.updateAutoHeight();\n  }\n\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'Start'\n  });\n}","import transitionEmit from './transitionEmit.js';\nexport default function transitionEnd(runCallbacks, direction) {\n  if (runCallbacks === void 0) {\n    runCallbacks = true;\n  }\n\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  swiper.animating = false;\n  if (params.cssMode) return;\n  swiper.setTransition(0);\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'End'\n  });\n}","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\nexport default {\n  setGrabCursor,\n  unsetGrabCursor\n};","export default function setGrabCursor(moving) {\n  const swiper = this;\n  if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;\n  const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n  el.style.cursor = 'move';\n  el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n  el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n  el.style.cursor = moving ? 'grabbing' : 'grab';\n}","export default function unsetGrabCursor() {\n  const swiper = this;\n\n  if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {\n    return;\n  }\n\n  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}","function checkOverflow() {\n  const swiper = this;\n  const {\n    isLocked: wasLocked,\n    params\n  } = swiper;\n  const {\n    slidesOffsetBefore\n  } = params;\n\n  if (slidesOffsetBefore) {\n    const lastSlideIndex = swiper.slides.length - 1;\n    const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;\n    swiper.isLocked = swiper.size > lastSlideRightEdge;\n  } else {\n    swiper.isLocked = swiper.snapGrid.length === 1;\n  }\n\n  if (params.allowSlideNext === true) {\n    swiper.allowSlideNext = !swiper.isLocked;\n  }\n\n  if (params.allowSlidePrev === true) {\n    swiper.allowSlidePrev = !swiper.isLocked;\n  }\n\n  if (wasLocked && wasLocked !== swiper.isLocked) {\n    swiper.isEnd = false;\n  }\n\n  if (wasLocked !== swiper.isLocked) {\n    swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n  }\n}\n\nexport default {\n  checkOverflow\n};","import { getWindow } from 'ssr-window';\nexport default function Resize(_ref) {\n  let {\n    swiper,\n    on,\n    emit\n  } = _ref;\n  const window = getWindow();\n  let observer = null;\n  let animationFrame = null;\n\n  const resizeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('beforeResize');\n    emit('resize');\n  };\n\n  const createObserver = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    observer = new ResizeObserver(entries => {\n      animationFrame = window.requestAnimationFrame(() => {\n        const {\n          width,\n          height\n        } = swiper;\n        let newWidth = width;\n        let newHeight = height;\n        entries.forEach(_ref2 => {\n          let {\n            contentBoxSize,\n            contentRect,\n            target\n          } = _ref2;\n          if (target && target !== swiper.el) return;\n          newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;\n          newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;\n        });\n\n        if (newWidth !== width || newHeight !== height) {\n          resizeHandler();\n        }\n      });\n    });\n    observer.observe(swiper.el);\n  };\n\n  const removeObserver = () => {\n    if (animationFrame) {\n      window.cancelAnimationFrame(animationFrame);\n    }\n\n    if (observer && observer.unobserve && swiper.el) {\n      observer.unobserve(swiper.el);\n      observer = null;\n    }\n  };\n\n  const orientationChangeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('orientationchange');\n  };\n\n  on('init', () => {\n    if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n      createObserver();\n      return;\n    }\n\n    window.addEventListener('resize', resizeHandler);\n    window.addEventListener('orientationchange', orientationChangeHandler);\n  });\n  on('destroy', () => {\n    removeObserver();\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('orientationchange', orientationChangeHandler);\n  });\n}","import { getWindow } from 'ssr-window';\nexport default function Observer(_ref) {\n  let {\n    swiper,\n    extendParams,\n    on,\n    emit\n  } = _ref;\n  const observers = [];\n  const window = getWindow();\n\n  const attach = function (target, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n    const observer = new ObserverFunc(mutations => {\n      // The observerUpdate event should only be triggered\n      // once despite the number of mutations.  Additional\n      // triggers are redundant and are very costly\n      if (mutations.length === 1) {\n        emit('observerUpdate', mutations[0]);\n        return;\n      }\n\n      const observerUpdate = function observerUpdate() {\n        emit('observerUpdate', mutations[0]);\n      };\n\n      if (window.requestAnimationFrame) {\n        window.requestAnimationFrame(observerUpdate);\n      } else {\n        window.setTimeout(observerUpdate, 0);\n      }\n    });\n    observer.observe(target, {\n      attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n      childList: typeof options.childList === 'undefined' ? true : options.childList,\n      characterData: typeof options.characterData === 'undefined' ? true : options.characterData\n    });\n    observers.push(observer);\n  };\n\n  const init = () => {\n    if (!swiper.params.observer) return;\n\n    if (swiper.params.observeParents) {\n      const containerParents = swiper.$el.parents();\n\n      for (let i = 0; i < containerParents.length; i += 1) {\n        attach(containerParents[i]);\n      }\n    } // Observe container\n\n\n    attach(swiper.$el[0], {\n      childList: swiper.params.observeSlideChildren\n    }); // Observe wrapper\n\n    attach(swiper.$wrapperEl[0], {\n      attributes: false\n    });\n  };\n\n  const destroy = () => {\n    observers.forEach(observer => {\n      observer.disconnect();\n    });\n    observers.splice(0, observers.length);\n  };\n\n  extendParams({\n    observer: false,\n    observeParents: false,\n    observeSlideChildren: false\n  });\n  on('init', init);\n  on('destroy', destroy);\n}","export default function classesToSelector(classes) {\n  if (classes === void 0) {\n    classes = '';\n  }\n\n  return `.${classes.trim().replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n  .replace(/ /g, '.')}`;\n}","/**\n * MicroEvent - to make any js object an event emitter\n *\n * - pure javascript - server compatible, browser compatible\n * - dont rely on the browser doms\n * - super simple - you get it immediatly, no mistery, no magic involved\n *\n * @author Jerome Etienne (https://github.com/jeromeetienne)\n */\n/**\n * Execute callback for each event in space separated list of event names\n *\n */\nfunction forEvents(events, callback) {\n    events.split(/\\s+/).forEach((event) => {\n        callback(event);\n    });\n}\nexport default class MicroEvent {\n    constructor() {\n        this._events = {};\n    }\n    on(events, fct) {\n        forEvents(events, (event) => {\n            const event_array = this._events[event] || [];\n            event_array.push(fct);\n            this._events[event] = event_array;\n        });\n    }\n    off(events, fct) {\n        var n = arguments.length;\n        if (n === 0) {\n            this._events = {};\n            return;\n        }\n        forEvents(events, (event) => {\n            if (n === 1) {\n                delete this._events[event];\n                return;\n            }\n            const event_array = this._events[event];\n            if (event_array === undefined)\n                return;\n            event_array.splice(event_array.indexOf(fct), 1);\n            this._events[event] = event_array;\n        });\n    }\n    trigger(events, ...args) {\n        var self = this;\n        forEvents(events, (event) => {\n            const event_array = self._events[event];\n            if (event_array === undefined)\n                return;\n            event_array.forEach(fct => {\n                fct.apply(self, args);\n            });\n        });\n    }\n}\n;\n//# sourceMappingURL=microevent.js.map","import { Controller } from \"@hotwired/stimulus\"\nimport Swiper, { Pagination, Autoplay } from 'swiper';\n\nSwiper.use([Pagination, Autoplay]);\n\n\nexport default class extends Controller {\n    connect () {\n        new Swiper('.swiper', {\n            pagination: {\n                el: '.swiper-pagination',\n                type: 'bullets',\n            },\n            autoplay: {\n                delay: 5000,\n            },\n        });\n    }\n}","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nexport default function Pagination(_ref) {\n  let {\n    swiper,\n    extendParams,\n    on,\n    emit\n  } = _ref;\n  const pfx = 'swiper-pagination';\n  extendParams({\n    pagination: {\n      el: null,\n      bulletElement: 'span',\n      clickable: false,\n      hideOnClick: false,\n      renderBullet: null,\n      renderProgressbar: null,\n      renderFraction: null,\n      renderCustom: null,\n      progressbarOpposite: false,\n      type: 'bullets',\n      // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n      dynamicBullets: false,\n      dynamicMainBullets: 1,\n      formatFractionCurrent: number => number,\n      formatFractionTotal: number => number,\n      bulletClass: `${pfx}-bullet`,\n      bulletActiveClass: `${pfx}-bullet-active`,\n      modifierClass: `${pfx}-`,\n      currentClass: `${pfx}-current`,\n      totalClass: `${pfx}-total`,\n      hiddenClass: `${pfx}-hidden`,\n      progressbarFillClass: `${pfx}-progressbar-fill`,\n      progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n      clickableClass: `${pfx}-clickable`,\n      lockClass: `${pfx}-lock`,\n      horizontalClass: `${pfx}-horizontal`,\n      verticalClass: `${pfx}-vertical`\n    }\n  });\n  swiper.pagination = {\n    el: null,\n    $el: null,\n    bullets: []\n  };\n  let bulletSize;\n  let dynamicBulletIndex = 0;\n\n  function isPaginationDisabled() {\n    return !swiper.params.pagination.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0;\n  }\n\n  function setSideBullets($bulletEl, position) {\n    const {\n      bulletActiveClass\n    } = swiper.params.pagination;\n    $bulletEl[position]().addClass(`${bulletActiveClass}-${position}`)[position]().addClass(`${bulletActiveClass}-${position}-${position}`);\n  }\n\n  function update() {\n    // Render || Update Pagination bullets/items\n    const rtl = swiper.rtl;\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const $el = swiper.pagination.$el; // Current/Total\n\n    let current;\n    const total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n\n    if (swiper.params.loop) {\n      current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);\n\n      if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n        current -= slidesLength - swiper.loopedSlides * 2;\n      }\n\n      if (current > total - 1) current -= total;\n      if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n    } else if (typeof swiper.snapIndex !== 'undefined') {\n      current = swiper.snapIndex;\n    } else {\n      current = swiper.activeIndex || 0;\n    } // Types\n\n\n    if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n      const bullets = swiper.pagination.bullets;\n      let firstIndex;\n      let lastIndex;\n      let midIndex;\n\n      if (params.dynamicBullets) {\n        bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n        $el.css(swiper.isHorizontal() ? 'width' : 'height', `${bulletSize * (params.dynamicMainBullets + 4)}px`);\n\n        if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n          dynamicBulletIndex += current - (swiper.previousIndex - swiper.loopedSlides || 0);\n\n          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n            dynamicBulletIndex = params.dynamicMainBullets - 1;\n          } else if (dynamicBulletIndex < 0) {\n            dynamicBulletIndex = 0;\n          }\n        }\n\n        firstIndex = Math.max(current - dynamicBulletIndex, 0);\n        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n        midIndex = (lastIndex + firstIndex) / 2;\n      }\n\n      bullets.removeClass(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`).join(' '));\n\n      if ($el.length > 1) {\n        bullets.each(bullet => {\n          const $bullet = $(bullet);\n          const bulletIndex = $bullet.index();\n\n          if (bulletIndex === current) {\n            $bullet.addClass(params.bulletActiveClass);\n          }\n\n          if (params.dynamicBullets) {\n            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n              $bullet.addClass(`${params.bulletActiveClass}-main`);\n            }\n\n            if (bulletIndex === firstIndex) {\n              setSideBullets($bullet, 'prev');\n            }\n\n            if (bulletIndex === lastIndex) {\n              setSideBullets($bullet, 'next');\n            }\n          }\n        });\n      } else {\n        const $bullet = bullets.eq(current);\n        const bulletIndex = $bullet.index();\n        $bullet.addClass(params.bulletActiveClass);\n\n        if (params.dynamicBullets) {\n          const $firstDisplayedBullet = bullets.eq(firstIndex);\n          const $lastDisplayedBullet = bullets.eq(lastIndex);\n\n          for (let i = firstIndex; i <= lastIndex; i += 1) {\n            bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n          }\n\n          if (swiper.params.loop) {\n            if (bulletIndex >= bullets.length) {\n              for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n                bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n              }\n\n              bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(`${params.bulletActiveClass}-prev`);\n            } else {\n              setSideBullets($firstDisplayedBullet, 'prev');\n              setSideBullets($lastDisplayedBullet, 'next');\n            }\n          } else {\n            setSideBullets($firstDisplayedBullet, 'prev');\n            setSideBullets($lastDisplayedBullet, 'next');\n          }\n        }\n      }\n\n      if (params.dynamicBullets) {\n        const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n        const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n        const offsetProp = rtl ? 'right' : 'left';\n        bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n      }\n    }\n\n    if (params.type === 'fraction') {\n      $el.find(classesToSelector(params.currentClass)).text(params.formatFractionCurrent(current + 1));\n      $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n    }\n\n    if (params.type === 'progressbar') {\n      let progressbarDirection;\n\n      if (params.progressbarOpposite) {\n        progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n      } else {\n        progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n      }\n\n      const scale = (current + 1) / total;\n      let scaleX = 1;\n      let scaleY = 1;\n\n      if (progressbarDirection === 'horizontal') {\n        scaleX = scale;\n      } else {\n        scaleY = scale;\n      }\n\n      $el.find(classesToSelector(params.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed);\n    }\n\n    if (params.type === 'custom' && params.renderCustom) {\n      $el.html(params.renderCustom(swiper, current + 1, total));\n      emit('paginationRender', $el[0]);\n    } else {\n      emit('paginationUpdate', $el[0]);\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n    }\n  }\n\n  function render() {\n    // Render Container\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const $el = swiper.pagination.$el;\n    let paginationHTML = '';\n\n    if (params.type === 'bullets') {\n      let numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n\n      if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.loop && numberOfBullets > slidesLength) {\n        numberOfBullets = slidesLength;\n      }\n\n      for (let i = 0; i < numberOfBullets; i += 1) {\n        if (params.renderBullet) {\n          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n        } else {\n          paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\"></${params.bulletElement}>`;\n        }\n      }\n\n      $el.html(paginationHTML);\n      swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n    }\n\n    if (params.type === 'fraction') {\n      if (params.renderFraction) {\n        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n      } else {\n        paginationHTML = `<span class=\"${params.currentClass}\"></span>` + ' / ' + `<span class=\"${params.totalClass}\"></span>`;\n      }\n\n      $el.html(paginationHTML);\n    }\n\n    if (params.type === 'progressbar') {\n      if (params.renderProgressbar) {\n        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n      } else {\n        paginationHTML = `<span class=\"${params.progressbarFillClass}\"></span>`;\n      }\n\n      $el.html(paginationHTML);\n    }\n\n    if (params.type !== 'custom') {\n      emit('paginationRender', swiper.pagination.$el[0]);\n    }\n  }\n\n  function init() {\n    swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {\n      el: 'swiper-pagination'\n    });\n    const params = swiper.params.pagination;\n    if (!params.el) return;\n    let $el = $(params.el);\n    if ($el.length === 0) return;\n\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n      $el = swiper.$el.find(params.el); // check if it belongs to another nested Swiper\n\n      if ($el.length > 1) {\n        $el = $el.filter(el => {\n          if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n          return true;\n        });\n      }\n    }\n\n    if (params.type === 'bullets' && params.clickable) {\n      $el.addClass(params.clickableClass);\n    }\n\n    $el.addClass(params.modifierClass + params.type);\n    $el.addClass(params.modifierClass + swiper.params.direction);\n\n    if (params.type === 'bullets' && params.dynamicBullets) {\n      $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n      dynamicBulletIndex = 0;\n\n      if (params.dynamicMainBullets < 1) {\n        params.dynamicMainBullets = 1;\n      }\n    }\n\n    if (params.type === 'progressbar' && params.progressbarOpposite) {\n      $el.addClass(params.progressbarOppositeClass);\n    }\n\n    if (params.clickable) {\n      $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n        e.preventDefault();\n        let index = $(this).index() * swiper.params.slidesPerGroup;\n        if (swiper.params.loop) index += swiper.loopedSlides;\n        swiper.slideTo(index);\n      });\n    }\n\n    Object.assign(swiper.pagination, {\n      $el,\n      el: $el[0]\n    });\n\n    if (!swiper.enabled) {\n      $el.addClass(params.lockClass);\n    }\n  }\n\n  function destroy() {\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const $el = swiper.pagination.$el;\n    $el.removeClass(params.hiddenClass);\n    $el.removeClass(params.modifierClass + params.type);\n    $el.removeClass(params.modifierClass + swiper.params.direction);\n    if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass) swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n\n    if (params.clickable) {\n      $el.off('click', classesToSelector(params.bulletClass));\n    }\n  }\n\n  on('init', () => {\n    init();\n    render();\n    update();\n  });\n  on('activeIndexChange', () => {\n    if (swiper.params.loop) {\n      update();\n    } else if (typeof swiper.snapIndex === 'undefined') {\n      update();\n    }\n  });\n  on('snapIndexChange', () => {\n    if (!swiper.params.loop) {\n      update();\n    }\n  });\n  on('slidesLengthChange', () => {\n    if (swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('snapGridLengthChange', () => {\n    if (!swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const {\n      $el\n    } = swiper.pagination;\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n    }\n  });\n  on('lock unlock', () => {\n    update();\n  });\n  on('click', (_s, e) => {\n    const targetEl = e.target;\n    const {\n      $el\n    } = swiper.pagination;\n\n    if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && $el.length > 0 && !$(targetEl).hasClass(swiper.params.pagination.bulletClass)) {\n      if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;\n      const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n\n      if (isHidden === true) {\n        emit('paginationShow');\n      } else {\n        emit('paginationHide');\n      }\n\n      $el.toggleClass(swiper.params.pagination.hiddenClass);\n    }\n  });\n  Object.assign(swiper.pagination, {\n    render,\n    update,\n    init,\n    destroy\n  });\n}","import { getDocument } from 'ssr-window';\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n  const document = getDocument();\n\n  if (swiper.params.createElements) {\n    Object.keys(checkProps).forEach(key => {\n      if (!params[key] && params.auto === true) {\n        let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n\n        if (!element) {\n          element = document.createElement('div');\n          element.className = checkProps[key];\n          swiper.$el.append(element);\n        }\n\n        params[key] = element;\n        originalParams[key] = element;\n      }\n    });\n  }\n\n  return params;\n}","/* eslint no-underscore-dangle: \"off\" */\n\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\nexport default function Autoplay(_ref) {\n  let {\n    swiper,\n    extendParams,\n    on,\n    emit\n  } = _ref;\n  let timeout;\n  swiper.autoplay = {\n    running: false,\n    paused: false\n  };\n  extendParams({\n    autoplay: {\n      enabled: false,\n      delay: 3000,\n      waitForTransition: true,\n      disableOnInteraction: true,\n      stopOnLastSlide: false,\n      reverseDirection: false,\n      pauseOnMouseEnter: false\n    }\n  });\n\n  function run() {\n    const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n    let delay = swiper.params.autoplay.delay;\n\n    if ($activeSlideEl.attr('data-swiper-autoplay')) {\n      delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n    }\n\n    clearTimeout(timeout);\n    timeout = nextTick(() => {\n      let autoplayResult;\n\n      if (swiper.params.autoplay.reverseDirection) {\n        if (swiper.params.loop) {\n          swiper.loopFix();\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.isBeginning) {\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);\n          emit('autoplay');\n        } else {\n          stop();\n        }\n      } else if (swiper.params.loop) {\n        swiper.loopFix();\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.isEnd) {\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.params.autoplay.stopOnLastSlide) {\n        autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n        emit('autoplay');\n      } else {\n        stop();\n      }\n\n      if (swiper.params.cssMode && swiper.autoplay.running) run();else if (autoplayResult === false) {\n        run();\n      }\n    }, delay);\n  }\n\n  function start() {\n    if (typeof timeout !== 'undefined') return false;\n    if (swiper.autoplay.running) return false;\n    swiper.autoplay.running = true;\n    emit('autoplayStart');\n    run();\n    return true;\n  }\n\n  function stop() {\n    if (!swiper.autoplay.running) return false;\n    if (typeof timeout === 'undefined') return false;\n\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = undefined;\n    }\n\n    swiper.autoplay.running = false;\n    emit('autoplayStop');\n    return true;\n  }\n\n  function pause(speed) {\n    if (!swiper.autoplay.running) return;\n    if (swiper.autoplay.paused) return;\n    if (timeout) clearTimeout(timeout);\n    swiper.autoplay.paused = true;\n\n    if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n      swiper.autoplay.paused = false;\n      run();\n    } else {\n      ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n        swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n      });\n    }\n  }\n\n  function onVisibilityChange() {\n    const document = getDocument();\n\n    if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n      pause();\n    }\n\n    if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n      run();\n      swiper.autoplay.paused = false;\n    }\n  }\n\n  function onTransitionEnd(e) {\n    if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n    if (e.target !== swiper.$wrapperEl[0]) return;\n    ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n    swiper.autoplay.paused = false;\n\n    if (!swiper.autoplay.running) {\n      stop();\n    } else {\n      run();\n    }\n  }\n\n  function onMouseEnter() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      stop();\n    } else {\n      emit('autoplayPause');\n      pause();\n    }\n\n    ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n  }\n\n  function onMouseLeave() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      return;\n    }\n\n    swiper.autoplay.paused = false;\n    emit('autoplayResume');\n    run();\n  }\n\n  function attachMouseEvents() {\n    if (swiper.params.autoplay.pauseOnMouseEnter) {\n      swiper.$el.on('mouseenter', onMouseEnter);\n      swiper.$el.on('mouseleave', onMouseLeave);\n    }\n  }\n\n  function detachMouseEvents() {\n    swiper.$el.off('mouseenter', onMouseEnter);\n    swiper.$el.off('mouseleave', onMouseLeave);\n  }\n\n  on('init', () => {\n    if (swiper.params.autoplay.enabled) {\n      start();\n      const document = getDocument();\n      document.addEventListener('visibilitychange', onVisibilityChange);\n      attachMouseEvents();\n    }\n  });\n  on('beforeTransitionStart', (_s, speed, internal) => {\n    if (swiper.autoplay.running) {\n      if (internal || !swiper.params.autoplay.disableOnInteraction) {\n        swiper.autoplay.pause(speed);\n      } else {\n        stop();\n      }\n    }\n  });\n  on('sliderFirstMove', () => {\n    if (swiper.autoplay.running) {\n      if (swiper.params.autoplay.disableOnInteraction) {\n        stop();\n      } else {\n        pause();\n      }\n    }\n  });\n  on('touchEnd', () => {\n    if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {\n      run();\n    }\n  });\n  on('destroy', () => {\n    detachMouseEvents();\n\n    if (swiper.autoplay.running) {\n      stop();\n    }\n\n    const document = getDocument();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  });\n  Object.assign(swiper.autoplay, {\n    pause,\n    run,\n    start,\n    stop\n  });\n}","/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n */\nexport const arrayToPattern = (chars) => {\n    chars = chars.filter(Boolean);\n    if (chars.length < 2) {\n        return chars[0] || '';\n    }\n    return (maxValueLength(chars) == 1) ? '[' + chars.join('') + ']' : '(?:' + chars.join('|') + ')';\n};\nexport const sequencePattern = (array) => {\n    if (!hasDuplicates(array)) {\n        return array.join('');\n    }\n    let pattern = '';\n    let prev_char_count = 0;\n    const prev_pattern = () => {\n        if (prev_char_count > 1) {\n            pattern += '{' + prev_char_count + '}';\n        }\n    };\n    array.forEach((char, i) => {\n        if (char === array[i - 1]) {\n            prev_char_count++;\n            return;\n        }\n        prev_pattern();\n        pattern += char;\n        prev_char_count = 1;\n    });\n    prev_pattern();\n    return pattern;\n};\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n */\nexport const setToPattern = (chars) => {\n    let array = Array.from(chars);\n    return arrayToPattern(array);\n};\n/**\n * https://stackoverflow.com/questions/7376598/in-javascript-how-do-i-check-if-an-array-has-duplicate-values\n */\nexport const hasDuplicates = (array) => {\n    return (new Set(array)).size !== array.length;\n};\n/**\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str) => {\n    return (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n/**\n * Return the max length of array values\n */\nexport const maxValueLength = (array) => {\n    return array.reduce((longest, value) => Math.max(longest, unicodeLength(value)), 0);\n};\nexport const unicodeLength = (str) => {\n    return Array.from(str).length;\n};\n//# sourceMappingURL=regex.js.map","/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n */\nexport const allSubstrings = (input) => {\n    if (input.length === 1)\n        return [[input]];\n    let result = [];\n    const start = input.substring(1);\n    const suba = allSubstrings(start);\n    suba.forEach(function (subresult) {\n        let tmp = subresult.slice(0);\n        tmp[0] = input.charAt(0) + tmp[0];\n        result.push(tmp);\n        tmp = subresult.slice(0);\n        tmp.unshift(input.charAt(0));\n        result.push(tmp);\n    });\n    return result;\n};\n//# sourceMappingURL=strings.js.map","import { setToPattern, arrayToPattern, escape_regex, sequencePattern } from \"./regex.js\";\nimport { allSubstrings } from \"./strings.js\";\nexport const code_points = [[0, 65535]];\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}\\u{2bc}]';\nexport let unicode_map;\nlet multi_char_reg;\nconst max_char_length = 3;\nconst latin_convert = {};\nconst latin_condensed = {\n    '/': '⁄∕',\n    '0': '߀',\n    \"a\": \"ⱥɐɑ\",\n    \"aa\": \"ꜳ\",\n    \"ae\": \"æǽǣ\",\n    \"ao\": \"ꜵ\",\n    \"au\": \"ꜷ\",\n    \"av\": \"ꜹꜻ\",\n    \"ay\": \"ꜽ\",\n    \"b\": \"ƀɓƃ\",\n    \"c\": \"ꜿƈȼↄ\",\n    \"d\": \"đɗɖᴅƌꮷԁɦ\",\n    \"e\": \"ɛǝᴇɇ\",\n    \"f\": \"ꝼƒ\",\n    \"g\": \"ǥɠꞡᵹꝿɢ\",\n    \"h\": \"ħⱨⱶɥ\",\n    \"i\": \"ɨı\",\n    \"j\": \"ɉȷ\",\n    \"k\": \"ƙⱪꝁꝃꝅꞣ\",\n    \"l\": \"łƚɫⱡꝉꝇꞁɭ\",\n    \"m\": \"ɱɯϻ\",\n    \"n\": \"ꞥƞɲꞑᴎлԉ\",\n    \"o\": \"øǿɔɵꝋꝍᴑ\",\n    \"oe\": \"œ\",\n    \"oi\": \"ƣ\",\n    \"oo\": \"ꝏ\",\n    \"ou\": \"ȣ\",\n    \"p\": \"ƥᵽꝑꝓꝕρ\",\n    \"q\": \"ꝗꝙɋ\",\n    \"r\": \"ɍɽꝛꞧꞃ\",\n    \"s\": \"ßȿꞩꞅʂ\",\n    \"t\": \"ŧƭʈⱦꞇ\",\n    \"th\": \"þ\",\n    \"tz\": \"ꜩ\",\n    \"u\": \"ʉ\",\n    \"v\": \"ʋꝟʌ\",\n    \"vy\": \"ꝡ\",\n    \"w\": \"ⱳ\",\n    \"y\": \"ƴɏỿ\",\n    \"z\": \"ƶȥɀⱬꝣ\",\n    \"hv\": \"ƕ\"\n};\nfor (let latin in latin_condensed) {\n    let unicode = latin_condensed[latin] || '';\n    for (let i = 0; i < unicode.length; i++) {\n        let char = unicode.substring(i, i + 1);\n        latin_convert[char] = latin;\n    }\n}\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|') + '|' + accent_pat, 'gu');\n/**\n * Initialize the unicode_map from the give code point ranges\n */\nexport const initialize = (_code_points) => {\n    if (unicode_map !== undefined)\n        return;\n    unicode_map = generateMap(_code_points || code_points);\n};\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n */\nexport const normalize = (str, form = 'NFKD') => str.normalize(form);\n/**\n * Remove accents without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n */\nexport const asciifold = (str) => {\n    return Array.from(str).reduce(\n    /**\n     * @param {string} result\n     * @param {string} char\n     */\n    (result, char) => {\n        return result + _asciifold(char);\n    }, '');\n};\nexport const _asciifold = (str) => {\n    str = normalize(str)\n        .toLowerCase()\n        .replace(convert_pat, (/** @type {string} */ char) => {\n        return latin_convert[char] || '';\n    });\n    //return str;\n    return normalize(str, 'NFC');\n};\n/**\n * Generate a list of unicode variants from the list of code points\n */\nexport function* generator(code_points) {\n    for (const [code_point_min, code_point_max] of code_points) {\n        for (let i = code_point_min; i <= code_point_max; i++) {\n            let composed = String.fromCharCode(i);\n            let folded = asciifold(composed);\n            if (folded == composed.toLowerCase()) {\n                continue;\n            }\n            // skip when folded is a string longer than 3 characters long\n            // bc the resulting regex patterns will be long\n            // eg:\n            // folded صلى الله عليه وسلم length 18 code point 65018\n            // folded جل جلاله length 8 code point 65019\n            if (folded.length > max_char_length) {\n                continue;\n            }\n            if (folded.length == 0) {\n                continue;\n            }\n            yield { folded: folded, composed: composed, code_point: i };\n        }\n    }\n}\n/**\n * Generate a unicode map from the list of code points\n */\nexport const generateSets = (code_points) => {\n    const unicode_sets = {};\n    const addMatching = (folded, to_add) => {\n        /** @type {Set<string>} */\n        const folded_set = unicode_sets[folded] || new Set();\n        const patt = new RegExp('^' + setToPattern(folded_set) + '$', 'iu');\n        if (to_add.match(patt)) {\n            return;\n        }\n        folded_set.add(escape_regex(to_add));\n        unicode_sets[folded] = folded_set;\n    };\n    for (let value of generator(code_points)) {\n        addMatching(value.folded, value.folded);\n        addMatching(value.folded, value.composed);\n    }\n    return unicode_sets;\n};\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|Ａ...)(?:E|ɛ|Ⓔ...))\n */\nexport const generateMap = (code_points) => {\n    const unicode_sets = generateSets(code_points);\n    const unicode_map = {};\n    let multi_char = [];\n    for (let folded in unicode_sets) {\n        let set = unicode_sets[folded];\n        if (set) {\n            unicode_map[folded] = setToPattern(set);\n        }\n        if (folded.length > 1) {\n            multi_char.push(escape_regex(folded));\n        }\n    }\n    multi_char.sort((a, b) => b.length - a.length);\n    const multi_char_patt = arrayToPattern(multi_char);\n    multi_char_reg = new RegExp('^' + multi_char_patt, 'u');\n    return unicode_map;\n};\n/**\n * Map each element of an array from its folded value to all possible unicode matches\n */\nexport const mapSequence = (strings, min_replacement = 1) => {\n    let chars_replaced = 0;\n    strings = strings.map((str) => {\n        if (unicode_map[str]) {\n            chars_replaced += str.length;\n        }\n        return unicode_map[str] || str;\n    });\n    if (chars_replaced >= min_replacement) {\n        return sequencePattern(strings);\n    }\n    return '';\n};\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n */\nexport const substringsToPattern = (str, min_replacement = 1) => {\n    min_replacement = Math.max(min_replacement, str.length - 1);\n    return arrayToPattern(allSubstrings(str).map((sub_pat) => {\n        return mapSequence(sub_pat, min_replacement);\n    }));\n};\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n */\nconst sequencesToPattern = (sequences, all = true) => {\n    let min_replacement = sequences.length > 1 ? 1 : 0;\n    return arrayToPattern(sequences.map((sequence) => {\n        let seq = [];\n        const len = all ? sequence.length() : sequence.length() - 1;\n        for (let j = 0; j < len; j++) {\n            seq.push(substringsToPattern(sequence.substrs[j] || '', min_replacement));\n        }\n        return sequencePattern(seq);\n    }));\n};\n/**\n * Return true if the sequence is already in the sequences\n */\nconst inSequences = (needle_seq, sequences) => {\n    for (const seq of sequences) {\n        if (seq.start != needle_seq.start || seq.end != needle_seq.end) {\n            continue;\n        }\n        if (seq.substrs.join('') !== needle_seq.substrs.join('')) {\n            continue;\n        }\n        let needle_parts = needle_seq.parts;\n        const filter = (part) => {\n            for (const needle_part of needle_parts) {\n                if (needle_part.start === part.start && needle_part.substr === part.substr) {\n                    return false;\n                }\n                if (part.length == 1 || needle_part.length == 1) {\n                    continue;\n                }\n                // check for overlapping parts\n                // a = ['::=','==']\n                // b = ['::','===']\n                // a = ['r','sm']\n                // b = ['rs','m']\n                if (part.start < needle_part.start && part.end > needle_part.start) {\n                    return true;\n                }\n                if (needle_part.start < part.start && needle_part.end > part.start) {\n                    return true;\n                }\n            }\n            return false;\n        };\n        let filtered = seq.parts.filter(filter);\n        if (filtered.length > 0) {\n            continue;\n        }\n        return true;\n    }\n    return false;\n};\nclass Sequence {\n    parts;\n    substrs;\n    start;\n    end;\n    constructor() {\n        this.parts = [];\n        this.substrs = [];\n        this.start = 0;\n        this.end = 0;\n    }\n    add(part) {\n        if (part) {\n            this.parts.push(part);\n            this.substrs.push(part.substr);\n            this.start = Math.min(part.start, this.start);\n            this.end = Math.max(part.end, this.end);\n        }\n    }\n    last() {\n        return this.parts[this.parts.length - 1];\n    }\n    length() {\n        return this.parts.length;\n    }\n    clone(position, last_piece) {\n        let clone = new Sequence();\n        let parts = JSON.parse(JSON.stringify(this.parts));\n        let last_part = parts.pop();\n        for (const part of parts) {\n            clone.add(part);\n        }\n        let last_substr = last_piece.substr.substring(0, position - last_part.start);\n        let clone_last_len = last_substr.length;\n        clone.add({ start: last_part.start, end: last_part.start + clone_last_len, length: clone_last_len, substr: last_substr });\n        return clone;\n    }\n}\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /aⓐａẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶＡÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * Issue:\n *  ﺊﺋ [ 'ﺊ = \\\\u{fe8a}', 'ﺋ = \\\\u{fe8b}' ]\n *\tbecomes:\tئئ [ 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}', 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}' ]\n *\n *\tİĲ = IIJ = ⅡJ\n *\n * \t1/2/4\n */\nexport const getPattern = (str) => {\n    initialize();\n    str = asciifold(str);\n    let pattern = '';\n    let sequences = [new Sequence()];\n    for (let i = 0; i < str.length; i++) {\n        let substr = str.substring(i);\n        let match = substr.match(multi_char_reg);\n        const char = str.substring(i, i + 1);\n        const match_str = match ? match[0] : null;\n        // loop through sequences\n        // add either the char or multi_match\n        let overlapping = [];\n        let added_types = new Set();\n        for (const sequence of sequences) {\n            const last_piece = sequence.last();\n            if (!last_piece || last_piece.length == 1 || last_piece.end <= i) {\n                // if we have a multi match\n                if (match_str) {\n                    const len = match_str.length;\n                    sequence.add({ start: i, end: i + len, length: len, substr: match_str });\n                    added_types.add('1');\n                }\n                else {\n                    sequence.add({ start: i, end: i + 1, length: 1, substr: char });\n                    added_types.add('2');\n                }\n            }\n            else if (match_str) {\n                let clone = sequence.clone(i, last_piece);\n                const len = match_str.length;\n                clone.add({ start: i, end: i + len, length: len, substr: match_str });\n                overlapping.push(clone);\n            }\n            else {\n                // don't add char\n                // adding would create invalid patterns: 234 => [2,34,4]\n                added_types.add('3');\n            }\n        }\n        // if we have overlapping\n        if (overlapping.length > 0) {\n            // ['ii','iii'] before ['i','i','iii']\n            overlapping = overlapping.sort((a, b) => {\n                return a.length() - b.length();\n            });\n            for (let clone of overlapping) {\n                // don't add if we already have an equivalent sequence\n                if (inSequences(clone, sequences)) {\n                    continue;\n                }\n                sequences.push(clone);\n            }\n            continue;\n        }\n        // if we haven't done anything unique\n        // clean up the patterns\n        // helps keep patterns smaller\n        // if str = 'r₨㎧aarss', pattern will be 446 instead of 655\n        if (i > 0 && added_types.size == 1 && !added_types.has('3')) {\n            pattern += sequencesToPattern(sequences, false);\n            let new_seq = new Sequence();\n            const old_seq = sequences[0];\n            if (old_seq) {\n                new_seq.add(old_seq.last());\n            }\n            sequences = [new_seq];\n        }\n    }\n    pattern += sequencesToPattern(sequences, true);\n    return pattern;\n};\nexport { escape_regex };\n//# sourceMappingURL=index.js.map","import { asciifold } from '@orchidjs/unicode-variants';\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\nexport const getAttr = (obj, name) => {\n    if (!obj)\n        return;\n    return obj[name];\n};\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\nexport const getAttrNesting = (obj, name) => {\n    if (!obj)\n        return;\n    var part, names = name.split(\".\");\n    while ((part = names.shift()) && (obj = obj[part]))\n        ;\n    return obj;\n};\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value, token, weight) => {\n    var score, pos;\n    if (!value)\n        return 0;\n    value = value + '';\n    if (token.regex == null)\n        return 0;\n    pos = value.search(token.regex);\n    if (pos === -1)\n        return 0;\n    score = token.string.length / value.length;\n    if (pos === 0)\n        score += 0.5;\n    return score * weight;\n};\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj, key) => {\n    var value = obj[key];\n    if (typeof value == 'function')\n        return value;\n    if (value && !Array.isArray(value)) {\n        obj[key] = [value];\n    }\n};\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object, callback) => {\n    if (Array.isArray(object)) {\n        object.forEach(callback);\n    }\n    else {\n        for (var key in object) {\n            if (object.hasOwnProperty(key)) {\n                callback(object[key], key);\n            }\n        }\n    }\n};\nexport const cmp = (a, b) => {\n    if (typeof a === 'number' && typeof b === 'number') {\n        return a > b ? 1 : (a < b ? -1 : 0);\n    }\n    a = asciifold(a + '').toLowerCase();\n    b = asciifold(b + '').toLowerCase();\n    if (a > b)\n        return 1;\n    if (b > a)\n        return -1;\n    return 0;\n};\n//# sourceMappingURL=utils.js.map","/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\nimport { scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp } from \"./utils.js\";\nimport { getPattern, escape_regex } from '@orchidjs/unicode-variants';\nclass Sifter {\n    items; // []|{};\n    settings;\n    /**\n     * Textually searches arrays and hashes of objects\n     * by property (or multiple properties). Designed\n     * specifically for autocomplete.\n     *\n     */\n    constructor(items, settings) {\n        this.items = items;\n        this.settings = settings || { diacritics: true };\n    }\n    ;\n    /**\n     * Splits a search string into an array of individual\n     * regexps to be used to match results.\n     *\n     */\n    tokenize(query, respect_word_boundaries, weights) {\n        if (!query || !query.length)\n            return [];\n        const tokens = [];\n        const words = query.split(/\\s+/);\n        var field_regex;\n        if (weights) {\n            field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\\:(.*)$');\n        }\n        words.forEach((word) => {\n            let field_match;\n            let field = null;\n            let regex = null;\n            // look for \"field:query\" tokens\n            if (field_regex && (field_match = word.match(field_regex))) {\n                field = field_match[1];\n                word = field_match[2];\n            }\n            if (word.length > 0) {\n                if (this.settings.diacritics) {\n                    regex = getPattern(word) || null;\n                }\n                else {\n                    regex = escape_regex(word);\n                }\n                if (regex && respect_word_boundaries)\n                    regex = \"\\\\b\" + regex;\n            }\n            tokens.push({\n                string: word,\n                regex: regex ? new RegExp(regex, 'iu') : null,\n                field: field,\n            });\n        });\n        return tokens;\n    }\n    ;\n    /**\n     * Returns a function to be used to score individual results.\n     *\n     * Good matches will have a higher score than poor matches.\n     * If an item is not a match, 0 will be returned by the function.\n     *\n     * @returns {T.ScoreFn}\n     */\n    getScoreFunction(query, options) {\n        var search = this.prepareSearch(query, options);\n        return this._getScoreFunction(search);\n    }\n    /**\n     * @returns {T.ScoreFn}\n     *\n     */\n    _getScoreFunction(search) {\n        const tokens = search.tokens, token_count = tokens.length;\n        if (!token_count) {\n            return function () { return 0; };\n        }\n        const fields = search.options.fields, weights = search.weights, field_count = fields.length, getAttrFn = search.getAttrFn;\n        if (!field_count) {\n            return function () { return 1; };\n        }\n        /**\n         * Calculates the score of an object\n         * against the search query.\n         *\n         */\n        const scoreObject = (function () {\n            if (field_count === 1) {\n                return function (token, data) {\n                    const field = fields[0].field;\n                    return scoreValue(getAttrFn(data, field), token, weights[field] || 1);\n                };\n            }\n            return function (token, data) {\n                var sum = 0;\n                // is the token specific to a field?\n                if (token.field) {\n                    const value = getAttrFn(data, token.field);\n                    if (!token.regex && value) {\n                        sum += (1 / field_count);\n                    }\n                    else {\n                        sum += scoreValue(value, token, 1);\n                    }\n                }\n                else {\n                    iterate(weights, (weight, field) => {\n                        sum += scoreValue(getAttrFn(data, field), token, weight);\n                    });\n                }\n                return sum / field_count;\n            };\n        })();\n        if (token_count === 1) {\n            return function (data) {\n                return scoreObject(tokens[0], data);\n            };\n        }\n        if (search.options.conjunction === 'and') {\n            return function (data) {\n                var score, sum = 0;\n                for (let token of tokens) {\n                    score = scoreObject(token, data);\n                    if (score <= 0)\n                        return 0;\n                    sum += score;\n                }\n                return sum / token_count;\n            };\n        }\n        else {\n            return function (data) {\n                var sum = 0;\n                iterate(tokens, (token) => {\n                    sum += scoreObject(token, data);\n                });\n                return sum / token_count;\n            };\n        }\n    }\n    ;\n    /**\n     * Returns a function that can be used to compare two\n     * results, for sorting purposes. If no sorting should\n     * be performed, `null` will be returned.\n     *\n     * @return function(a,b)\n     */\n    getSortFunction(query, options) {\n        var search = this.prepareSearch(query, options);\n        return this._getSortFunction(search);\n    }\n    _getSortFunction(search) {\n        var implicit_score, sort_flds = [];\n        const self = this, options = search.options, sort = (!search.query && options.sort_empty) ? options.sort_empty : options.sort;\n        if (typeof sort == 'function') {\n            return sort.bind(this);\n        }\n        /**\n         * Fetches the specified sort field value\n         * from a search result item.\n         *\n         */\n        const get_field = function (name, result) {\n            if (name === '$score')\n                return result.score;\n            return search.getAttrFn(self.items[result.id], name);\n        };\n        // parse options\n        if (sort) {\n            for (let s of sort) {\n                if (search.query || s.field !== '$score') {\n                    sort_flds.push(s);\n                }\n            }\n        }\n        // the \"$score\" field is implied to be the primary\n        // sort field, unless it's manually specified\n        if (search.query) {\n            implicit_score = true;\n            for (let fld of sort_flds) {\n                if (fld.field === '$score') {\n                    implicit_score = false;\n                    break;\n                }\n            }\n            if (implicit_score) {\n                sort_flds.unshift({ field: '$score', direction: 'desc' });\n            }\n            // without a search.query, all items will have the same score\n        }\n        else {\n            sort_flds = sort_flds.filter((fld) => fld.field !== '$score');\n        }\n        // build function\n        const sort_flds_count = sort_flds.length;\n        if (!sort_flds_count) {\n            return null;\n        }\n        return function (a, b) {\n            var result, field;\n            for (let sort_fld of sort_flds) {\n                field = sort_fld.field;\n                let multiplier = sort_fld.direction === 'desc' ? -1 : 1;\n                result = multiplier * cmp(get_field(field, a), get_field(field, b));\n                if (result)\n                    return result;\n            }\n            return 0;\n        };\n    }\n    ;\n    /**\n     * Parses a search query and returns an object\n     * with tokens and fields ready to be populated\n     * with results.\n     *\n     */\n    prepareSearch(query, optsUser) {\n        const weights = {};\n        var options = Object.assign({}, optsUser);\n        propToArray(options, 'sort');\n        propToArray(options, 'sort_empty');\n        // convert fields to new format\n        if (options.fields) {\n            propToArray(options, 'fields');\n            const fields = [];\n            options.fields.forEach((field) => {\n                if (typeof field == 'string') {\n                    field = { field: field, weight: 1 };\n                }\n                fields.push(field);\n                weights[field.field] = ('weight' in field) ? field.weight : 1;\n            });\n            options.fields = fields;\n        }\n        return {\n            options: options,\n            query: query.toLowerCase().trim(),\n            tokens: this.tokenize(query, options.respect_word_boundaries, weights),\n            total: 0,\n            items: [],\n            weights: weights,\n            getAttrFn: (options.nesting) ? getAttrNesting : getAttr,\n        };\n    }\n    ;\n    /**\n     * Searches through all items and returns a sorted array of matches.\n     *\n     */\n    search(query, options) {\n        var self = this, score, search;\n        search = this.prepareSearch(query, options);\n        options = search.options;\n        query = search.query;\n        // generate result scoring function\n        const fn_score = options.score || self._getScoreFunction(search);\n        // perform search and sort\n        if (query.length) {\n            iterate(self.items, (item, id) => {\n                score = fn_score(item);\n                if (options.filter === false || score > 0) {\n                    search.items.push({ 'score': score, 'id': id });\n                }\n            });\n        }\n        else {\n            iterate(self.items, (_, id) => {\n                search.items.push({ 'score': 1, 'id': id });\n            });\n        }\n        const fn_sort = self._getSortFunction(search);\n        if (fn_sort)\n            search.items.sort(fn_sort);\n        // apply limits\n        search.total = search.items.length;\n        if (typeof options.limit === 'number') {\n            search.items = search.items.slice(0, options.limit);\n        }\n        return search;\n    }\n    ;\n}\nexport { Sifter, scoreValue, getAttr, getAttrNesting, propToArray, iterate, cmp, getPattern };\nexport * from \"./types.js\";\n//# sourceMappingURL=sifter.js.map","/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nexport const hash_key = (value) => {\n    if (typeof value === 'undefined' || value === null)\n        return null;\n    return get_hash(value);\n};\nexport const get_hash = (value) => {\n    if (typeof value === 'boolean')\n        return value ? '1' : '0';\n    return value + '';\n};\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str) => {\n    return (str + '')\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;');\n};\n/**\n * use setTimeout if timeout > 0\n */\nexport const timeout = (fn, timeout) => {\n    if (timeout > 0) {\n        return window.setTimeout(fn, timeout);\n    }\n    fn.call(null);\n    return null;\n};\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn, delay) => {\n    var timeout;\n    return function (value, callback) {\n        var self = this;\n        if (timeout) {\n            self.loading = Math.max(self.loading - 1, 0);\n            clearTimeout(timeout);\n        }\n        timeout = setTimeout(function () {\n            timeout = null;\n            self.loadedSearches[value] = true;\n            fn.call(self, value, callback);\n        }, delay);\n    };\n};\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = (self, types, fn) => {\n    var type;\n    var trigger = self.trigger;\n    var event_args = {};\n    // override trigger method\n    self.trigger = function () {\n        var type = arguments[0];\n        if (types.indexOf(type) !== -1) {\n            event_args[type] = arguments;\n        }\n        else {\n            return trigger.apply(self, arguments);\n        }\n    };\n    // invoke provided function\n    fn.apply(self, []);\n    self.trigger = trigger;\n    // trigger queued events\n    for (type of types) {\n        if (type in event_args) {\n            trigger.apply(self, event_args[type]);\n        }\n    }\n};\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input) => {\n    return {\n        start: input.selectionStart || 0,\n        length: (input.selectionEnd || 0) - (input.selectionStart || 0),\n    };\n};\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt, stop = false) => {\n    if (evt) {\n        evt.preventDefault();\n        if (stop) {\n            evt.stopPropagation();\n        }\n    }\n};\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target, type, callback, options) => {\n    target.addEventListener(type, callback, options);\n};\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = (key_name, evt) => {\n    if (!evt) {\n        return false;\n    }\n    if (!evt[key_name]) {\n        return false;\n    }\n    var count = (evt.altKey ? 1 : 0) + (evt.ctrlKey ? 1 : 0) + (evt.shiftKey ? 1 : 0) + (evt.metaKey ? 1 : 0);\n    if (count === 1) {\n        return true;\n    }\n    return false;\n};\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el, id) => {\n    const existing_id = el.getAttribute('id');\n    if (existing_id) {\n        return existing_id;\n    }\n    el.setAttribute('id', id);\n    return id;\n};\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str) => {\n    return str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n/**\n *\n */\nexport const append = (parent, node) => {\n    if (node)\n        parent.append(node);\n};\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object, callback) => {\n    if (Array.isArray(object)) {\n        object.forEach(callback);\n    }\n    else {\n        for (var key in object) {\n            if (object.hasOwnProperty(key)) {\n                callback(object[key], key);\n            }\n        }\n    }\n};\n//# sourceMappingURL=utils.js.map","import { iterate } from \"./utils.js\";\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = (query) => {\n    if (query.jquery) {\n        return query[0];\n    }\n    if (query instanceof HTMLElement) {\n        return query;\n    }\n    if (isHtmlString(query)) {\n        var tpl = document.createElement('template');\n        tpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n        return tpl.content.firstChild;\n    }\n    return document.querySelector(query);\n};\nexport const isHtmlString = (arg) => {\n    if (typeof arg === 'string' && arg.indexOf('<') > -1) {\n        return true;\n    }\n    return false;\n};\nexport const escapeQuery = (query) => {\n    return query.replace(/['\"\\\\]/g, '\\\\$&');\n};\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = (dom_el, event_name) => {\n    var event = document.createEvent('HTMLEvents');\n    event.initEvent(event_name, true, false);\n    dom_el.dispatchEvent(event);\n};\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = (dom_el, css) => {\n    Object.assign(dom_el.style, css);\n};\n/**\n * Add css classes\n *\n */\nexport const addClasses = (elmts, ...classes) => {\n    var norm_classes = classesArray(classes);\n    elmts = castAsArray(elmts);\n    elmts.map(el => {\n        norm_classes.map(cls => {\n            el.classList.add(cls);\n        });\n    });\n};\n/**\n * Remove css classes\n *\n */\nexport const removeClasses = (elmts, ...classes) => {\n    var norm_classes = classesArray(classes);\n    elmts = castAsArray(elmts);\n    elmts.map(el => {\n        norm_classes.map(cls => {\n            el.classList.remove(cls);\n        });\n    });\n};\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args) => {\n    var classes = [];\n    iterate(args, (_classes) => {\n        if (typeof _classes === 'string') {\n            _classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n        }\n        if (Array.isArray(_classes)) {\n            classes = classes.concat(_classes);\n        }\n    });\n    return classes.filter(Boolean);\n};\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg) => {\n    if (!Array.isArray(arg)) {\n        arg = [arg];\n    }\n    return arg;\n};\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = (target, selector, wrapper) => {\n    if (wrapper && !wrapper.contains(target)) {\n        return;\n    }\n    while (target && target.matches) {\n        if (target.matches(selector)) {\n            return target;\n        }\n        target = target.parentNode;\n    }\n};\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = (list, direction = 0) => {\n    if (direction > 0) {\n        return list[list.length - 1];\n    }\n    return list[0];\n};\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj) => {\n    return (Object.keys(obj).length === 0);\n};\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = (el, amongst) => {\n    if (!el)\n        return -1;\n    amongst = amongst || el.nodeName;\n    var i = 0;\n    while (el = el.previousElementSibling) {\n        if (el.matches(amongst)) {\n            i++;\n        }\n    }\n    return i;\n};\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el, attrs) => {\n    iterate(attrs, (val, attr) => {\n        if (val == null) {\n            el.removeAttribute(attr);\n        }\n        else {\n            el.setAttribute(attr, '' + val);\n        }\n    });\n};\n/**\n * Replace a node\n */\nexport const replaceNode = (existing, replacement) => {\n    if (existing.parentNode)\n        existing.parentNode.replaceChild(replacement, existing);\n};\n//# sourceMappingURL=vanilla.js.map","export const KEY_A = 65;\nexport const KEY_RETURN = 13;\nexport const KEY_ESC = 27;\nexport const KEY_LEFT = 37;\nexport const KEY_UP = 38;\nexport const KEY_RIGHT = 39;\nexport const KEY_DOWN = 40;\nexport const KEY_BACKSPACE = 8;\nexport const KEY_DELETE = 46;\nexport const KEY_TAB = 9;\nexport const IS_MAC = typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT = IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n//# sourceMappingURL=constants.js.map","export default {\n    options: [],\n    optgroups: [],\n    plugins: [],\n    delimiter: ',',\n    splitOn: null, // regexp or string for splitting up values from a paste command\n    persist: true,\n    diacritics: true,\n    create: null,\n    createOnBlur: false,\n    createFilter: null,\n    clearAfterSelect: false,\n    highlight: true,\n    openOnFocus: true,\n    shouldOpen: null,\n    maxOptions: 50,\n    maxItems: null,\n    hideSelected: null,\n    duplicates: false,\n    addPrecedence: false,\n    selectOnTab: false,\n    preload: null,\n    allowEmptyOption: false,\n    //closeAfterSelect: false,\n    refreshThrottle: 300,\n    loadThrottle: 300,\n    loadingClass: 'loading',\n    dataAttr: null, //'data-data',\n    optgroupField: 'optgroup',\n    valueField: 'value',\n    labelField: 'text',\n    disabledField: 'disabled',\n    optgroupLabelField: 'label',\n    optgroupValueField: 'value',\n    lockOptgroupOrder: false,\n    sortField: '$order',\n    searchField: ['text'],\n    searchConjunction: 'and',\n    mode: null,\n    wrapperClass: 'ts-wrapper',\n    controlClass: 'ts-control',\n    dropdownClass: 'ts-dropdown',\n    dropdownContentClass: 'ts-dropdown-content',\n    itemClass: 'item',\n    optionClass: 'option',\n    dropdownParent: null,\n    controlInput: '<input type=\"text\" autocomplete=\"off\" size=\"1\" />',\n    copyClassesToDropdown: false,\n    placeholder: null,\n    hidePlaceholder: null,\n    shouldLoad: function (query) {\n        return query.length > 0;\n    },\n    /*\n    load                 : null, // function(query, callback) { ... }\n    score                : null, // function(search) { ... }\n    onInitialize         : null, // function() { ... }\n    onChange             : null, // function(value) { ... }\n    onItemAdd            : null, // function(value, $item) { ... }\n    onItemRemove         : null, // function(value) { ... }\n    onClear              : null, // function() { ... }\n    onOptionAdd          : null, // function(value, data) { ... }\n    onOptionRemove       : null, // function(value) { ... }\n    onOptionClear        : null, // function() { ... }\n    onOptionGroupAdd     : null, // function(id, data) { ... }\n    onOptionGroupRemove  : null, // function(id) { ... }\n    onOptionGroupClear   : null, // function() { ... }\n    onDropdownOpen       : null, // function(dropdown) { ... }\n    onDropdownClose      : null, // function(dropdown) { ... }\n    onType               : null, // function(str) { ... }\n    onDelete             : null, // function(values) { ... }\n    */\n    render: {\n    /*\n    item: null,\n    optgroup: null,\n    optgroup_header: null,\n    option: null,\n    option_create: null\n    */\n    }\n};\n//# sourceMappingURL=defaults.js.map","import defaults from \"./defaults.js\";\nimport { hash_key, iterate } from \"./utils.js\";\nexport default function getSettings(input, settings_user) {\n    var settings = Object.assign({}, defaults, settings_user);\n    var attr_data = settings.dataAttr;\n    var field_label = settings.labelField;\n    var field_value = settings.valueField;\n    var field_disabled = settings.disabledField;\n    var field_optgroup = settings.optgroupField;\n    var field_optgroup_label = settings.optgroupLabelField;\n    var field_optgroup_value = settings.optgroupValueField;\n    var tag_name = input.tagName.toLowerCase();\n    var placeholder = input.getAttribute('placeholder') || input.getAttribute('data-placeholder');\n    if (!placeholder && !settings.allowEmptyOption) {\n        let option = input.querySelector('option[value=\"\"]');\n        if (option) {\n            placeholder = option.textContent;\n        }\n    }\n    var settings_element = {\n        placeholder: placeholder,\n        options: [],\n        optgroups: [],\n        items: [],\n        maxItems: null,\n    };\n    /**\n     * Initialize from a <select> element.\n     *\n     */\n    var init_select = () => {\n        var tagName;\n        var options = settings_element.options;\n        var optionsMap = {};\n        var group_count = 1;\n        let $order = 0;\n        var readData = (el) => {\n            var data = Object.assign({}, el.dataset); // get plain object from DOMStringMap\n            var json = attr_data && data[attr_data];\n            if (typeof json === 'string' && json.length) {\n                data = Object.assign(data, JSON.parse(json));\n            }\n            return data;\n        };\n        var addOption = (option, group) => {\n            var value = hash_key(option.value);\n            if (value == null)\n                return;\n            if (!value && !settings.allowEmptyOption)\n                return;\n            // if the option already exists, it's probably been\n            // duplicated in another optgroup. in this case, push\n            // the current group to the \"optgroup\" property on the\n            // existing option so that it's rendered in both places.\n            if (optionsMap.hasOwnProperty(value)) {\n                if (group) {\n                    var arr = optionsMap[value][field_optgroup];\n                    if (!arr) {\n                        optionsMap[value][field_optgroup] = group;\n                    }\n                    else if (!Array.isArray(arr)) {\n                        optionsMap[value][field_optgroup] = [arr, group];\n                    }\n                    else {\n                        arr.push(group);\n                    }\n                }\n            }\n            else {\n                var option_data = readData(option);\n                option_data[field_label] = option_data[field_label] || option.textContent;\n                option_data[field_value] = option_data[field_value] || value;\n                option_data[field_disabled] = option_data[field_disabled] || option.disabled;\n                option_data[field_optgroup] = option_data[field_optgroup] || group;\n                option_data.$option = option;\n                option_data.$order = option_data.$order || ++$order;\n                optionsMap[value] = option_data;\n                options.push(option_data);\n            }\n            if (option.selected) {\n                settings_element.items.push(value);\n            }\n        };\n        var addGroup = (optgroup) => {\n            var id, optgroup_data;\n            optgroup_data = readData(optgroup);\n            optgroup_data[field_optgroup_label] = optgroup_data[field_optgroup_label] || optgroup.getAttribute('label') || '';\n            optgroup_data[field_optgroup_value] = optgroup_data[field_optgroup_value] || group_count++;\n            optgroup_data[field_disabled] = optgroup_data[field_disabled] || optgroup.disabled;\n            optgroup_data.$order = optgroup_data.$order || ++$order;\n            settings_element.optgroups.push(optgroup_data);\n            id = optgroup_data[field_optgroup_value];\n            iterate(optgroup.children, (option) => {\n                addOption(option, id);\n            });\n        };\n        settings_element.maxItems = input.hasAttribute('multiple') ? null : 1;\n        iterate(input.children, (child) => {\n            tagName = child.tagName.toLowerCase();\n            if (tagName === 'optgroup') {\n                addGroup(child);\n            }\n            else if (tagName === 'option') {\n                addOption(child);\n            }\n        });\n    };\n    /**\n     * Initialize from a <input type=\"text\"> element.\n     *\n     */\n    var init_textbox = () => {\n        var _a, _b;\n        const data_raw = input.getAttribute(attr_data);\n        if (!data_raw) {\n            var value = (_b = (_a = input === null || input === void 0 ? void 0 : input.value) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : '';\n            if (!settings.allowEmptyOption && !value.length)\n                return;\n            const values = value.split(settings.delimiter);\n            iterate(values, (value) => {\n                const option = {};\n                option[field_label] = value;\n                option[field_value] = value;\n                settings_element.options.push(option);\n            });\n            settings_element.items = values;\n        }\n        else {\n            settings_element.options = JSON.parse(data_raw);\n            iterate(settings_element.options, (opt) => {\n                settings_element.items.push(opt[field_value]);\n            });\n        }\n    };\n    if (tag_name === 'select') {\n        init_select();\n    }\n    else {\n        init_textbox();\n    }\n    return Object.assign({}, defaults, settings_element, settings_user);\n}\n;\n//# sourceMappingURL=getSettings.js.map","import MicroEvent from \"./contrib/microevent.js\";\nimport MicroPlugin from \"./contrib/microplugin.js\";\nimport { Sifter } from '@orchidjs/sifter';\nimport { escape_regex } from '@orchidjs/unicode-variants';\nimport { highlight, removeHighlight } from \"./contrib/highlight.js\";\nimport * as constants from \"./constants.js\";\nimport getSettings from \"./getSettings.js\";\nimport { hash_key, get_hash, escape_html, debounce_events, getSelection, preventDefault, addEvent, loadDebounce, timeout, isKeyDown, getId, addSlashes, append, iterate } from \"./utils.js\";\nimport { getDom, isHtmlString, escapeQuery, triggerEvent, applyCSS, addClasses, removeClasses, parentMatch, getTail, isEmptyObject, nodeIndex, setAttr, replaceNode } from \"./vanilla.js\";\nvar instance_i = 0;\nexport default class TomSelect extends MicroPlugin(MicroEvent) {\n    constructor(input_arg, user_settings) {\n        super();\n        this.order = 0;\n        this.isOpen = false;\n        this.isDisabled = false;\n        this.isReadOnly = false;\n        this.isInvalid = false; // @deprecated 1.8\n        this.isValid = true;\n        this.isLocked = false;\n        this.isFocused = false;\n        this.isInputHidden = false;\n        this.isSetup = false;\n        this.isDropdownContentStale = true;\n        this.ignoreFocus = false;\n        this.ignoreHover = false;\n        this.hasOptions = false;\n        this.lastValue = '';\n        this.caretPos = 0;\n        this.loading = 0;\n        this.loadedSearches = {};\n        this.activeOption = null;\n        this.activeItems = [];\n        this.optgroups = {};\n        this.options = {};\n        this.userOptions = {};\n        this.items = [];\n        this.refreshTimeout = null;\n        instance_i++;\n        var dir;\n        var input = getDom(input_arg);\n        if (input.tomselect) {\n            throw new Error('Tom Select already initialized on this element');\n        }\n        input.tomselect = this;\n        // detect rtl environment\n        var computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);\n        dir = computedStyle.getPropertyValue('direction');\n        // setup default state\n        const settings = getSettings(input, user_settings);\n        this.settings = settings;\n        this.input = input;\n        this.tabIndex = input.tabIndex || 0;\n        this.is_select_tag = input.tagName.toLowerCase() === 'select';\n        this.rtl = /rtl/i.test(dir);\n        this.inputId = getId(input, 'tomselect-' + instance_i);\n        this.isRequired = input.required;\n        // search system\n        this.sifter = new Sifter(this.options, { diacritics: settings.diacritics });\n        // option-dependent defaults\n        settings.mode = settings.mode || (settings.maxItems === 1 ? 'single' : 'multi');\n        if (typeof settings.hideSelected !== 'boolean') {\n            settings.hideSelected = settings.mode === 'multi';\n        }\n        if (typeof settings.hidePlaceholder !== 'boolean') {\n            settings.hidePlaceholder = settings.mode !== 'multi';\n        }\n        // set up createFilter callback\n        var filter = settings.createFilter;\n        if (typeof filter !== 'function') {\n            if (typeof filter === 'string') {\n                filter = new RegExp(filter);\n            }\n            if (filter instanceof RegExp) {\n                settings.createFilter = (input) => filter.test(input);\n            }\n            else {\n                settings.createFilter = (value) => {\n                    return this.settings.duplicates || !this.options[value];\n                };\n            }\n        }\n        this.initializePlugins(settings.plugins);\n        this.setupCallbacks();\n        this.setupTemplates();\n        // Create all elements\n        const wrapper = getDom('<div>');\n        const control = getDom('<div>');\n        const dropdown = this._render('dropdown');\n        const dropdown_content = getDom(`<div role=\"listbox\" tabindex=\"-1\">`);\n        const classes = this.input.getAttribute('class') || '';\n        const inputMode = settings.mode;\n        var control_input;\n        addClasses(wrapper, settings.wrapperClass, classes, inputMode);\n        addClasses(control, settings.controlClass);\n        append(wrapper, control);\n        addClasses(dropdown, settings.dropdownClass, inputMode);\n        if (settings.copyClassesToDropdown) {\n            addClasses(dropdown, classes);\n        }\n        addClasses(dropdown_content, settings.dropdownContentClass);\n        append(dropdown, dropdown_content);\n        getDom(settings.dropdownParent || wrapper).appendChild(dropdown);\n        // default controlInput\n        if (isHtmlString(settings.controlInput)) {\n            control_input = getDom(settings.controlInput);\n            // set attributes\n            var attrs = ['autocorrect', 'autocapitalize', 'autocomplete', 'spellcheck', 'aria-label'];\n            iterate(attrs, (attr) => {\n                if (input.getAttribute(attr)) {\n                    setAttr(control_input, { [attr]: input.getAttribute(attr) });\n                }\n            });\n            control_input.tabIndex = -1;\n            control.appendChild(control_input);\n            this.focus_node = control_input;\n            // dom element\n        }\n        else if (settings.controlInput) {\n            control_input = getDom(settings.controlInput);\n            this.focus_node = control_input;\n        }\n        else {\n            control_input = getDom('<input/>');\n            this.focus_node = control;\n        }\n        this.wrapper = wrapper;\n        this.dropdown = dropdown;\n        this.dropdown_content = dropdown_content;\n        this.control = control;\n        this.control_input = control_input;\n        this.setup();\n    }\n    /**\n     * set up event bindings.\n     *\n     */\n    setup() {\n        const self = this;\n        const settings = self.settings;\n        const control_input = self.control_input;\n        const dropdown = self.dropdown;\n        const dropdown_content = self.dropdown_content;\n        const wrapper = self.wrapper;\n        const control = self.control;\n        const input = self.input;\n        const focus_node = self.focus_node;\n        const passive_event = { passive: true };\n        const listboxId = self.inputId + '-ts-dropdown';\n        setAttr(dropdown_content, {\n            id: listboxId\n        });\n        setAttr(focus_node, {\n            role: 'combobox',\n            'aria-haspopup': 'listbox',\n            'aria-expanded': 'false',\n            'aria-controls': listboxId\n        });\n        const control_id = getId(focus_node, self.inputId + '-ts-control');\n        const query = \"label[for='\" + escapeQuery(self.inputId) + \"']\";\n        const label = document.querySelector(query);\n        const label_click = self.focus.bind(self);\n        if (label) {\n            addEvent(label, 'click', label_click);\n            setAttr(label, { for: control_id });\n            const label_id = getId(label, self.inputId + '-ts-label');\n            setAttr(focus_node, { 'aria-labelledby': label_id });\n            setAttr(dropdown_content, { 'aria-labelledby': label_id });\n        }\n        wrapper.style.width = input.style.width;\n        wrapper.style.minWidth = input.style.minWidth;\n        wrapper.style.maxWidth = input.style.maxWidth;\n        if (self.plugins.names.length) {\n            const classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n            addClasses([wrapper, dropdown], classes_plugins);\n        }\n        if ((settings.maxItems === null || settings.maxItems > 1) && self.is_select_tag) {\n            setAttr(input, { multiple: 'multiple' });\n        }\n        if (settings.placeholder) {\n            setAttr(control_input, { placeholder: settings.placeholder });\n        }\n        // if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n        if (!settings.splitOn && settings.delimiter) {\n            settings.splitOn = new RegExp('\\\\s*' + escape_regex(settings.delimiter) + '+\\\\s*');\n        }\n        // debounce user defined load() if loadThrottle > 0\n        // after initializePlugins() so plugins can create/modify user defined loaders\n        if (settings.load && settings.loadThrottle) {\n            settings.load = loadDebounce(settings.load, settings.loadThrottle);\n        }\n        addEvent(dropdown, 'mousemove', () => {\n            self.ignoreHover = false;\n        });\n        addEvent(dropdown, 'mouseenter', (e) => {\n            var target_match = parentMatch(e.target, '[data-selectable]', dropdown);\n            if (target_match)\n                self.onOptionHover(e, target_match);\n        }, { capture: true });\n        // clicking on an option should select it\n        addEvent(dropdown, 'click', (evt) => {\n            const option = parentMatch(evt.target, '[data-selectable]');\n            if (option) {\n                self.onOptionSelect(evt, option);\n                preventDefault(evt, true);\n            }\n        });\n        addEvent(control, 'click', (evt) => {\n            var target_match = parentMatch(evt.target, '[data-ts-item]', control);\n            if (target_match && self.onItemSelect(evt, target_match)) {\n                preventDefault(evt, true);\n                return;\n            }\n            // retain focus (see control_input mousedown)\n            if (control_input.value != '') {\n                return;\n            }\n            self.onClick();\n            preventDefault(evt, true);\n        });\n        // keydown on focus_node for arrow_down/arrow_up\n        addEvent(focus_node, 'keydown', (e) => self.onKeyDown(e));\n        // keypress and input/keyup\n        addEvent(control_input, 'keypress', (e) => self.onKeyPress(e));\n        addEvent(control_input, 'input', (e) => self.onInput(e));\n        addEvent(focus_node, 'blur', (e) => self.onBlur(e));\n        addEvent(focus_node, 'focus', (e) => self.onFocus(e));\n        addEvent(control_input, 'paste', (e) => self.onPaste(e));\n        const doc_mousedown = (evt) => {\n            // blur if target is outside of this instance\n            // dropdown is not always inside wrapper\n            const target = evt.composedPath()[0];\n            if (!wrapper.contains(target) && !dropdown.contains(target)) {\n                if (self.isFocused) {\n                    self.blur();\n                }\n                self.inputState();\n                return;\n            }\n            // retain focus by preventing native handling. if the\n            // event target is the input it should not be modified.\n            // otherwise, text selection within the input won't work.\n            // Fixes bug #212 which is no covered by tests\n            if (target == control_input && self.isOpen) {\n                evt.stopPropagation();\n                // clicking anywhere in the control should not blur the control_input (which would close the dropdown)\n            }\n            else {\n                preventDefault(evt, true);\n            }\n        };\n        const win_scroll = () => {\n            if (self.isOpen) {\n                self.positionDropdown();\n            }\n        };\n        const input_invalid = () => {\n            if (self.isValid) {\n                self.isValid = false;\n                self.isInvalid = true;\n                self.refreshState();\n            }\n        };\n        addEvent(input, 'invalid', input_invalid);\n        addEvent(document, 'mousedown', doc_mousedown);\n        addEvent(window, 'scroll', win_scroll, passive_event);\n        addEvent(window, 'resize', win_scroll, passive_event);\n        this._destroy = () => {\n            input.removeEventListener('invalid', input_invalid);\n            document.removeEventListener('mousedown', doc_mousedown);\n            window.removeEventListener('scroll', win_scroll);\n            window.removeEventListener('resize', win_scroll);\n            if (label)\n                label.removeEventListener('click', label_click);\n        };\n        // store original html and tab index so that they can be\n        // restored when the destroy() method is called.\n        this.revertSettings = {\n            innerHTML: input.innerHTML,\n            tabIndex: input.tabIndex\n        };\n        input.tabIndex = -1;\n        input.insertAdjacentElement('afterend', self.wrapper);\n        self.sync(false);\n        settings.items = [];\n        delete settings.optgroups;\n        delete settings.options;\n        self.refreshItems();\n        self.close(false);\n        self.inputState();\n        self.isSetup = true;\n        self.on('change', this.onChange);\n        addClasses(input, 'tomselected', 'ts-hidden-accessible');\n        self.trigger('initialize');\n        // preload options\n        if (settings.preload === true) {\n            self.preload();\n        }\n    }\n    /**\n     * Register options and optgroups\n     *\n     */\n    setupOptions(options = [], optgroups = []) {\n        // build options table\n        this.addOptions(options);\n        // build optgroup table\n        iterate(optgroups, (optgroup) => {\n            this.registerOptionGroup(optgroup);\n        });\n    }\n    /**\n     * Sets up default rendering functions.\n     */\n    setupTemplates() {\n        var self = this;\n        var field_label = self.settings.labelField;\n        var field_optgroup = self.settings.optgroupLabelField;\n        var templates = {\n            'optgroup': (data) => {\n                let optgroup = document.createElement('div');\n                optgroup.className = 'optgroup';\n                optgroup.appendChild(data.options);\n                return optgroup;\n            },\n            'optgroup_header': (data, escape) => {\n                return '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n            },\n            'option': (data, escape) => {\n                return '<div>' + escape(data[field_label]) + '</div>';\n            },\n            'item': (data, escape) => {\n                return '<div>' + escape(data[field_label]) + '</div>';\n            },\n            'option_create': (data, escape) => {\n                return '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n            },\n            'no_results': () => {\n                return '<div class=\"no-results\">No results found</div>';\n            },\n            'loading': () => {\n                return '<div class=\"spinner\"></div>';\n            },\n            'not_loading': () => { },\n            'dropdown': () => {\n                return '<div></div>';\n            }\n        };\n        self.settings.render = Object.assign({}, templates, self.settings.render);\n    }\n    /**\n     * Maps fired events to callbacks provided\n     * in the settings used when creating the control.\n     */\n    setupCallbacks() {\n        var key, fn;\n        var callbacks = {\n            'initialize': 'onInitialize',\n            'change': 'onChange',\n            'item_add': 'onItemAdd',\n            'item_remove': 'onItemRemove',\n            'item_select': 'onItemSelect',\n            'clear': 'onClear',\n            'option_add': 'onOptionAdd',\n            'option_remove': 'onOptionRemove',\n            'option_clear': 'onOptionClear',\n            'optgroup_add': 'onOptionGroupAdd',\n            'optgroup_remove': 'onOptionGroupRemove',\n            'optgroup_clear': 'onOptionGroupClear',\n            'dropdown_open': 'onDropdownOpen',\n            'dropdown_close': 'onDropdownClose',\n            'type': 'onType',\n            'load': 'onLoad',\n            'focus': 'onFocus',\n            'blur': 'onBlur'\n        };\n        for (key in callbacks) {\n            fn = this.settings[callbacks[key]];\n            if (fn)\n                this.on(key, fn);\n        }\n    }\n    /**\n     * Sync the Tom Select instance with the original input or select\n     *\n     */\n    sync(get_settings = true) {\n        const self = this;\n        const settings = get_settings ? getSettings(self.input, { delimiter: self.settings.delimiter, allowEmptyOption: self.settings.allowEmptyOption }) : self.settings;\n        self.setupOptions(settings.options, settings.optgroups);\n        self.setValue(settings.items || [], true); // silent prevents recursion\n        if (self.input.disabled) {\n            self.disable();\n        }\n        else if (self.input.readOnly) {\n            self.setReadOnly(true);\n        }\n        else {\n            self.enable(); //sets tabIndex\n        }\n        self.lastQuery = null; // so updated options will be displayed in dropdown\n    }\n    /**\n     * Triggered when the main control element\n     * has a click event.\n     *\n     */\n    onClick() {\n        var self = this;\n        if (self.activeItems.length > 0) {\n            self.clearActiveItems();\n            self.focus();\n            return;\n        }\n        if (self.isFocused && self.isOpen) {\n            self.blur();\n        }\n        else {\n            self.focus();\n        }\n    }\n    /**\n     * @deprecated v1.7\n     *\n     */\n    onMouseDown() { }\n    /**\n     * Triggered when the value of the control has been changed.\n     * This should propagate the event to the original DOM\n     * input / select element.\n     */\n    onChange() {\n        triggerEvent(this.input, 'input');\n        triggerEvent(this.input, 'change');\n    }\n    /**\n     * Triggered on <input> paste.\n     *\n     */\n    onPaste(e) {\n        var self = this;\n        if (self.isInputHidden || self.isLocked) {\n            preventDefault(e);\n            return;\n        }\n        // If a regex or string is included, this will split the pasted\n        // input and create Items for each separate value\n        if (!self.settings.splitOn) {\n            return;\n        }\n        // Wait for pasted text to be recognized in value\n        setTimeout(() => {\n            var pastedText = self.inputValue();\n            if (!pastedText.match(self.settings.splitOn)) {\n                return;\n            }\n            var splitInput = pastedText.trim().split(self.settings.splitOn);\n            iterate(splitInput, (piece) => {\n                const hash = hash_key(piece);\n                if (hash) {\n                    if (this.options[piece]) {\n                        self.addItem(piece);\n                    }\n                    else {\n                        self.createItem(piece);\n                    }\n                }\n            });\n        }, 0);\n    }\n    /**\n     * Triggered on <input> keypress.\n     *\n     */\n    onKeyPress(e) {\n        var self = this;\n        if (self.isLocked) {\n            preventDefault(e);\n            return;\n        }\n        var character = String.fromCharCode(e.keyCode || e.which);\n        if (self.settings.create && self.settings.mode === 'multi' && character === self.settings.delimiter) {\n            self.createItem();\n            preventDefault(e);\n            return;\n        }\n    }\n    /**\n     * Triggered on <input> keydown.\n     *\n     */\n    onKeyDown(e) {\n        var self = this;\n        self.ignoreHover = true;\n        if (self.isLocked) {\n            if (e.keyCode !== constants.KEY_TAB) {\n                preventDefault(e);\n            }\n            return;\n        }\n        switch (e.keyCode) {\n            // ctrl+A: select all\n            case constants.KEY_A:\n                if (isKeyDown(constants.KEY_SHORTCUT, e)) {\n                    if (self.control_input.value == '') {\n                        preventDefault(e);\n                        self.selectAll();\n                        return;\n                    }\n                }\n                break;\n            // esc: close dropdown\n            case constants.KEY_ESC:\n                if (self.isOpen) {\n                    preventDefault(e, true);\n                    self.close();\n                }\n                self.clearActiveItems();\n                return;\n            // down: open dropdown or move selection down\n            case constants.KEY_DOWN:\n                if (!self.isOpen && self.hasOptions) {\n                    self.open();\n                }\n                else if (self.activeOption) {\n                    let next = self.getAdjacent(self.activeOption, 1);\n                    if (next)\n                        self.setActiveOption(next);\n                }\n                preventDefault(e);\n                return;\n            // up: move selection up\n            case constants.KEY_UP:\n                if (self.activeOption) {\n                    let prev = self.getAdjacent(self.activeOption, -1);\n                    if (prev)\n                        self.setActiveOption(prev);\n                }\n                preventDefault(e);\n                return;\n            // return: select active option\n            case constants.KEY_RETURN:\n                if (self.canSelect(self.activeOption)) {\n                    self.onOptionSelect(e, self.activeOption);\n                    preventDefault(e);\n                    // if the option_create=null, the dropdown might be closed\n                }\n                else if (self.settings.create && self.createItem()) {\n                    preventDefault(e);\n                    // don't submit form when searching for a value\n                }\n                else if (document.activeElement == self.control_input && self.isOpen) {\n                    preventDefault(e);\n                }\n                return;\n            // left: modifiy item selection to the left\n            case constants.KEY_LEFT:\n                self.advanceSelection(-1, e);\n                return;\n            // right: modifiy item selection to the right\n            case constants.KEY_RIGHT:\n                self.advanceSelection(1, e);\n                return;\n            // tab: select active option and/or create item\n            case constants.KEY_TAB:\n                if (self.settings.selectOnTab) {\n                    if (self.canSelect(self.activeOption)) {\n                        self.onOptionSelect(e, self.activeOption);\n                        // prevent default [tab] behaviour of jump to the next field\n                        // if select isFull, then the dropdown won't be open and [tab] will work normally\n                        preventDefault(e);\n                    }\n                    else if (self.settings.create && self.createItem()) {\n                        preventDefault(e);\n                    }\n                }\n                return;\n            // delete|backspace: delete items\n            case constants.KEY_BACKSPACE:\n            case constants.KEY_DELETE:\n                self.deleteSelection(e);\n                return;\n        }\n        // don't enter text in the control_input when active items are selected\n        if (self.isInputHidden && !isKeyDown(constants.KEY_SHORTCUT, e)) {\n            preventDefault(e);\n        }\n    }\n    /**\n     * Triggered on <input> keyup.\n     *\n     */\n    onInput(e) {\n        if (this.isLocked) {\n            return;\n        }\n        const value = this.inputValue();\n        if (this.lastValue === value)\n            return;\n        this.lastValue = value;\n        if (value == '') {\n            this._onInput();\n            return;\n        }\n        if (this.refreshTimeout) {\n            window.clearTimeout(this.refreshTimeout);\n        }\n        this.refreshTimeout = timeout(() => {\n            this.refreshTimeout = null;\n            this._onInput();\n        }, this.settings.refreshThrottle);\n    }\n    _onInput() {\n        const value = this.lastValue;\n        if (this.settings.shouldLoad.call(this, value)) {\n            this.load(value);\n        }\n        this.refreshOptions();\n        this.trigger('type', value);\n    }\n    /**\n     * Triggered when the user rolls over\n     * an option in the autocomplete dropdown menu.\n     *\n     */\n    onOptionHover(evt, option) {\n        if (this.ignoreHover)\n            return;\n        this.setActiveOption(option, false);\n    }\n    /**\n     * Triggered on <input> focus.\n     *\n     */\n    onFocus(e) {\n        var self = this;\n        var wasFocused = self.isFocused;\n        if (self.isDisabled || self.isReadOnly) {\n            self.blur();\n            preventDefault(e);\n            return;\n        }\n        if (self.ignoreFocus)\n            return;\n        self.isFocused = true;\n        if (self.settings.preload === 'focus')\n            self.preload();\n        if (!wasFocused)\n            self.trigger('focus');\n        if (!self.activeItems.length) {\n            self.inputState();\n            self.refreshOptions(!!self.settings.openOnFocus);\n        }\n        self.refreshState();\n    }\n    /**\n     * Triggered on <input> blur.\n     *\n     */\n    onBlur(e) {\n        if (document.hasFocus() === false)\n            return;\n        var self = this;\n        if (!self.isFocused)\n            return;\n        self.isFocused = false;\n        self.ignoreFocus = false;\n        var deactivate = () => {\n            self.close();\n            self.setActiveItem();\n            self.setCaret(self.items.length);\n            self.trigger('blur');\n        };\n        if (self.settings.create && self.settings.createOnBlur) {\n            self.createItem(null, deactivate);\n        }\n        else {\n            deactivate();\n        }\n    }\n    /**\n     * Triggered when the user clicks on an option\n     * in the autocomplete dropdown menu.\n     *\n     */\n    onOptionSelect(evt, option) {\n        var value, self = this;\n        // should not be possible to trigger a option under a disabled optgroup\n        if (option.parentElement && option.parentElement.matches('[data-disabled]')) {\n            return;\n        }\n        if (option.classList.contains('create')) {\n            self.createItem(null, () => {\n                if (self.settings.closeAfterSelect) {\n                    self.close();\n                }\n                else if (self.settings.clearAfterSelect) {\n                    self.setTextboxValue();\n                }\n            });\n        }\n        else {\n            value = option.dataset.value;\n            if (typeof value !== 'undefined') {\n                self.isDropdownContentStale = self.settings.hideSelected;\n                self.addItem(value);\n                if (self.settings.closeAfterSelect) {\n                    self.close();\n                }\n                else if (self.settings.clearAfterSelect) {\n                    self.setTextboxValue();\n                }\n                if (!self.settings.hideSelected && evt.type && /click/.test(evt.type)) {\n                    self.setActiveOption(option);\n                }\n            }\n        }\n    }\n    /**\n     * Return true if the given option can be selected\n     *\n     */\n    canSelect(option) {\n        if (this.isOpen && option && this.dropdown_content.contains(option)) {\n            return true;\n        }\n        return false;\n    }\n    /**\n     * Triggered when the user clicks on an item\n     * that has been selected.\n     *\n     */\n    onItemSelect(evt, item) {\n        var self = this;\n        if (!self.isLocked && self.settings.mode === 'multi') {\n            preventDefault(evt);\n            self.setActiveItem(item, evt);\n            return true;\n        }\n        return false;\n    }\n    /**\n     * Determines whether or not to invoke\n     * the user-provided option provider / loader\n     *\n     * Note, there is a subtle difference between\n     * this.canLoad() and this.settings.shouldLoad();\n     *\n     *\t- settings.shouldLoad() is a user-input validator.\n     *\tWhen false is returned, the not_loading template\n     *\twill be added to the dropdown\n     *\n     *\t- canLoad() is lower level validator that checks\n     * \tthe Tom Select instance. There is no inherent user\n     *\tfeedback when canLoad returns false\n     *\n     */\n    canLoad(value) {\n        if (!this.settings.load)\n            return false;\n        if (this.loadedSearches.hasOwnProperty(value))\n            return false;\n        return true;\n    }\n    /**\n     * Invokes the user-provided option provider / loader.\n     *\n     */\n    load(value) {\n        const self = this;\n        if (!self.canLoad(value))\n            return;\n        addClasses(self.wrapper, self.settings.loadingClass);\n        self.loading++;\n        const callback = self.loadCallback.bind(self);\n        self.settings.load.call(self, value, callback);\n    }\n    /**\n     * Invoked by the user-provided option provider\n     *\n     */\n    loadCallback(options, optgroups) {\n        const self = this;\n        self.loading = Math.max(self.loading - 1, 0);\n        self.isDropdownContentStale = true;\n        self.clearActiveOption(); // when new results load, focus should be on first option\n        self.setupOptions(options, optgroups);\n        self.refreshOptions(self.isFocused && !self.isInputHidden);\n        if (!self.loading) {\n            removeClasses(self.wrapper, self.settings.loadingClass);\n        }\n        self.trigger('load', options, optgroups);\n    }\n    preload() {\n        var classList = this.wrapper.classList;\n        if (classList.contains('preloaded'))\n            return;\n        classList.add('preloaded');\n        this.load('');\n    }\n    /**\n     * Sets the input field of the control to the specified value.\n     *\n     */\n    setTextboxValue(value = '') {\n        var input = this.control_input;\n        var changed = input.value !== value;\n        if (changed) {\n            input.value = value;\n            triggerEvent(input, 'update');\n            this.lastValue = value;\n        }\n    }\n    /**\n     * Returns the value of the control. If multiple items\n     * can be selected (e.g. <select multiple>), this returns\n     * an array. If only one item can be selected, this\n     * returns a string.\n     *\n     */\n    getValue() {\n        if (this.is_select_tag && this.input.hasAttribute('multiple')) {\n            return this.items;\n        }\n        return this.items.join(this.settings.delimiter);\n    }\n    /**\n     * Resets the selected items to the given value.\n     *\n     */\n    setValue(value, silent) {\n        var events = silent ? [] : ['change'];\n        debounce_events(this, events, () => {\n            this.clear(silent);\n            this.addItems(value, silent);\n        });\n    }\n    /**\n     * Resets the number of max items to the given value\n     *\n     */\n    setMaxItems(value) {\n        if (value === 0)\n            value = null; //reset to unlimited items.\n        this.settings.maxItems = value;\n        this.refreshState();\n    }\n    /**\n     * Sets the selected item.\n     *\n     */\n    setActiveItem(item, e) {\n        var self = this;\n        var eventName;\n        var i, begin, end, swap;\n        var last;\n        if (self.settings.mode === 'single')\n            return;\n        // clear the active selection\n        if (!item) {\n            self.clearActiveItems();\n            if (self.isFocused) {\n                self.inputState();\n            }\n            return;\n        }\n        // modify selection\n        eventName = e && e.type.toLowerCase();\n        if (eventName === 'click' && isKeyDown('shiftKey', e) && self.activeItems.length) {\n            last = self.getLastActive();\n            begin = Array.prototype.indexOf.call(self.control.children, last);\n            end = Array.prototype.indexOf.call(self.control.children, item);\n            if (begin > end) {\n                swap = begin;\n                begin = end;\n                end = swap;\n            }\n            for (i = begin; i <= end; i++) {\n                item = self.control.children[i];\n                if (self.activeItems.indexOf(item) === -1) {\n                    self.setActiveItemClass(item);\n                }\n            }\n            preventDefault(e);\n        }\n        else if ((eventName === 'click' && isKeyDown(constants.KEY_SHORTCUT, e)) || (eventName === 'keydown' && isKeyDown('shiftKey', e))) {\n            if (item.classList.contains('active')) {\n                self.removeActiveItem(item);\n            }\n            else {\n                self.setActiveItemClass(item);\n            }\n        }\n        else {\n            self.clearActiveItems();\n            self.setActiveItemClass(item);\n        }\n        // ensure control has focus\n        self.inputState();\n        if (!self.isFocused) {\n            self.focus();\n        }\n    }\n    /**\n     * Set the active and last-active classes\n     *\n     */\n    setActiveItemClass(item) {\n        const self = this;\n        const last_active = self.control.querySelector('.last-active');\n        if (last_active)\n            removeClasses(last_active, 'last-active');\n        addClasses(item, 'active last-active');\n        self.trigger('item_select', item);\n        if (self.activeItems.indexOf(item) == -1) {\n            self.activeItems.push(item);\n        }\n    }\n    /**\n     * Remove active item\n     *\n     */\n    removeActiveItem(item) {\n        var idx = this.activeItems.indexOf(item);\n        this.activeItems.splice(idx, 1);\n        removeClasses(item, 'active');\n    }\n    /**\n     * Clears all the active items\n     *\n     */\n    clearActiveItems() {\n        removeClasses(this.activeItems, 'active');\n        this.activeItems = [];\n    }\n    /**\n     * Sets the selected item in the dropdown menu\n     * of available options.\n     *\n     */\n    setActiveOption(option, scroll = true) {\n        if (option === this.activeOption) {\n            return;\n        }\n        this.clearActiveOption();\n        if (!option)\n            return;\n        this.activeOption = option;\n        setAttr(this.focus_node, { 'aria-activedescendant': option.getAttribute('id') });\n        setAttr(option, { 'aria-selected': 'true' });\n        addClasses(option, 'active');\n        if (scroll)\n            this.scrollToOption(option);\n    }\n    /**\n     * Sets the dropdown_content scrollTop to display the option\n     *\n     */\n    scrollToOption(option, behavior) {\n        if (!option)\n            return;\n        const content = this.dropdown_content;\n        const height_menu = content.clientHeight;\n        const scrollTop = content.scrollTop || 0;\n        const height_item = option.offsetHeight;\n        const y = option.getBoundingClientRect().top - content.getBoundingClientRect().top + scrollTop;\n        if (y + height_item > height_menu + scrollTop) {\n            this.scroll(y - height_menu + height_item, behavior);\n        }\n        else if (y < scrollTop) {\n            this.scroll(y, behavior);\n        }\n    }\n    /**\n     * Scroll the dropdown to the given position\n     *\n     */\n    scroll(scrollTop, behavior) {\n        const content = this.dropdown_content;\n        if (behavior) {\n            content.style.scrollBehavior = behavior;\n        }\n        content.scrollTop = scrollTop;\n        content.style.scrollBehavior = '';\n    }\n    /**\n     * Clears the active option\n     *\n     */\n    clearActiveOption() {\n        if (this.activeOption) {\n            removeClasses(this.activeOption, 'active');\n            setAttr(this.activeOption, { 'aria-selected': null });\n        }\n        this.activeOption = null;\n        setAttr(this.focus_node, { 'aria-activedescendant': null });\n    }\n    /**\n     * Selects all items (CTRL + A).\n     */\n    selectAll() {\n        const self = this;\n        if (self.settings.mode === 'single')\n            return;\n        const activeItems = self.controlChildren();\n        if (!activeItems.length)\n            return;\n        self.inputState();\n        self.close();\n        self.activeItems = activeItems;\n        iterate(activeItems, (item) => {\n            self.setActiveItemClass(item);\n        });\n    }\n    /**\n     * Determines if the control_input should be in a hidden or visible state\n     *\n     */\n    inputState() {\n        var self = this;\n        if (!self.control.contains(self.control_input))\n            return;\n        setAttr(self.control_input, { placeholder: self.settings.placeholder });\n        if (self.activeItems.length > 0 || (!self.isFocused && self.settings.hidePlaceholder && self.items.length > 0)) {\n            self.setTextboxValue();\n            self.isInputHidden = true;\n        }\n        else {\n            if (self.settings.hidePlaceholder && self.items.length > 0) {\n                setAttr(self.control_input, { placeholder: '' });\n            }\n            self.isInputHidden = false;\n        }\n        self.wrapper.classList.toggle('input-hidden', self.isInputHidden);\n    }\n    /**\n     * Get the input value\n     */\n    inputValue() {\n        return this.control_input.value.trim();\n    }\n    /**\n     * Gives the control focus.\n     */\n    focus() {\n        var self = this;\n        if (self.isDisabled || self.isReadOnly)\n            return;\n        self.ignoreFocus = true;\n        const focusTarget = this.control_input.offsetWidth ? this.control_input : this.focus_node;\n        focusTarget.focus();\n        setTimeout(() => {\n            self.ignoreFocus = false;\n            // Fix https://github.com/orchidjs/tom-select/issues/806\n            // Only proceed if this instance's element is still the active element. If Edge autofill\n            // (or anything else) has moved focus to a different element in the interim, calling\n            // onFocus() here would steal focus back and restart the cascade loop.\n            const root = focusTarget.getRootNode();\n            if (root.activeElement !== focusTarget) {\n                return;\n            }\n            this.onFocus();\n        }, 0);\n    }\n    /**\n     * Forces the control out of focus.\n     *\n     */\n    blur() {\n        this.focus_node.blur();\n        this.onBlur();\n    }\n    /**\n     * Returns a function that scores an object\n     * to show how good of a match it is to the\n     * provided query.\n     *\n     * @return {function}\n     */\n    getScoreFunction(query) {\n        return this.sifter.getScoreFunction(query, this.getSearchOptions());\n    }\n    /**\n     * Returns search options for sifter (the system\n     * for scoring and sorting results).\n     *\n     * @see https://github.com/orchidjs/sifter.js\n     * @return {object}\n     */\n    getSearchOptions() {\n        var settings = this.settings;\n        var sort = settings.sortField;\n        if (typeof settings.sortField === 'string') {\n            sort = [{ field: settings.sortField }];\n        }\n        return {\n            fields: settings.searchField,\n            conjunction: settings.searchConjunction,\n            sort: sort,\n            nesting: settings.nesting\n        };\n    }\n    /**\n     * Searches through available options and returns\n     * a sorted array of matches.\n     *\n     */\n    search(query) {\n        var result, calculateScore;\n        var self = this;\n        var options = this.getSearchOptions();\n        // validate user-provided result scoring function\n        if (self.settings.score) {\n            calculateScore = self.settings.score.call(self, query);\n            if (typeof calculateScore !== 'function') {\n                throw new Error('Tom Select \"score\" setting must be a function that returns a function');\n            }\n        }\n        // perform search\n        if (self.isDropdownContentStale || query !== self.lastQuery) {\n            self.lastQuery = query;\n            // temp fix for https://github.com/orchidjs/tom-select/issues/987\n            // UI crashed when more than 30 same chars in a row, prevent search and return empt result\n            if (/(.)\\1{15,}/.test(query)) {\n                query = '';\n            }\n            result = self.sifter.search(query, Object.assign(options, { score: calculateScore }));\n            self.currentResults = result;\n        }\n        else {\n            result = Object.assign({}, self.currentResults);\n        }\n        // filter out selected items\n        if (self.settings.hideSelected) {\n            result.items = result.items.filter((item) => {\n                let hashed = hash_key(item.id);\n                return !(hashed !== null && self.items.indexOf(hashed) !== -1);\n            });\n        }\n        return result;\n    }\n    /**\n     * Refreshes the list of available options shown\n     * in the autocomplete dropdown menu.\n     *\n     */\n    refreshOptions(triggerDropdown = true) {\n        var i, j, k, n, optgroup, optgroups, html, has_create_option, active_group;\n        var create;\n        const groups = {};\n        const groups_order = [];\n        var self = this;\n        var query = self.inputValue();\n        const same_query = query === self.lastQuery || (query == '' && self.lastQuery == null);\n        var results = self.search(query);\n        var active_option = null;\n        var show_dropdown = self.settings.shouldOpen || false;\n        var dropdown_content = self.dropdown_content;\n        if (same_query) {\n            active_option = self.activeOption;\n            if (active_option) {\n                active_group = active_option.closest('[data-group]');\n            }\n        }\n        // build markup\n        n = results.items.length;\n        if (typeof self.settings.maxOptions === 'number') {\n            n = Math.min(n, self.settings.maxOptions);\n        }\n        if (n > 0) {\n            show_dropdown = true;\n        }\n        // get fragment for group and the position of the group in group_order\n        const getGroupFragment = (optgroup, order) => {\n            let group_order_i = groups[optgroup];\n            if (group_order_i !== undefined) {\n                let order_group = groups_order[group_order_i];\n                if (order_group !== undefined) {\n                    return [group_order_i, order_group.fragment];\n                }\n            }\n            let group_fragment = document.createDocumentFragment();\n            group_order_i = groups_order.length;\n            groups_order.push({ fragment: group_fragment, order, optgroup });\n            return [group_order_i, group_fragment];\n        };\n        // render and group available options individually\n        for (i = 0; i < n; i++) {\n            // get option dom element\n            let item = results.items[i];\n            if (!item)\n                continue;\n            let opt_value = item.id;\n            let option = self.options[opt_value];\n            if (option === undefined)\n                continue;\n            let opt_hash = get_hash(opt_value);\n            let option_el = self.getOption(opt_hash, true);\n            // toggle 'selected' class\n            if (!self.settings.hideSelected) {\n                option_el.classList.toggle('selected', self.items.includes(opt_hash));\n            }\n            optgroup = option[self.settings.optgroupField] || '';\n            optgroups = Array.isArray(optgroup) ? optgroup : [optgroup];\n            for (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n                optgroup = optgroups[j];\n                let order = option.$order;\n                let self_optgroup = self.optgroups[optgroup];\n                if (self_optgroup === undefined && typeof self.settings.optionGroupRegister === 'function') {\n                    var regGroup;\n                    if (regGroup = self.settings.optionGroupRegister.apply(self, [optgroup])) {\n                        self.registerOptionGroup(regGroup);\n                    }\n                }\n                self_optgroup = self.optgroups[optgroup];\n                if (self_optgroup === undefined) {\n                    optgroup = '';\n                }\n                else {\n                    order = self_optgroup.$order;\n                }\n                const [group_order_i, group_fragment] = getGroupFragment(optgroup, order);\n                // nodes can only have one parent, so if the option is in mutple groups, we need a clone\n                if (j > 0) {\n                    option_el = option_el.cloneNode(true);\n                    setAttr(option_el, { id: option.$id + '-clone-' + j, 'aria-selected': null });\n                    option_el.classList.add('ts-cloned');\n                    removeClasses(option_el, 'active');\n                    // make sure we keep the activeOption in the same group\n                    if (self.activeOption && self.activeOption.dataset.value == opt_value) {\n                        if (active_group && active_group.dataset.group === optgroup.toString()) {\n                            active_option = option_el;\n                        }\n                    }\n                }\n                group_fragment.appendChild(option_el);\n                if (optgroup != '') {\n                    groups[optgroup] = group_order_i;\n                }\n            }\n        }\n        // sort optgroups\n        if (self.settings.lockOptgroupOrder) {\n            groups_order.sort((a, b) => {\n                return a.order - b.order;\n            });\n        }\n        // render optgroup headers & join groups\n        html = document.createDocumentFragment();\n        iterate(groups_order, (group_order) => {\n            let group_fragment = group_order.fragment;\n            let optgroup = group_order.optgroup;\n            if (!group_fragment || !group_fragment.children.length)\n                return;\n            let group_heading = self.optgroups[optgroup];\n            if (group_heading !== undefined) {\n                let group_options = document.createDocumentFragment();\n                let header = self.render('optgroup_header', group_heading);\n                append(group_options, header);\n                append(group_options, group_fragment);\n                let group_html = self.render('optgroup', { group: group_heading, options: group_options });\n                append(html, group_html);\n            }\n            else {\n                append(html, group_fragment);\n            }\n        });\n        dropdown_content.innerHTML = '';\n        append(dropdown_content, html);\n        self.isDropdownContentStale = false;\n        // highlight matching terms inline\n        if (self.settings.highlight) {\n            removeHighlight(dropdown_content);\n            if (results.query.length && results.tokens.length) {\n                iterate(results.tokens, (tok) => {\n                    highlight(dropdown_content, tok.regex);\n                });\n            }\n        }\n        // helper method for adding templates to dropdown\n        var add_template = (template) => {\n            let content = self.render(template, { input: query });\n            if (content) {\n                show_dropdown = true;\n                dropdown_content.insertBefore(content, dropdown_content.firstChild);\n            }\n            return content;\n        };\n        // add loading message\n        if (self.loading) {\n            add_template('loading');\n            // invalid query\n        }\n        else if (!self.settings.shouldLoad.call(self, query)) {\n            add_template('not_loading');\n            // add no_results message\n        }\n        else if (results.items.length === 0) {\n            add_template('no_results');\n        }\n        // add create option\n        has_create_option = self.canCreate(query);\n        if (has_create_option) {\n            create = add_template('option_create');\n        }\n        // activate\n        self.hasOptions = results.items.length > 0 || has_create_option;\n        if (show_dropdown) {\n            if (results.items.length > 0) {\n                if (!active_option && self.settings.mode === 'single' && self.items[0] != undefined) {\n                    active_option = self.getOption(self.items[0]);\n                }\n                if (!dropdown_content.contains(active_option)) {\n                    let active_index = 0;\n                    if (create && !self.settings.addPrecedence) {\n                        active_index = 1;\n                    }\n                    active_option = self.selectable()[active_index];\n                }\n            }\n            else if (create) {\n                active_option = create;\n            }\n            if (triggerDropdown && !self.isOpen) {\n                self.open();\n                self.scrollToOption(active_option, 'auto');\n            }\n            self.setActiveOption(active_option);\n        }\n        else {\n            self.clearActiveOption();\n            if (triggerDropdown && self.isOpen) {\n                self.close(false); // if create_option=null, we want the dropdown to close but not reset the textbox value\n            }\n        }\n    }\n    /**\n     * Return list of selectable options\n     *\n     */\n    selectable() {\n        return this.dropdown_content.querySelectorAll('[data-selectable]');\n    }\n    /**\n     * Adds an available option. If it already exists,\n     * nothing will happen. Note: this does not refresh\n     * the options list dropdown (use `refreshOptions`\n     * for that).\n     *\n     * Usage:\n     *\n     *   this.addOption(data)\n     *\n     */\n    addOption(data, user_created = false) {\n        const self = this;\n        // @deprecated 1.7.7\n        // use addOptions( array, user_created ) for adding multiple options\n        if (Array.isArray(data)) {\n            self.addOptions(data, user_created);\n            return false;\n        }\n        const key = hash_key(data[self.settings.valueField]);\n        if (key === null || self.options.hasOwnProperty(key)) {\n            self.updateOption(data[self.settings.valueField], data);\n            return false;\n        }\n        data.$order = data.$order || ++self.order;\n        data.$id = self.inputId + '-opt-' + data.$order;\n        self.options[key] = data;\n        self.isDropdownContentStale = true;\n        if (user_created) {\n            self.userOptions[key] = user_created;\n            self.trigger('option_add', key, data);\n        }\n        return key;\n    }\n    /**\n     * Add multiple options\n     *\n     */\n    addOptions(data, user_created = false) {\n        iterate(data, (dat) => {\n            this.addOption(dat, user_created);\n        });\n    }\n    /**\n     * @deprecated 1.7.7\n     */\n    registerOption(data) {\n        return this.addOption(data);\n    }\n    /**\n     * Registers an option group to the pool of option groups.\n     *\n     * @return {boolean|string}\n     */\n    registerOptionGroup(data) {\n        var key = hash_key(data[this.settings.optgroupValueField]);\n        if (key === null)\n            return false;\n        data.$order = data.$order || ++this.order;\n        this.optgroups[key] = data;\n        return key;\n    }\n    /**\n     * Registers a new optgroup for options\n     * to be bucketed into.\n     *\n     */\n    addOptionGroup(id, data) {\n        var hashed_id;\n        data[this.settings.optgroupValueField] = id;\n        if (hashed_id = this.registerOptionGroup(data)) {\n            this.trigger('optgroup_add', hashed_id, data);\n        }\n    }\n    /**\n     * Removes an existing option group.\n     *\n     */\n    removeOptionGroup(id) {\n        if (this.optgroups.hasOwnProperty(id)) {\n            delete this.optgroups[id];\n            this.clearCache();\n            this.trigger('optgroup_remove', id);\n        }\n    }\n    /**\n     * Clears all existing option groups.\n     */\n    clearOptionGroups() {\n        this.optgroups = {};\n        this.clearCache();\n        this.trigger('optgroup_clear');\n    }\n    /**\n     * Updates an option available for selection. If\n     * it is visible in the selected items or options\n     * dropdown, it will be re-rendered automatically.\n     *\n     */\n    updateOption(value, data) {\n        const self = this;\n        var item_new;\n        var index_item;\n        const value_old = hash_key(value);\n        const value_new = hash_key(data[self.settings.valueField]);\n        // sanity checks\n        if (value_old === null)\n            return;\n        const data_old = self.options[value_old];\n        if (data_old == undefined)\n            return;\n        if (typeof value_new !== 'string')\n            throw new Error('Value must be set in option data');\n        const option = self.getOption(value_old);\n        const item = self.getItem(value_old);\n        data.$order = data.$order || data_old.$order;\n        delete self.options[value_old];\n        // invalidate render cache\n        // don't remove existing node yet, we'll remove it after replacing it\n        self.uncacheValue(value_new);\n        self.options[value_new] = data;\n        // update the option if it's in the dropdown\n        if (option) {\n            if (self.dropdown_content.contains(option)) {\n                const option_new = self._render('option', data);\n                replaceNode(option, option_new);\n                if (self.activeOption === option) {\n                    self.setActiveOption(option_new);\n                }\n            }\n            option.remove();\n        }\n        // update the item if we have one\n        if (item) {\n            index_item = self.items.indexOf(value_old);\n            if (index_item !== -1) {\n                self.items.splice(index_item, 1, value_new);\n            }\n            item_new = self._render('item', data);\n            if (item.classList.contains('active'))\n                addClasses(item_new, 'active');\n            replaceNode(item, item_new);\n        }\n        // we might have updated the sortField\n        self.isDropdownContentStale = true;\n    }\n    /**\n     * Removes a single option.\n     *\n     */\n    removeOption(value, silent) {\n        const self = this;\n        value = get_hash(value);\n        self.uncacheValue(value);\n        delete self.userOptions[value];\n        delete self.options[value];\n        self.isDropdownContentStale = true;\n        self.trigger('option_remove', value);\n        self.removeItem(value, silent);\n    }\n    /**\n     * Clears all options.\n     */\n    clearOptions(filter) {\n        const boundFilter = (filter || this.clearFilter).bind(this);\n        this.loadedSearches = {};\n        this.userOptions = {};\n        this.clearCache();\n        const selected = {};\n        iterate(this.options, (option, key) => {\n            if (boundFilter(option, key)) {\n                selected[key] = option;\n            }\n        });\n        this.options = this.sifter.items = selected;\n        this.isDropdownContentStale = true;\n        this.trigger('option_clear');\n    }\n    /**\n     * Used by clearOptions() to decide whether or not an option should be removed\n     * Return true to keep an option, false to remove\n     *\n     */\n    clearFilter(option, value) {\n        if (this.items.indexOf(value) >= 0) {\n            return true;\n        }\n        return false;\n    }\n    /**\n     * Returns the dom element of the option\n     * matching the given value.\n     *\n     */\n    getOption(value, create = false) {\n        const hashed = hash_key(value);\n        if (hashed === null)\n            return null;\n        const option = this.options[hashed];\n        if (option != undefined) {\n            if (option.$div) {\n                return option.$div;\n            }\n            if (create) {\n                return this._render('option', option);\n            }\n        }\n        return null;\n    }\n    /**\n     * Returns the dom element of the next or previous dom element of the same type\n     * Note: adjacent options may not be adjacent DOM elements (optgroups)\n     *\n     */\n    getAdjacent(option, direction, type = 'option') {\n        var self = this, all;\n        if (!option) {\n            return null;\n        }\n        if (type == 'item') {\n            all = self.controlChildren();\n        }\n        else {\n            all = self.dropdown_content.querySelectorAll('[data-selectable]');\n        }\n        for (let i = 0; i < all.length; i++) {\n            if (all[i] != option) {\n                continue;\n            }\n            if (direction > 0) {\n                return all[i + 1];\n            }\n            return all[i - 1];\n        }\n        return null;\n    }\n    /**\n     * Returns the dom element of the item\n     * matching the given value.\n     *\n     */\n    getItem(item) {\n        if (typeof item == 'object') {\n            return item;\n        }\n        var value = hash_key(item);\n        return value !== null\n            ? this.control.querySelector(`[data-value=\"${addSlashes(value)}\"]`)\n            : null;\n    }\n    /**\n     * \"Selects\" multiple items at once. Adds them to the list\n     * at the current caret position.\n     *\n     */\n    addItems(values, silent) {\n        var self = this;\n        var items = Array.isArray(values) ? values : [values];\n        items = items.filter(x => self.items.indexOf(x) === -1);\n        const last_item = items[items.length - 1];\n        items.forEach(item => {\n            self.isPending = (item !== last_item);\n            self.addItem(item, silent);\n        });\n    }\n    /**\n     * \"Selects\" an item. Adds it to the list\n     * at the current caret position.\n     *\n     */\n    addItem(value, silent) {\n        var events = silent ? [] : ['change', 'dropdown_close'];\n        debounce_events(this, events, () => {\n            var item, wasFull;\n            const self = this;\n            const inputMode = self.settings.mode;\n            const hashed = hash_key(value);\n            if (hashed && self.items.indexOf(hashed) !== -1) {\n                if (inputMode === 'single') {\n                    self.close();\n                }\n                if (inputMode === 'single' || !self.settings.duplicates) {\n                    return;\n                }\n            }\n            if (hashed === null || !self.options.hasOwnProperty(hashed))\n                return;\n            if (inputMode === 'single')\n                self.clear(silent);\n            if (inputMode === 'multi' && self.isFull())\n                return;\n            item = self._render('item', self.options[hashed]);\n            if (self.control.contains(item)) { // duplicates\n                item = item.cloneNode(true);\n            }\n            wasFull = self.isFull();\n            self.items.splice(self.caretPos, 0, hashed);\n            self.insertAtCaret(item);\n            if (self.isSetup) {\n                // update menu / remove the option (if this is not one item being added as part of series)\n                if (!self.isPending && self.settings.hideSelected) {\n                    let option = self.getOption(hashed);\n                    let next = self.getAdjacent(option, 1);\n                    if (next) {\n                        self.setActiveOption(next);\n                    }\n                }\n                //remove input value when enabled\n                if (self.settings.clearAfterSelect) {\n                    self.setTextboxValue();\n                }\n                // refreshOptions after setActiveOption(),\n                // otherwise setActiveOption() will be called by refreshOptions() with the wrong value\n                if (!self.isPending && !self.settings.closeAfterSelect) {\n                    self.refreshOptions(self.isFocused && inputMode !== 'single');\n                }\n                // hide the menu if the maximum number of items have been selected or no options are left\n                if (self.settings.closeAfterSelect != false && self.isFull()) {\n                    self.close();\n                }\n                else if (!self.isPending) {\n                    self.positionDropdown();\n                }\n                self.trigger('item_add', hashed, item);\n                if (!self.isPending) {\n                    self.updateOriginalInput({ silent: silent });\n                }\n            }\n            if (!self.isPending || (!wasFull && self.isFull())) {\n                self.inputState();\n                self.refreshState();\n            }\n        });\n    }\n    /**\n     * Removes the selected item matching\n     * the provided value.\n     *\n     */\n    removeItem(item = null, silent) {\n        const self = this;\n        item = self.getItem(item);\n        if (!item)\n            return;\n        var i, idx;\n        const value = item.dataset.value;\n        i = nodeIndex(item);\n        item.remove();\n        if (item.classList.contains('active')) {\n            idx = self.activeItems.indexOf(item);\n            self.activeItems.splice(idx, 1);\n            removeClasses(item, 'active');\n        }\n        self.items.splice(i, 1);\n        self.isDropdownContentStale = true;\n        if (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n            self.removeOption(value, silent);\n        }\n        if (i < self.caretPos) {\n            self.setCaret(self.caretPos - 1);\n        }\n        self.updateOriginalInput({ silent: silent });\n        self.refreshState();\n        self.positionDropdown();\n        self.trigger('item_remove', value, item);\n    }\n    /**\n     * Invokes the `create` method provided in the\n     * TomSelect options that should provide the data\n     * for the new item, given the user input.\n     *\n     * Once this completes, it will be added\n     * to the item list.\n     *\n     */\n    createItem(input = null, callback = () => { }) {\n        // triggerDropdown parameter @deprecated 2.1.1\n        if (arguments.length === 3) {\n            callback = arguments[2];\n        }\n        if (typeof callback != 'function') {\n            callback = () => { };\n        }\n        var self = this;\n        var caret = self.caretPos;\n        var output;\n        input = input || self.inputValue();\n        if (!self.canCreate(input)) {\n            const hash = hash_key(input);\n            if (hash) {\n                if (this.options[input]) {\n                    self.addItem(input);\n                }\n            }\n            callback();\n            return false;\n        }\n        self.lock();\n        var created = false;\n        var create = (data) => {\n            self.unlock();\n            if (!data || typeof data !== 'object')\n                return callback();\n            var value = hash_key(data[self.settings.valueField]);\n            if (typeof value !== 'string') {\n                return callback();\n            }\n            self.setTextboxValue();\n            self.addOption(data, true);\n            self.setCaret(caret);\n            self.addItem(value);\n            callback(data);\n            created = true;\n        };\n        if (typeof self.settings.create === 'function') {\n            output = self.settings.create.call(this, input, create);\n        }\n        else {\n            output = {\n                [self.settings.labelField]: input,\n                [self.settings.valueField]: input,\n            };\n        }\n        if (!created) {\n            create(output);\n        }\n        return true;\n    }\n    /**\n     * Re-renders the selected item lists.\n     */\n    refreshItems() {\n        var self = this;\n        self.isDropdownContentStale = true;\n        if (self.isSetup) {\n            self.addItems(self.items);\n        }\n        self.updateOriginalInput();\n        self.refreshState();\n    }\n    /**\n     * Updates all state-dependent attributes\n     * and CSS classes.\n     */\n    refreshState() {\n        const self = this;\n        self.refreshValidityState();\n        const isFull = self.isFull();\n        const isLocked = self.isLocked;\n        self.wrapper.classList.toggle('rtl', self.rtl);\n        const wrap_classList = self.wrapper.classList;\n        wrap_classList.toggle('focus', self.isFocused);\n        wrap_classList.toggle('disabled', self.isDisabled);\n        wrap_classList.toggle('readonly', self.isReadOnly);\n        wrap_classList.toggle('required', self.isRequired);\n        wrap_classList.toggle('invalid', !self.isValid);\n        wrap_classList.toggle('locked', isLocked);\n        wrap_classList.toggle('full', isFull);\n        wrap_classList.toggle('input-active', self.isFocused && !self.isInputHidden);\n        wrap_classList.toggle('dropdown-active', self.isOpen);\n        wrap_classList.toggle('has-options', isEmptyObject(self.options));\n        wrap_classList.toggle('has-items', self.items.length > 0);\n    }\n    /**\n     * Update the `required` attribute of both input and control input.\n     *\n     * The `required` property needs to be activated on the control input\n     * for the error to be displayed at the right place. `required` also\n     * needs to be temporarily deactivated on the input since the input is\n     * hidden and can't show errors.\n     */\n    refreshValidityState() {\n        var self = this;\n        if (!self.input.validity) {\n            return;\n        }\n        self.isValid = self.input.validity.valid;\n        self.isInvalid = !self.isValid;\n    }\n    /**\n     * Determines whether or not more items can be added\n     * to the control without exceeding the user-defined maximum.\n     *\n     * @returns {boolean}\n     */\n    isFull() {\n        return this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n    }\n    /**\n     * Refreshes the original <select> or <input>\n     * element to reflect the current state.\n     *\n     */\n    updateOriginalInput(opts = {}) {\n        const self = this;\n        var option, label;\n        const empty_option = self.input.querySelector('option[value=\"\"]');\n        if (self.is_select_tag) {\n            const selected = [];\n            const has_selected = self.input.querySelectorAll('option:checked').length;\n            function AddSelected(option_el, value, label) {\n                if (!option_el) {\n                    option_el = getDom('<option value=\"' + escape_html(value) + '\">' + escape_html(label) + '</option>');\n                }\n                // don't move empty option from top of list\n                // fixes bug in firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1725293\n                if (option_el != empty_option) {\n                    self.input.append(option_el);\n                }\n                selected.push(option_el);\n                // marking empty option as selected can break validation\n                // fixes https://github.com/orchidjs/tom-select/issues/303\n                if (option_el != empty_option || has_selected > 0) {\n                    option_el.selected = true;\n                }\n                return option_el;\n            }\n            // unselect all selected options\n            self.input.querySelectorAll('option:checked').forEach((option_el) => {\n                option_el.selected = false;\n            });\n            // nothing selected?\n            if (self.items.length == 0 && self.settings.mode == 'single') {\n                AddSelected(empty_option, \"\", \"\");\n                // order selected <option> tags for values in self.items\n            }\n            else {\n                self.items.forEach((value) => {\n                    option = self.options[value];\n                    label = option[self.settings.labelField] || '';\n                    if (selected.includes(option.$option)) {\n                        const reuse_opt = self.input.querySelector(`option[value=\"${addSlashes(value)}\"]:not(:checked)`);\n                        AddSelected(reuse_opt, value, label);\n                    }\n                    else {\n                        option.$option = AddSelected(option.$option, value, label);\n                    }\n                });\n            }\n        }\n        else {\n            self.input.value = self.getValue();\n        }\n        if (self.isSetup) {\n            if (!opts.silent) {\n                self.trigger('change', self.getValue());\n            }\n        }\n    }\n    /**\n     * Shows the autocomplete dropdown containing\n     * the available options.\n     */\n    open() {\n        var self = this;\n        if (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull()))\n            return;\n        self.isOpen = true;\n        setAttr(self.focus_node, { 'aria-expanded': 'true' });\n        self.refreshState();\n        applyCSS(self.dropdown, { visibility: 'hidden', display: 'block' });\n        self.positionDropdown();\n        applyCSS(self.dropdown, { visibility: 'visible', display: 'block' });\n        self.focus();\n        self.trigger('dropdown_open', self.dropdown);\n    }\n    /**\n     * Closes the autocomplete dropdown menu.\n     */\n    close(setTextboxValue = true) {\n        var self = this;\n        var trigger = self.isOpen;\n        if (setTextboxValue) {\n            // before blur() to prevent form onchange event\n            self.setTextboxValue();\n            if (self.settings.mode === 'single' && self.items.length) {\n                self.inputState();\n            }\n        }\n        self.isOpen = false;\n        setAttr(self.focus_node, { 'aria-expanded': 'false' });\n        applyCSS(self.dropdown, { display: 'none' });\n        if (self.settings.hideSelected) {\n            self.clearActiveOption();\n        }\n        self.refreshState();\n        if (trigger)\n            self.trigger('dropdown_close', self.dropdown);\n    }\n    /**\n     * Calculates and applies the appropriate\n     * position of the dropdown if dropdownParent = 'body'.\n     * Otherwise, position is determined by css\n     */\n    positionDropdown() {\n        if (this.settings.dropdownParent !== 'body') {\n            return;\n        }\n        var context = this.control;\n        var rect = context.getBoundingClientRect();\n        var top = context.offsetHeight + rect.top + window.scrollY;\n        var left = rect.left + window.scrollX;\n        applyCSS(this.dropdown, {\n            width: rect.width + 'px',\n            top: top + 'px',\n            left: left + 'px'\n        });\n    }\n    /**\n     * Resets / clears all selected items\n     * from the control.\n     *\n     */\n    clear(silent) {\n        var self = this;\n        if (!self.items.length)\n            return;\n        var items = self.controlChildren();\n        iterate(items, (item) => {\n            self.removeItem(item, true);\n        });\n        self.inputState();\n        if (!silent)\n            self.updateOriginalInput();\n        self.trigger('clear');\n    }\n    /**\n     * A helper method for inserting an element\n     * at the current caret position.\n     *\n     */\n    insertAtCaret(el) {\n        const self = this;\n        const caret = self.caretPos;\n        const target = self.control;\n        target.insertBefore(el, target.children[caret] || null);\n        self.setCaret(caret + 1);\n    }\n    /**\n     * Removes the current selected item(s).\n     *\n     */\n    deleteSelection(e) {\n        var direction, selection, caret, tail;\n        var self = this;\n        direction = (e && e.keyCode === constants.KEY_BACKSPACE) ? -1 : 1;\n        selection = getSelection(self.control_input);\n        // determine items that will be removed\n        const rm_items = [];\n        if (self.activeItems.length) {\n            tail = getTail(self.activeItems, direction);\n            caret = nodeIndex(tail);\n            if (direction > 0) {\n                caret++;\n            }\n            iterate(self.activeItems, (item) => rm_items.push(item));\n        }\n        else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n            const items = self.controlChildren();\n            let rm_item;\n            if (direction < 0 && selection.start === 0 && selection.length === 0) {\n                rm_item = items[self.caretPos - 1];\n            }\n            else if (direction > 0 && selection.start === self.inputValue().length) {\n                rm_item = items[self.caretPos];\n            }\n            if (rm_item !== undefined) {\n                rm_items.push(rm_item);\n            }\n        }\n        if (!self.shouldDelete(rm_items, e)) {\n            return false;\n        }\n        preventDefault(e, true);\n        // perform removal\n        if (typeof caret !== 'undefined') {\n            self.setCaret(caret);\n        }\n        while (rm_items.length) {\n            self.removeItem(rm_items.pop());\n        }\n        self.inputState();\n        self.positionDropdown();\n        self.refreshOptions(false);\n        return true;\n    }\n    /**\n     * Return true if the items should be deleted\n     */\n    shouldDelete(items, evt) {\n        const values = items.map(item => item.dataset.value);\n        // allow the callback to abort\n        if (!values.length || (typeof this.settings.onDelete === 'function' && this.settings.onDelete.call(this, values, evt) === false)) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * Selects the previous / next item (depending on the `direction` argument).\n     *\n     * > 0 - right\n     * < 0 - left\n     *\n     */\n    advanceSelection(direction, e) {\n        var last_active, adjacent, self = this;\n        if (self.rtl)\n            direction *= -1;\n        if (self.inputValue().length)\n            return;\n        // add or remove to active items\n        if (isKeyDown(constants.KEY_SHORTCUT, e) || isKeyDown('shiftKey', e)) {\n            last_active = self.getLastActive(direction);\n            if (last_active) {\n                if (!last_active.classList.contains('active')) {\n                    adjacent = last_active;\n                }\n                else {\n                    adjacent = self.getAdjacent(last_active, direction, 'item');\n                }\n                // if no active item, get items adjacent to the control input\n            }\n            else if (direction > 0) {\n                adjacent = self.control_input.nextElementSibling;\n            }\n            else {\n                adjacent = self.control_input.previousElementSibling;\n            }\n            if (adjacent) {\n                if (adjacent.classList.contains('active')) {\n                    self.removeActiveItem(last_active);\n                }\n                self.setActiveItemClass(adjacent); // mark as last_active !! after removeActiveItem() on last_active\n            }\n            // move caret to the left or right\n        }\n        else {\n            self.moveCaret(direction);\n        }\n    }\n    moveCaret(direction) { }\n    /**\n     * Get the last active item\n     *\n     */\n    getLastActive(direction) {\n        let last_active = this.control.querySelector('.last-active');\n        if (last_active) {\n            return last_active;\n        }\n        var result = this.control.querySelectorAll('.active');\n        if (result) {\n            return getTail(result, direction);\n        }\n    }\n    /**\n     * Moves the caret to the specified index.\n     *\n     * The input must be moved by leaving it in place and moving the\n     * siblings, due to the fact that focus cannot be restored once lost\n     * on mobile webkit devices\n     *\n     */\n    setCaret(new_pos) {\n        this.caretPos = this.items.length;\n    }\n    /**\n     * Return list of item dom elements\n     *\n     */\n    controlChildren() {\n        return Array.from(this.control.querySelectorAll('[data-ts-item]'));\n    }\n    /**\n     * Disables user input on the control. Used while\n     * items are being asynchronously created.\n     */\n    lock() {\n        this.setLocked(true);\n    }\n    /**\n     * Re-enables user input on the control.\n     */\n    unlock() {\n        this.setLocked(false);\n    }\n    /**\n     * Disable or enable user input on the control\n     */\n    setLocked(lock = this.isReadOnly || this.isDisabled) {\n        this.isLocked = lock;\n        this.refreshState();\n    }\n    /**\n     * Disables user input on the control completely.\n     * While disabled, it cannot receive focus.\n     */\n    disable() {\n        this.setDisabled(true);\n        this.close();\n    }\n    /**\n     * Enables the control so that it can respond\n     * to focus and user input.\n     */\n    enable() {\n        this.setDisabled(false);\n    }\n    setDisabled(disabled) {\n        this.focus_node.tabIndex = disabled ? -1 : this.tabIndex;\n        this.isDisabled = disabled;\n        this.input.disabled = disabled;\n        this.control_input.disabled = disabled;\n        this.setLocked();\n    }\n    setReadOnly(isReadOnly) {\n        this.isReadOnly = isReadOnly;\n        this.input.readOnly = isReadOnly;\n        this.control_input.readOnly = isReadOnly;\n        this.setLocked();\n    }\n    /**\n     * Completely destroys the control and\n     * unbinds all event listeners so that it can\n     * be garbage collected.\n     */\n    destroy() {\n        var self = this;\n        var revertSettings = self.revertSettings;\n        self.trigger('destroy');\n        self.off();\n        self.wrapper.remove();\n        self.dropdown.remove();\n        self.input.innerHTML = revertSettings.innerHTML;\n        self.input.tabIndex = revertSettings.tabIndex;\n        removeClasses(self.input, 'tomselected', 'ts-hidden-accessible');\n        self._destroy();\n        delete self.input.tomselect;\n    }\n    /**\n     * A helper method for rendering \"item\" and\n     * \"option\" templates, given the data.\n     *\n     */\n    render(templateName, data) {\n        var id, html;\n        const self = this;\n        if (typeof this.settings.render[templateName] !== 'function') {\n            return null;\n        }\n        // render markup\n        html = self.settings.render[templateName].call(this, data, escape_html);\n        if (!html) {\n            return null;\n        }\n        html = getDom(html);\n        // add mandatory attributes\n        if (templateName === 'option' || templateName === 'option_create') {\n            if (data[self.settings.disabledField]) {\n                setAttr(html, { 'aria-disabled': 'true' });\n            }\n            else {\n                setAttr(html, { 'data-selectable': '' });\n            }\n        }\n        else if (templateName === 'optgroup') {\n            id = data.group[self.settings.optgroupValueField];\n            setAttr(html, { 'data-group': id });\n            if (data.group[self.settings.disabledField]) {\n                setAttr(html, { 'data-disabled': '' });\n            }\n        }\n        if (templateName === 'option' || templateName === 'item') {\n            const value = get_hash(data[self.settings.valueField]);\n            setAttr(html, { 'data-value': value });\n            // make sure we have some classes if a template is overwritten\n            if (templateName === 'item') {\n                addClasses(html, self.settings.itemClass);\n                setAttr(html, { 'data-ts-item': '' });\n            }\n            else {\n                addClasses(html, self.settings.optionClass);\n                setAttr(html, {\n                    role: 'option',\n                    id: data.$id\n                });\n                // update cache\n                data.$div = html;\n                self.options[value] = data;\n            }\n        }\n        return html;\n    }\n    /**\n     * Type guarded rendering\n     *\n     */\n    _render(templateName, data) {\n        const html = this.render(templateName, data);\n        if (html == null) {\n            throw 'HTMLElement expected';\n        }\n        return html;\n    }\n    /**\n     * Clears the render cache for a template. If\n     * no template is given, clears all render\n     * caches.\n     *\n     */\n    clearCache() {\n        iterate(this.options, (option) => {\n            if (option.$div) {\n                option.$div.remove();\n                delete option.$div;\n            }\n        });\n    }\n    /**\n     * Removes a value from item and option caches\n     *\n     */\n    uncacheValue(value) {\n        const option_el = this.getOption(value);\n        if (option_el)\n            option_el.remove();\n    }\n    /**\n     * Determines whether or not to display the\n     * create item prompt, given a user input.\n     *\n     */\n    canCreate(input) {\n        return this.settings.create && (input.length > 0) && this.settings.createFilter.call(this, input);\n    }\n    /**\n     * Wraps this.`method` so that `new_fn` can be invoked 'before', 'after', or 'instead' of the original method\n     *\n     * this.hook('instead','onKeyDown',function( arg1, arg2 ...){\n     *\n     * });\n     */\n    hook(when, method, new_fn) {\n        var self = this;\n        var orig_method = self[method];\n        self[method] = function () {\n            var result, result_new;\n            if (when === 'after') {\n                result = orig_method.apply(self, arguments);\n            }\n            result_new = new_fn.apply(self, arguments);\n            if (when === 'instead') {\n                return result_new;\n            }\n            if (when === 'before') {\n                result = orig_method.apply(self, arguments);\n            }\n            return result;\n        };\n    }\n}\n;\n//# sourceMappingURL=tom-select.js.map","/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\nexport default function MicroPlugin(Interface) {\n    Interface.plugins = {};\n    return class extends Interface {\n        constructor() {\n            super(...arguments);\n            this.plugins = {\n                names: [],\n                settings: {},\n                requested: {},\n                loaded: {}\n            };\n        }\n        /**\n         * Registers a plugin.\n         *\n         * @param {function} fn\n         */\n        static define(name, fn) {\n            Interface.plugins[name] = {\n                'name': name,\n                'fn': fn\n            };\n        }\n        /**\n         * Initializes the listed plugins (with options).\n         * Acceptable formats:\n         *\n         * List (without options):\n         *   ['a', 'b', 'c']\n         *\n         * List (with options):\n         *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n         *\n         * Hash (with options):\n         *   {'a': { ... }, 'b': { ... }, 'c': { ... }}\n         *\n         * @param {array|object} plugins\n         */\n        initializePlugins(plugins) {\n            var key, name;\n            const self = this;\n            const queue = [];\n            if (Array.isArray(plugins)) {\n                plugins.forEach((plugin) => {\n                    if (typeof plugin === 'string') {\n                        queue.push(plugin);\n                    }\n                    else {\n                        self.plugins.settings[plugin.name] = plugin.options;\n                        queue.push(plugin.name);\n                    }\n                });\n            }\n            else if (plugins) {\n                for (key in plugins) {\n                    if (plugins.hasOwnProperty(key)) {\n                        self.plugins.settings[key] = plugins[key];\n                        queue.push(key);\n                    }\n                }\n            }\n            while (name = queue.shift()) {\n                self.require(name);\n            }\n        }\n        loadPlugin(name) {\n            var self = this;\n            var plugins = self.plugins;\n            var plugin = Interface.plugins[name];\n            if (!Interface.plugins.hasOwnProperty(name)) {\n                throw new Error('Unable to find \"' + name + '\" plugin');\n            }\n            plugins.requested[name] = true;\n            plugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n            plugins.names.push(name);\n        }\n        /**\n         * Initializes a plugin.\n         *\n         */\n        require(name) {\n            var self = this;\n            var plugins = self.plugins;\n            if (!self.plugins.loaded.hasOwnProperty(name)) {\n                if (plugins.requested[name]) {\n                    throw new Error('Plugin has circular dependency (\"' + name + '\")');\n                }\n                self.loadPlugin(name);\n            }\n            return plugins.loaded[name];\n        }\n    };\n}\n//# sourceMappingURL=microplugin.js.map","/**\n * highlight v3 | MIT license | Johann Burkard <jb@eaio.com>\n * Highlights arbitrary terms in a node.\n *\n * - Modified by Marshal <beatgates@gmail.com> 2011-6-24 (added regex)\n * - Modified by Brian Reavis <brian@thirdroute.com> 2012-8-27 (cleanup)\n */\nimport { replaceNode } from \"../vanilla.js\";\nexport const highlight = (element, regex) => {\n    if (regex === null)\n        return;\n    // convet string to regex\n    if (typeof regex === 'string') {\n        if (!regex.length)\n            return;\n        regex = new RegExp(regex, 'i');\n    }\n    // Wrap matching part of text node with highlighting <span>, e.g.\n    // Soccer  ->  <span class=\"highlight\">Soc</span>cer  for regex = /soc/i\n    const highlightText = (node) => {\n        var match = node.data.match(regex);\n        if (match && node.data.length > 0) {\n            var spannode = document.createElement('span');\n            spannode.className = 'highlight';\n            var middlebit = node.splitText(match.index);\n            middlebit.splitText(match[0].length);\n            var middleclone = middlebit.cloneNode(true);\n            spannode.appendChild(middleclone);\n            replaceNode(middlebit, spannode);\n            return 1;\n        }\n        return 0;\n    };\n    // Recurse element node, looking for child text nodes to highlight, unless element\n    // is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n    const highlightChildren = (node) => {\n        if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && (node.className !== 'highlight' || node.tagName !== 'SPAN')) {\n            Array.from(node.childNodes).forEach(element => {\n                highlightRecursive(element);\n            });\n        }\n    };\n    const highlightRecursive = (node) => {\n        if (node.nodeType === 3) {\n            return highlightText(node);\n        }\n        highlightChildren(node);\n        return 0;\n    };\n    highlightRecursive(element);\n};\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with(), pass js strict mode, and use without jquery\n */\nexport const removeHighlight = (el) => {\n    var elements = el.querySelectorAll(\"span.highlight\");\n    Array.prototype.forEach.call(elements, function (el) {\n        var parent = el.parentNode;\n        parent.replaceChild(el.firstChild, el);\n        parent.normalize();\n    });\n};\n//# sourceMappingURL=highlight.js.map","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nconst hash_key = value => {\n  if (typeof value === 'undefined' || value === null) return null;\n  return get_hash(value);\n};\nconst get_hash = value => {\n  if (typeof value === 'boolean') return value ? '1' : '0';\n  return value + '';\n};\n\n/**\n * Prevent default\n *\n */\nconst preventDefault = (evt, stop = false) => {\n  if (evt) {\n    evt.preventDefault();\n    if (stop) {\n      evt.stopPropagation();\n    }\n  }\n};\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nconst getDom = query => {\n  if (query.jquery) {\n    return query[0];\n  }\n  if (query instanceof HTMLElement) {\n    return query;\n  }\n  if (isHtmlString(query)) {\n    var tpl = document.createElement('template');\n    tpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n    return tpl.content.firstChild;\n  }\n  return document.querySelector(query);\n};\nconst isHtmlString = arg => {\n  if (typeof arg === 'string' && arg.indexOf('<') > -1) {\n    return true;\n  }\n  return false;\n};\n\n/**\n * Plugin: \"checkbox_options\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin (userOptions) {\n  var self = this;\n  var orig_onOptionSelect = self.onOptionSelect;\n  self.settings.hideSelected = false;\n  const cbOptions = Object.assign({\n    // so that the user may add different ones as well\n    className: \"tomselect-checkbox\",\n    // the following default to the historic plugin's values\n    checkedClassNames: undefined,\n    uncheckedClassNames: undefined\n  }, userOptions);\n  var UpdateChecked = function UpdateChecked(checkbox, toCheck) {\n    if (toCheck) {\n      checkbox.checked = true;\n      if (cbOptions.uncheckedClassNames) {\n        checkbox.classList.remove(...cbOptions.uncheckedClassNames);\n      }\n      if (cbOptions.checkedClassNames) {\n        checkbox.classList.add(...cbOptions.checkedClassNames);\n      }\n    } else {\n      checkbox.checked = false;\n      if (cbOptions.checkedClassNames) {\n        checkbox.classList.remove(...cbOptions.checkedClassNames);\n      }\n      if (cbOptions.uncheckedClassNames) {\n        checkbox.classList.add(...cbOptions.uncheckedClassNames);\n      }\n    }\n  };\n\n  // update the checkbox for an option\n  var UpdateCheckbox = function UpdateCheckbox(option) {\n    setTimeout(() => {\n      var checkbox = option.querySelector('input.' + cbOptions.className);\n      if (checkbox instanceof HTMLInputElement) {\n        UpdateChecked(checkbox, option.classList.contains('selected'));\n      }\n    }, 1);\n  };\n\n  // add checkbox to option template\n  self.hook('after', 'setupTemplates', () => {\n    var orig_render_option = self.settings.render.option;\n    self.settings.render.option = (data, escape_html) => {\n      var rendered = getDom(orig_render_option.call(self, data, escape_html));\n      var checkbox = document.createElement('input');\n      if (cbOptions.className) {\n        checkbox.classList.add(cbOptions.className);\n      }\n      checkbox.addEventListener('click', function (evt) {\n        preventDefault(evt);\n      });\n      checkbox.type = 'checkbox';\n      const hashed = hash_key(data[self.settings.valueField]);\n      UpdateChecked(checkbox, !!(hashed && self.items.indexOf(hashed) > -1));\n      rendered.prepend(checkbox);\n      return rendered;\n    };\n  });\n\n  // uncheck when item removed\n  self.on('item_remove', value => {\n    var option = self.getOption(value);\n    if (option) {\n      // if dropdown hasn't been opened yet, the option won't exist\n      option.classList.remove('selected'); // selected class won't be removed yet\n      UpdateCheckbox(option);\n    }\n  });\n\n  // check when item added\n  self.on('item_add', value => {\n    var option = self.getOption(value);\n    if (option) {\n      // if dropdown hasn't been opened yet, the option won't exist\n      UpdateCheckbox(option);\n    }\n  });\n\n  // remove items when selected option is clicked\n  self.hook('instead', 'onOptionSelect', (evt, option) => {\n    if (option.classList.contains('selected')) {\n      option.classList.remove('selected');\n      self.removeItem(option.dataset.value);\n      self.refreshOptions();\n      preventDefault(evt, true);\n      return;\n    }\n    orig_onOptionSelect.call(self, evt, option);\n    UpdateCheckbox(option);\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\n\n/**\n * Prevent default\n *\n */\nconst preventDefault = (evt, stop = false) => {\n  if (evt) {\n    evt.preventDefault();\n    if (stop) {\n      evt.stopPropagation();\n    }\n  }\n};\n\n/**\n * Add event helper\n *\n */\nconst addEvent = (target, type, callback, options) => {\n  target.addEventListener(type, callback, options);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nconst iterate = (object, callback) => {\n  if (Array.isArray(object)) {\n    object.forEach(callback);\n  } else {\n    for (var key in object) {\n      if (object.hasOwnProperty(key)) {\n        callback(object[key], key);\n      }\n    }\n  }\n};\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nconst getDom = query => {\n  if (query.jquery) {\n    return query[0];\n  }\n  if (query instanceof HTMLElement) {\n    return query;\n  }\n  if (isHtmlString(query)) {\n    var tpl = document.createElement('template');\n    tpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n    return tpl.content.firstChild;\n  }\n  return document.querySelector(query);\n};\nconst isHtmlString = arg => {\n  if (typeof arg === 'string' && arg.indexOf('<') > -1) {\n    return true;\n  }\n  return false;\n};\n\n/**\n * Set attributes of an element\n *\n */\nconst setAttr = (el, attrs) => {\n  iterate(attrs, (val, attr) => {\n    if (val == null) {\n      el.removeAttribute(attr);\n    } else {\n      el.setAttribute(attr, '' + val);\n    }\n  });\n};\n\n/**\n * Plugin: \"drag_drop\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nconst insertAfter = (referenceNode, newNode) => {\n  var _referenceNode$parent;\n  (_referenceNode$parent = referenceNode.parentNode) == null || _referenceNode$parent.insertBefore(newNode, referenceNode.nextSibling);\n};\nconst insertBefore = (referenceNode, newNode) => {\n  var _referenceNode$parent2;\n  (_referenceNode$parent2 = referenceNode.parentNode) == null || _referenceNode$parent2.insertBefore(newNode, referenceNode);\n};\nconst isBefore = (referenceNode, newNode) => {\n  do {\n    var _newNode;\n    newNode = (_newNode = newNode) == null ? void 0 : _newNode.previousElementSibling;\n    if (referenceNode == newNode) {\n      return true;\n    }\n  } while (newNode && newNode.previousElementSibling);\n  return false;\n};\nfunction plugin () {\n  var self = this;\n  if (self.settings.mode !== 'multi') return;\n  var orig_lock = self.lock;\n  var orig_unlock = self.unlock;\n  let sortable = true;\n  let drag_item;\n\n  /**\n   * Add draggable attribute to item\n   */\n  self.hook('after', 'setupTemplates', () => {\n    var orig_render_item = self.settings.render.item;\n    self.settings.render.item = (data, escape) => {\n      const item = getDom(orig_render_item.call(self, data, escape));\n      setAttr(item, {\n        'draggable': 'true'\n      });\n\n      // prevent doc_mousedown (see tom-select.ts)\n      const mousedown = evt => {\n        if (!sortable) preventDefault(evt);\n        evt.stopPropagation();\n      };\n      const dragStart = evt => {\n        drag_item = item;\n        setTimeout(() => {\n          item.classList.add('ts-dragging');\n        }, 0);\n      };\n      const dragOver = evt => {\n        evt.preventDefault();\n        item.classList.add('ts-drag-over');\n        moveitem(item, drag_item);\n      };\n      const dragLeave = () => {\n        item.classList.remove('ts-drag-over');\n      };\n      const moveitem = (targetitem, dragitem) => {\n        if (dragitem === undefined) return;\n        if (isBefore(dragitem, item)) {\n          insertAfter(targetitem, dragitem);\n        } else {\n          insertBefore(targetitem, dragitem);\n        }\n      };\n      const dragend = () => {\n        var _drag_item;\n        document.querySelectorAll('.ts-drag-over').forEach(el => el.classList.remove('ts-drag-over'));\n        (_drag_item = drag_item) == null || _drag_item.classList.remove('ts-dragging');\n        drag_item = undefined;\n        var values = [];\n        self.control.querySelectorAll(`[data-value]`).forEach(el => {\n          if (el.dataset.value) {\n            let value = el.dataset.value;\n            if (value) {\n              values.push(value);\n            }\n          }\n        });\n        self.setValue(values);\n      };\n      addEvent(item, 'mousedown', mousedown);\n      addEvent(item, 'dragstart', dragStart);\n      addEvent(item, 'dragenter', dragOver);\n      addEvent(item, 'dragover', dragOver);\n      addEvent(item, 'dragleave', dragLeave);\n      addEvent(item, 'dragend', dragend);\n      return item;\n    };\n  });\n  self.hook('instead', 'lock', () => {\n    sortable = false;\n    return orig_lock.call(self);\n  });\n  self.hook('instead', 'unlock', () => {\n    sortable = true;\n    return orig_unlock.call(self);\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\nconst KEY_ESC = 27;\nconst KEY_TAB = 9;\n // ctrl key or apple key for ma\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\n\n/**\n * Prevent default\n *\n */\nconst preventDefault = (evt, stop = false) => {\n  if (evt) {\n    evt.preventDefault();\n    if (stop) {\n      evt.stopPropagation();\n    }\n  }\n};\n\n/**\n * Add event helper\n *\n */\nconst addEvent = (target, type, callback, options) => {\n  target.addEventListener(type, callback, options);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nconst iterate = (object, callback) => {\n  if (Array.isArray(object)) {\n    object.forEach(callback);\n  } else {\n    for (var key in object) {\n      if (object.hasOwnProperty(key)) {\n        callback(object[key], key);\n      }\n    }\n  }\n};\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nconst getDom = query => {\n  if (query.jquery) {\n    return query[0];\n  }\n  if (query instanceof HTMLElement) {\n    return query;\n  }\n  if (isHtmlString(query)) {\n    var tpl = document.createElement('template');\n    tpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n    return tpl.content.firstChild;\n  }\n  return document.querySelector(query);\n};\nconst isHtmlString = arg => {\n  if (typeof arg === 'string' && arg.indexOf('<') > -1) {\n    return true;\n  }\n  return false;\n};\n\n/**\n * Add css classes\n *\n */\nconst addClasses = (elmts, ...classes) => {\n  var norm_classes = classesArray(classes);\n  elmts = castAsArray(elmts);\n  elmts.map(el => {\n    norm_classes.map(cls => {\n      el.classList.add(cls);\n    });\n  });\n};\n\n/**\n * Return arguments\n *\n */\nconst classesArray = args => {\n  var classes = [];\n  iterate(args, _classes => {\n    if (typeof _classes === 'string') {\n      _classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n    }\n    if (Array.isArray(_classes)) {\n      classes = classes.concat(_classes);\n    }\n  });\n  return classes.filter(Boolean);\n};\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nconst castAsArray = arg => {\n  if (!Array.isArray(arg)) {\n    arg = [arg];\n  }\n  return arg;\n};\n\n/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin () {\n  const self = this;\n  self.settings.shouldOpen = true; // make sure the input is shown even if there are no options to display in the dropdown\n\n  self.hook('before', 'setup', () => {\n    var _self$input;\n    self.focus_node = self.control;\n    addClasses(self.control_input, 'dropdown-input');\n    const div = getDom('<div class=\"dropdown-input-wrap\">');\n    div.append(self.control_input);\n    self.dropdown.insertBefore(div, self.dropdown.firstChild);\n\n    // set a placeholder in the select control\n    const placeholder = getDom('<input class=\"items-placeholder\" tabindex=\"-1\" />');\n    placeholder.placeholder = self.settings.placeholder || '';\n    self.control.append(placeholder);\n    /**\n     * TomSelect renders a custom control with a focusable <input class=\"items-placeholder\">.\n     * The source <select>'s aria-label is not automatically propagated to that input,\n     * which triggers \"Missing form label\" accessibility warnings.\n     * This helper copies the label from the <select> onto the generated input.\n     */\n    const label = (_self$input = self.input) == null ? void 0 : _self$input.getAttribute('aria-label');\n    if (!label) return;\n    placeholder.setAttribute('aria-label', label);\n  });\n  self.on('initialize', () => {\n    // set tabIndex on control to -1, otherwise [shift+tab] will put focus right back on control_input\n    self.control_input.addEventListener('keydown', evt => {\n      //addEvent(self.control_input,'keydown' as const,(evt:KeyboardEvent) =>{\n      switch (evt.keyCode) {\n        case KEY_ESC:\n          if (self.isOpen) {\n            preventDefault(evt, true);\n            self.close();\n          }\n          self.clearActiveItems();\n          return;\n        case KEY_TAB:\n          self.focus_node.tabIndex = -1;\n          break;\n      }\n      return self.onKeyDown.call(self, evt);\n    });\n    self.on('blur', () => {\n      self.focus_node.tabIndex = self.isDisabled ? -1 : self.tabIndex;\n    });\n\n    // give the control_input focus when the dropdown is open\n    self.on('dropdown_open', () => {\n      self.control_input.focus();\n    });\n\n    // prevent onBlur from closing when focus is on the control_input\n    const orig_onBlur = self.onBlur;\n    self.hook('instead', 'onBlur', evt => {\n      if (evt && evt.relatedTarget == self.control_input) return;\n      return orig_onBlur.call(self);\n    });\n    addEvent(self.control_input, 'blur', () => self.onBlur());\n\n    // return focus to control to allow further keyboard input\n    self.hook('before', 'close', () => {\n      if (!self.isOpen) return;\n      self.focus_node.focus({\n        preventScroll: true\n      });\n    });\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\n\n/**\n * Add event helper\n *\n */\nconst addEvent = (target, type, callback, options) => {\n  target.addEventListener(type, callback, options);\n};\n\n/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin () {\n  var self = this;\n  self.on('initialize', () => {\n    var test_input = document.createElement('span');\n    var control = self.control_input;\n    test_input.style.cssText = 'position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ';\n    self.wrapper.appendChild(test_input);\n    var transfer_styles = ['letterSpacing', 'fontSize', 'fontFamily', 'fontWeight', 'textTransform'];\n    for (const style_name of transfer_styles) {\n      // @ts-ignore TS7015 https://stackoverflow.com/a/50506154/697576\n      test_input.style[style_name] = control.style[style_name];\n    }\n\n    /**\n     * Set the control width\n     *\n     */\n    var resize = () => {\n      test_input.textContent = control.value;\n      control.style.width = test_input.clientWidth + 'px';\n    };\n    resize();\n    self.on('update item_add item_remove', resize);\n    addEvent(control, 'input', resize);\n    addEvent(control, 'keyup', resize);\n    addEvent(control, 'blur', resize);\n    addEvent(control, 'update', resize);\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nconst escape_html = str => {\n  return (str + '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n};\n\n/**\n * Prevent default\n *\n */\nconst preventDefault = (evt, stop = false) => {\n  if (evt) {\n    evt.preventDefault();\n    if (stop) {\n      evt.stopPropagation();\n    }\n  }\n};\n\n/**\n * Add event helper\n *\n */\nconst addEvent = (target, type, callback, options) => {\n  target.addEventListener(type, callback, options);\n};\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nconst getDom = query => {\n  if (query.jquery) {\n    return query[0];\n  }\n  if (query instanceof HTMLElement) {\n    return query;\n  }\n  if (isHtmlString(query)) {\n    var tpl = document.createElement('template');\n    tpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n    return tpl.content.firstChild;\n  }\n  return document.querySelector(query);\n};\nconst isHtmlString = arg => {\n  if (typeof arg === 'string' && arg.indexOf('<') > -1) {\n    return true;\n  }\n  return false;\n};\n\n/**\n * Plugin: \"remove_button\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin (userOptions) {\n  const options = Object.assign({\n    label: '&times;',\n    title: 'Remove',\n    className: 'remove',\n    append: true\n  }, userOptions);\n\n  //options.className = 'remove-single';\n  var self = this;\n\n  // override the render method to add remove button to each item\n  if (!options.append) {\n    return;\n  }\n  var html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n  self.hook('after', 'setupTemplates', () => {\n    var orig_render_item = self.settings.render.item;\n    self.settings.render.item = (data, escape) => {\n      var item = getDom(orig_render_item.call(self, data, escape));\n      var close_button = getDom(html);\n      item.appendChild(close_button);\n      addEvent(close_button, 'mousedown', evt => {\n        preventDefault(evt, true);\n      });\n      addEvent(close_button, 'click', evt => {\n        if (self.isLocked) return;\n\n        // propagating will trigger the dropdown to show for single mode\n        preventDefault(evt, true);\n        if (self.isLocked) return;\n        if (!self.shouldDelete([item], evt)) return;\n        self.removeItem(item);\n        self.refreshOptions(false);\n        self.inputState();\n      });\n      return item;\n    };\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","import TomSelect from \"./tom-select.js\";\nimport change_listener from \"./plugins/change_listener/plugin.js\";\nimport checkbox_options from \"./plugins/checkbox_options/plugin.js\";\nimport clear_button from \"./plugins/clear_button/plugin.js\";\nimport drag_drop from \"./plugins/drag_drop/plugin.js\";\nimport dropdown_header from \"./plugins/dropdown_header/plugin.js\";\nimport caret_position from \"./plugins/caret_position/plugin.js\";\nimport dropdown_input from \"./plugins/dropdown_input/plugin.js\";\nimport input_autogrow from \"./plugins/input_autogrow/plugin.js\";\nimport no_backspace_delete from \"./plugins/no_backspace_delete/plugin.js\";\nimport no_active_items from \"./plugins/no_active_items/plugin.js\";\nimport optgroup_columns from \"./plugins/optgroup_columns/plugin.js\";\nimport remove_button from \"./plugins/remove_button/plugin.js\";\nimport restore_on_backspace from \"./plugins/restore_on_backspace/plugin.js\";\nimport virtual_scroll from \"./plugins/virtual_scroll/plugin.js\";\nTomSelect.define('change_listener', change_listener);\nTomSelect.define('checkbox_options', checkbox_options);\nTomSelect.define('clear_button', clear_button);\nTomSelect.define('drag_drop', drag_drop);\nTomSelect.define('dropdown_header', dropdown_header);\nTomSelect.define('caret_position', caret_position);\nTomSelect.define('dropdown_input', dropdown_input);\nTomSelect.define('input_autogrow', input_autogrow);\nTomSelect.define('no_backspace_delete', no_backspace_delete);\nTomSelect.define('no_active_items', no_active_items);\nTomSelect.define('optgroup_columns', optgroup_columns);\nTomSelect.define('remove_button', remove_button);\nTomSelect.define('restore_on_backspace', restore_on_backspace);\nTomSelect.define('virtual_scroll', virtual_scroll);\nexport default TomSelect;\n//# sourceMappingURL=tom-select.complete.js.map","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\n\n/**\n * Add event helper\n *\n */\nconst addEvent = (target, type, callback, options) => {\n  target.addEventListener(type, callback, options);\n};\n\n/**\n * Plugin: \"change_listener\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin () {\n  addEvent(this.input, 'change', () => {\n    this.sync();\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nconst getDom = query => {\n  if (query.jquery) {\n    return query[0];\n  }\n  if (query instanceof HTMLElement) {\n    return query;\n  }\n  if (isHtmlString(query)) {\n    var tpl = document.createElement('template');\n    tpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n    return tpl.content.firstChild;\n  }\n  return document.querySelector(query);\n};\nconst isHtmlString = arg => {\n  if (typeof arg === 'string' && arg.indexOf('<') > -1) {\n    return true;\n  }\n  return false;\n};\n\n/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin (userOptions) {\n  const self = this;\n  const options = Object.assign({\n    className: 'clear-button',\n    title: 'Clear All',\n    role: 'button',\n    tabindex: 0,\n    html: data => {\n      return `<div class=\"${data.className}\" title=\"${data.title}\" role=\"${data.role}\" tabindex=\"${data.tabindex}\">&times;</div>`;\n    }\n  }, userOptions);\n  self.on('initialize', () => {\n    var button = getDom(options.html(options));\n    button.addEventListener('click', evt => {\n      if (self.isLocked) return;\n      self.clear();\n      if (self.settings.mode === 'single' && self.settings.allowEmptyOption) {\n        self.addItem('');\n      }\n      self.refreshOptions(false);\n      evt.preventDefault();\n      evt.stopPropagation();\n    });\n    self.control.appendChild(button);\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\n\n/**\n * Prevent default\n *\n */\nconst preventDefault = (evt, stop = false) => {\n  if (evt) {\n    evt.preventDefault();\n    if (stop) {\n      evt.stopPropagation();\n    }\n  }\n};\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nconst getDom = query => {\n  if (query.jquery) {\n    return query[0];\n  }\n  if (query instanceof HTMLElement) {\n    return query;\n  }\n  if (isHtmlString(query)) {\n    var tpl = document.createElement('template');\n    tpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n    return tpl.content.firstChild;\n  }\n  return document.querySelector(query);\n};\nconst isHtmlString = arg => {\n  if (typeof arg === 'string' && arg.indexOf('<') > -1) {\n    return true;\n  }\n  return false;\n};\n\n/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin (userOptions) {\n  const self = this;\n  const options = Object.assign({\n    title: 'Untitled',\n    headerClass: 'dropdown-header',\n    titleRowClass: 'dropdown-header-title',\n    labelClass: 'dropdown-header-label',\n    closeClass: 'dropdown-header-close',\n    html: data => {\n      return '<div class=\"' + data.headerClass + '\">' + '<div class=\"' + data.titleRowClass + '\">' + '<span class=\"' + data.labelClass + '\">' + data.title + '</span>' + '<a class=\"' + data.closeClass + '\">&times;</a>' + '</div>' + '</div>';\n    }\n  }, userOptions);\n  self.on('initialize', () => {\n    var header = getDom(options.html(options));\n    var close_link = header.querySelector('.' + options.closeClass);\n    if (close_link) {\n      close_link.addEventListener('click', evt => {\n        preventDefault(evt, true);\n        self.close();\n      });\n    }\n    self.dropdown.insertBefore(header, self.dropdown.firstChild);\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nconst iterate = (object, callback) => {\n  if (Array.isArray(object)) {\n    object.forEach(callback);\n  } else {\n    for (var key in object) {\n      if (object.hasOwnProperty(key)) {\n        callback(object[key], key);\n      }\n    }\n  }\n};\n\n/**\n * Remove css classes\n *\n */\nconst removeClasses = (elmts, ...classes) => {\n  var norm_classes = classesArray(classes);\n  elmts = castAsArray(elmts);\n  elmts.map(el => {\n    norm_classes.map(cls => {\n      el.classList.remove(cls);\n    });\n  });\n};\n\n/**\n * Return arguments\n *\n */\nconst classesArray = args => {\n  var classes = [];\n  iterate(args, _classes => {\n    if (typeof _classes === 'string') {\n      _classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n    }\n    if (Array.isArray(_classes)) {\n      classes = classes.concat(_classes);\n    }\n  });\n  return classes.filter(Boolean);\n};\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nconst castAsArray = arg => {\n  if (!Array.isArray(arg)) {\n    arg = [arg];\n  }\n  return arg;\n};\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nconst nodeIndex = (el, amongst) => {\n  if (!el) return -1;\n  amongst = amongst || el.nodeName;\n  var i = 0;\n  while (el = el.previousElementSibling) {\n    if (el.matches(amongst)) {\n      i++;\n    }\n  }\n  return i;\n};\n\n/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin () {\n  var self = this;\n\n  /**\n   * Moves the caret to the specified index.\n   *\n   * The input must be moved by leaving it in place and moving the\n   * siblings, due to the fact that focus cannot be restored once lost\n   * on mobile webkit devices\n   *\n   */\n  self.hook('instead', 'setCaret', new_pos => {\n    if (self.settings.mode === 'single' || !self.control.contains(self.control_input)) {\n      new_pos = self.items.length;\n    } else {\n      new_pos = Math.max(0, Math.min(self.items.length, new_pos));\n      if (new_pos != self.caretPos && !self.isPending) {\n        self.controlChildren().forEach((child, j) => {\n          if (j < new_pos) {\n            self.control_input.insertAdjacentElement('beforebegin', child);\n          } else {\n            self.control.appendChild(child);\n          }\n        });\n      }\n    }\n    self.caretPos = new_pos;\n  });\n  self.hook('instead', 'moveCaret', direction => {\n    if (!self.isFocused) return;\n\n    // move caret before or after selected items\n    const last_active = self.getLastActive(direction);\n    if (last_active) {\n      const idx = nodeIndex(last_active);\n      self.setCaret(direction > 0 ? idx + 1 : idx);\n      self.setActiveItem();\n      removeClasses(last_active, 'last-active');\n\n      // move caret left or right of current position\n    } else {\n      self.setCaret(self.caretPos + direction);\n    }\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin () {\n  var self = this;\n  var orig_deleteSelection = self.deleteSelection;\n  this.hook('instead', 'deleteSelection', evt => {\n    if (self.activeItems.length) {\n      return orig_deleteSelection.call(self, evt);\n    }\n    return false;\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Plugin: \"no_active_items\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin () {\n  this.hook('instead', 'setActiveItem', () => {});\n  this.hook('instead', 'selectAll', () => {});\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\nconst KEY_LEFT = 37;\nconst KEY_RIGHT = 39;\n // ctrl key or apple key for ma\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nconst parentMatch = (target, selector, wrapper) => {\n  while (target && target.matches) {\n    if (target.matches(selector)) {\n      return target;\n    }\n    target = target.parentNode;\n  }\n};\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nconst nodeIndex = (el, amongst) => {\n  if (!el) return -1;\n  amongst = amongst || el.nodeName;\n  var i = 0;\n  while (el = el.previousElementSibling) {\n    if (el.matches(amongst)) {\n      i++;\n    }\n  }\n  return i;\n};\n\n/**\n * Plugin: \"optgroup_columns\" (Tom Select.js)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin () {\n  var self = this;\n  var orig_keydown = self.onKeyDown;\n  self.hook('instead', 'onKeyDown', evt => {\n    var index, option, options, optgroup;\n    if (!self.isOpen || !(evt.keyCode === KEY_LEFT || evt.keyCode === KEY_RIGHT)) {\n      return orig_keydown.call(self, evt);\n    }\n    self.ignoreHover = true;\n    optgroup = parentMatch(self.activeOption, '[data-group]');\n    index = nodeIndex(self.activeOption, '[data-selectable]');\n    if (!optgroup) {\n      return;\n    }\n    if (evt.keyCode === KEY_LEFT) {\n      optgroup = optgroup.previousSibling;\n    } else {\n      optgroup = optgroup.nextSibling;\n    }\n    if (!optgroup) {\n      return;\n    }\n    options = optgroup.querySelectorAll('[data-selectable]');\n    option = options[Math.min(options.length - 1, index)];\n    if (option) {\n      self.setActiveOption(option);\n    }\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin (userOptions) {\n  const self = this;\n  const options = Object.assign({\n    text: option => {\n      return option[self.settings.labelField];\n    }\n  }, userOptions);\n  self.on('item_remove', function (value) {\n    if (!self.isFocused) {\n      return;\n    }\n    if (self.control_input.value.trim() === '') {\n      var option = self.options[value];\n      if (option) {\n        self.setTextboxValue(options.text.call(self, option));\n      }\n    }\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","/**\n* Tom Select v2.6.1\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\nconst iterate = (object, callback) => {\n  if (Array.isArray(object)) {\n    object.forEach(callback);\n  } else {\n    for (var key in object) {\n      if (object.hasOwnProperty(key)) {\n        callback(object[key], key);\n      }\n    }\n  }\n};\n\n/**\n * Add css classes\n *\n */\nconst addClasses = (elmts, ...classes) => {\n  var norm_classes = classesArray(classes);\n  elmts = castAsArray(elmts);\n  elmts.map(el => {\n    norm_classes.map(cls => {\n      el.classList.add(cls);\n    });\n  });\n};\n\n/**\n * Return arguments\n *\n */\nconst classesArray = args => {\n  var classes = [];\n  iterate(args, _classes => {\n    if (typeof _classes === 'string') {\n      _classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n    }\n    if (Array.isArray(_classes)) {\n      classes = classes.concat(_classes);\n    }\n  });\n  return classes.filter(Boolean);\n};\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nconst castAsArray = arg => {\n  if (!Array.isArray(arg)) {\n    arg = [arg];\n  }\n  return arg;\n};\n\n/**\n * Plugin: \"virtual_scroll\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nfunction plugin () {\n  const self = this;\n  const orig_canLoad = self.canLoad;\n  const orig_clearActiveOption = self.clearActiveOption;\n  const orig_loadCallback = self.loadCallback;\n  var pagination = {};\n  var dropdown_content;\n  var loading_more = false;\n  var load_more_opt;\n  var default_values = [];\n  var default_values_loaded = false;\n  var default_pagination;\n  if (!self.settings.shouldLoadMore) {\n    // return true if additional results should be loaded\n    self.settings.shouldLoadMore = () => {\n      const scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);\n      if (scroll_percent > 0.9) {\n        return true;\n      }\n      if (self.activeOption) {\n        var selectable = self.selectable();\n        var index = Array.from(selectable).indexOf(self.activeOption);\n        if (index >= selectable.length - 2) {\n          return true;\n        }\n      }\n      return false;\n    };\n  }\n  if (!self.settings.firstUrl) {\n    throw 'virtual_scroll plugin requires a firstUrl() method';\n  }\n\n  // in order for virtual scrolling to work,\n  // options need to be ordered the same way they're returned from the remote data source\n  self.settings.sortField = [{\n    field: '$order'\n  }, {\n    field: '$score'\n  }];\n\n  // can we load more results for given query?\n  const canLoadMore = query => {\n    if (typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions) {\n      return false;\n    }\n    if (query in pagination && pagination[query]) {\n      return true;\n    }\n    return false;\n  };\n  const clearFilter = (option, value) => {\n    if (self.items.indexOf(value) >= 0 || default_values.indexOf(value) >= 0) {\n      return true;\n    }\n    return false;\n  };\n\n  // set the next url that will be\n  self.setNextUrl = (value, next_url) => {\n    pagination[value] = next_url;\n  };\n\n  // getUrl() to be used in settings.load()\n  self.getUrl = query => {\n    if (query in pagination) {\n      const next_url = pagination[query];\n      pagination[query] = false;\n      return next_url;\n    }\n\n    // if the user goes back to a previous query\n    // we need to load the first page again\n    self.clearPagination();\n    return self.settings.firstUrl.call(self, query);\n  };\n\n  // clear pagination\n  self.clearPagination = () => {\n    pagination = {};\n  };\n\n  // don't clear the active option (and cause unwanted dropdown scroll)\n  // while loading more results\n  self.hook('instead', 'clearActiveOption', () => {\n    if (loading_more) {\n      return;\n    }\n    return orig_clearActiveOption.call(self);\n  });\n\n  // override the canLoad method\n  self.hook('instead', 'canLoad', query => {\n    // first time the query has been seen\n    if (!(query in pagination)) {\n      return orig_canLoad.call(self, query);\n    }\n    return canLoadMore(query);\n  });\n\n  // wrap the load\n  self.hook('instead', 'loadCallback', (options, optgroups) => {\n    if (!loading_more) {\n      self.clearOptions(clearFilter);\n    } else if (load_more_opt) {\n      const first_option = options[0];\n      if (first_option !== undefined) {\n        load_more_opt.dataset.value = first_option[self.settings.valueField];\n      }\n    }\n    orig_loadCallback.call(self, options, optgroups);\n\n    // After the initial preload (empty query), update default_values to include\n    // preloaded options, not just the HTML <option> elements captured on initialize\n    if (!loading_more && !default_values_loaded) {\n      default_values_loaded = true;\n      if (self.lastValue === '') {\n        default_values = Object.keys(self.options);\n        default_pagination = pagination[''];\n      }\n    }\n    loading_more = false;\n  });\n\n  // as the “loading_more” element will be removed from the dropdown,\n  // we activate the previous option if needed\n  // to avoid the dropdown being scrolled back to the first one\n  self.hook('before', 'refreshOptions', () => {\n    if (self.activeOption && \"option\" !== self.activeOption.getAttribute(\"role\")) {\n      self.setActiveOption(self.activeOption.previousElementSibling);\n    }\n  });\n\n  // add templates to dropdown\n  //\tloading_more if we have another url in the queue\n  //\tno_more_results if we don't have another url in the queue\n  self.hook('after', 'refreshOptions', () => {\n    const query = self.lastValue;\n    var option;\n    if (canLoadMore(query)) {\n      option = self.render('loading_more', {\n        query: query\n      });\n      if (option) {\n        option.setAttribute('data-selectable', ''); // so that navigating dropdown with [down] keypresses can navigate to this node\n        load_more_opt = option;\n      }\n    } else if (query in pagination && !dropdown_content.querySelector('.no-results')) {\n      option = self.render('no_more_results', {\n        query: query\n      });\n    }\n    if (option) {\n      addClasses(option, self.settings.optionClass);\n      dropdown_content.append(option);\n    }\n  });\n\n  // Restore preloaded options and pagination when clearing search\n  const restoreDefaults = () => {\n    if (!default_values_loaded) {\n      return;\n    }\n    self.clearOptions(clearFilter);\n    if (default_pagination) {\n      pagination[''] = default_pagination;\n    }\n  };\n  self.on('type', query => {\n    if (query === '') {\n      restoreDefaults();\n      self.refreshOptions(false);\n    }\n  });\n  self.on('dropdown_close', restoreDefaults);\n\n  // add scroll listener and default templates\n  self.on('initialize', () => {\n    default_values = Object.keys(self.options);\n    dropdown_content = self.dropdown_content;\n\n    // default templates\n    self.settings.render = Object.assign({}, {\n      loading_more: () => {\n        return `<div class=\"loading-more-results\">Loading more results ... </div>`;\n      },\n      no_more_results: () => {\n        return `<div class=\"no-more-results\">No more results</div>`;\n      }\n    }, self.settings.render);\n\n    // watch dropdown content scroll position\n    dropdown_content.addEventListener('scroll', () => {\n      if (!self.settings.shouldLoadMore.call(self)) {\n        return;\n      }\n\n      // !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true\n      if (!canLoadMore(self.lastValue)) {\n        return;\n      }\n\n      // don't call load() too much\n      if (loading_more) return;\n      loading_more = true;\n      self.load.call(self, self.lastValue);\n    });\n  });\n}\n\nexport { plugin as default };\n//# sourceMappingURL=plugin.js.map\n","export class FetchResponse {\n  constructor (response) {\n    this.response = response\n  }\n\n  get statusCode () {\n    return this.response.status\n  }\n\n  get redirected () {\n    return this.response.redirected\n  }\n\n  get ok () {\n    return this.response.ok\n  }\n\n  get unauthenticated () {\n    return this.statusCode === 401\n  }\n\n  get unprocessableEntity () {\n    return this.statusCode === 422\n  }\n\n  get authenticationURL () {\n    return this.response.headers.get('WWW-Authenticate')\n  }\n\n  get contentType () {\n    const contentType = this.response.headers.get('Content-Type') || ''\n\n    return contentType.replace(/;.*$/, '')\n  }\n\n  get headers () {\n    return this.response.headers\n  }\n\n  get html () {\n    if (this.contentType.match(/^(application|text)\\/(html|xhtml\\+xml)$/)) {\n      return this.text\n    }\n\n    return Promise.reject(new Error(`Expected an HTML response but got \"${this.contentType}\" instead`))\n  }\n\n  get json () {\n    if (this.contentType.match(/^application\\/.*json$/)) {\n      return this.responseJson || (this.responseJson = this.response.json())\n    }\n\n    return Promise.reject(new Error(`Expected a JSON response but got \"${this.contentType}\" instead`))\n  }\n\n  get text () {\n    return this.responseText || (this.responseText = this.response.text())\n  }\n\n  get isTurboStream () {\n    return this.contentType.match(/^text\\/vnd\\.turbo-stream\\.html/)\n  }\n\n  async renderTurboStream () {\n    if (this.isTurboStream) {\n      if (window.Turbo) {\n        await window.Turbo.renderStreamMessage(await this.text)\n      } else {\n        console.warn('You must set `window.Turbo = Turbo` to automatically process Turbo Stream events with request.js')\n      }\n    } else {\n      return Promise.reject(new Error(`Expected a Turbo Stream response but got \"${this.contentType}\" instead`))\n    }\n  }\n}\n","export function getCookie (name) {\n  const cookies = document.cookie ? document.cookie.split('; ') : []\n  const prefix = `${encodeURIComponent(name)}=`\n  const cookie = cookies.find(cookie => cookie.startsWith(prefix))\n\n  if (cookie) {\n    const value = cookie.split('=').slice(1).join('=')\n\n    if (value) {\n      return decodeURIComponent(value)\n    }\n  }\n}\n\nexport function compact (object) {\n  const result = {}\n\n  for (const key in object) {\n    const value = object[key]\n    if (value !== undefined) {\n      result[key] = value\n    }\n  }\n\n  return result\n}\n\nexport function metaContent (name) {\n  const element = document.head.querySelector(`meta[name=\"${name}\"]`)\n  return element && element.content\n}\n\nexport function stringEntriesFromFormData (formData) {\n  return [...formData].reduce((entries, [name, value]) => {\n    return entries.concat(typeof value === 'string' ? [[name, value]] : [])\n  }, [])\n}\n\nexport function mergeEntries (searchParams, entries) {\n  for (const [name, value] of entries) {\n    if (value instanceof window.File) continue\n\n    if (searchParams.has(name)) {\n      searchParams.delete(name)\n      searchParams.set(name, value)\n    } else {\n      searchParams.append(name, value)\n    }\n  }\n}\n","import { FetchResponse } from './fetch_response'\nimport { RequestInterceptor } from './request_interceptor'\nimport { getCookie, compact, metaContent, stringEntriesFromFormData, mergeEntries } from './lib/utils'\n\nexport class FetchRequest {\n  constructor (method, url, options = {}) {\n    this.method = method\n    this.options = options\n    this.originalUrl = url.toString()\n  }\n\n  async perform () {\n    try {\n      const requestInterceptor = RequestInterceptor.get()\n      if (requestInterceptor) {\n        await requestInterceptor(this)\n      }\n    } catch (error) {\n      console.error(error)\n    }\n\n    const response = new FetchResponse(await window.fetch(this.url, this.fetchOptions))\n\n    if (response.unauthenticated && response.authenticationURL) {\n      return Promise.reject(window.location.href = response.authenticationURL)\n    }\n\n    if (response.ok && response.isTurboStream) {\n      await response.renderTurboStream()\n    }\n\n    return response\n  }\n\n  addHeader (key, value) {\n    const headers = this.additionalHeaders\n    headers[key] = value\n    this.options.headers = headers\n  }\n\n  get fetchOptions () {\n    return {\n      method: this.method.toUpperCase(),\n      headers: this.headers,\n      body: this.formattedBody,\n      signal: this.signal,\n      credentials: 'same-origin',\n      redirect: this.redirect\n    }\n  }\n\n  get headers () {\n    return compact(\n      Object.assign({\n        'X-Requested-With': 'XMLHttpRequest',\n        'X-CSRF-Token': this.csrfToken,\n        'Content-Type': this.contentType,\n        Accept: this.accept\n      },\n      this.additionalHeaders)\n    )\n  }\n\n  get csrfToken () {\n    return getCookie(metaContent('csrf-param')) || metaContent('csrf-token')\n  }\n\n  get contentType () {\n    if (this.options.contentType) {\n      return this.options.contentType\n    } else if (this.body == null || this.body instanceof window.FormData) {\n      return undefined\n    } else if (this.body instanceof window.File) {\n      return this.body.type\n    }\n\n    return 'application/json'\n  }\n\n  get accept () {\n    switch (this.responseKind) {\n      case 'html':\n        return 'text/html, application/xhtml+xml'\n      case 'turbo-stream':\n        return 'text/vnd.turbo-stream.html, text/html, application/xhtml+xml'\n      case 'json':\n        return 'application/json, application/vnd.api+json'\n      default:\n        return '*/*'\n    }\n  }\n\n  get body () {\n    return this.options.body\n  }\n\n  get query () {\n    const originalQuery = (this.originalUrl.split('?')[1] || '').split('#')[0]\n    const params = new URLSearchParams(originalQuery)\n\n    let requestQuery = this.options.query\n    if (requestQuery instanceof window.FormData) {\n      requestQuery = stringEntriesFromFormData(requestQuery)\n    } else if (requestQuery instanceof window.URLSearchParams) {\n      requestQuery = requestQuery.entries()\n    } else {\n      requestQuery = Object.entries(requestQuery || {})\n    }\n\n    mergeEntries(params, requestQuery)\n\n    const query = params.toString()\n    return (query.length > 0 ? `?${query}` : '')\n  }\n\n  get url () {\n    return (this.originalUrl.split('?')[0]).split('#')[0] + this.query\n  }\n\n  get responseKind () {\n    return this.options.responseKind || 'html'\n  }\n\n  get signal () {\n    return this.options.signal\n  }\n\n  get redirect () {\n    return this.options.redirect || 'follow'\n  }\n\n  get additionalHeaders () {\n    return this.options.headers || {}\n  }\n\n  get formattedBody () {\n    const bodyIsAString = Object.prototype.toString.call(this.body) === '[object String]'\n    const contentTypeIsJson = this.headers['Content-Type'] === 'application/json'\n\n    if (contentTypeIsJson && !bodyIsAString) {\n      return JSON.stringify(this.body)\n    }\n\n    return this.body\n  }\n}\n","export class RequestInterceptor {\n  static register (interceptor) {\n    this.interceptor = interceptor\n  }\n\n  static get () {\n    return this.interceptor\n  }\n\n  static reset () {\n    this.interceptor = undefined\n  }\n}\n","import { FetchRequest } from './fetch_request'\n\nasync function get (url, options) {\n  const request = new FetchRequest('get', url, options)\n  return request.perform()\n}\n\nasync function post (url, options) {\n  const request = new FetchRequest('post', url, options)\n  return request.perform()\n}\n\nasync function put (url, options) {\n  const request = new FetchRequest('put', url, options)\n  return request.perform()\n}\n\nasync function patch (url, options) {\n  const request = new FetchRequest('patch', url, options)\n  return request.perform()\n}\n\nasync function destroy (url, options) {\n  const request = new FetchRequest('delete', url, options)\n  return request.perform()\n}\n\nexport { get, post, put, patch, destroy }\n","var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp.call(b, prop))\n      __defNormalProp(a, prop, b[prop]);\n  if (__getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(b)) {\n      if (__propIsEnum.call(b, prop))\n        __defNormalProp(a, prop, b[prop]);\n    }\n  return a;\n};\nfunction camelize(value) {\n  return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\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 readInheritableStaticArrayValues(constructor, propertyName) {\n  const ancestors = getAncestorsForConstructor(constructor);\n  return Array.from(ancestors.reduce((values, constructor2) => {\n    getOwnStaticArrayValues(constructor2, 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, constructor2) => {\n    pairs.push(...getOwnStaticObjectPairs(constructor2, 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(() => {\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    };\n    return new b();\n  }\n  try {\n    testReflectExtension();\n    return extendWithReflect;\n  } catch (error) {\n    return (constructor) => class extended extends constructor {\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        } 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}\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        } 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}\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);\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) {\n  const definition = parseValueDefinitionPair(valueDefinitionPair);\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        } else {\n          return definition.defaultValue;\n        }\n      },\n      set(value) {\n        if (value === void 0) {\n          this.data.delete(key);\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]) {\n  return valueDescriptorForTokenAndTypeDefinition(token, typeDefinition);\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(typeObject) {\n  const typeFromObject = parseValueTypeConstant(typeObject.type);\n  if (typeFromObject) {\n    const defaultValueType = parseValueTypeDefault(typeObject.default);\n    if (typeFromObject !== defaultValueType) {\n      throw new Error(`Type \"${typeFromObject}\" must match the type of the default value. Given default value: \"${typeObject.default}\" as \"${defaultValueType}\"`);\n    }\n    return typeFromObject;\n  }\n}\nfunction parseValueTypeDefinition(typeDefinition) {\n  const typeFromObject = parseValueTypeObject(typeDefinition);\n  const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n  const typeFromConstant = parseValueTypeConstant(typeDefinition);\n  const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n  if (type)\n    return type;\n  throw new Error(`Unknown value type \"${typeDefinition}\"`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n  const constant = parseValueTypeConstant(typeDefinition);\n  if (constant)\n    return defaultValuesByType[constant];\n  const defaultValue = typeDefinition.default;\n  if (defaultValue !== void 0)\n    return defaultValue;\n  return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(token, typeDefinition) {\n  const key = `${dasherize(token)}-value`;\n  const type = parseValueTypeDefinition(typeDefinition);\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) !== void 0;\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 array\");\n    }\n    return array;\n  },\n  boolean(value) {\n    return !(value == \"0\" || value == \"false\");\n  },\n  number(value) {\n    return Number(value);\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 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}\nclass Controller {\n  constructor(context) {\n    this.context = context;\n  }\n  static get shouldLoad() {\n    return true;\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 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 = [ClassPropertiesBlessing, TargetPropertiesBlessing, ValuePropertiesBlessing];\nController.targets = [];\nController.values = {};\n/**!\n * Sortable 1.14.0\n * @author\tRubaXa   <trash@rubaxa.org>\n * @author\towenm    <owen23355@gmail.com>\n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) {\n      symbols = symbols.filter(function(sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n    keys.push.apply(keys, symbols);\n  }\n  return keys;\n}\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function(key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function(key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n  return target;\n}\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function(obj2) {\n      return typeof obj2;\n    };\n  } else {\n    _typeof = function(obj2) {\n      return obj2 && typeof Symbol === \"function\" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? \"symbol\" : typeof obj2;\n    };\n  }\n  return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nfunction _extends() {\n  _extends = Object.assign || function(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null)\n    return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0)\n      continue;\n    target[key] = source[key];\n  }\n  return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null)\n    return {};\n  var target = _objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0)\n        continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key))\n        continue;\n      target[key] = source[key];\n    }\n  }\n  return target;\n}\nvar version = \"1.14.0\";\nfunction userAgent(pattern) {\n  if (typeof window !== \"undefined\" && window.navigator) {\n    return !!/* @__PURE__ */ navigator.userAgent.match(pattern);\n  }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\nvar captureMode = {\n  capture: false,\n  passive: false\n};\nfunction on(el, event, fn) {\n  el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n  el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches(el, selector) {\n  if (!selector)\n    return;\n  selector[0] === \">\" && (selector = selector.substring(1));\n  if (el) {\n    try {\n      if (el.matches) {\n        return el.matches(selector);\n      } else if (el.msMatchesSelector) {\n        return el.msMatchesSelector(selector);\n      } else if (el.webkitMatchesSelector) {\n        return el.webkitMatchesSelector(selector);\n      }\n    } catch (_) {\n      return false;\n    }\n  }\n  return false;\n}\nfunction getParentOrHost(el) {\n  return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest(el, selector, ctx, includeCTX) {\n  if (el) {\n    ctx = ctx || document;\n    do {\n      if (selector != null && (selector[0] === \">\" ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n        return el;\n      }\n      if (el === ctx)\n        break;\n    } while (el = getParentOrHost(el));\n  }\n  return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n  if (el && name) {\n    if (el.classList) {\n      el.classList[state ? \"add\" : \"remove\"](name);\n    } else {\n      var className = (\" \" + el.className + \" \").replace(R_SPACE, \" \").replace(\" \" + name + \" \", \" \");\n      el.className = (className + (state ? \" \" + name : \"\")).replace(R_SPACE, \" \");\n    }\n  }\n}\nfunction css(el, prop, val) {\n  var style = el && el.style;\n  if (style) {\n    if (val === void 0) {\n      if (document.defaultView && document.defaultView.getComputedStyle) {\n        val = document.defaultView.getComputedStyle(el, \"\");\n      } else if (el.currentStyle) {\n        val = el.currentStyle;\n      }\n      return prop === void 0 ? val : val[prop];\n    } else {\n      if (!(prop in style) && prop.indexOf(\"webkit\") === -1) {\n        prop = \"-webkit-\" + prop;\n      }\n      style[prop] = val + (typeof val === \"string\" ? \"\" : \"px\");\n    }\n  }\n}\nfunction matrix(el, selfOnly) {\n  var appliedTransforms = \"\";\n  if (typeof el === \"string\") {\n    appliedTransforms = el;\n  } else {\n    do {\n      var transform = css(el, \"transform\");\n      if (transform && transform !== \"none\") {\n        appliedTransforms = transform + \" \" + appliedTransforms;\n      }\n    } while (!selfOnly && (el = el.parentNode));\n  }\n  var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n  return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n  if (ctx) {\n    var list = ctx.getElementsByTagName(tagName), i = 0, n = list.length;\n    if (iterator) {\n      for (; i < n; i++) {\n        iterator(list[i], i);\n      }\n    }\n    return list;\n  }\n  return [];\n}\nfunction getWindowScrollingElement() {\n  var scrollingElement = document.scrollingElement;\n  if (scrollingElement) {\n    return scrollingElement;\n  } else {\n    return document.documentElement;\n  }\n}\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n  if (!el.getBoundingClientRect && el !== window)\n    return;\n  var elRect, top, left, bottom, right, height, width;\n  if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n    elRect = el.getBoundingClientRect();\n    top = elRect.top;\n    left = elRect.left;\n    bottom = elRect.bottom;\n    right = elRect.right;\n    height = elRect.height;\n    width = elRect.width;\n  } else {\n    top = 0;\n    left = 0;\n    bottom = window.innerHeight;\n    right = window.innerWidth;\n    height = window.innerHeight;\n    width = window.innerWidth;\n  }\n  if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n    container = container || el.parentNode;\n    if (!IE11OrLess) {\n      do {\n        if (container && container.getBoundingClientRect && (css(container, \"transform\") !== \"none\" || relativeToNonStaticParent && css(container, \"position\") !== \"static\")) {\n          var containerRect = container.getBoundingClientRect();\n          top -= containerRect.top + parseInt(css(container, \"border-top-width\"));\n          left -= containerRect.left + parseInt(css(container, \"border-left-width\"));\n          bottom = top + elRect.height;\n          right = left + elRect.width;\n          break;\n        }\n      } while (container = container.parentNode);\n    }\n  }\n  if (undoScale && el !== window) {\n    var elMatrix = matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d;\n    if (elMatrix) {\n      top /= scaleY;\n      left /= scaleX;\n      width /= scaleX;\n      height /= scaleY;\n      bottom = top + height;\n      right = left + width;\n    }\n  }\n  return {\n    top,\n    left,\n    bottom,\n    right,\n    width,\n    height\n  };\n}\nfunction isScrolledPast(el, elSide, parentSide) {\n  var parent = getParentAutoScrollElement(el, true), elSideVal = getRect(el)[elSide];\n  while (parent) {\n    var parentSideVal = getRect(parent)[parentSide], visible = void 0;\n    if (parentSide === \"top\" || parentSide === \"left\") {\n      visible = elSideVal >= parentSideVal;\n    } else {\n      visible = elSideVal <= parentSideVal;\n    }\n    if (!visible)\n      return parent;\n    if (parent === getWindowScrollingElement())\n      break;\n    parent = getParentAutoScrollElement(parent, false);\n  }\n  return false;\n}\nfunction getChild(el, childNum, options, includeDragEl) {\n  var currentChild = 0, i = 0, children = el.children;\n  while (i < children.length) {\n    if (children[i].style.display !== \"none\" && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n      if (currentChild === childNum) {\n        return children[i];\n      }\n      currentChild++;\n    }\n    i++;\n  }\n  return null;\n}\nfunction lastChild(el, selector) {\n  var last = el.lastElementChild;\n  while (last && (last === Sortable.ghost || css(last, \"display\") === \"none\" || selector && !matches(last, selector))) {\n    last = last.previousElementSibling;\n  }\n  return last || null;\n}\nfunction index(el, selector) {\n  var index2 = 0;\n  if (!el || !el.parentNode) {\n    return -1;\n  }\n  while (el = el.previousElementSibling) {\n    if (el.nodeName.toUpperCase() !== \"TEMPLATE\" && el !== Sortable.clone && (!selector || matches(el, selector))) {\n      index2++;\n    }\n  }\n  return index2;\n}\nfunction getRelativeScrollOffset(el) {\n  var offsetLeft = 0, offsetTop = 0, winScroller = getWindowScrollingElement();\n  if (el) {\n    do {\n      var elMatrix = matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d;\n      offsetLeft += el.scrollLeft * scaleX;\n      offsetTop += el.scrollTop * scaleY;\n    } while (el !== winScroller && (el = el.parentNode));\n  }\n  return [offsetLeft, offsetTop];\n}\nfunction indexOfObject(arr, obj) {\n  for (var i in arr) {\n    if (!arr.hasOwnProperty(i))\n      continue;\n    for (var key in obj) {\n      if (obj.hasOwnProperty(key) && obj[key] === arr[i][key])\n        return Number(i);\n    }\n  }\n  return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n  if (!el || !el.getBoundingClientRect)\n    return getWindowScrollingElement();\n  var elem = el;\n  var gotSelf = false;\n  do {\n    if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n      var elemCSS = css(elem);\n      if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == \"auto\" || elemCSS.overflowX == \"scroll\") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == \"auto\" || elemCSS.overflowY == \"scroll\")) {\n        if (!elem.getBoundingClientRect || elem === document.body)\n          return getWindowScrollingElement();\n        if (gotSelf || includeSelf)\n          return elem;\n        gotSelf = true;\n      }\n    }\n  } while (elem = elem.parentNode);\n  return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n  if (dst && src) {\n    for (var key in src) {\n      if (src.hasOwnProperty(key)) {\n        dst[key] = src[key];\n      }\n    }\n  }\n  return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n  return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n  return function() {\n    if (!_throttleTimeout) {\n      var args = arguments, _this = this;\n      if (args.length === 1) {\n        callback.call(_this, args[0]);\n      } else {\n        callback.apply(_this, args);\n      }\n      _throttleTimeout = setTimeout(function() {\n        _throttleTimeout = void 0;\n      }, ms);\n    }\n  };\n}\nfunction cancelThrottle() {\n  clearTimeout(_throttleTimeout);\n  _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n  el.scrollLeft += x;\n  el.scrollTop += y;\n}\nfunction clone(el) {\n  var Polymer = window.Polymer;\n  var $ = window.jQuery || window.Zepto;\n  if (Polymer && Polymer.dom) {\n    return Polymer.dom(el).cloneNode(true);\n  } else if ($) {\n    return $(el).clone(true)[0];\n  } else {\n    return el.cloneNode(true);\n  }\n}\nvar expando = \"Sortable\" + new Date().getTime();\nfunction AnimationStateManager() {\n  var animationStates = [], animationCallbackId;\n  return {\n    captureAnimationState: function captureAnimationState() {\n      animationStates = [];\n      if (!this.options.animation)\n        return;\n      var children = [].slice.call(this.el.children);\n      children.forEach(function(child) {\n        if (css(child, \"display\") === \"none\" || child === Sortable.ghost)\n          return;\n        animationStates.push({\n          target: child,\n          rect: getRect(child)\n        });\n        var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n        if (child.thisAnimationDuration) {\n          var childMatrix = matrix(child, true);\n          if (childMatrix) {\n            fromRect.top -= childMatrix.f;\n            fromRect.left -= childMatrix.e;\n          }\n        }\n        child.fromRect = fromRect;\n      });\n    },\n    addAnimationState: function addAnimationState(state) {\n      animationStates.push(state);\n    },\n    removeAnimationState: function removeAnimationState(target) {\n      animationStates.splice(indexOfObject(animationStates, {\n        target\n      }), 1);\n    },\n    animateAll: function animateAll(callback) {\n      var _this = this;\n      if (!this.options.animation) {\n        clearTimeout(animationCallbackId);\n        if (typeof callback === \"function\")\n          callback();\n        return;\n      }\n      var animating = false, animationTime = 0;\n      animationStates.forEach(function(state) {\n        var time = 0, target = state.target, fromRect = target.fromRect, toRect = getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state.rect, targetMatrix = matrix(target, true);\n        if (targetMatrix) {\n          toRect.top -= targetMatrix.f;\n          toRect.left -= targetMatrix.e;\n        }\n        target.toRect = toRect;\n        if (target.thisAnimationDuration) {\n          if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n            time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n          }\n        }\n        if (!isRectEqual(toRect, fromRect)) {\n          target.prevFromRect = fromRect;\n          target.prevToRect = toRect;\n          if (!time) {\n            time = _this.options.animation;\n          }\n          _this.animate(target, animatingRect, toRect, time);\n        }\n        if (time) {\n          animating = true;\n          animationTime = Math.max(animationTime, time);\n          clearTimeout(target.animationResetTimer);\n          target.animationResetTimer = setTimeout(function() {\n            target.animationTime = 0;\n            target.prevFromRect = null;\n            target.fromRect = null;\n            target.prevToRect = null;\n            target.thisAnimationDuration = null;\n          }, time);\n          target.thisAnimationDuration = time;\n        }\n      });\n      clearTimeout(animationCallbackId);\n      if (!animating) {\n        if (typeof callback === \"function\")\n          callback();\n      } else {\n        animationCallbackId = setTimeout(function() {\n          if (typeof callback === \"function\")\n            callback();\n        }, animationTime);\n      }\n      animationStates = [];\n    },\n    animate: function animate(target, currentRect, toRect, duration) {\n      if (duration) {\n        css(target, \"transition\", \"\");\n        css(target, \"transform\", \"\");\n        var elMatrix = matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n        target.animatingX = !!translateX;\n        target.animatingY = !!translateY;\n        css(target, \"transform\", \"translate3d(\" + translateX + \"px,\" + translateY + \"px,0)\");\n        this.forRepaintDummy = repaint(target);\n        css(target, \"transition\", \"transform \" + duration + \"ms\" + (this.options.easing ? \" \" + this.options.easing : \"\"));\n        css(target, \"transform\", \"translate3d(0,0,0)\");\n        typeof target.animated === \"number\" && clearTimeout(target.animated);\n        target.animated = setTimeout(function() {\n          css(target, \"transition\", \"\");\n          css(target, \"transform\", \"\");\n          target.animated = false;\n          target.animatingX = false;\n          target.animatingY = false;\n        }, duration);\n      }\n    }\n  };\n}\nfunction repaint(target) {\n  return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n  return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\nvar plugins = [];\nvar defaults = {\n  initializeByDefault: true\n};\nvar PluginManager = {\n  mount: function mount(plugin) {\n    for (var option2 in defaults) {\n      if (defaults.hasOwnProperty(option2) && !(option2 in plugin)) {\n        plugin[option2] = defaults[option2];\n      }\n    }\n    plugins.forEach(function(p) {\n      if (p.pluginName === plugin.pluginName) {\n        throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n      }\n    });\n    plugins.push(plugin);\n  },\n  pluginEvent: function pluginEvent(eventName, sortable, evt) {\n    var _this = this;\n    this.eventCanceled = false;\n    evt.cancel = function() {\n      _this.eventCanceled = true;\n    };\n    var eventNameGlobal = eventName + \"Global\";\n    plugins.forEach(function(plugin) {\n      if (!sortable[plugin.pluginName])\n        return;\n      if (sortable[plugin.pluginName][eventNameGlobal]) {\n        sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n          sortable\n        }, evt));\n      }\n      if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n        sortable[plugin.pluginName][eventName](_objectSpread2({\n          sortable\n        }, evt));\n      }\n    });\n  },\n  initializePlugins: function initializePlugins(sortable, el, defaults2, options) {\n    plugins.forEach(function(plugin) {\n      var pluginName = plugin.pluginName;\n      if (!sortable.options[pluginName] && !plugin.initializeByDefault)\n        return;\n      var initialized = new plugin(sortable, el, sortable.options);\n      initialized.sortable = sortable;\n      initialized.options = sortable.options;\n      sortable[pluginName] = initialized;\n      _extends(defaults2, initialized.defaults);\n    });\n    for (var option2 in sortable.options) {\n      if (!sortable.options.hasOwnProperty(option2))\n        continue;\n      var modified = this.modifyOption(sortable, option2, sortable.options[option2]);\n      if (typeof modified !== \"undefined\") {\n        sortable.options[option2] = modified;\n      }\n    }\n  },\n  getEventProperties: function getEventProperties(name, sortable) {\n    var eventProperties = {};\n    plugins.forEach(function(plugin) {\n      if (typeof plugin.eventProperties !== \"function\")\n        return;\n      _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n    });\n    return eventProperties;\n  },\n  modifyOption: function modifyOption(sortable, name, value) {\n    var modifiedValue;\n    plugins.forEach(function(plugin) {\n      if (!sortable[plugin.pluginName])\n        return;\n      if (plugin.optionListeners && typeof plugin.optionListeners[name] === \"function\") {\n        modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n      }\n    });\n    return modifiedValue;\n  }\n};\nfunction dispatchEvent(_ref) {\n  var sortable = _ref.sortable, rootEl2 = _ref.rootEl, name = _ref.name, targetEl = _ref.targetEl, cloneEl2 = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex2 = _ref.oldIndex, newIndex2 = _ref.newIndex, oldDraggableIndex2 = _ref.oldDraggableIndex, newDraggableIndex2 = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable2 = _ref.putSortable, extraEventProperties = _ref.extraEventProperties;\n  sortable = sortable || rootEl2 && rootEl2[expando];\n  if (!sortable)\n    return;\n  var evt, options = sortable.options, onName = \"on\" + name.charAt(0).toUpperCase() + name.substr(1);\n  if (window.CustomEvent && !IE11OrLess && !Edge) {\n    evt = new CustomEvent(name, {\n      bubbles: true,\n      cancelable: true\n    });\n  } else {\n    evt = document.createEvent(\"Event\");\n    evt.initEvent(name, true, true);\n  }\n  evt.to = toEl || rootEl2;\n  evt.from = fromEl || rootEl2;\n  evt.item = targetEl || rootEl2;\n  evt.clone = cloneEl2;\n  evt.oldIndex = oldIndex2;\n  evt.newIndex = newIndex2;\n  evt.oldDraggableIndex = oldDraggableIndex2;\n  evt.newDraggableIndex = newDraggableIndex2;\n  evt.originalEvent = originalEvent;\n  evt.pullMode = putSortable2 ? putSortable2.lastPutMode : void 0;\n  var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n  for (var option2 in allEventProperties) {\n    evt[option2] = allEventProperties[option2];\n  }\n  if (rootEl2) {\n    rootEl2.dispatchEvent(evt);\n  }\n  if (options[onName]) {\n    options[onName].call(sortable, evt);\n  }\n}\nvar _excluded = [\"evt\"];\nvar pluginEvent2 = function pluginEvent3(eventName, sortable) {\n  var _ref = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, originalEvent = _ref.evt, data = _objectWithoutProperties(_ref, _excluded);\n  PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n    dragEl,\n    parentEl,\n    ghostEl,\n    rootEl,\n    nextEl,\n    lastDownEl,\n    cloneEl,\n    cloneHidden,\n    dragStarted: moved,\n    putSortable,\n    activeSortable: Sortable.active,\n    originalEvent,\n    oldIndex,\n    oldDraggableIndex,\n    newIndex,\n    newDraggableIndex,\n    hideGhostForTarget: _hideGhostForTarget,\n    unhideGhostForTarget: _unhideGhostForTarget,\n    cloneNowHidden: function cloneNowHidden() {\n      cloneHidden = true;\n    },\n    cloneNowShown: function cloneNowShown() {\n      cloneHidden = false;\n    },\n    dispatchSortableEvent: function dispatchSortableEvent(name) {\n      _dispatchEvent({\n        sortable,\n        name,\n        originalEvent\n      });\n    }\n  }, data));\n};\nfunction _dispatchEvent(info) {\n  dispatchEvent(_objectSpread2({\n    putSortable,\n    cloneEl,\n    targetEl: dragEl,\n    rootEl,\n    oldIndex,\n    oldDraggableIndex,\n    newIndex,\n    newDraggableIndex\n  }, info));\n}\nvar dragEl, parentEl, ghostEl, rootEl, nextEl, lastDownEl, cloneEl, cloneHidden, oldIndex, newIndex, oldDraggableIndex, newDraggableIndex, activeGroup, putSortable, awaitingDragStarted = false, ignoreNextClick = false, sortables = [], tapEvt, touchEvt, lastDx, lastDy, tapDistanceLeft, tapDistanceTop, moved, lastTarget, lastDirection, pastFirstInvertThresh = false, isCircumstantialInvert = false, targetMoveDistance, ghostRelativeParent, ghostRelativeParentInitialScroll = [], _silent = false, savedInputChecked = [];\nvar documentExists = typeof document !== \"undefined\", PositionGhostAbsolutely = IOS, CSSFloatProperty = Edge || IE11OrLess ? \"cssFloat\" : \"float\", supportDraggable = documentExists && !ChromeForAndroid && !IOS && \"draggable\" in document.createElement(\"div\"), supportCssPointerEvents = function() {\n  if (!documentExists)\n    return;\n  if (IE11OrLess) {\n    return false;\n  }\n  var el = document.createElement(\"x\");\n  el.style.cssText = \"pointer-events:auto\";\n  return el.style.pointerEvents === \"auto\";\n}(), _detectDirection = function _detectDirection2(el, options) {\n  var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), firstChildCSS = child1 && css(child1), secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n  if (elCSS.display === \"flex\") {\n    return elCSS.flexDirection === \"column\" || elCSS.flexDirection === \"column-reverse\" ? \"vertical\" : \"horizontal\";\n  }\n  if (elCSS.display === \"grid\") {\n    return elCSS.gridTemplateColumns.split(\" \").length <= 1 ? \"vertical\" : \"horizontal\";\n  }\n  if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== \"none\") {\n    var touchingSideChild2 = firstChildCSS[\"float\"] === \"left\" ? \"left\" : \"right\";\n    return child2 && (secondChildCSS.clear === \"both\" || secondChildCSS.clear === touchingSideChild2) ? \"vertical\" : \"horizontal\";\n  }\n  return child1 && (firstChildCSS.display === \"block\" || firstChildCSS.display === \"flex\" || firstChildCSS.display === \"table\" || firstChildCSS.display === \"grid\" || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === \"none\" || child2 && elCSS[CSSFloatProperty] === \"none\" && firstChildWidth + secondChildWidth > elWidth) ? \"vertical\" : \"horizontal\";\n}, _dragElInRowColumn = function _dragElInRowColumn2(dragRect, targetRect, vertical) {\n  var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height;\n  return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n}, _detectNearestEmptySortable = function _detectNearestEmptySortable2(x, y) {\n  var ret;\n  sortables.some(function(sortable) {\n    var threshold = sortable[expando].options.emptyInsertThreshold;\n    if (!threshold || lastChild(sortable))\n      return;\n    var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n    if (insideHorizontally && insideVertically) {\n      return ret = sortable;\n    }\n  });\n  return ret;\n}, _prepareGroup = function _prepareGroup2(options) {\n  function toFn(value, pull) {\n    return function(to, from, dragEl2, evt) {\n      var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n      if (value == null && (pull || sameGroup)) {\n        return true;\n      } else if (value == null || value === false) {\n        return false;\n      } else if (pull && value === \"clone\") {\n        return value;\n      } else if (typeof value === \"function\") {\n        return toFn(value(to, from, dragEl2, evt), pull)(to, from, dragEl2, evt);\n      } else {\n        var otherGroup = (pull ? to : from).options.group.name;\n        return value === true || typeof value === \"string\" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n      }\n    };\n  }\n  var group = {};\n  var originalGroup = options.group;\n  if (!originalGroup || _typeof(originalGroup) != \"object\") {\n    originalGroup = {\n      name: originalGroup\n    };\n  }\n  group.name = originalGroup.name;\n  group.checkPull = toFn(originalGroup.pull, true);\n  group.checkPut = toFn(originalGroup.put);\n  group.revertClone = originalGroup.revertClone;\n  options.group = group;\n}, _hideGhostForTarget = function _hideGhostForTarget2() {\n  if (!supportCssPointerEvents && ghostEl) {\n    css(ghostEl, \"display\", \"none\");\n  }\n}, _unhideGhostForTarget = function _unhideGhostForTarget2() {\n  if (!supportCssPointerEvents && ghostEl) {\n    css(ghostEl, \"display\", \"\");\n  }\n};\nif (documentExists) {\n  document.addEventListener(\"click\", function(evt) {\n    if (ignoreNextClick) {\n      evt.preventDefault();\n      evt.stopPropagation && evt.stopPropagation();\n      evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n      ignoreNextClick = false;\n      return false;\n    }\n  }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent2(evt) {\n  if (dragEl) {\n    evt = evt.touches ? evt.touches[0] : evt;\n    var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n    if (nearest) {\n      var event = {};\n      for (var i in evt) {\n        if (evt.hasOwnProperty(i)) {\n          event[i] = evt[i];\n        }\n      }\n      event.target = event.rootEl = nearest;\n      event.preventDefault = void 0;\n      event.stopPropagation = void 0;\n      nearest[expando]._onDragOver(event);\n    }\n  }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl2(evt) {\n  if (dragEl) {\n    dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n  }\n};\nfunction Sortable(el, options) {\n  if (!(el && el.nodeType && el.nodeType === 1)) {\n    throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n  }\n  this.el = el;\n  this.options = options = _extends({}, options);\n  el[expando] = this;\n  var defaults2 = {\n    group: null,\n    sort: true,\n    disabled: false,\n    store: null,\n    handle: null,\n    draggable: /^[uo]l$/i.test(el.nodeName) ? \">li\" : \">*\",\n    swapThreshold: 1,\n    invertSwap: false,\n    invertedSwapThreshold: null,\n    removeCloneOnHide: true,\n    direction: function direction() {\n      return _detectDirection(el, this.options);\n    },\n    ghostClass: \"sortable-ghost\",\n    chosenClass: \"sortable-chosen\",\n    dragClass: \"sortable-drag\",\n    ignore: \"a, img\",\n    filter: null,\n    preventOnFilter: true,\n    animation: 0,\n    easing: null,\n    setData: function setData(dataTransfer, dragEl2) {\n      dataTransfer.setData(\"Text\", dragEl2.textContent);\n    },\n    dropBubble: false,\n    dragoverBubble: false,\n    dataIdAttr: \"data-id\",\n    delay: 0,\n    delayOnTouchOnly: false,\n    touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n    forceFallback: false,\n    fallbackClass: \"sortable-fallback\",\n    fallbackOnBody: false,\n    fallbackTolerance: 0,\n    fallbackOffset: {\n      x: 0,\n      y: 0\n    },\n    supportPointer: Sortable.supportPointer !== false && \"PointerEvent\" in window && !Safari,\n    emptyInsertThreshold: 5\n  };\n  PluginManager.initializePlugins(this, el, defaults2);\n  for (var name in defaults2) {\n    !(name in options) && (options[name] = defaults2[name]);\n  }\n  _prepareGroup(options);\n  for (var fn in this) {\n    if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") {\n      this[fn] = this[fn].bind(this);\n    }\n  }\n  this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n  if (this.nativeDraggable) {\n    this.options.touchStartThreshold = 1;\n  }\n  if (options.supportPointer) {\n    on(el, \"pointerdown\", this._onTapStart);\n  } else {\n    on(el, \"mousedown\", this._onTapStart);\n    on(el, \"touchstart\", this._onTapStart);\n  }\n  if (this.nativeDraggable) {\n    on(el, \"dragover\", this);\n    on(el, \"dragenter\", this);\n  }\n  sortables.push(this.el);\n  options.store && options.store.get && this.sort(options.store.get(this) || []);\n  _extends(this, AnimationStateManager());\n}\nSortable.prototype = {\n  constructor: Sortable,\n  _isOutsideThisEl: function _isOutsideThisEl(target) {\n    if (!this.el.contains(target) && target !== this.el) {\n      lastTarget = null;\n    }\n  },\n  _getDirection: function _getDirection(evt, target) {\n    return typeof this.options.direction === \"function\" ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n  },\n  _onTapStart: function _onTapStart(evt) {\n    if (!evt.cancelable)\n      return;\n    var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === \"touch\" && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter;\n    _saveInputCheckedState(el);\n    if (dragEl) {\n      return;\n    }\n    if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n      return;\n    }\n    if (originalTarget.isContentEditable) {\n      return;\n    }\n    if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === \"SELECT\") {\n      return;\n    }\n    target = closest(target, options.draggable, el, false);\n    if (target && target.animated) {\n      return;\n    }\n    if (lastDownEl === target) {\n      return;\n    }\n    oldIndex = index(target);\n    oldDraggableIndex = index(target, options.draggable);\n    if (typeof filter === \"function\") {\n      if (filter.call(this, evt, target, this)) {\n        _dispatchEvent({\n          sortable: _this,\n          rootEl: originalTarget,\n          name: \"filter\",\n          targetEl: target,\n          toEl: el,\n          fromEl: el\n        });\n        pluginEvent2(\"filter\", _this, {\n          evt\n        });\n        preventOnFilter && evt.cancelable && evt.preventDefault();\n        return;\n      }\n    } else if (filter) {\n      filter = filter.split(\",\").some(function(criteria) {\n        criteria = closest(originalTarget, criteria.trim(), el, false);\n        if (criteria) {\n          _dispatchEvent({\n            sortable: _this,\n            rootEl: criteria,\n            name: \"filter\",\n            targetEl: target,\n            fromEl: el,\n            toEl: el\n          });\n          pluginEvent2(\"filter\", _this, {\n            evt\n          });\n          return true;\n        }\n      });\n      if (filter) {\n        preventOnFilter && evt.cancelable && evt.preventDefault();\n        return;\n      }\n    }\n    if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n      return;\n    }\n    this._prepareDragStart(evt, touch, target);\n  },\n  _prepareDragStart: function _prepareDragStart(evt, touch, target) {\n    var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn;\n    if (target && !dragEl && target.parentNode === el) {\n      var dragRect = getRect(target);\n      rootEl = el;\n      dragEl = target;\n      parentEl = dragEl.parentNode;\n      nextEl = dragEl.nextSibling;\n      lastDownEl = target;\n      activeGroup = options.group;\n      Sortable.dragged = dragEl;\n      tapEvt = {\n        target: dragEl,\n        clientX: (touch || evt).clientX,\n        clientY: (touch || evt).clientY\n      };\n      tapDistanceLeft = tapEvt.clientX - dragRect.left;\n      tapDistanceTop = tapEvt.clientY - dragRect.top;\n      this._lastX = (touch || evt).clientX;\n      this._lastY = (touch || evt).clientY;\n      dragEl.style[\"will-change\"] = \"all\";\n      dragStartFn = function dragStartFn2() {\n        pluginEvent2(\"delayEnded\", _this, {\n          evt\n        });\n        if (Sortable.eventCanceled) {\n          _this._onDrop();\n          return;\n        }\n        _this._disableDelayedDragEvents();\n        if (!FireFox && _this.nativeDraggable) {\n          dragEl.draggable = true;\n        }\n        _this._triggerDragStart(evt, touch);\n        _dispatchEvent({\n          sortable: _this,\n          name: \"choose\",\n          originalEvent: evt\n        });\n        toggleClass(dragEl, options.chosenClass, true);\n      };\n      options.ignore.split(\",\").forEach(function(criteria) {\n        find(dragEl, criteria.trim(), _disableDraggable);\n      });\n      on(ownerDocument, \"dragover\", nearestEmptyInsertDetectEvent);\n      on(ownerDocument, \"mousemove\", nearestEmptyInsertDetectEvent);\n      on(ownerDocument, \"touchmove\", nearestEmptyInsertDetectEvent);\n      on(ownerDocument, \"mouseup\", _this._onDrop);\n      on(ownerDocument, \"touchend\", _this._onDrop);\n      on(ownerDocument, \"touchcancel\", _this._onDrop);\n      if (FireFox && this.nativeDraggable) {\n        this.options.touchStartThreshold = 4;\n        dragEl.draggable = true;\n      }\n      pluginEvent2(\"delayStart\", this, {\n        evt\n      });\n      if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n        if (Sortable.eventCanceled) {\n          this._onDrop();\n          return;\n        }\n        on(ownerDocument, \"mouseup\", _this._disableDelayedDrag);\n        on(ownerDocument, \"touchend\", _this._disableDelayedDrag);\n        on(ownerDocument, \"touchcancel\", _this._disableDelayedDrag);\n        on(ownerDocument, \"mousemove\", _this._delayedDragTouchMoveHandler);\n        on(ownerDocument, \"touchmove\", _this._delayedDragTouchMoveHandler);\n        options.supportPointer && on(ownerDocument, \"pointermove\", _this._delayedDragTouchMoveHandler);\n        _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n      } else {\n        dragStartFn();\n      }\n    }\n  },\n  _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(e) {\n    var touch = e.touches ? e.touches[0] : e;\n    if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n      this._disableDelayedDrag();\n    }\n  },\n  _disableDelayedDrag: function _disableDelayedDrag() {\n    dragEl && _disableDraggable(dragEl);\n    clearTimeout(this._dragStartTimer);\n    this._disableDelayedDragEvents();\n  },\n  _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n    var ownerDocument = this.el.ownerDocument;\n    off(ownerDocument, \"mouseup\", this._disableDelayedDrag);\n    off(ownerDocument, \"touchend\", this._disableDelayedDrag);\n    off(ownerDocument, \"touchcancel\", this._disableDelayedDrag);\n    off(ownerDocument, \"mousemove\", this._delayedDragTouchMoveHandler);\n    off(ownerDocument, \"touchmove\", this._delayedDragTouchMoveHandler);\n    off(ownerDocument, \"pointermove\", this._delayedDragTouchMoveHandler);\n  },\n  _triggerDragStart: function _triggerDragStart(evt, touch) {\n    touch = touch || evt.pointerType == \"touch\" && evt;\n    if (!this.nativeDraggable || touch) {\n      if (this.options.supportPointer) {\n        on(document, \"pointermove\", this._onTouchMove);\n      } else if (touch) {\n        on(document, \"touchmove\", this._onTouchMove);\n      } else {\n        on(document, \"mousemove\", this._onTouchMove);\n      }\n    } else {\n      on(dragEl, \"dragend\", this);\n      on(rootEl, \"dragstart\", this._onDragStart);\n    }\n    try {\n      if (document.selection) {\n        _nextTick(function() {\n          document.selection.empty();\n        });\n      } else {\n        window.getSelection().removeAllRanges();\n      }\n    } catch (err) {\n    }\n  },\n  _dragStarted: function _dragStarted(fallback, evt) {\n    awaitingDragStarted = false;\n    if (rootEl && dragEl) {\n      pluginEvent2(\"dragStarted\", this, {\n        evt\n      });\n      if (this.nativeDraggable) {\n        on(document, \"dragover\", _checkOutsideTargetEl);\n      }\n      var options = this.options;\n      !fallback && toggleClass(dragEl, options.dragClass, false);\n      toggleClass(dragEl, options.ghostClass, true);\n      Sortable.active = this;\n      fallback && this._appendGhost();\n      _dispatchEvent({\n        sortable: this,\n        name: \"start\",\n        originalEvent: evt\n      });\n    } else {\n      this._nulling();\n    }\n  },\n  _emulateDragOver: function _emulateDragOver() {\n    if (touchEvt) {\n      this._lastX = touchEvt.clientX;\n      this._lastY = touchEvt.clientY;\n      _hideGhostForTarget();\n      var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n      var parent = target;\n      while (target && target.shadowRoot) {\n        target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n        if (target === parent)\n          break;\n        parent = target;\n      }\n      dragEl.parentNode[expando]._isOutsideThisEl(target);\n      if (parent) {\n        do {\n          if (parent[expando]) {\n            var inserted = void 0;\n            inserted = parent[expando]._onDragOver({\n              clientX: touchEvt.clientX,\n              clientY: touchEvt.clientY,\n              target,\n              rootEl: parent\n            });\n            if (inserted && !this.options.dragoverBubble) {\n              break;\n            }\n          }\n          target = parent;\n        } while (parent = parent.parentNode);\n      }\n      _unhideGhostForTarget();\n    }\n  },\n  _onTouchMove: function _onTouchMove(evt) {\n    if (tapEvt) {\n      var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = ghostEl && matrix(ghostEl, true), scaleX = ghostEl && ghostMatrix && ghostMatrix.a, scaleY = ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n      if (!Sortable.active && !awaitingDragStarted) {\n        if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n          return;\n        }\n        this._onDragStart(evt, true);\n      }\n      if (ghostEl) {\n        if (ghostMatrix) {\n          ghostMatrix.e += dx - (lastDx || 0);\n          ghostMatrix.f += dy - (lastDy || 0);\n        } else {\n          ghostMatrix = {\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: dx,\n            f: dy\n          };\n        }\n        var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n        css(ghostEl, \"webkitTransform\", cssMatrix);\n        css(ghostEl, \"mozTransform\", cssMatrix);\n        css(ghostEl, \"msTransform\", cssMatrix);\n        css(ghostEl, \"transform\", cssMatrix);\n        lastDx = dx;\n        lastDy = dy;\n        touchEvt = touch;\n      }\n      evt.cancelable && evt.preventDefault();\n    }\n  },\n  _appendGhost: function _appendGhost() {\n    if (!ghostEl) {\n      var container = this.options.fallbackOnBody ? document.body : rootEl, rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), options = this.options;\n      if (PositionGhostAbsolutely) {\n        ghostRelativeParent = container;\n        while (css(ghostRelativeParent, \"position\") === \"static\" && css(ghostRelativeParent, \"transform\") === \"none\" && ghostRelativeParent !== document) {\n          ghostRelativeParent = ghostRelativeParent.parentNode;\n        }\n        if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n          if (ghostRelativeParent === document)\n            ghostRelativeParent = getWindowScrollingElement();\n          rect.top += ghostRelativeParent.scrollTop;\n          rect.left += ghostRelativeParent.scrollLeft;\n        } else {\n          ghostRelativeParent = getWindowScrollingElement();\n        }\n        ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n      }\n      ghostEl = dragEl.cloneNode(true);\n      toggleClass(ghostEl, options.ghostClass, false);\n      toggleClass(ghostEl, options.fallbackClass, true);\n      toggleClass(ghostEl, options.dragClass, true);\n      css(ghostEl, \"transition\", \"\");\n      css(ghostEl, \"transform\", \"\");\n      css(ghostEl, \"box-sizing\", \"border-box\");\n      css(ghostEl, \"margin\", 0);\n      css(ghostEl, \"top\", rect.top);\n      css(ghostEl, \"left\", rect.left);\n      css(ghostEl, \"width\", rect.width);\n      css(ghostEl, \"height\", rect.height);\n      css(ghostEl, \"opacity\", \"0.8\");\n      css(ghostEl, \"position\", PositionGhostAbsolutely ? \"absolute\" : \"fixed\");\n      css(ghostEl, \"zIndex\", \"100000\");\n      css(ghostEl, \"pointerEvents\", \"none\");\n      Sortable.ghost = ghostEl;\n      container.appendChild(ghostEl);\n      css(ghostEl, \"transform-origin\", tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + \"% \" + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + \"%\");\n    }\n  },\n  _onDragStart: function _onDragStart(evt, fallback) {\n    var _this = this;\n    var dataTransfer = evt.dataTransfer;\n    var options = _this.options;\n    pluginEvent2(\"dragStart\", this, {\n      evt\n    });\n    if (Sortable.eventCanceled) {\n      this._onDrop();\n      return;\n    }\n    pluginEvent2(\"setupClone\", this);\n    if (!Sortable.eventCanceled) {\n      cloneEl = clone(dragEl);\n      cloneEl.draggable = false;\n      cloneEl.style[\"will-change\"] = \"\";\n      this._hideClone();\n      toggleClass(cloneEl, this.options.chosenClass, false);\n      Sortable.clone = cloneEl;\n    }\n    _this.cloneId = _nextTick(function() {\n      pluginEvent2(\"clone\", _this);\n      if (Sortable.eventCanceled)\n        return;\n      if (!_this.options.removeCloneOnHide) {\n        rootEl.insertBefore(cloneEl, dragEl);\n      }\n      _this._hideClone();\n      _dispatchEvent({\n        sortable: _this,\n        name: \"clone\"\n      });\n    });\n    !fallback && toggleClass(dragEl, options.dragClass, true);\n    if (fallback) {\n      ignoreNextClick = true;\n      _this._loopId = setInterval(_this._emulateDragOver, 50);\n    } else {\n      off(document, \"mouseup\", _this._onDrop);\n      off(document, \"touchend\", _this._onDrop);\n      off(document, \"touchcancel\", _this._onDrop);\n      if (dataTransfer) {\n        dataTransfer.effectAllowed = \"move\";\n        options.setData && options.setData.call(_this, dataTransfer, dragEl);\n      }\n      on(document, \"drop\", _this);\n      css(dragEl, \"transform\", \"translateZ(0)\");\n    }\n    awaitingDragStarted = true;\n    _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n    on(document, \"selectstart\", _this);\n    moved = true;\n    if (Safari) {\n      css(document.body, \"user-select\", \"none\");\n    }\n  },\n  _onDragOver: function _onDragOver(evt) {\n    var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = Sortable.active, isOwner = activeGroup === group, canSort = options.sort, fromSortable = putSortable || activeSortable, vertical, _this = this, completedFired = false;\n    if (_silent)\n      return;\n    function dragOverEvent(name, extra) {\n      pluginEvent2(name, _this, _objectSpread2({\n        evt,\n        isOwner,\n        axis: vertical ? \"vertical\" : \"horizontal\",\n        revert,\n        dragRect,\n        targetRect,\n        canSort,\n        fromSortable,\n        target,\n        completed,\n        onMove: function onMove(target2, after2) {\n          return _onMove(rootEl, el, dragEl, dragRect, target2, getRect(target2), evt, after2);\n        },\n        changed\n      }, extra));\n    }\n    function capture() {\n      dragOverEvent(\"dragOverAnimationCapture\");\n      _this.captureAnimationState();\n      if (_this !== fromSortable) {\n        fromSortable.captureAnimationState();\n      }\n    }\n    function completed(insertion) {\n      dragOverEvent(\"dragOverCompleted\", {\n        insertion\n      });\n      if (insertion) {\n        if (isOwner) {\n          activeSortable._hideClone();\n        } else {\n          activeSortable._showClone(_this);\n        }\n        if (_this !== fromSortable) {\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n          toggleClass(dragEl, options.ghostClass, true);\n        }\n        if (putSortable !== _this && _this !== Sortable.active) {\n          putSortable = _this;\n        } else if (_this === Sortable.active && putSortable) {\n          putSortable = null;\n        }\n        if (fromSortable === _this) {\n          _this._ignoreWhileAnimating = target;\n        }\n        _this.animateAll(function() {\n          dragOverEvent(\"dragOverAnimationComplete\");\n          _this._ignoreWhileAnimating = null;\n        });\n        if (_this !== fromSortable) {\n          fromSortable.animateAll();\n          fromSortable._ignoreWhileAnimating = null;\n        }\n      }\n      if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n        lastTarget = null;\n      }\n      if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n        dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n        !insertion && nearestEmptyInsertDetectEvent(evt);\n      }\n      !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n      return completedFired = true;\n    }\n    function changed() {\n      newIndex = index(dragEl);\n      newDraggableIndex = index(dragEl, options.draggable);\n      _dispatchEvent({\n        sortable: _this,\n        name: \"change\",\n        toEl: el,\n        newIndex,\n        newDraggableIndex,\n        originalEvent: evt\n      });\n    }\n    if (evt.preventDefault !== void 0) {\n      evt.cancelable && evt.preventDefault();\n    }\n    target = closest(target, options.draggable, el, true);\n    dragOverEvent(\"dragOver\");\n    if (Sortable.eventCanceled)\n      return completedFired;\n    if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n      return completed(false);\n    }\n    ignoreNextClick = false;\n    if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n      vertical = this._getDirection(evt, target) === \"vertical\";\n      dragRect = getRect(dragEl);\n      dragOverEvent(\"dragOverValid\");\n      if (Sortable.eventCanceled)\n        return completedFired;\n      if (revert) {\n        parentEl = rootEl;\n        capture();\n        this._hideClone();\n        dragOverEvent(\"revert\");\n        if (!Sortable.eventCanceled) {\n          if (nextEl) {\n            rootEl.insertBefore(dragEl, nextEl);\n          } else {\n            rootEl.appendChild(dragEl);\n          }\n        }\n        return completed(true);\n      }\n      var elLastChild = lastChild(el, options.draggable);\n      if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n        if (elLastChild === dragEl) {\n          return completed(false);\n        }\n        if (elLastChild && el === evt.target) {\n          target = elLastChild;\n        }\n        if (target) {\n          targetRect = getRect(target);\n        }\n        if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n          capture();\n          el.appendChild(dragEl);\n          parentEl = el;\n          changed();\n          return completed(true);\n        }\n      } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n        var firstChild = getChild(el, 0, options, true);\n        if (firstChild === dragEl) {\n          return completed(false);\n        }\n        target = firstChild;\n        targetRect = getRect(target);\n        if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n          capture();\n          el.insertBefore(dragEl, firstChild);\n          parentEl = el;\n          changed();\n          return completed(true);\n        }\n      } else if (target.parentNode === el) {\n        targetRect = getRect(target);\n        var direction = 0, targetBeforeFirstSwap, differentLevel = dragEl.parentNode !== el, differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? \"top\" : \"left\", scrolledPastTop = isScrolledPast(target, \"top\", \"top\") || isScrolledPast(dragEl, \"top\", \"top\"), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n        if (lastTarget !== target) {\n          targetBeforeFirstSwap = targetRect[side1];\n          pastFirstInvertThresh = false;\n          isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n        }\n        direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n        var sibling;\n        if (direction !== 0) {\n          var dragIndex = index(dragEl);\n          do {\n            dragIndex -= direction;\n            sibling = parentEl.children[dragIndex];\n          } while (sibling && (css(sibling, \"display\") === \"none\" || sibling === ghostEl));\n        }\n        if (direction === 0 || sibling === target) {\n          return completed(false);\n        }\n        lastTarget = target;\n        lastDirection = direction;\n        var nextSibling = target.nextElementSibling, after = false;\n        after = direction === 1;\n        var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n        if (moveVector !== false) {\n          if (moveVector === 1 || moveVector === -1) {\n            after = moveVector === 1;\n          }\n          _silent = true;\n          setTimeout(_unsilent, 30);\n          capture();\n          if (after && !nextSibling) {\n            el.appendChild(dragEl);\n          } else {\n            target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n          }\n          if (scrolledPastTop) {\n            scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n          }\n          parentEl = dragEl.parentNode;\n          if (targetBeforeFirstSwap !== void 0 && !isCircumstantialInvert) {\n            targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n          }\n          changed();\n          return completed(true);\n        }\n      }\n      if (el.contains(dragEl)) {\n        return completed(false);\n      }\n    }\n    return false;\n  },\n  _ignoreWhileAnimating: null,\n  _offMoveEvents: function _offMoveEvents() {\n    off(document, \"mousemove\", this._onTouchMove);\n    off(document, \"touchmove\", this._onTouchMove);\n    off(document, \"pointermove\", this._onTouchMove);\n    off(document, \"dragover\", nearestEmptyInsertDetectEvent);\n    off(document, \"mousemove\", nearestEmptyInsertDetectEvent);\n    off(document, \"touchmove\", nearestEmptyInsertDetectEvent);\n  },\n  _offUpEvents: function _offUpEvents() {\n    var ownerDocument = this.el.ownerDocument;\n    off(ownerDocument, \"mouseup\", this._onDrop);\n    off(ownerDocument, \"touchend\", this._onDrop);\n    off(ownerDocument, \"pointerup\", this._onDrop);\n    off(ownerDocument, \"touchcancel\", this._onDrop);\n    off(document, \"selectstart\", this);\n  },\n  _onDrop: function _onDrop(evt) {\n    var el = this.el, options = this.options;\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    pluginEvent2(\"drop\", this, {\n      evt\n    });\n    parentEl = dragEl && dragEl.parentNode;\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    if (Sortable.eventCanceled) {\n      this._nulling();\n      return;\n    }\n    awaitingDragStarted = false;\n    isCircumstantialInvert = false;\n    pastFirstInvertThresh = false;\n    clearInterval(this._loopId);\n    clearTimeout(this._dragStartTimer);\n    _cancelNextTick(this.cloneId);\n    _cancelNextTick(this._dragStartId);\n    if (this.nativeDraggable) {\n      off(document, \"drop\", this);\n      off(el, \"dragstart\", this._onDragStart);\n    }\n    this._offMoveEvents();\n    this._offUpEvents();\n    if (Safari) {\n      css(document.body, \"user-select\", \"\");\n    }\n    css(dragEl, \"transform\", \"\");\n    if (evt) {\n      if (moved) {\n        evt.cancelable && evt.preventDefault();\n        !options.dropBubble && evt.stopPropagation();\n      }\n      ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n      if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== \"clone\") {\n        cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n      }\n      if (dragEl) {\n        if (this.nativeDraggable) {\n          off(dragEl, \"dragend\", this);\n        }\n        _disableDraggable(dragEl);\n        dragEl.style[\"will-change\"] = \"\";\n        if (moved && !awaitingDragStarted) {\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n        }\n        toggleClass(dragEl, this.options.chosenClass, false);\n        _dispatchEvent({\n          sortable: this,\n          name: \"unchoose\",\n          toEl: parentEl,\n          newIndex: null,\n          newDraggableIndex: null,\n          originalEvent: evt\n        });\n        if (rootEl !== parentEl) {\n          if (newIndex >= 0) {\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: \"add\",\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n            _dispatchEvent({\n              sortable: this,\n              name: \"remove\",\n              toEl: parentEl,\n              originalEvent: evt\n            });\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: \"sort\",\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n            _dispatchEvent({\n              sortable: this,\n              name: \"sort\",\n              toEl: parentEl,\n              originalEvent: evt\n            });\n          }\n          putSortable && putSortable.save();\n        } else {\n          if (newIndex !== oldIndex) {\n            if (newIndex >= 0) {\n              _dispatchEvent({\n                sortable: this,\n                name: \"update\",\n                toEl: parentEl,\n                originalEvent: evt\n              });\n              _dispatchEvent({\n                sortable: this,\n                name: \"sort\",\n                toEl: parentEl,\n                originalEvent: evt\n              });\n            }\n          }\n        }\n        if (Sortable.active) {\n          if (newIndex == null || newIndex === -1) {\n            newIndex = oldIndex;\n            newDraggableIndex = oldDraggableIndex;\n          }\n          _dispatchEvent({\n            sortable: this,\n            name: \"end\",\n            toEl: parentEl,\n            originalEvent: evt\n          });\n          this.save();\n        }\n      }\n    }\n    this._nulling();\n  },\n  _nulling: function _nulling() {\n    pluginEvent2(\"nulling\", this);\n    rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n    savedInputChecked.forEach(function(el) {\n      el.checked = true;\n    });\n    savedInputChecked.length = lastDx = lastDy = 0;\n  },\n  handleEvent: function handleEvent(evt) {\n    switch (evt.type) {\n      case \"drop\":\n      case \"dragend\":\n        this._onDrop(evt);\n        break;\n      case \"dragenter\":\n      case \"dragover\":\n        if (dragEl) {\n          this._onDragOver(evt);\n          _globalDragOver(evt);\n        }\n        break;\n      case \"selectstart\":\n        evt.preventDefault();\n        break;\n    }\n  },\n  toArray: function toArray() {\n    var order = [], el, children = this.el.children, i = 0, n = children.length, options = this.options;\n    for (; i < n; i++) {\n      el = children[i];\n      if (closest(el, options.draggable, this.el, false)) {\n        order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n      }\n    }\n    return order;\n  },\n  sort: function sort(order, useAnimation) {\n    var items = {}, rootEl2 = this.el;\n    this.toArray().forEach(function(id, i) {\n      var el = rootEl2.children[i];\n      if (closest(el, this.options.draggable, rootEl2, false)) {\n        items[id] = el;\n      }\n    }, this);\n    useAnimation && this.captureAnimationState();\n    order.forEach(function(id) {\n      if (items[id]) {\n        rootEl2.removeChild(items[id]);\n        rootEl2.appendChild(items[id]);\n      }\n    });\n    useAnimation && this.animateAll();\n  },\n  save: function save() {\n    var store = this.options.store;\n    store && store.set && store.set(this);\n  },\n  closest: function closest$1(el, selector) {\n    return closest(el, selector || this.options.draggable, this.el, false);\n  },\n  option: function option(name, value) {\n    var options = this.options;\n    if (value === void 0) {\n      return options[name];\n    } else {\n      var modifiedValue = PluginManager.modifyOption(this, name, value);\n      if (typeof modifiedValue !== \"undefined\") {\n        options[name] = modifiedValue;\n      } else {\n        options[name] = value;\n      }\n      if (name === \"group\") {\n        _prepareGroup(options);\n      }\n    }\n  },\n  destroy: function destroy() {\n    pluginEvent2(\"destroy\", this);\n    var el = this.el;\n    el[expando] = null;\n    off(el, \"mousedown\", this._onTapStart);\n    off(el, \"touchstart\", this._onTapStart);\n    off(el, \"pointerdown\", this._onTapStart);\n    if (this.nativeDraggable) {\n      off(el, \"dragover\", this);\n      off(el, \"dragenter\", this);\n    }\n    Array.prototype.forEach.call(el.querySelectorAll(\"[draggable]\"), function(el2) {\n      el2.removeAttribute(\"draggable\");\n    });\n    this._onDrop();\n    this._disableDelayedDragEvents();\n    sortables.splice(sortables.indexOf(this.el), 1);\n    this.el = el = null;\n  },\n  _hideClone: function _hideClone() {\n    if (!cloneHidden) {\n      pluginEvent2(\"hideClone\", this);\n      if (Sortable.eventCanceled)\n        return;\n      css(cloneEl, \"display\", \"none\");\n      if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n        cloneEl.parentNode.removeChild(cloneEl);\n      }\n      cloneHidden = true;\n    }\n  },\n  _showClone: function _showClone(putSortable2) {\n    if (putSortable2.lastPutMode !== \"clone\") {\n      this._hideClone();\n      return;\n    }\n    if (cloneHidden) {\n      pluginEvent2(\"showClone\", this);\n      if (Sortable.eventCanceled)\n        return;\n      if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n        rootEl.insertBefore(cloneEl, dragEl);\n      } else if (nextEl) {\n        rootEl.insertBefore(cloneEl, nextEl);\n      } else {\n        rootEl.appendChild(cloneEl);\n      }\n      if (this.options.group.revertClone) {\n        this.animate(dragEl, cloneEl);\n      }\n      css(cloneEl, \"display\", \"\");\n      cloneHidden = false;\n    }\n  }\n};\nfunction _globalDragOver(evt) {\n  if (evt.dataTransfer) {\n    evt.dataTransfer.dropEffect = \"move\";\n  }\n  evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl2, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n  var evt, sortable = fromEl[expando], onMoveFn = sortable.options.onMove, retVal;\n  if (window.CustomEvent && !IE11OrLess && !Edge) {\n    evt = new CustomEvent(\"move\", {\n      bubbles: true,\n      cancelable: true\n    });\n  } else {\n    evt = document.createEvent(\"Event\");\n    evt.initEvent(\"move\", true, true);\n  }\n  evt.to = toEl;\n  evt.from = fromEl;\n  evt.dragged = dragEl2;\n  evt.draggedRect = dragRect;\n  evt.related = targetEl || toEl;\n  evt.relatedRect = targetRect || getRect(toEl);\n  evt.willInsertAfter = willInsertAfter;\n  evt.originalEvent = originalEvent;\n  fromEl.dispatchEvent(evt);\n  if (onMoveFn) {\n    retVal = onMoveFn.call(sortable, evt, originalEvent);\n  }\n  return retVal;\n}\nfunction _disableDraggable(el) {\n  el.draggable = false;\n}\nfunction _unsilent() {\n  _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n  var rect = getRect(getChild(sortable.el, 0, sortable.options, true));\n  var spacer = 10;\n  return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n  var rect = getRect(lastChild(sortable.el, sortable.options.draggable));\n  var spacer = 10;\n  return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n  var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false;\n  if (!invertSwap) {\n    if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n      if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n        pastFirstInvertThresh = true;\n      }\n      if (!pastFirstInvertThresh) {\n        if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance : mouseOnAxis > targetS2 - targetMoveDistance) {\n          return -lastDirection;\n        }\n      } else {\n        invert = true;\n      }\n    } else {\n      if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n        return _getInsertDirection(target);\n      }\n    }\n  }\n  invert = invert || invertSwap;\n  if (invert) {\n    if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n      return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n    }\n  }\n  return 0;\n}\nfunction _getInsertDirection(target) {\n  if (index(dragEl) < index(target)) {\n    return 1;\n  } else {\n    return -1;\n  }\n}\nfunction _generateId(el) {\n  var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0;\n  while (i--) {\n    sum += str.charCodeAt(i);\n  }\n  return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n  savedInputChecked.length = 0;\n  var inputs = root.getElementsByTagName(\"input\");\n  var idx = inputs.length;\n  while (idx--) {\n    var el = inputs[idx];\n    el.checked && savedInputChecked.push(el);\n  }\n}\nfunction _nextTick(fn) {\n  return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n  return clearTimeout(id);\n}\nif (documentExists) {\n  on(document, \"touchmove\", function(evt) {\n    if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n      evt.preventDefault();\n    }\n  });\n}\nSortable.utils = {\n  on,\n  off,\n  css,\n  find,\n  is: function is(el, selector) {\n    return !!closest(el, selector, el, false);\n  },\n  extend,\n  throttle,\n  closest,\n  toggleClass,\n  clone,\n  index,\n  nextTick: _nextTick,\n  cancelNextTick: _cancelNextTick,\n  detectDirection: _detectDirection,\n  getChild\n};\nSortable.get = function(element) {\n  return element[expando];\n};\nSortable.mount = function() {\n  for (var _len = arguments.length, plugins2 = new Array(_len), _key = 0; _key < _len; _key++) {\n    plugins2[_key] = arguments[_key];\n  }\n  if (plugins2[0].constructor === Array)\n    plugins2 = plugins2[0];\n  plugins2.forEach(function(plugin) {\n    if (!plugin.prototype || !plugin.prototype.constructor) {\n      throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n    }\n    if (plugin.utils)\n      Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n    PluginManager.mount(plugin);\n  });\n};\nSortable.create = function(el, options) {\n  return new Sortable(el, options);\n};\nSortable.version = version;\nvar autoScrolls = [], scrollEl, scrollRootEl, scrolling = false, lastAutoScrollX, lastAutoScrollY, touchEvt$1, pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n  function AutoScroll() {\n    this.defaults = {\n      scroll: true,\n      forceAutoScrollFallback: false,\n      scrollSensitivity: 30,\n      scrollSpeed: 10,\n      bubbleScroll: true\n    };\n    for (var fn in this) {\n      if (fn.charAt(0) === \"_\" && typeof this[fn] === \"function\") {\n        this[fn] = this[fn].bind(this);\n      }\n    }\n  }\n  AutoScroll.prototype = {\n    dragStarted: function dragStarted(_ref) {\n      var originalEvent = _ref.originalEvent;\n      if (this.sortable.nativeDraggable) {\n        on(document, \"dragover\", this._handleAutoScroll);\n      } else {\n        if (this.options.supportPointer) {\n          on(document, \"pointermove\", this._handleFallbackAutoScroll);\n        } else if (originalEvent.touches) {\n          on(document, \"touchmove\", this._handleFallbackAutoScroll);\n        } else {\n          on(document, \"mousemove\", this._handleFallbackAutoScroll);\n        }\n      }\n    },\n    dragOverCompleted: function dragOverCompleted(_ref2) {\n      var originalEvent = _ref2.originalEvent;\n      if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n        this._handleAutoScroll(originalEvent);\n      }\n    },\n    drop: function drop3() {\n      if (this.sortable.nativeDraggable) {\n        off(document, \"dragover\", this._handleAutoScroll);\n      } else {\n        off(document, \"pointermove\", this._handleFallbackAutoScroll);\n        off(document, \"touchmove\", this._handleFallbackAutoScroll);\n        off(document, \"mousemove\", this._handleFallbackAutoScroll);\n      }\n      clearPointerElemChangedInterval();\n      clearAutoScrolls();\n      cancelThrottle();\n    },\n    nulling: function nulling() {\n      touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n      autoScrolls.length = 0;\n    },\n    _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n      this._handleAutoScroll(evt, true);\n    },\n    _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n      var _this = this;\n      var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y);\n      touchEvt$1 = evt;\n      if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n        autoScroll(evt, this.options, elem, fallback);\n        var ogElemScroller = getParentAutoScrollElement(elem, true);\n        if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n          pointerElemChangedInterval && clearPointerElemChangedInterval();\n          pointerElemChangedInterval = setInterval(function() {\n            var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n            if (newElem !== ogElemScroller) {\n              ogElemScroller = newElem;\n              clearAutoScrolls();\n            }\n            autoScroll(evt, _this.options, newElem, fallback);\n          }, 10);\n          lastAutoScrollX = x;\n          lastAutoScrollY = y;\n        }\n      } else {\n        if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n          clearAutoScrolls();\n          return;\n        }\n        autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n      }\n    }\n  };\n  return _extends(AutoScroll, {\n    pluginName: \"scroll\",\n    initializeByDefault: true\n  });\n}\nfunction clearAutoScrolls() {\n  autoScrolls.forEach(function(autoScroll2) {\n    clearInterval(autoScroll2.pid);\n  });\n  autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n  clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function(evt, options, rootEl2, isFallback) {\n  if (!options.scroll)\n    return;\n  var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = getWindowScrollingElement();\n  var scrollThisInstance = false, scrollCustomFn;\n  if (scrollRootEl !== rootEl2) {\n    scrollRootEl = rootEl2;\n    clearAutoScrolls();\n    scrollEl = options.scroll;\n    scrollCustomFn = options.scrollFn;\n    if (scrollEl === true) {\n      scrollEl = getParentAutoScrollElement(rootEl2, true);\n    }\n  }\n  var layersOut = 0;\n  var currentParent = scrollEl;\n  do {\n    var el = currentParent, rect = getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop;\n    if (el === winScroller) {\n      canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\" || elCSS.overflowX === \"visible\");\n      canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\" || elCSS.overflowY === \"visible\");\n    } else {\n      canScrollX = width < scrollWidth && (elCSS.overflowX === \"auto\" || elCSS.overflowX === \"scroll\");\n      canScrollY = height < scrollHeight && (elCSS.overflowY === \"auto\" || elCSS.overflowY === \"scroll\");\n    }\n    var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n    var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n    if (!autoScrolls[layersOut]) {\n      for (var i = 0; i <= layersOut; i++) {\n        if (!autoScrolls[i]) {\n          autoScrolls[i] = {};\n        }\n      }\n    }\n    if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n      autoScrolls[layersOut].el = el;\n      autoScrolls[layersOut].vx = vx;\n      autoScrolls[layersOut].vy = vy;\n      clearInterval(autoScrolls[layersOut].pid);\n      if (vx != 0 || vy != 0) {\n        scrollThisInstance = true;\n        autoScrolls[layersOut].pid = setInterval(function() {\n          if (isFallback && this.layer === 0) {\n            Sortable.active._onTouchMove(touchEvt$1);\n          }\n          var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n          var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n          if (typeof scrollCustomFn === \"function\") {\n            if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== \"continue\") {\n              return;\n            }\n          }\n          scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n        }.bind({\n          layer: layersOut\n        }), 24);\n      }\n    }\n    layersOut++;\n  } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n  scrolling = scrollThisInstance;\n}, 30);\nvar drop = function drop2(_ref) {\n  var originalEvent = _ref.originalEvent, putSortable2 = _ref.putSortable, dragEl2 = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget;\n  if (!originalEvent)\n    return;\n  var toSortable = putSortable2 || activeSortable;\n  hideGhostForTarget();\n  var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n  var target = document.elementFromPoint(touch.clientX, touch.clientY);\n  unhideGhostForTarget();\n  if (toSortable && !toSortable.el.contains(target)) {\n    dispatchSortableEvent(\"spill\");\n    this.onSpill({\n      dragEl: dragEl2,\n      putSortable: putSortable2\n    });\n  }\n};\nfunction Revert() {\n}\nRevert.prototype = {\n  startIndex: null,\n  dragStart: function dragStart(_ref2) {\n    var oldDraggableIndex2 = _ref2.oldDraggableIndex;\n    this.startIndex = oldDraggableIndex2;\n  },\n  onSpill: function onSpill(_ref3) {\n    var dragEl2 = _ref3.dragEl, putSortable2 = _ref3.putSortable;\n    this.sortable.captureAnimationState();\n    if (putSortable2) {\n      putSortable2.captureAnimationState();\n    }\n    var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n    if (nextSibling) {\n      this.sortable.el.insertBefore(dragEl2, nextSibling);\n    } else {\n      this.sortable.el.appendChild(dragEl2);\n    }\n    this.sortable.animateAll();\n    if (putSortable2) {\n      putSortable2.animateAll();\n    }\n  },\n  drop\n};\n_extends(Revert, {\n  pluginName: \"revertOnSpill\"\n});\nfunction Remove() {\n}\nRemove.prototype = {\n  onSpill: function onSpill2(_ref4) {\n    var dragEl2 = _ref4.dragEl, putSortable2 = _ref4.putSortable;\n    var parentSortable = putSortable2 || this.sortable;\n    parentSortable.captureAnimationState();\n    dragEl2.parentNode && dragEl2.parentNode.removeChild(dragEl2);\n    parentSortable.animateAll();\n  },\n  drop\n};\n_extends(Remove, {\n  pluginName: \"removeOnSpill\"\n});\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\nclass FetchResponse {\n  constructor(response) {\n    this.response = response;\n  }\n  get statusCode() {\n    return this.response.status;\n  }\n  get redirected() {\n    return this.response.redirected;\n  }\n  get ok() {\n    return this.response.ok;\n  }\n  get unauthenticated() {\n    return this.statusCode === 401;\n  }\n  get authenticationURL() {\n    return this.response.headers.get(\"WWW-Authenticate\");\n  }\n  get contentType() {\n    const contentType = this.response.headers.get(\"Content-Type\") || \"\";\n    return contentType.replace(/;.*$/, \"\");\n  }\n  get headers() {\n    return this.response.headers;\n  }\n  get html() {\n    if (this.contentType.match(/^(application|text)\\/(html|xhtml\\+xml)$/)) {\n      return this.text;\n    }\n    return Promise.reject(new Error(`Expected an HTML response but got \"${this.contentType}\" instead`));\n  }\n  get json() {\n    if (this.contentType.match(/^application\\/json/)) {\n      return this.responseJson || (this.responseJson = this.response.json());\n    }\n    return Promise.reject(new Error(`Expected a JSON response but got \"${this.contentType}\" instead`));\n  }\n  get text() {\n    return this.responseText || (this.responseText = this.response.text());\n  }\n  get isTurboStream() {\n    return this.contentType.match(/^text\\/vnd\\.turbo-stream\\.html/);\n  }\n  async renderTurboStream() {\n    if (this.isTurboStream) {\n      if (window.Turbo) {\n        window.Turbo.renderStreamMessage(await this.text);\n      } else {\n        console.warn(\"You must set `window.Turbo = Turbo` to automatically process Turbo Stream events with request.js\");\n      }\n    } else {\n      return Promise.reject(new Error(`Expected a Turbo Stream response but got \"${this.contentType}\" instead`));\n    }\n  }\n}\nclass RequestInterceptor {\n  static register(interceptor) {\n    this.interceptor = interceptor;\n  }\n  static get() {\n    return this.interceptor;\n  }\n  static reset() {\n    this.interceptor = void 0;\n  }\n}\nfunction getCookie(name) {\n  const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n  const prefix = `${encodeURIComponent(name)}=`;\n  const cookie = cookies.find((cookie2) => cookie2.startsWith(prefix));\n  if (cookie) {\n    const value = cookie.split(\"=\").slice(1).join(\"=\");\n    if (value) {\n      return decodeURIComponent(value);\n    }\n  }\n}\nfunction compact(object) {\n  const result = {};\n  for (const key in object) {\n    const value = object[key];\n    if (value !== void 0) {\n      result[key] = value;\n    }\n  }\n  return result;\n}\nfunction metaContent(name) {\n  const element = document.head.querySelector(`meta[name=\"${name}\"]`);\n  return element && element.content;\n}\nfunction stringEntriesFromFormData(formData) {\n  return [...formData].reduce((entries, [name, value]) => {\n    return entries.concat(typeof value === \"string\" ? [[name, value]] : []);\n  }, []);\n}\nfunction mergeEntries(searchParams, entries) {\n  for (const [name, value] of entries) {\n    if (value instanceof window.File)\n      continue;\n    if (searchParams.has(name)) {\n      searchParams.delete(name);\n      searchParams.set(name, value);\n    } else {\n      searchParams.append(name, value);\n    }\n  }\n}\nclass FetchRequest {\n  constructor(method, url, options = {}) {\n    this.method = method;\n    this.options = options;\n    this.originalUrl = url;\n  }\n  async perform() {\n    try {\n      const requestInterceptor = RequestInterceptor.get();\n      if (requestInterceptor) {\n        await requestInterceptor(this);\n      }\n    } catch (error) {\n      console.error(error);\n    }\n    const response = new FetchResponse(await window.fetch(this.url, this.fetchOptions));\n    if (response.unauthenticated && response.authenticationURL) {\n      return Promise.reject(window.location.href = response.authenticationURL);\n    }\n    if (response.ok && response.isTurboStream) {\n      response.renderTurboStream();\n    }\n    return response;\n  }\n  addHeader(key, value) {\n    const headers = this.additionalHeaders;\n    headers[key] = value;\n    this.options.headers = headers;\n  }\n  get fetchOptions() {\n    return {\n      method: this.method.toUpperCase(),\n      headers: this.headers,\n      body: this.formattedBody,\n      signal: this.signal,\n      credentials: \"same-origin\",\n      redirect: this.redirect\n    };\n  }\n  get headers() {\n    return compact(Object.assign({\n      \"X-Requested-With\": \"XMLHttpRequest\",\n      \"X-CSRF-Token\": this.csrfToken,\n      \"Content-Type\": this.contentType,\n      Accept: this.accept\n    }, this.additionalHeaders));\n  }\n  get csrfToken() {\n    return getCookie(metaContent(\"csrf-param\")) || metaContent(\"csrf-token\");\n  }\n  get contentType() {\n    if (this.options.contentType) {\n      return this.options.contentType;\n    } else if (this.body == null || this.body instanceof window.FormData) {\n      return void 0;\n    } else if (this.body instanceof window.File) {\n      return this.body.type;\n    }\n    return \"application/json\";\n  }\n  get accept() {\n    switch (this.responseKind) {\n      case \"html\":\n        return \"text/html, application/xhtml+xml\";\n      case \"turbo-stream\":\n        return \"text/vnd.turbo-stream.html, text/html, application/xhtml+xml\";\n      case \"json\":\n        return \"application/json\";\n      default:\n        return \"*/*\";\n    }\n  }\n  get body() {\n    return this.options.body;\n  }\n  get query() {\n    const originalQuery = (this.originalUrl.split(\"?\")[1] || \"\").split(\"#\")[0];\n    const params = new URLSearchParams(originalQuery);\n    let requestQuery = this.options.query;\n    if (requestQuery instanceof window.FormData) {\n      requestQuery = stringEntriesFromFormData(requestQuery);\n    } else if (requestQuery instanceof window.URLSearchParams) {\n      requestQuery = requestQuery.entries();\n    } else {\n      requestQuery = Object.entries(requestQuery || {});\n    }\n    mergeEntries(params, requestQuery);\n    const query = params.toString();\n    return query.length > 0 ? `?${query}` : \"\";\n  }\n  get url() {\n    return this.originalUrl.split(\"?\")[0] + this.query;\n  }\n  get responseKind() {\n    return this.options.responseKind || \"html\";\n  }\n  get signal() {\n    return this.options.signal;\n  }\n  get redirect() {\n    return this.options.redirect || \"follow\";\n  }\n  get additionalHeaders() {\n    return this.options.headers || {};\n  }\n  get formattedBody() {\n    const bodyIsAString = Object.prototype.toString.call(this.body) === \"[object String]\";\n    const contentTypeIsJson = this.headers[\"Content-Type\"] === \"application/json\";\n    if (contentTypeIsJson && !bodyIsAString) {\n      return JSON.stringify(this.body);\n    }\n    return this.body;\n  }\n}\nasync function patch(url, options) {\n  const request = new FetchRequest(\"patch\", url, options);\n  return request.perform();\n}\nclass src_default extends Controller {\n  initialize() {\n    this.end = this.end.bind(this);\n  }\n  connect() {\n    this.sortable = new Sortable(this.element, __spreadValues(__spreadValues({}, this.defaultOptions), this.options));\n  }\n  disconnect() {\n    this.sortable.destroy();\n    this.sortable = void 0;\n  }\n  async end({ item, newIndex: newIndex2 }) {\n    if (!item.dataset.sortableUpdateUrl)\n      return;\n    const param = this.resourceNameValue ? `${this.resourceNameValue}[${this.paramNameValue}]` : this.paramNameValue;\n    const data = new FormData();\n    data.append(param, newIndex2 + 1);\n    await patch(item.dataset.sortableUpdateUrl, { body: data, responseKind: this.responseKindValue });\n  }\n  get options() {\n    return {\n      animation: this.animationValue || this.defaultOptions.animation || 150,\n      handle: this.handleValue || this.defaultOptions.handle || void 0,\n      onEnd: this.end\n    };\n  }\n  get defaultOptions() {\n    return {};\n  }\n}\nsrc_default.values = {\n  resourceName: String,\n  paramName: {\n    type: String,\n    default: \"position\"\n  },\n  responseKind: {\n    type: String,\n    default: \"html\"\n  },\n  animation: Number,\n  handle: String\n};\nexport { src_default as default };\n","function t(t){return t.replace(/(?:[_-])([a-z0-9])/g,((t,e)=>e.toUpperCase()))}function e(t){return t.charAt(0).toUpperCase()+t.slice(1)}function r(t,e){const r=s(t);return Array.from(r.reduce(((t,r)=>(function(t,e){const r=t[e];return Array.isArray(r)?r:[]}(r,e).forEach((e=>t.add(e))),t)),new Set))}function n(t,e){return s(t).reduce(((t,r)=>(t.push(...function(t,e){const r=t[e];return r?Object.keys(r).map((t=>[t,r[t]])):[]}(r,e)),t)),[])}function s(t){const e=[];for(;t;)e.push(t),t=Object.getPrototypeOf(t);return e.reverse()}function a([e,r]){return function(e,r){const n=`${a=e,a.replace(/([A-Z])/g,((t,e)=>`-${e.toLowerCase()}`))}-value`,s=function(t){const e=function(t){const e=o(t.type);if(e){const r=u(t.default);if(e!==r)throw new Error(`Type \"${e}\" must match the type of the default value. Given default value: \"${t.default}\" as \"${r}\"`);return e}}(t),r=u(t),n=o(t),s=e||r||n;if(s)return s;throw new Error(`Unknown value type \"${t}\"`)}(r);var a;return{type:s,key:n,name:t(n),get defaultValue(){return function(t){const e=o(t);if(e)return c[e];const r=t.default;return void 0!==r?r:t}(r)},get hasCustomDefaultValue(){return void 0!==u(r)},reader:i[s],writer:l[s]||l.default}}(e,r)}function o(t){switch(t){case Array:return\"array\";case Boolean:return\"boolean\";case Number:return\"number\";case Object:return\"object\";case String:return\"string\"}}function u(t){switch(typeof t){case\"boolean\":return\"boolean\";case\"number\":return\"number\";case\"string\":return\"string\"}return Array.isArray(t)?\"array\":\"[object Object]\"===Object.prototype.toString.call(t)?\"object\":void 0}(()=>{function t(t){function e(){return Reflect.construct(t,arguments,new.target)}return e.prototype=Object.create(t.prototype,{constructor:{value:e}}),Reflect.setPrototypeOf(e,t),e}try{(function(){const e=t((function(){this.a.call(this)}));e.prototype.a=function(){},new e})()}catch(e){return t=>class extends t{}}})();const c={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:\"\"},i={array(t){const e=JSON.parse(t);if(!Array.isArray(e))throw new TypeError(\"Expected array\");return e},boolean:t=>!(\"0\"==t||\"false\"==t),number:t=>Number(t),object(t){const e=JSON.parse(t);if(null===e||\"object\"!=typeof e||Array.isArray(e))throw new TypeError(\"Expected object\");return e},string:t=>t},l={default:function(t){return`${t}`},array:h,object:h};function h(t){return JSON.stringify(t)}class f{constructor(t){this.context=t}static get shouldLoad(){return!0}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(t,{target:e=this.element,detail:r={},prefix:n=this.identifier,bubbles:s=!0,cancelable:a=!0}={}){const o=new CustomEvent(n?`${n}:${t}`:t,{detail:r,bubbles:s,cancelable:a});return e.dispatchEvent(o),o}}f.blessings=[function(t){return r(t,\"classes\").reduce(((t,r)=>{return Object.assign(t,{[`${n=r}Class`]:{get(){const{classes:t}=this;if(t.has(n))return t.get(n);{const e=t.getAttributeName(n);throw new Error(`Missing attribute \"${e}\"`)}}},[`${n}Classes`]:{get(){return this.classes.getAll(n)}},[`has${e(n)}Class`]:{get(){return this.classes.has(n)}}});var n}),{})},function(t){return r(t,\"targets\").reduce(((t,r)=>{return Object.assign(t,{[`${n=r}Target`]:{get(){const t=this.targets.find(n);if(t)return t;throw new Error(`Missing target element \"${n}\" for \"${this.identifier}\" controller`)}},[`${n}Targets`]:{get(){return this.targets.findAll(n)}},[`has${e(n)}Target`]:{get(){return this.targets.has(n)}}});var n}),{})},function(t){const r=n(t,\"values\"),s={valueDescriptorMap:{get(){return r.reduce(((t,e)=>{const r=a(e),n=this.data.getAttributeNameForKey(r.key);return Object.assign(t,{[n]:r})}),{})}}};return r.reduce(((t,r)=>Object.assign(t,function(t){const r=a(t),{key:n,name:s,reader:o,writer:u}=r;return{[s]:{get(){const t=this.data.get(n);return null!==t?o(t):r.defaultValue},set(t){void 0===t?this.data.delete(n):this.data.set(n,u(t))}},[`has${e(s)}`]:{get(){return this.data.has(n)||r.hasCustomDefaultValue}}}}(r))),s)}],f.targets=[],f.values={};class g extends f{connect(){this.hasButtonTarget&&(this.originalText=this.buttonTarget.innerText)}copy(t){t.preventDefault(),this.sourceTarget.select(),document.execCommand(\"copy\"),this.copied()}copied(){this.hasButtonTarget&&(this.timeout&&clearTimeout(this.timeout),this.buttonTarget.innerText=this.data.get(\"successContent\"),this.timeout=setTimeout((()=>{this.buttonTarget.innerText=this.originalText}),this.successDurationValue))}}g.targets=[\"button\",\"source\"],g.values={successDuration:{type:Number,default:2e3}};export default g;\n","// This file is auto-generated by ./bin/rails stimulus:manifest:update\n// Run that command whenever you add a new controller or create them with\n// ./bin/rails generate stimulus controllerName\n\nimport { application } from \"./application\"\nimport GalleryController from './gallery_controller'\nimport NavbarController from \"./navbar_controller\"\nimport MobileNavbarController from \"./mobile_navbar_controller\"\nimport HomeCarouselController from \"./home_carousel_controller\"\nimport UploadSlipController from \"./upload_slip_controller\"\nimport TabsController from \"./tabs_controller\"\nimport NestedFormController from \"./nested_form_controller\"\nimport AdminNavbarController from \"./admin_navbar_controller\"\nimport ExpenseFormController from \"./expense_form_controller\"\nimport ComboboxController from \"./combobox_controller\"\nimport ModalController from \"./modal_controller\"\nimport DispatchEventController from \"./dispatch_event_controller\"\nimport SortableController from \"./sortable_controller\"\nimport AddressesController from \"../share_controller/addresses_controller\"\nimport Clipboard from \"stimulus-clipboard\"\n\napplication.register(\"clipboard\", Clipboard)\napplication.register(\"sortable\", SortableController)\n\napplication.register(\"mobile-navbar\", MobileNavbarController)\napplication.register(\"navbar\", NavbarController)\napplication.register(\"gallery\", GalleryController)\napplication.register(\"home-carousel\", HomeCarouselController)\napplication.register(\"addresses-form\", AddressesController)\napplication.register(\"upload-slip\", UploadSlipController)\napplication.register(\"tabs\", TabsController)\napplication.register(\"nested-form\", NestedFormController)\napplication.register(\"admin-navbar\", AdminNavbarController)\napplication.register(\"expense-form\", ExpenseFormController)\napplication.register(\"combobox\", ComboboxController)\napplication.register(\"modal\", ModalController)\napplication.register(\"dispatch-event\", DispatchEventController)\n","import { Controller } from \"@hotwired/stimulus\"\nimport { patch } from \"@rails/request.js\"\nimport SortableController from \"stimulus-sortable\"\n\nexport default class extends SortableController {\n  static values = { \n    animation: { type: Number, default: 150 }\n  }\n\n  connect() {\n    super.connect()\n  }\n\n  onUpdate(event) {\n    super.onUpdate && super.onUpdate(event)\n    \n    const item = event.item\n    const url = item.dataset.sortableUpdateUrl\n    \n    if (!url) {\n      console.warn(\"No sortableUpdateUrl found on item\")\n      return\n    }\n\n    const formData = new FormData()\n    formData.append(\"position\", event.newIndex + 1)\n\n    patch(url, { \n      body: formData,\n      headers: {\n        \"X-CSRF-Token\": document.querySelector('meta[name=\"csrf-token\"]').content\n      }\n    }).then(response => {\n      if (!response.ok) {\n        console.error(\"Failed to update position\")\n        // Revert the sort if the request failed\n        if (event.oldIndex !== event.newIndex) {\n          this.sortable.sort(this.getOriginalOrder())\n        }\n      }\n    }).catch(error => {\n      console.error(\"Error updating position:\", error)\n      // Revert the sort if the request failed\n      if (event.oldIndex !== event.newIndex) {\n        this.sortable.sort(this.getOriginalOrder())\n      }\n    })\n  }\n\n  getOriginalOrder() {\n    return Array.from(this.element.children).map((item, index) => index)\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n    static targets = [ \"settingContainer\" ]\n\n    initialize () {\n        this.isShowMenu = false\n    }\n\n    toggleSetting (e) {\n        e.preventDefault()\n        if (this.isShowMenu) {\n            this.settingContainerTarget.classList.remove('visible')\n            this.settingContainerTarget.classList.add('invisible')\n        } else {\n            this.settingContainerTarget.classList.remove('invisible')\n            this.settingContainerTarget.classList.add('visible')\n        }\n        this.isShowMenu = !this.isShowMenu\n    }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n    static targets = [ \"dropdownMenu\" ]\n\n    initialize() {\n        this.isShowingDropdown = false\n    }\n\n    toggleDropdown() {\n        if (this.isShowingDropdown) {\n            this.dropdownMenuTarget.classList.remove('visible')\n            this.dropdownMenuTarget.classList.add('invisible')\n        } else {\n            this.dropdownMenuTarget.classList.remove('invisible')\n            this.dropdownMenuTarget.classList.add('visible')\n        }\n\n        this.isShowingDropdown = !this.isShowingDropdown\n\n    }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport SimpleLightbox from \"../simplelightbox\";\nexport default class extends Controller {\n    connect () {\n    }\n\n    loadSimpleLightBox () {\n        new SimpleLightbox(this.element.querySelectorAll('a'), {\n            overlayOpacity: 0.84\n        });\n    }\n}","import { Controller } from '@hotwired/stimulus'\nimport { get } from '@rails/request.js'\n\n\nexport default class extends Controller {\n    static targets = [\n        'districtSelectDom',\n        'subDistrictSelectDom',\n        'postalCodeInputDom',\n        'tempPostalCodeInputDom'\n    ]\n\n    provinceChanged(event) {\n        let params = new URLSearchParams()\n        params.append(\"district_target\", this.districtSelectDomTarget.id)\n        params.append(\"sub_district_target\", this.subDistrictSelectDomTarget.id)\n        params.append(\"postal_code_target\", this.postalCodeInputDomTarget.id)\n        params.append(\"temp_postal_code_target\", this.tempPostalCodeInputDomTarget.id)\n\n        const provinceId = event.target.selectedOptions[0].value\n        const url = `/auto_complete/province/${provinceId}?${params}`\n\n        get(url, {\n            responseKind: 'turbo-stream'\n        })\n\n    }\n\n    districtChanged(event) {\n        let params = new URLSearchParams()\n        params.append(\"district_target\", this.districtSelectDomTarget.id)\n        params.append(\"sub_district_target\", this.subDistrictSelectDomTarget.id)\n        params.append(\"postal_code_target\", this.postalCodeInputDomTarget.id)\n        params.append(\"temp_postal_code_target\", this.tempPostalCodeInputDomTarget.id)\n\n        const districtId = event.target.selectedOptions[0].value\n        const url = `/auto_complete/district/${districtId}?${params}`\n\n        get(url, {\n            responseKind: 'turbo-stream'\n        })\n    }\n\n\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n    static targets = [ 'previewImage', 'previewImageContainer', 'submitLabel' ]\n\n    selectedImage(event) {\n        const input = event.target\n        if (input.files && input.files[0]) {\n\n            const reader = new FileReader();\n            reader.onload = (event) => {\n                this.previewImageTarget.src = event.currentTarget.result\n            }\n            reader.readAsDataURL(input.files[0])\n            this.submitLabelTarget.classList.add('hidden')\n            this.submitLabelTarget.closest('form').requestSubmit()\n            this.previewImageContainerTarget.classList.remove('hidden')\n        }\n    }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static classes = ['active']\n  static targets = [\"btn\", \"tab\"]\n  static values = {defaultTab: String}\n\n  connect() {\n    // first, hide all tabs\n    this.tabTargets.map(x => x.hidden = true)\n\n    // then, show the default tab\n    let selectedTab = this.tabTargets.find(element => element.id === this.defaultTabValue)\n    selectedTab.hidden = false\n\n    // and activate the selected button\n    let selectedBtn = this.btnTargets.find(element => element.id === this.defaultTabValue)\n    selectedBtn.classList.add(...this.activeClasses)\n  }\n\n  // switch between tabs\n  // add to your buttons: data-action=\"click->tabs#select\"\n  select(event) {\n    // find tab matching (with same id as) the clicked btn\n    let selectedTab = this.tabTargets.find(element => element.id === event.currentTarget.id)\n    if (selectedTab.hidden) {\n      // hide everything\n      this.tabTargets.map(x => x.hidden = true) // hide all tabs\n      this.btnTargets.map(x => x.classList.remove(...this.activeClasses)) // deactive all btns\n\n      // then show selected\n      selectedTab.hidden = false // show current tab\n      event.currentTarget.classList.add(...this.activeClasses) // activate current button\n    }\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n    static targets = [ \"add_item\", \"template\" ]\n\n    addAssociation(event) {\n        event.preventDefault()\n        const content = this.templateTarget.innerHTML.replace(/TEMPLATE_RECORD/g, Math.floor(Math.random() * 20))\n        this.add_itemTarget.insertAdjacentHTML('beforebegin', content)\n    }\n\n    removeAssociation(event) {\n        event.preventDefault()\n        const item = event.target.closest('.nested-fields')\n        item.querySelector(\"input[name*='destroy']\").value = 1\n        item.style.display = 'none'\n    }\n\n\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [ \"dropdownMenu\", \"leftMobileMenu\"]\n\n  initialize() {\n    this.isShowingDropdown = false\n    this.isOpenMenu = false\n  }\n\n  toggleDropdown() {\n    if (this.isShowingDropdown) {\n      this.dropdownMenuTarget.classList.remove('visible')\n      this.dropdownMenuTarget.classList.add('invisible')\n    } else {\n      this.dropdownMenuTarget.classList.remove('invisible')\n      this.dropdownMenuTarget.classList.add('visible')\n    }\n\n    this.isShowingDropdown = !this.isShowingDropdown\n  }\n\n  toggleMenu() {\n    if (this.isOpenMenu) {\n      this.leftMobileMenuTarget.classList.remove('visible')\n      this.leftMobileMenuTarget.classList.add('invisible')\n    } else {\n      this.leftMobileMenuTarget.classList.remove('invisible')\n      this.leftMobileMenuTarget.classList.add('visible')\n    }\n\n    this.isOpenMenu = !this.isOpenMenu\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\n    \"kind\",\n    \"supplierWrapper\",\n    \"subtotal\",\n    \"vat\",\n    \"wht\",\n    \"grandPreview\"\n  ]\n\n  connect() {\n    this.element.addEventListener(\"change\", (e) => {\n      if (e.target === this.kindTarget) this.onKindChange()\n    })\n    this.recompute()\n  }\n\n  onKindChange() {\n    if (this.hasSupplierWrapperTarget) {\n      this.supplierWrapperTarget.dataset.comboboxKindValue = this.kindTarget.value\n    }\n  }\n\n  recompute() {\n    const sub = parseFloat(this.subtotalTarget?.value) || 0\n    const vat = parseFloat(this.vatTarget?.value) || 0\n    const wht = parseFloat(this.whtTarget?.value) || 0\n    const grand = sub + vat - wht\n    this.grandPreviewTarget.textContent = grand.toLocaleString(\"th-TH\", {\n      style: \"currency\",\n      currency: \"THB\"\n    })\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport TomSelect from \"tom-select\"\n\nexport default class extends Controller {\n  static values = {\n    url: String,\n    kind: String,\n    placeholder: { type: String, default: \"พิมพ์เพื่อค้นหา...\" }\n  }\n\n  connect() {\n    const preload = []\n    const selected = this.element.querySelector(\"option[selected]\")\n    if (selected && selected.value) {\n      preload.push({\n        id: selected.value,\n        name: selected.textContent.trim(),\n        display_kind: \"\"\n      })\n    }\n\n    this.select = new TomSelect(this.element, {\n      valueField: \"id\",\n      labelField: \"name\",\n      searchField: [\"name\"],\n      placeholder: this.placeholderValue,\n      maxOptions: 20,\n      preload: \"focus\",\n      options: preload,\n      render: {\n        option: (item, escape) => {\n          const kind = item.display_kind ? ` <span class=\"text-xs text-gray-500\">(${escape(item.display_kind)})</span>` : \"\"\n          return `<div>${escape(item.name)}${kind}</div>`\n        },\n        item: (item, escape) => `<div>${escape(item.name)}</div>`\n      },\n      load: (query, callback) => {\n        const url = new URL(this.urlValue, window.location.origin)\n        if (query) url.searchParams.set(\"q\", query)\n        if (this.kindValue) url.searchParams.set(\"kind\", this.kindValue)\n        fetch(url.toString(), { headers: { Accept: \"application/json\" } })\n          .then((r) => r.json())\n          .then(callback)\n          .catch(() => callback())\n      }\n    })\n  }\n\n  disconnect() {\n    if (this.select) this.select.destroy()\n  }\n\n  kindValueChanged() {\n    if (!this.select) return\n    this.select.clearOptions()\n    this.select.clear()\n    this.select.load(\"\")\n  }\n\n  addAndSelect(item) {\n    if (!this.select || !item) return\n    this.select.addOption(item)\n    this.select.refreshOptions(false)\n    this.select.addItem(String(item.id))\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"overlay\", \"frame\"]\n\n  connect() {\n    this.boundKeydown = this.handleKeydown.bind(this)\n    this.boundSupplierCreated = (e) => this.onSupplierCreated(e)\n    document.addEventListener(\"keydown\", this.boundKeydown)\n    document.addEventListener(\"modal:supplier-created\", this.boundSupplierCreated)\n  }\n\n  disconnect() {\n    document.removeEventListener(\"keydown\", this.boundKeydown)\n    document.removeEventListener(\"modal:supplier-created\", this.boundSupplierCreated)\n  }\n\n  open(event) {\n    event?.preventDefault()\n    const url = event?.currentTarget?.dataset?.modalUrl\n    if (url && this.hasFrameTarget) {\n      this.frameTarget.innerHTML = \"\"\n      this.frameTarget.setAttribute(\"src\", url)\n    }\n    this.overlayTarget.classList.remove(\"hidden\")\n    document.body.classList.add(\"overflow-hidden\")\n  }\n\n  close(event) {\n    event?.preventDefault()\n    this.overlayTarget.classList.add(\"hidden\")\n    document.body.classList.remove(\"overflow-hidden\")\n    if (this.hasFrameTarget) {\n      this.frameTarget.removeAttribute(\"src\")\n      this.frameTarget.innerHTML = \"\"\n    }\n  }\n\n  backdrop(event) {\n    if (event.target === event.currentTarget) this.close()\n  }\n\n  handleKeydown(event) {\n    if (event.key === \"Escape\" && !this.overlayTarget.classList.contains(\"hidden\")) {\n      this.close()\n    }\n  }\n\n  onSupplierCreated(event) {\n    const supplier = event.detail\n    if (!supplier) return this.close()\n\n    document.querySelectorAll(\"[data-controller~='combobox']\").forEach((el) => {\n      const ctrl = this.application.getControllerForElementAndIdentifier(el, \"combobox\")\n      if (ctrl && ctrl.urlValue && ctrl.urlValue.includes(\"/suppliers/\")) {\n        ctrl.addAndSelect(supplier)\n      }\n    })\n\n    this.close()\n  }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    name: String,\n    detail: Object\n  }\n\n  connect() {\n    if (!this.nameValue) return\n    const evt = new CustomEvent(this.nameValue, {\n      detail: this.detailValue,\n      bubbles: true\n    })\n    document.dispatchEvent(evt)\n    this.element.remove()\n  }\n}\n","var sparkMd5 = {\n  exports: {}\n};\n\n(function(module, exports) {\n  (function(factory) {\n    {\n      module.exports = factory();\n    }\n  })((function(undefined$1) {\n    var hex_chr = [ \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\" ];\n    function md5cycle(x, k) {\n      var a = x[0], b = x[1], c = x[2], d = x[3];\n      a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[10] - 42063 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b ^ c ^ d) + k[5] - 378558 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      x[0] = a + x[0] | 0;\n      x[1] = b + x[1] | 0;\n      x[2] = c + x[2] | 0;\n      x[3] = d + x[3] | 0;\n    }\n    function md5blk(s) {\n      var md5blks = [], i;\n      for (i = 0; i < 64; i += 4) {\n        md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n      }\n      return md5blks;\n    }\n    function md5blk_array(a) {\n      var md5blks = [], i;\n      for (i = 0; i < 64; i += 4) {\n        md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n      }\n      return md5blks;\n    }\n    function md51(s) {\n      var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n      for (i = 64; i <= n; i += 64) {\n        md5cycle(state, md5blk(s.substring(i - 64, i)));\n      }\n      s = s.substring(i - 64);\n      length = s.length;\n      tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);\n      }\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(state, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = n * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(state, tail);\n      return state;\n    }\n    function md51_array(a) {\n      var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n      for (i = 64; i <= n; i += 64) {\n        md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n      }\n      a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0);\n      length = a.length;\n      tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= a[i] << (i % 4 << 3);\n      }\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(state, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = n * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(state, tail);\n      return state;\n    }\n    function rhex(n) {\n      var s = \"\", j;\n      for (j = 0; j < 4; j += 1) {\n        s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15];\n      }\n      return s;\n    }\n    function hex(x) {\n      var i;\n      for (i = 0; i < x.length; i += 1) {\n        x[i] = rhex(x[i]);\n      }\n      return x.join(\"\");\n    }\n    if (hex(md51(\"hello\")) !== \"5d41402abc4b2a76b9719d911017c592\") ;\n    if (typeof ArrayBuffer !== \"undefined\" && !ArrayBuffer.prototype.slice) {\n      (function() {\n        function clamp(val, length) {\n          val = val | 0 || 0;\n          if (val < 0) {\n            return Math.max(val + length, 0);\n          }\n          return Math.min(val, length);\n        }\n        ArrayBuffer.prototype.slice = function(from, to) {\n          var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray;\n          if (to !== undefined$1) {\n            end = clamp(to, length);\n          }\n          if (begin > end) {\n            return new ArrayBuffer(0);\n          }\n          num = end - begin;\n          target = new ArrayBuffer(num);\n          targetArray = new Uint8Array(target);\n          sourceArray = new Uint8Array(this, begin, num);\n          targetArray.set(sourceArray);\n          return target;\n        };\n      })();\n    }\n    function toUtf8(str) {\n      if (/[\\u0080-\\uFFFF]/.test(str)) {\n        str = unescape(encodeURIComponent(str));\n      }\n      return str;\n    }\n    function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n      var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i;\n      for (i = 0; i < length; i += 1) {\n        arr[i] = str.charCodeAt(i);\n      }\n      return returnUInt8Array ? arr : buff;\n    }\n    function arrayBuffer2Utf8Str(buff) {\n      return String.fromCharCode.apply(null, new Uint8Array(buff));\n    }\n    function concatenateArrayBuffers(first, second, returnUInt8Array) {\n      var result = new Uint8Array(first.byteLength + second.byteLength);\n      result.set(new Uint8Array(first));\n      result.set(new Uint8Array(second), first.byteLength);\n      return returnUInt8Array ? result : result.buffer;\n    }\n    function hexToBinaryString(hex) {\n      var bytes = [], length = hex.length, x;\n      for (x = 0; x < length - 1; x += 2) {\n        bytes.push(parseInt(hex.substr(x, 2), 16));\n      }\n      return String.fromCharCode.apply(String, bytes);\n    }\n    function SparkMD5() {\n      this.reset();\n    }\n    SparkMD5.prototype.append = function(str) {\n      this.appendBinary(toUtf8(str));\n      return this;\n    };\n    SparkMD5.prototype.appendBinary = function(contents) {\n      this._buff += contents;\n      this._length += contents.length;\n      var length = this._buff.length, i;\n      for (i = 64; i <= length; i += 64) {\n        md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n      }\n      this._buff = this._buff.substring(i - 64);\n      return this;\n    };\n    SparkMD5.prototype.end = function(raw) {\n      var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret;\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3);\n      }\n      this._finish(tail, length);\n      ret = hex(this._hash);\n      if (raw) {\n        ret = hexToBinaryString(ret);\n      }\n      this.reset();\n      return ret;\n    };\n    SparkMD5.prototype.reset = function() {\n      this._buff = \"\";\n      this._length = 0;\n      this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n      return this;\n    };\n    SparkMD5.prototype.getState = function() {\n      return {\n        buff: this._buff,\n        length: this._length,\n        hash: this._hash.slice()\n      };\n    };\n    SparkMD5.prototype.setState = function(state) {\n      this._buff = state.buff;\n      this._length = state.length;\n      this._hash = state.hash;\n      return this;\n    };\n    SparkMD5.prototype.destroy = function() {\n      delete this._hash;\n      delete this._buff;\n      delete this._length;\n    };\n    SparkMD5.prototype._finish = function(tail, length) {\n      var i = length, tmp, lo, hi;\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(this._hash, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = this._length * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(this._hash, tail);\n    };\n    SparkMD5.hash = function(str, raw) {\n      return SparkMD5.hashBinary(toUtf8(str), raw);\n    };\n    SparkMD5.hashBinary = function(content, raw) {\n      var hash = md51(content), ret = hex(hash);\n      return raw ? hexToBinaryString(ret) : ret;\n    };\n    SparkMD5.ArrayBuffer = function() {\n      this.reset();\n    };\n    SparkMD5.ArrayBuffer.prototype.append = function(arr) {\n      var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i;\n      this._length += arr.byteLength;\n      for (i = 64; i <= length; i += 64) {\n        md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n      }\n      this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n      return this;\n    };\n    SparkMD5.ArrayBuffer.prototype.end = function(raw) {\n      var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret;\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= buff[i] << (i % 4 << 3);\n      }\n      this._finish(tail, length);\n      ret = hex(this._hash);\n      if (raw) {\n        ret = hexToBinaryString(ret);\n      }\n      this.reset();\n      return ret;\n    };\n    SparkMD5.ArrayBuffer.prototype.reset = function() {\n      this._buff = new Uint8Array(0);\n      this._length = 0;\n      this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n      return this;\n    };\n    SparkMD5.ArrayBuffer.prototype.getState = function() {\n      var state = SparkMD5.prototype.getState.call(this);\n      state.buff = arrayBuffer2Utf8Str(state.buff);\n      return state;\n    };\n    SparkMD5.ArrayBuffer.prototype.setState = function(state) {\n      state.buff = utf8Str2ArrayBuffer(state.buff, true);\n      return SparkMD5.prototype.setState.call(this, state);\n    };\n    SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n    SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n    SparkMD5.ArrayBuffer.hash = function(arr, raw) {\n      var hash = md51_array(new Uint8Array(arr)), ret = hex(hash);\n      return raw ? hexToBinaryString(ret) : ret;\n    };\n    return SparkMD5;\n  }));\n})(sparkMd5);\n\nvar SparkMD5 = sparkMd5.exports;\n\nconst fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;\n\nclass FileChecksum {\n  static create(file, callback) {\n    const instance = new FileChecksum(file);\n    instance.create(callback);\n  }\n  constructor(file) {\n    this.file = file;\n    this.chunkSize = 2097152;\n    this.chunkCount = Math.ceil(this.file.size / this.chunkSize);\n    this.chunkIndex = 0;\n  }\n  create(callback) {\n    this.callback = callback;\n    this.md5Buffer = new SparkMD5.ArrayBuffer;\n    this.fileReader = new FileReader;\n    this.fileReader.addEventListener(\"load\", (event => this.fileReaderDidLoad(event)));\n    this.fileReader.addEventListener(\"error\", (event => this.fileReaderDidError(event)));\n    this.readNextChunk();\n  }\n  fileReaderDidLoad(event) {\n    this.md5Buffer.append(event.target.result);\n    if (!this.readNextChunk()) {\n      const binaryDigest = this.md5Buffer.end(true);\n      const base64digest = btoa(binaryDigest);\n      this.callback(null, base64digest);\n    }\n  }\n  fileReaderDidError(event) {\n    this.callback(`Error reading ${this.file.name}`);\n  }\n  readNextChunk() {\n    if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {\n      const start = this.chunkIndex * this.chunkSize;\n      const end = Math.min(start + this.chunkSize, this.file.size);\n      const bytes = fileSlice.call(this.file, start, end);\n      this.fileReader.readAsArrayBuffer(bytes);\n      this.chunkIndex++;\n      return true;\n    } else {\n      return false;\n    }\n  }\n}\n\nfunction getMetaValue(name) {\n  const element = findElement(document.head, `meta[name=\"${name}\"]`);\n  if (element) {\n    return element.getAttribute(\"content\");\n  }\n}\n\nfunction findElements(root, selector) {\n  if (typeof root == \"string\") {\n    selector = root;\n    root = document;\n  }\n  const elements = root.querySelectorAll(selector);\n  return toArray(elements);\n}\n\nfunction findElement(root, selector) {\n  if (typeof root == \"string\") {\n    selector = root;\n    root = document;\n  }\n  return root.querySelector(selector);\n}\n\nfunction dispatchEvent(element, type, eventInit = {}) {\n  const {disabled: disabled} = element;\n  const {bubbles: bubbles, cancelable: cancelable, detail: detail} = eventInit;\n  const event = document.createEvent(\"Event\");\n  event.initEvent(type, bubbles || true, cancelable || true);\n  event.detail = detail || {};\n  try {\n    element.disabled = false;\n    element.dispatchEvent(event);\n  } finally {\n    element.disabled = disabled;\n  }\n  return event;\n}\n\nfunction toArray(value) {\n  if (Array.isArray(value)) {\n    return value;\n  } else if (Array.from) {\n    return Array.from(value);\n  } else {\n    return [].slice.call(value);\n  }\n}\n\nclass BlobRecord {\n  constructor(file, checksum, url) {\n    this.file = file;\n    this.attributes = {\n      filename: file.name,\n      content_type: file.type || \"application/octet-stream\",\n      byte_size: file.size,\n      checksum: checksum\n    };\n    this.xhr = new XMLHttpRequest;\n    this.xhr.open(\"POST\", url, true);\n    this.xhr.responseType = \"json\";\n    this.xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n    this.xhr.setRequestHeader(\"Accept\", \"application/json\");\n    this.xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n    const csrfToken = getMetaValue(\"csrf-token\");\n    if (csrfToken != undefined) {\n      this.xhr.setRequestHeader(\"X-CSRF-Token\", csrfToken);\n    }\n    this.xhr.addEventListener(\"load\", (event => this.requestDidLoad(event)));\n    this.xhr.addEventListener(\"error\", (event => this.requestDidError(event)));\n  }\n  get status() {\n    return this.xhr.status;\n  }\n  get response() {\n    const {responseType: responseType, response: response} = this.xhr;\n    if (responseType == \"json\") {\n      return response;\n    } else {\n      return JSON.parse(response);\n    }\n  }\n  create(callback) {\n    this.callback = callback;\n    this.xhr.send(JSON.stringify({\n      blob: this.attributes\n    }));\n  }\n  requestDidLoad(event) {\n    if (this.status >= 200 && this.status < 300) {\n      const {response: response} = this;\n      const {direct_upload: direct_upload} = response;\n      delete response.direct_upload;\n      this.attributes = response;\n      this.directUploadData = direct_upload;\n      this.callback(null, this.toJSON());\n    } else {\n      this.requestDidError(event);\n    }\n  }\n  requestDidError(event) {\n    this.callback(`Error creating Blob for \"${this.file.name}\". Status: ${this.status}`);\n  }\n  toJSON() {\n    const result = {};\n    for (const key in this.attributes) {\n      result[key] = this.attributes[key];\n    }\n    return result;\n  }\n}\n\nclass BlobUpload {\n  constructor(blob) {\n    this.blob = blob;\n    this.file = blob.file;\n    const {url: url, headers: headers} = blob.directUploadData;\n    this.xhr = new XMLHttpRequest;\n    this.xhr.open(\"PUT\", url, true);\n    this.xhr.responseType = \"text\";\n    for (const key in headers) {\n      this.xhr.setRequestHeader(key, headers[key]);\n    }\n    this.xhr.addEventListener(\"load\", (event => this.requestDidLoad(event)));\n    this.xhr.addEventListener(\"error\", (event => this.requestDidError(event)));\n  }\n  create(callback) {\n    this.callback = callback;\n    this.xhr.send(this.file.slice());\n  }\n  requestDidLoad(event) {\n    const {status: status, response: response} = this.xhr;\n    if (status >= 200 && status < 300) {\n      this.callback(null, response);\n    } else {\n      this.requestDidError(event);\n    }\n  }\n  requestDidError(event) {\n    this.callback(`Error storing \"${this.file.name}\". Status: ${this.xhr.status}`);\n  }\n}\n\nlet id = 0;\n\nclass DirectUpload {\n  constructor(file, url, delegate) {\n    this.id = ++id;\n    this.file = file;\n    this.url = url;\n    this.delegate = delegate;\n  }\n  create(callback) {\n    FileChecksum.create(this.file, ((error, checksum) => {\n      if (error) {\n        callback(error);\n        return;\n      }\n      const blob = new BlobRecord(this.file, checksum, this.url);\n      notify(this.delegate, \"directUploadWillCreateBlobWithXHR\", blob.xhr);\n      blob.create((error => {\n        if (error) {\n          callback(error);\n        } else {\n          const upload = new BlobUpload(blob);\n          notify(this.delegate, \"directUploadWillStoreFileWithXHR\", upload.xhr);\n          upload.create((error => {\n            if (error) {\n              callback(error);\n            } else {\n              callback(null, blob.toJSON());\n            }\n          }));\n        }\n      }));\n    }));\n  }\n}\n\nfunction notify(object, methodName, ...messages) {\n  if (object && typeof object[methodName] == \"function\") {\n    return object[methodName](...messages);\n  }\n}\n\nclass DirectUploadController {\n  constructor(input, file) {\n    this.input = input;\n    this.file = file;\n    this.directUpload = new DirectUpload(this.file, this.url, this);\n    this.dispatch(\"initialize\");\n  }\n  start(callback) {\n    const hiddenInput = document.createElement(\"input\");\n    hiddenInput.type = \"hidden\";\n    hiddenInput.name = this.input.name;\n    this.input.insertAdjacentElement(\"beforebegin\", hiddenInput);\n    this.dispatch(\"start\");\n    this.directUpload.create(((error, attributes) => {\n      if (error) {\n        hiddenInput.parentNode.removeChild(hiddenInput);\n        this.dispatchError(error);\n      } else {\n        hiddenInput.value = attributes.signed_id;\n      }\n      this.dispatch(\"end\");\n      callback(error);\n    }));\n  }\n  uploadRequestDidProgress(event) {\n    const progress = event.loaded / event.total * 100;\n    if (progress) {\n      this.dispatch(\"progress\", {\n        progress: progress\n      });\n    }\n  }\n  get url() {\n    return this.input.getAttribute(\"data-direct-upload-url\");\n  }\n  dispatch(name, detail = {}) {\n    detail.file = this.file;\n    detail.id = this.directUpload.id;\n    return dispatchEvent(this.input, `direct-upload:${name}`, {\n      detail: detail\n    });\n  }\n  dispatchError(error) {\n    const event = this.dispatch(\"error\", {\n      error: error\n    });\n    if (!event.defaultPrevented) {\n      alert(error);\n    }\n  }\n  directUploadWillCreateBlobWithXHR(xhr) {\n    this.dispatch(\"before-blob-request\", {\n      xhr: xhr\n    });\n  }\n  directUploadWillStoreFileWithXHR(xhr) {\n    this.dispatch(\"before-storage-request\", {\n      xhr: xhr\n    });\n    xhr.upload.addEventListener(\"progress\", (event => this.uploadRequestDidProgress(event)));\n  }\n}\n\nconst inputSelector = \"input[type=file][data-direct-upload-url]:not([disabled])\";\n\nclass DirectUploadsController {\n  constructor(form) {\n    this.form = form;\n    this.inputs = findElements(form, inputSelector).filter((input => input.files.length));\n  }\n  start(callback) {\n    const controllers = this.createDirectUploadControllers();\n    const startNextController = () => {\n      const controller = controllers.shift();\n      if (controller) {\n        controller.start((error => {\n          if (error) {\n            callback(error);\n            this.dispatch(\"end\");\n          } else {\n            startNextController();\n          }\n        }));\n      } else {\n        callback();\n        this.dispatch(\"end\");\n      }\n    };\n    this.dispatch(\"start\");\n    startNextController();\n  }\n  createDirectUploadControllers() {\n    const controllers = [];\n    this.inputs.forEach((input => {\n      toArray(input.files).forEach((file => {\n        const controller = new DirectUploadController(input, file);\n        controllers.push(controller);\n      }));\n    }));\n    return controllers;\n  }\n  dispatch(name, detail = {}) {\n    return dispatchEvent(this.form, `direct-uploads:${name}`, {\n      detail: detail\n    });\n  }\n}\n\nconst processingAttribute = \"data-direct-uploads-processing\";\n\nconst submitButtonsByForm = new WeakMap;\n\nlet started = false;\n\nfunction start() {\n  if (!started) {\n    started = true;\n    document.addEventListener(\"click\", didClick, true);\n    document.addEventListener(\"submit\", didSubmitForm, true);\n    document.addEventListener(\"ajax:before\", didSubmitRemoteElement);\n  }\n}\n\nfunction didClick(event) {\n  const {target: target} = event;\n  if ((target.tagName == \"INPUT\" || target.tagName == \"BUTTON\") && target.type == \"submit\" && target.form) {\n    submitButtonsByForm.set(target.form, target);\n  }\n}\n\nfunction didSubmitForm(event) {\n  handleFormSubmissionEvent(event);\n}\n\nfunction didSubmitRemoteElement(event) {\n  if (event.target.tagName == \"FORM\") {\n    handleFormSubmissionEvent(event);\n  }\n}\n\nfunction handleFormSubmissionEvent(event) {\n  const form = event.target;\n  if (form.hasAttribute(processingAttribute)) {\n    event.preventDefault();\n    return;\n  }\n  const controller = new DirectUploadsController(form);\n  const {inputs: inputs} = controller;\n  if (inputs.length) {\n    event.preventDefault();\n    form.setAttribute(processingAttribute, \"\");\n    inputs.forEach(disable);\n    controller.start((error => {\n      form.removeAttribute(processingAttribute);\n      if (error) {\n        inputs.forEach(enable);\n      } else {\n        submitForm(form);\n      }\n    }));\n  }\n}\n\nfunction submitForm(form) {\n  let button = submitButtonsByForm.get(form) || findElement(form, \"input[type=submit], button[type=submit]\");\n  if (button) {\n    const {disabled: disabled} = button;\n    button.disabled = false;\n    button.focus();\n    button.click();\n    button.disabled = disabled;\n  } else {\n    button = document.createElement(\"input\");\n    button.type = \"submit\";\n    button.style.display = \"none\";\n    form.appendChild(button);\n    button.click();\n    form.removeChild(button);\n  }\n  submitButtonsByForm.delete(form);\n}\n\nfunction disable(input) {\n  input.disabled = true;\n}\n\nfunction enable(input) {\n  input.disabled = false;\n}\n\nfunction autostart() {\n  if (window.ActiveStorage) {\n    start();\n  }\n}\n\nsetTimeout(autostart, 1);\n\nexport { DirectUpload, start };\n","import { DirectUpload } from \"@rails/activestorage\"\n\nexport class AttachmentUpload {\n  constructor(attachment, element) {\n    this.attachment = attachment\n    this.element = element\n    this.directUpload = new DirectUpload(attachment.file, this.directUploadUrl, this)\n  }\n\n  start() {\n    this.directUpload.create(this.directUploadDidComplete.bind(this))\n  }\n\n  directUploadWillStoreFileWithXHR(xhr) {\n    xhr.upload.addEventListener(\"progress\", event => {\n      const progress = event.loaded / event.total * 100\n      this.attachment.setUploadProgress(progress)\n    })\n  }\n\n  directUploadDidComplete(error, attributes) {\n    if (error) {\n      throw new Error(`Direct upload failed: ${error}`)\n    }\n\n    this.attachment.setAttributes({\n      sgid: attributes.attachable_sgid,\n      url: this.createBlobUrl(attributes.signed_id, attributes.filename)\n    })\n  }\n\n  createBlobUrl(signedId, filename) {\n    return this.blobUrlTemplate\n      .replace(\":signed_id\", signedId)\n      .replace(\":filename\", encodeURIComponent(filename))\n  }\n\n  get directUploadUrl() {\n    return this.element.dataset.directUploadUrl\n  }\n\n  get blobUrlTemplate() {\n    return this.element.dataset.blobUrlTemplate\n  }\n}\n","import \"@hotwired/turbo-rails\"\nimport \"trix\"\nimport \"./controllers\"\nimport 'sharer.js'\n\nimport {AttachmentUpload} from \"@rails/actiontext/app/javascript/actiontext/attachment_upload\"\n\naddEventListener(\"trix-attachment-add\", event => {\n    const {attachment, target} = event\n\n    if (attachment.file) {\n        const upload = new AttachmentUpload(attachment, target)\n        upload.start()\n    }\n})\n"],"names":["logger","self","console","WebSocket","log","messages","this","enabled","push","Date","now","adapters","getTime","secondsSince","time","ConnectionMonitor","constructor","connection","visibilityDidChange","bind","reconnectAttempts","start","isRunning","startedAt","stoppedAt","startPolling","addEventListener","staleThreshold","stop","stopPolling","removeEventListener","recordPing","pingedAt","recordConnect","disconnectedAt","recordDisconnect","poll","clearTimeout","pollTimeout","setTimeout","reconnectIfStale","getPollInterval","reconnectionBackoffRate","Math","pow","min","random","connectionIsStale","refreshedAt","disconnectedRecently","reopen","document","visibilityState","isOpen","message_types","protocols","supportedProtocols","slice","length","indexOf","Connection","consumer","open","subscriptions","monitor","disconnected","send","data","webSocket","JSON","stringify","isActive","getState","uninstallEventHandlers","url","installEventHandlers","close","allowReconnect","error","reopenDelay","getProtocol","protocol","isState","isProtocolSupported","call","states","state","readyState","toLowerCase","eventName","events","handler","prototype","message","event","identifier","reason","reconnect","type","parse","welcome","reload","disconnect","ping","confirmation","confirmSubscription","notify","rejection","reject","notifyAll","willAttemptReconnect","Subscription","params","mixin","object","properties","key","value","extend","perform","action","command","unsubscribe","remove","pendingSubscriptions","guarantee","subscription","startGuaranteeing","forget","filter","s","stopGuaranteeing","retrySubscribing","retryTimeout","map","subscribe","Subscriptions","guarantor","create","channelName","channel","add","ensureActiveConnection","findAll","sendCommand","callbackName","args","undefined","Consumer","_url","createWebSocketURL","connect","test","a","createElement","href","replace","createConsumer","getConfig","name","element","head","querySelector","getAttribute","window","Sharer","elem","init","i","elems","querySelectorAll","l","target","currentTarget","srcElement","share","getValue","attr","val","startsWith","sharer","facebook","shareUrl","u","hashtag","quote","linkedin","mini","twitter","text","hashtags","via","email","subject","body","whatsapp","phone","telegram","viber","line","encodeURIComponent","pinterest","media","description","tumblr","canonicalUrl","content","posttype","title","caption","tags","hackernews","t","reddit","vk","image","xing","buffer","picture","instapaper","pocket","mashable","mix","flipboard","v","weibo","pic","appkey","ralateUid","language","blogger","n","baidu","it","iu","douban","comment","okru","mailru","share_url","linkname","linknote","evernote","skype","delicious","sms","trello","desc","mode","messenger","link","odnoklassniki","st","cmd","deprecated","meneame","diaspora","googlebookmarks","op","bkmk","qzone","refind","surfingbird","yahoomail","to","wordpress","amazon","pinboard","threema","id","kakaostory","yummly","yumtype","width","height","urlSharer","p","keys","Object","str","isLink","isBlank","location","popWidth","popHeight","left","innerWidth","screenX","popParams","innerHeight","screenY","newWindow","focus","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","d","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","hasOwnProperty","r","Symbol","toStringTag","Reflect","customElements","polyfillWrapFlushCallback","BuiltInHTMLElement","HTMLElement","construct","setPrototypeOf","raise","errorConstructor","requestSubmit","submitter","form","TypeError","DOMException","validateSubmitter","click","hidden","appendChild","removeChild","HTMLFormElement","submittersByForm","WeakMap","clickCaptured","Element","Node","parentElement","candidate","closest","findSubmitterFromClickTarget","set","FrameLoadingStyle","FetchMethod","FormSubmissionState","FormEnctype","TimingMetric","VisitState","Event","navigator","vendor","SubmitEvent","FrameElement","super","loaded","Promise","resolve","delegate","delegateConstructor","observedAttributes","connectedCallback","disconnectedCallback","src","attributeChangedCallback","loadingStyleChanged","sourceURLChanged","disabledChanged","setAttribute","removeAttribute","loading","lazy","eager","disabled","hasAttribute","autoscroll","complete","isLoading","ownerDocument","isPreview","_a","_b","documentElement","expandURL","locatable","URL","toString","baseURI","getAnchor","anchorMatch","hash","match","getAction","locationIsVisitable","rootLocation","baseURL","prefix","origin","pathname","endsWith","getPrefix","isPrefixedBy","split","getPathComponents","getLastPathComponent","getRequestURL","anchor","toCacheKey","FetchResponse","response","succeeded","ok","failed","clientError","statusCode","serverError","redirected","isHTML","contentType","status","header","responseText","clone","responseHTML","headers","dispatch","cancelable","detail","CustomEvent","bubbles","isConnected","dispatchEvent","nextAnimationFrame","requestAnimationFrame","parseHTMLDocument","html","DOMParser","parseFromString","unindent","strings","values","lines","reduce","result","string","interpolate","indent","join","uuid","Array","apply","_","floor","attributeName","elements","markAsBusy","localName","clearBusyState","method","URLSearchParams","abortController","AbortController","resolveRequestPromise","defaultHeaders","searchParams","entries","from","cancel","abort","async","fetchOptions","prepareHeadersForRequest","allowRequestToBeIntercepted","requestStarted","fetch","receive","requestErrored","requestFinished","fetchResponse","defaultPrevented","requestPreventedHandlingResponse","requestSucceededWithResponse","requestFailedWithResponse","toUpperCase","credentials","redirect","isIdempotent","signal","abortSignal","referrer","requestInterception","resume","AppearanceObserver","started","intersect","lastEntry","isIntersecting","elementAppearedInViewport","intersectionObserver","IntersectionObserver","observe","unobserve","StreamMessage","templateElement","innerHTML","static","fragment","createDocumentFragment","foreignElements","importNode","templateChildren","streamElements","child","tagName","children","FormSubmission","formElement","mustRedirect","initialized","formData","FormData","append","buildFormData","File","search","mergeFormDataEntries","fetchRequest","confirm","post","put","patch","delete","fetchMethodFromString","formElementAction","enctype","urlEncoded","stringFormData","encoding","multipart","plain","formEnctypeFromString","concat","confirmationMessage","needsConfirmation","requesting","confirmMethod","stopping","stopped","request","token","cookieName","cookie","find","decodeURIComponent","getCookieValue","getMetaContent","waiting","formSubmission","formSubmissionStarted","success","formSubmissionFailedWithResponse","requestMustRedirect","responseSucceededWithoutRedirect","Error","formSubmissionErrored","receiving","formSubmissionSucceededWithResponse","assign","formSubmissionFinished","Snapshot","hasAnchor","getElementForAnchor","firstAutofocusableElement","permanentElements","getPermanentElementById","getPermanentElementMapForSnapshot","snapshot","permanentElementMap","currentPermanentElement","newPermanentElement","FormInterceptor","submitBubbled","shouldInterceptFormSubmission","preventDefault","stopImmediatePropagation","formSubmissionIntercepted","View","resolveRenderPromise","resolveInterceptionPromise","scrollToAnchor","scrollToElement","focusElement","scrollToPosition","x","y","scrollToAnchorFromLocation","scrollIntoView","scrollRoot","scrollTo","scrollToTop","renderer","shouldRender","newSnapshot","renderPromise","prepareToRenderSnapshot","renderInterception","allowsImmediateRender","renderSnapshot","viewRenderedSnapshot","finishRenderingSnapshot","invalidate","viewInvalidated","markAsPreview","prepareToRender","render","finishRendering","FrameView","LinkInterceptor","clickBubbled","respondsToEventTarget","clickEvent","linkClicked","shouldInterceptLinkClick","linkClickIntercepted","willVisit","Renderer","currentSnapshot","willRender","promise","resolvingFunctions","createScriptElement","createdScriptElement","cspNonce","nonce","textContent","destinationElement","sourceElement","attributes","copyElementAttributes","preservingPermanentElements","callback","bardo","enter","leave","replaceNewPermanentElementWithPlaceholder","replaceCurrentPermanentElementWithClone","replacePlaceholderWithPermanentElement","permanentElement","placeholder","createPlaceholderForPermanentElement","replaceWith","cloneNode","getPlaceholderById","placeholders","focusFirstAutofocusableElement","connectedSnapshot","elementIsFocusable","currentElement","newElement","FrameRenderer","loadFrameElement","scrollFrameIntoView","activateScriptElements","destinationRange","createRange","selectNodeContents","deleteContents","frameElement","sourceRange","extractContents","firstElementChild","block","inertScriptElement","newScriptElements","activatedScriptElement","ProgressBar","hiding","visible","trickle","setValue","stylesheetElement","createStylesheetElement","progressElement","createProgressElement","installStylesheetElement","defaultCSS","animationDuration","show","installProgressElement","startTrickling","hide","fadeProgressElement","uninstallProgressElement","stopTrickling","refresh","insertBefore","firstChild","style","opacity","parentNode","trickleInterval","setInterval","clearInterval","className","HeadSnapshot","arguments","detailsByOuterHTML","elementIsNoscript","elementWithoutNonce","outerHTML","details","elementType","tracked","elementIsTracked","trackedElementSignature","getScriptElementsNotInSnapshot","getElementsMatchingTypeNotInSnapshot","getStylesheetElementsNotInSnapshot","matchedType","provisionalElements","getMetaValue","findMetaElementByName","elementIsMetaElementWithName","elementIsScript","elementIsStylesheet","PageSnapshot","headSnapshot","fromDocument","headElement","getSetting","cacheControlValue","isPreviewable","isCacheable","isVisitable","defaultOptions","historyChanged","visitCachedSnapshot","SystemStatusCode","PageStage","Visit","restorationIdentifier","options","timingMetrics","followedRedirect","scrolled","snapshotCached","snapshotHTML","isSamePage","locationWithActionIsSamePage","adapter","view","history","restorationData","getRestorationDataForIdentifier","silent","recordTimingMetric","visitStart","visitStarted","cancelRender","canceled","visitEnd","completed","visitCompleted","followRedirect","fail","visitFailed","changeHistory","actionForHistory","getHistoryMethodForAction","update","issueRequest","hasPreloadedResponse","simulateRequest","shouldIssueRequest","startRequest","recordResponse","finishRequest","requestStart","visitRequestStarted","isSuccessful","visitRequestCompleted","visitRequestFailedWithStatusCode","requestEnd","visitRequestFinished","loadResponse","cacheSnapshot","renderPage","fromHTMLString","visitRendered","renderError","getCachedSnapshot","getCachedSnapshotForLocation","getPreloadedSnapshot","hasCachedSnapshot","loadCachedSnapshot","redirectedToLocation","visitProposedToLocation","goToSamePageAnchor","contentTypeMismatch","networkFailure","performScroll","scrollToRestoredPosition","visitScrolledToSamePageLocation","lastRenderedLocation","scrollPosition","metric","getTimingMetrics","replaceState","pushState","then","frame","cancelAnimationFrame","BrowserAdapter","session","progressBar","showProgressBar","startVisit","visit","showVisitProgressBarAfterDelay","timeoutFailure","hideVisitProgressBar","pageInvalidated","showFormProgressBarAfterDelay","hideFormProgressBar","visitProgressBarTimeout","progressBarDelay","formProgressBarTimeout","CacheObserver","removeStaleElements","staleElements","FormSubmitObserver","submitCaptured","willSubmitForm","formSubmitted","FrameRedirector","linkInterceptor","formInterceptor","shouldRedirect","findFrameElement","shouldSubmit","meta","History","pageLoaded","onPopState","shouldHandlePopState","turbo","historyPoppedToLocationWithRestorationIdentifier","onPageLoad","updateRestorationData","additionalData","assumeControlOfScrollRestoration","previousScrollRestoration","scrollRestoration","relinquishControlOfScrollRestoration","pageIsLoaded","LinkClickObserver","clickEventIsSignificant","composedPath","findLinkFromClickTarget","getLocationForLink","willFollowLinkToLocation","followedLinkToLocation","isContentEditable","which","altKey","ctrlKey","metaKey","shiftKey","isAction","Navigator","proposeVisit","allowsVisitingLocationWithAction","currentVisit","submitForm","clearSnapshotCache","visitOptions","getActionForFormSubmission","currentAnchor","isRestorationToTop","oldURL","newURL","PageObserver","stage","initial","interpretReadyState","pageIsInteractive","pageIsComplete","pageWillUnload","interactive","pageBecameInteractive","ScrollObserver","onScroll","updatePosition","pageXOffset","pageYOffset","position","scrollPositionChanged","StreamObserver","sources","Set","inspectFetchResponse","fetchResponseFromEvent","fetchResponseIsStream","receiveMessageResponse","receiveMessageEvent","receiveMessageHTML","connectStreamSource","source","streamSourceIsConnected","disconnectStreamSource","has","receivedMessageFromStream","ErrorRenderer","replaceHeadAndBody","replaceChild","newHead","replaceableElement","scriptElements","PageRenderer","trackedElementsAreIdentical","mergeHead","replaceBody","currentHeadSnapshot","newHeadSnapshot","copyNewHeadStylesheetElements","copyNewHeadScriptElements","removeCurrentHeadProvisionalElements","copyNewHeadProvisionalElements","activateNewBody","assignNewBody","newHeadStylesheetElements","newHeadScriptElements","currentHeadProvisionalElements","newHeadProvisionalElements","adoptNode","activateNewBodyScriptElements","newBodyScriptElements","HTMLBodyElement","SnapshotCache","size","snapshots","read","touch","write","clear","index","splice","unshift","trim","PageView","snapshotCache","shouldCacheSnapshot","viewWillCacheSnapshot","cachedSnapshot","fromElement","extendURLWithDeprecatedProperties","defineProperties","deprecatedLocationPropertyDescriptors","absoluteURL","pageObserver","cacheObserver","linkClickObserver","formSubmitObserver","scrollObserver","streamObserver","frameRedirector","drive","disable","registerAdapter","renderStreamMessage","wrap","clearCache","setProgressBarDelay","delay","elementDriveEnabled","applicationAllowsFollowingLinkToLocation","getActionForLink","convertLinkWithMethodClickToFormSubmission","linkMethod","getTargetFrameForLink","applicationAllowsVisitingLocation","notifyApplicationAfterVisitingLocation","notifyApplicationAfterPageLoad","notifyApplicationAfterVisitingSamePageLocation","notifyApplicationBeforeCachingSnapshot","notifyApplicationBeforeRender","notifyApplicationAfterRender","frameLoaded","notifyApplicationAfterFrameLoad","frameRendered","notifyApplicationAfterFrameRender","notifyApplicationAfterClickingLinkToLocation","notifyApplicationBeforeVisitingLocation","newBody","timing","HashChangeEvent","container","navigator$1","Turbo","freeze","__proto__","setConfirmMethod","SnapshotSubstitution","getFrameElementById","getElementById","activateElement","currentURL","right","StreamActions","after","targetElements","forEach","templateContent","nextSibling","removeDuplicateTargetChildren","before","prepend","StreamElement","beforeRenderEvent","performAction","duplicateChildren","c","existingChildren","flatMap","newChildrenIds","includes","actionFunction","targetElementsById","targets","targetElementsByQuery","HTMLTemplateElement","setConsumer","newConsumer","fetchResponseLoaded","currentFetchRequest","resolveVisitPromise","connected","hasBeenLoaded","settingSourceURL","appearanceObserver","reloadable","loadingStyle","loadSourceURL","sourceURL","previousURL","extractForeignFrameElement","shouldInterceptNavigation","navigateFrame","proposeVisitIfNavigatedWithAction","CSS","escape","formActionIsVisitable","define","currentScript","warn","TurboCableStreamSourceElement","getConsumer","subscribeTo","received","dispatchMessageEvent","MessageEvent","signed_stream_name","attachmentSelector","default","nestable","heading1","terminal","breakOnReturn","group","code","plaintext","bulletList","bullet","listAttribute","tagName$1","numberList","number","attachmentGallery","exclusive","_element$tagName","browser$1","composesExistingText","userAgent","forcesObjectResizing","supportsInputEvents","InputEvent","property","lang$1","attachFiles","bold","bullets","byte","bytes","captionPlaceholder","italic","numbers","outdent","redo","strike","undo","unlink","urlPlaceholder","GB","KB","MB","PB","TB","sizes","fileSize","precision","formatter","base","exp","withoutInsignificantZeros","toFixed","ZERO_WIDTH_SPACE","NON_BREAKING_SPACE","matches","handleEvent","onElement","matchingSelector","withCallback","inPhase","times","selector","useCapture","destroy","findClosestElementFromNode","triggerEvent","createEvent","initEvent","elementMatchesSelector","nodeType","node","untilNode","ELEMENT_NODE","innerElementIsActive","activeElement","elementContainsNode","findChildIndexOfNode","_node","childIndex","previousSibling","removeNode","_node$parentNode","walkTree","tree","onlyNodesOfType","usingFilter","expandEntityReferences","whatToShow","NodeFilter","SHOW_ELEMENT","SHOW_TEXT","SHOW_COMMENT","SHOW_ALL","createTreeWalker","makeElement","tag","editable","contenteditable","dataset","classList","childNodes","childNode","blockTagNames","getBlockTagNames","attributes$1","nodeIsBlockContainer","nodeIsBlockStartComment","nodeProbablyIsBlockContainer","nodeIsBlockStart","strict","nodeIsCommentNode","COMMENT_NODE","nodeIsCursorTarget","nodeIsTextNode","trixCursorTarget","nodeIsAttachmentElement","nodeIsEmptyTextNode","TEXT_NODE","config","attachments","preview","presentation","file","blockAttributes","browser","css","attachment","attachmentCaption","attachmentCaptionEditor","attachmentMetadata","attachmentMetadataContainer","attachmentName","attachmentProgress","attachmentSize","attachmentToolbar","input","level2Enabled","getLevel","pickFiles","multiple","fileInputId","files","keyNames","lang","textAttributes","inheritable","parser","getComputedStyle","fontWeight","fontStyle","groupTagName","frozen","backgroundColor","toolbar","getDefaultHTML","undoInterval","_AwaitValue","wrapped","_AsyncGenerator","gen","front","back","arg","wrappedAwait","settle","done","err","next","_invoke","return","_defineProperty","configurable","writable","asyncIterator","throw","BasicObject","expression","toMethod","toProperty","optional","parseProxyMethodExpression","_this$toMethod","_object","proxyMethodExpressionPattern","RegExp","_Array$from","_$codePointAt$1","_String$fromCodePoint","UTF16String","fromUCS2String","ucs2String","ucs2decode","codepoints","ucs2encode","ucs2Length","offsetToUCS2Offset","offset","max","offsetFromUCS2Offset","ucs2Offset","fromCodepoints","charAt","isEqualTo","box","toJSON","getCacheKey","hasArrayFrom","hasStringCodePointAt$1","codePointAt","hasStringFromCodePoint","String","fromCodePoint","char","output","counter","charCodeAt","extra","array","fromCharCode","id$1","TrixObject","jsonString","fromJSON","hasSameConstructorAs","inspect","parts","contents","contentsForInspection","toJSONString","toUTF16String","arraysAreEqual","b","spliceArray","_len","_key","RTL_PATTERN","getDirection","dir","dirName","supportsDirName","supportsDirSelector","allAttributeNames","blockAttributeNames","textAttributeNames","listAttributeNames","getAllAttributeNames","getTextAttributeNames","getBlockAttributeNames","getBlockConfig","getTextConfig","installDefaultCSSForTagName","insertStyleElementForTagName","getCSPNonce","getMetaElement","testTransferData","dataTransferIsPlainText","dataTransfer","getData","keyEventIsKeyboardCommand","platform","defer","fn","copyObject","objectsAreEqual","normalizeRange","range","isArray","copyValue","rangeIsCollapsed","end","rangeValuesAreEqual","rangesAreEqual","leftRange","rightRange","leftStart","leftEnd","rightStart","rightEnd","selectionChangeObserver","run","selectionManagers","registerSelectionManager","selectionManager","unregisterSelectionManager","notifySelectionManagersOfSelectionChange","selectionDidChange","domRange","getDOMRange","startContainer","startOffset","endContainer","endOffset","reset","getDOMSelection","selection","getSelection","rangeCount","_getDOMSelection","getRangeAt","domRangeIsPrivate","setDOMRange","removeAllRanges","addRange","nodeIsPrivate","getPrototypeOf","normalizeSpaces","breakableWhitespacePattern","squishBreakableWhitespace","utf16StringDifferences","diffA","utf16StringDifference","utf16String","diffB","leftIndex","rightIndexA","rightIndexB","Hash","objects","getKeys","getKeysCommonToHash","copy","merge","unbox","toArray","isEmpty","toObject","keyToRemove","sort","Operation","isPerforming","performing","hasPerformed","performed","hasSucceeded","hasFailed","getPromise","release","_this$promise","_this$promise$cancel","proxyMethod","ImagePreloadOperation","Image","onload","naturalWidth","naturalHeight","onerror","Attachment","attributesForFile","setFile","filename","filesize","attachmentJSON","releaseFile","didChangeAttributes","attribute","getAttributes","setAttributes","newAttributes","_this$previewDelegate","_this$previewDelegate2","_this$delegate","_this$delegate$attach","previewDelegate","attachmentDidChangeAttributes","preloadURL","isPending","getURL","getHref","previewablePattern","getContentType","getType","hasContent","getFilename","getFilesize","getFormattedFilesize","getExtension","_this$getFilename$mat","getContent","getWidth","getHeight","getFile","preloadFile","releasePreloadedFile","getUploadProgress","uploadProgress","setUploadProgress","_this$uploadProgressD","_this$uploadProgressD2","uploadProgressDelegate","attachmentDidChangeUploadProgress","getPreviewURL","previewURL","preloadingURL","setPreviewURL","_this$previewDelegate3","_this$previewDelegate4","_this$delegate2","_this$delegate2$attac","attachmentDidChangePreviewURL","preload","fileObjectURL","createObjectURL","revokeObjectURL","_ref","catch","ManagedAttachment","attachmentManager","requestRemovalOfAttachment","AttachmentManager","managedAttachments","manageAttachment","getAttachments","attachmentIsManaged","attachmentManagerDidRequestRemovalOfAttachment","unmanageAttachment","managedAttachment","Piece","types","pieceJSON","copyWithAttributes","copyWithAdditionalAttributes","copyWithoutAttribute","getAttributesHash","hasSameStringValueAsPiece","piece","hasSameAttributesAsPiece","isBlockBreak","isSerializable","canBeGrouped","canBeGroupedWith","getLength","canBeConsolidatedWith","AttachmentPiece","ensureAttachmentExclusivelyHasAttribute","removeProhibitedAttributes","permittedAttributes","getCaption","_piece$attachment","json","toConsole","registerType","StringPiece","normalizeNewlines","consolidateWith","splitAtOffset","SplittableList","eachObject","insertObjectAtIndex","insertSplittableListAtIndex","splittableList","insertSplittableListAtPosition","splitObjectAtPosition","editObjectAtIndex","replaceObjectAtIndex","removeObjectAtIndex","getObjectAtIndex","getSplittableListInRange","rightIndex","splitObjectsAtRange","selectSplittableList","removeObjectsInRange","transformObjectsInRange","transform","transformedObjects","rightOuterIndex","leftInnerIndex","startOfRange","endOfRange","getObjectAtPosition","findIndexAndOffsetAtPosition","splitIndex","splitOffset","leftObject","rightObject","consolidate","pendingObject","_pendingObject$canBeC","_pendingObject","consolidateFromIndexToIndex","startIndex","endIndex","objectsInRange","consolidatedInRange","currentPosition","nextPosition","findPositionAtIndexAndOffset","currentIndex","getEndPosition","endPosition","objectArraysAreEqual","Text","textJSON","pieces","notEmpty","pieceList","copyWithPieceList","copyUsingObjectMap","objectMap","getPieces","appendText","insertTextAtPosition","removeTextAtRange","replaceTextAtRange","moveTextFromRangeToPosition","getTextAtRange","addAttributeAtRange","addAttributesAtRange","removeAttributeAtRange","setAttributesAtRange","getAttributesAtPosition","_this$pieceList$getOb","getCommonAttributes","fromCommonAttributesOfObjects","getCommonAttributesAtRange","getExpandedRangeForAttributeAtOffset","getStringAtRange","getStringAtPosition","startsWithString","endsWithString","getAttachmentPieces","getAttachmentAndPositionById","attachmentId","getAttachmentById","getRangeOfAttachment","attachmentAndPosition","updateAttributesForAttachment","_text$pieceList","eachPiece","getPieceAtPosition","toSerializableText","isRTL","Block","blockJSON","applyBlockBreakToText","copyWithText","copyWithoutText","copyWithoutAttributes","mappedText","addAttribute","expandAttribute","removeLastValue","removeLastAttribute","getLastAttribute","getLastElement","getAttributeLevel","getAttributeAtLevel","level","hasAttributes","getLastNestableAttribute","getNestableAttributes","getNestingLevel","decreaseNestingLevel","increaseNestingLevel","lastIndexOf","getListItemAttributes","isListItem","_getBlockConfig","isTerminalBlock","_getBlockConfig2","breaksOnReturn","_getBlockConfig3","findLineBreakInDirectionFromPosition","direction","newlineText","textForStringWithAttributes","getTextWithoutBlockBreak","getBlockBreakPosition","textEndsInBlockBreak","depth","otherBlock","otherAttributes","otherAttribute","getListAttributeNames","unmarkExistingInnerBlockBreaksInText","addBlockBreakToText","modified","innerPieces","lastPiece","unmarkBlockBreakPiece","blockBreakText","blockBreak","ObjectMap","Document","documentJSON","blocks","blockList","getBlockAtIndex","consolidateBlocks","copyUsingObjectsFromDocument","sourceDocument","getObjects","getBlocks","copyWithBaseBlockAttributes","replaceBlock","oldBlock","newBlock","insertDocumentAtRange","locationFromPosition","getBlockAtPosition","mergeDocumentAtRange","formattedDocument","startPosition","startLocation","baseBlockAttributes","getBaseBlockAttributes","trailingBlockAttributes","leadingBlockAttributes","blockCount","getBlockCount","firstBlock","firstText","insertTextAtRange","leftPosition","rightPosition","leftLocation","rightLocation","locationRangeFromRange","leftOffset","leftBlock","rightOffset","rightBlock","leftText","rightText","affectedBlockCount","getDocumentAtRange","movingRightward","eachBlockAtRange","textRange","eachBlock","getTextAtIndex","removeAttributeForAttachment","insertBlockBreakAtRange","applyBlockAttributeAtRange","expanded","expandRangeToLineBreaksAndSplitBlocks","blockConfig","removeLastListAttributeAtRange","exceptAttributeName","converted","convertLineBreaksToBlockBreaksInRange","removeBlockAttributesAtRange","removeLastTerminalAttributeAtRange","consolidateBlocksAtRange","lastAttributeName","endLocation","startBlock","positionFromLocation","endBlock","_this$getBlockAtIndex","getTextAtPosition","getCharacterAtPosition","getEditCount","editCount","getCommonAttributesAtPosition","attributesForBlock","commonAttributes","attributesLeft","inheritableAttributes","getRangeOfCommonAttributeAtPosition","blockIndex","lastAttributeIndex","attachmentPieces","iterable","getLocationRangeOfAttachment","getAttachmentPieceForAttachment","findRangesForBlockAttribute","ranges","findRangesForTextAttribute","withValue","locationRangeFromPosition","rangeFromLocationRange","locationRange","getTexts","toSerializableDocument","DEFAULT_ALLOWED_ATTRIBUTES","DEFAULT_FORBIDDEN_PROTOCOLS","DEFAULT_FORBIDDEN_ELEMENTS","HTMLSanitizer","sanitizer","sanitize","allowedAttributes","forbiddenProtocols","forbiddenElements","createBodyElementForHTML","sanitizeElements","normalizeListElementNesting","getHTML","getBody","walker","nodesToRemove","nextNode","currentNode","elementIsRemovable","sanitizeElement","listElement","previousElement","previousElementSibling","elementIsForbidden","elementIsntSerializable","doc","implementation","createHTMLDocument","pieceForString","parseTrixDataAttribute","HTMLParser","referenceElement","blockElements","processedElements","getDocument","createHiddenContainer","containerElement","nodeFilter","processNode","translateBlockElementMarginsToNewlines","removeHiddenContainer","display","isInsignificantTextNode","appendBlockForTextNode","processTextNode","appendBlockForElement","processElement","currentBlockElement","isBlockElement","appendStringWithAttributes","_this$currentBlock","getBlockAttributes","currentBlock","appendBlockForAttributesWithElement","elementIsBlockElement","currentBlockContainsElement","parentBlockElement","findParentBlockElement","appendEmptyBlock","_node$previousSibling","elementCanDisplayPreformattedText","stringEndsWithWhitespace","leftTrimBreakableWhitespace","getTextAttributes","appendAttachmentWithAttributes","isExtraBR","dimensions","parseInt","getImageDimensions","blockForAttributes","appendPiece","pieceForAttachment","appendStringToTextAtIndex","prependStringToTextAtIndex","configAttr","attributeInheritedFromBlock","blockElement","findBlockElementAncestors","styleProperty","attrConfig","_attrConfig$test","reverse","ancestors","stringIsAllBreakableWhitespace","nodeEndsWithNonWhitespace","lastChild","defaultMargin","getMarginOfDefaultBlockElement","margin","getMarginOfBlockElementAtIndex","top","bottom","getBlockElementMargin","whiteSpace","marginTop","marginBottom","FILTER_REJECT","FILTER_ACCEPT","LineBreakInsertion","composition","selectedRange","getSelectedRange","previousCharacter","nextCharacter","shouldInsertBlockBreak","shouldBreakFormattedBlock","shouldDecreaseListLevel","shouldPrependListItem","shouldRemoveLastBlockAttribute","Composition","currentAttributes","revision","setDocument","_this$delegate$compos","refreshAttachments","compositionDidChangeDocument","getSnapshot","loadSnapshot","_this$delegate2$compo","_this$delegate3","_this$delegate3$compo","compositionWillLoadSnapshot","setSelection","compositionDidLoadSnapshot","insertText","notifyDelegateOfInsertionAtRange","insertBlock","insertDocument","insertString","getCurrentTextAttributes","insertBlockBreak","insertLineBreak","insertion","decreaseListLevel","removeLastBlockAttribute","breakFormattedBlock","insertHTML","replaceHTML","getLocationRange","insertFile","insertFiles","_this$delegate4","compositionShouldAcceptFile","attachmentForFile","insertAttachments","insertAttachment","_config$attachments$t","attachmentText","textForAttachmentWithAttributes","shouldManageDeletingInDirection","shouldManageMovingCursorInDirection","deleteInDirection","deletingIntoPreviousBlock","selectionSpansBlocks","selectionIsCollapsed","canDecreaseBlockAttributeLevel","getBlock","decreaseBlockAttributeLevel","getExpandedRangeInDirection","getAttachmentAtRange","editAttachment","moveTextFromRange","removeAttachment","stopEditingAttachment","removeCurrentAttribute","insertPlaceholder","placeholderPosition","getPosition","selectPlaceholder","setSelectedRange","forgetPlaceholder","hasCurrentAttribute","toggleCurrentAttribute","setCurrentAttribute","canSetCurrentAttribute","canSetCurrentBlockAttribute","canSetCurrentTextAttribute","getSelectedDocument","setBlockAttribute","setTextAttribute","notifyDelegateOfCurrentAttributesChange","removeBlockAttribute","updateCurrentAttributes","removeTextAttribute","canDecreaseNestingLevel","_this$getBlock","canIncreaseNestingLevel","previousBlock","getPreviousBlock","arrayStartsWith","_this$getBlock2","_this$getBlock3","attributeLevel","ignoreLock","getCurrentAttributes","freezeSelection","thawSelection","hasFrozenSelection","_this$delegate5","compositionDidRequestChangingSelectionToLocationRange","getSelectionManager","setLocationRange","targetLocationRange","withTargetLocationRange","withTargetRange","withTargetDOMRange","createLocationRangeFromDOMRange","translateUTF16PositionFromOffset","editingAttachment","moveCursorInDirection","canEditAttachment","expandSelectionInDirection","expandSelectionForEditing","expandSelectionAroundCommonAttribute","selectionContainsAttachments","_this$getSelectedAtta","getSelectedAttachments","selectionIsInCursorTarget","positionIsCursorTarget","locationIsCursorTarget","positionIsBlockBreak","_this$document$getPie","_this$getSelectedDocu","added","removed","oldArray","newArray","existingValues","currentValues","summarizeArrayChange","_this$delegate6","_this$delegate6$compo","compositionDidRemoveAttachment","_this$delegate7","_this$delegate7$compo","compositionDidAddAttachment","_this$delegate8","_this$delegate8$compo","compositionDidEditAttachment","_this$delegate9","_this$delegate9$compo","compositionDidChangeAttachmentPreviewURL","_this$delegate10","_this$delegate10$comp","compositionDidStartEditingAttachment","_this$delegate11","_this$delegate11$comp","compositionDidStopEditingAttachment","newDocument","_this$delegate12","_this$delegate12$comp","compositionDidChangeCurrentAttributes","_this$delegate13","_this$delegate13$comp","compositionDidPerformInsertionAtRange","utf16string","utf16position","UndoManager","undoEntries","redoEntries","recordUndoEntry","context","consolidatable","previousEntry","entryHasDescriptionAndContext","undoEntry","createEntry","pop","redoEntry","canUndo","canRedo","entry","BLOCK_ATTRIBUTE_NAME","Filter","applyBlockAttribute","findRangesOfBlocks","findRangesOfPieces","moveSelectedRangeForward","DEFAULT_FILTERS","Editor","undoManager","filters","loadDocument","loadHTML","loadJSON","getClientRectAtPosition","getClientRectAtLocationRange","activateAttribute","attributeIsActive","canActivateAttribute","deactivateAttribute","LocationMapper","findLocationFromContainerAndOffset","foundBlock","attachmentElement","findAttachmentElementParentForNode","rejectAttachmentContents","nodeLength","findContainerAndOffsetFromLocation","nodeOffset","findNodeAndOffsetFromLocation","getSignificantNodesForIndex","nodes","acceptSignificantNodes","recordingNodes","rejectEmptyTextNodes","PointMapper","createDOMRangeFromPoint","caretPositionFromPoint","offsetNode","setStart","caretRangeFromPoint","createTextRange","originalDOMRange","moveToPoint","select","getClientRectsForDOMRange","getClientRects","SelectionManager","didMouseDown","locationMapper","pointMapper","lockCount","currentLocationRange","lockedLocationRange","createDOMRangeFromLocationRange","updateCurrentLocationRange","setLocationRangeFromPointRange","pointRange","getLocationAtPoint","lock","unlock","clearSelection","_getDOMRange","collapsed","selectionIsExpanded","domRangeWithinElement","pauseTemporarily","resumeHandlers","paused","resumeTimeout","_this$delegate$locati","locationRangeDidChange","rangeStart","rangeEnd","setEnd","point","_this$createLocationR","models","Cocument","HtmlParser","HtmlSanitizer","Trix","VERSION","ObjectGroup","ungroupedObjects","asTree","_object$canBeGrouped2","_object$canBeGrouped","_group$canBeGroupedWi","_group","groupObjects","getDepth","ElementStore","getKey","trixStoreKey","ObjectView","childViews","rootView","getNodes","createNodes","_this$parentView","parentView","invalidateViewForObject","_this$findViewForObje","findViewForObject","findOrCreateCachedChildView","viewClass","getCachedViewForObject","recordChildView","createChildView","cacheViewForObject","ObjectGroupView","getAllChildViews","views","childView","findElement","findElementForObject","getViewCache","isViewCachingEnabled","viewCache","shouldCacheViews","enableViewCaching","disableViewCaching","_this$getViewCache","cache","garbageCollectCachedViews","objectKeys","objectGroup","getChildViews","createContainerElement","css$2","AttachmentView","attachmentPiece","createContentNodes","innerElement","figure","getClassName","tabindex","createCaptionElement","class","trixMutable","createCursorTarget","figcaption","captionConfig","getCaptionConfig","nameElement","createTextNode","sizeElement","names","extension","trixAttachment","trixContentType","trixId","trixAttributes","trixSerialize","htmlContainsTagName","findProgressElement","_this$findElement","div","PreviewableAttachmentView","updateAttributesForImage","serializedAttributes","storeKey","PieceView","textConfig","createAttachmentNodes","createStringNodes","_element","findInnerElement","_this$textConfig","substring","preserveSpaces","styles","pendingElement","isLast","isFirst","followsWhitespace","TextView","lastIndex","endsWithWhitespace","previousPiece","css$1","BlockView","createComment","textView","shouldAddExtraNewlineElement","DocumentView","sync","elementStore","shadowElement","isSynced","elementsHaveEqualHTML","createDocumentFragmentForSync","didSync","findStoredElements","storedElement","otherElement","ignoreSpaces","unserializableAttributeNames","serializedAttributesAttribute","serializedAttributesSelector","blockCommentPattern","serializers","serializable","el","mutableAttributeName","mutableSelector","childList","characterData","characterDataOldValue","subtree","didMutate","observer","MutationObserver","mutations","_this$delegate$elemen","findSignificantMutations","elementDidMutate","getMutationSummary","mutation","mutationIsSignificant","nodeIsMutable","nodesModifiedByMutation","nodeIsSignificant","addedNodes","removedNodes","getTextMutationSummary","additions","deletions","getTextChangesFromCharacterData","textChanges","getTextChangesFromChildList","addition","summary","textAdded","deleted","textDeleted","getMutationsByType","textRemoved","getTextForNodes","characterMutations","startMutation","endMutation","summarized","oldString","newString","summarizeStringChange","oldValue","Controller","FileVerificationOperation","reader","FileReader","readAsArrayBuffer","InputController","mutationObserver","handlerFor","mutationSummary","editorWillSyncDocumentView","editorDidSyncDocumentView","requestRender","_this$delegate$inputC","inputControllerDidRequestRender","requestReparse","_this$delegate2$input","inputControllerDidRequestReparse","operations","all","handleInput","_this$responder","inputControllerWillAttachFiles","responder","inputControllerWillHandleInput","inputControllerDidHandleInput","createLinkHTML","_$codePointAt","keyNames$1","pastedFileCount","Level0InputController","resetInputSummary","setInputSummary","inputSummary","isComposing","inputControllerDidAllowUnhandledInput","mutationIsExpected","preferDocument","mutationAdditionMatchesSummary","mutationDeletionMatchesSummary","didDelete","unexpectedNewlineAddition","unexpectedNewlineDeletion","_this$compositionInpu","textChanged","composedEmptyString","compositionInput","getEndData","getCompositionInput","CompositionInput","isEnded","_this$responder2","serializeSelectionToDataTransfer","_this$responder3","setData","dataTransferIsWritable","canAcceptDataTransfer","Files","getPastedHTMLUsingHiddenElement","keydown","didInput","keyName","keyCode","_context2","modifier","_context","character","inputControllerDidReceiveKeyboardCommand","keypress","stringFromKeyEvent","_this$responder9","inputControllerWillPerformTyping","textInput","_this$responder10","dragenter","dragstart","_this$delegate5$input","draggedRange","inputControllerDidStartDrag","dragover","draggingPoint","clientX","clientY","_this$delegate6$input","inputControllerDidReceiveDragOverPoint","dragend","_this$delegate7$input","inputControllerDidCancelDrag","drop","_event$dataTransfer","_this$responder11","_this$responder12","inputControllerWillMoveText","_this$responder13","fromJSONString","cut","_this$responder14","clipboardData","inputControllerWillCutText","_this$responder15","paste","clipboard","testClipboardData","pasteEventIsCrippledSafariHTMLPaste","_this$responder16","inputControllerWillPaste","inputControllerDidPaste","_this$responder17","_this$delegate14","_this$responder18","_this$delegate15","_this$delegate16","_this$responder19","_this$delegate17","_clipboard$items","_clipboard$items$","_clipboard$items$$get","items","getAsFile","_this$delegate18","_this$responder20","_this$delegate19","extensionForFile","compositionstart","compositionupdate","compositionend","beforeinput","stopPropagation","backspace","_this$delegate20","_this$delegate21","_this$delegate22","_this$responder21","tab","_this$responder22","_this$responder23","_this$responder24","_this$responder25","control","_this$delegate23","h","_this$delegate24","_this$delegate25","_this$responder26","shift","_this$delegate26","_this$responder27","_this$responder28","_this$responder29","alt","_this$delegate27","_this$delegate28","_file$type","_file$type$match","hasStringCodePointAt","charCode","hasPasteboardFlavor","hasReadableDynamicData","isExternalHTMLPaste","isExternalRichTextPaste","inputController","_this$responder5","_this$responder4","isSignificant","canApplyToDocument","_this$responder6","_this$responder7","_this$responder8","_this$data$start","_this$data$end","Level2InputController","scheduledRender","composing","reparse","scheduleRender","_this$afterRender","afterRender","toggleAttributeIfSupported","inputControllerWillPerformFormatting","activateAttributeIfSupported","getTargetDOMRange","minLength","_this$event$getTarget","_this$event","targetRanges","getTargetRanges","staticRangeToRange","withEvent","keyboardCommandFromKeyEvent","_event$clipboardData","pasteEventHasFilesOnly","pasteEventHasPlainTextOnly","inputTypes","inputType","dragging","pointFromEvent","dragEventHasFiles","ArrowLeft","ArrowRight","Backspace","Tab","deleteByComposition","deleteByCut","deleteByDrag","deleteByDragRange","deleteCompositionText","deleteContent","deleteContentBackward","deleteContentForward","deleteEntireSoftLine","deleteHardLineBackward","deleteHardLineForward","deleteSoftLineBackward","deleteSoftLineForward","deleteWordBackward","deleteWordForward","formatBackColor","formatBold","formatFontColor","formatFontName","formatIndent","formatItalic","formatJustifyCenter","formatJustifyFull","formatJustifyLeft","formatJustifyRight","formatOutdent","formatRemove","_this$responder30","formatSetBlockTextDirection","formatSetInlineTextDirection","formatStrikeThrough","formatSubscript","formatSuperscript","formatUnderline","historyRedo","inputControllerWillPerformRedo","historyUndo","inputControllerWillPerformUndo","insertCompositionText","insertFromComposition","insertFromDrop","_this$responder31","insertFromPaste","_dataTransfer$files","_this$responder32","_this$responder33","_this$responder34","_this$responder35","insertFromYank","insertLink","insertOrderedList","insertParagraph","_this$responder36","insertReplacementText","_this$event$dataTrans","insertTranspose","insertUnorderedList","staticRange","undoable","commands","do","undos","AttachmentEditorController","trixAction","didClickToolbar","didClickActionButton","textarea","textareaClone","tabIndex","autoresize","scrollHeight","didInputCaption","didKeyDownCaption","didChangeCaption","didBlurCaption","editingFigcaption","editCaption","install","makeElementMutable","addToolbar","installCaptionEditor","uninstall","savePendingCaption","didUninstallAttachmentEditor","pendingCaption","_this$delegate3$attac","attachmentEditorDidRequestUpdatingAttributesForAttachment","attachmentEditorDidRequestRemovingAttributeForAttachment","attachmentEditorDidRequestRemovalOfAttachment","_this$delegate5$attac","attachmentEditorDidRequestDeselectingAttachment","CompositionController","didFocus","didBlur","didClickAttachment","documentView","_this$blurPromise","focused","compositionControllerDidFocus","blurPromise","compositionControllerDidBlur","findAttachmentForElement","compositionControllerDidSelectAttachment","getSerializableElement","isEditingAttachment","_this$delegate4$compo","_this$delegate5$compo","canSyncDocumentView","compositionControllerWillSyncDocumentView","compositionControllerDidSyncDocumentView","compositionControllerDidRender","rerenderViewForObject","refreshViewCache","attachmentEditor","installAttachmentEditorForAttachment","_this$attachmentEdito","uninstallAttachmentEditor","_this$attachmentEdito2","compositionControllerWillUpdateAttachment","compositionControllerDidRequestRemovalOfAttachment","compositionControllerDidRequestDeselectingAttachment","attributeButtonSelector","actionButtonSelector","toolbarButtonSelector","dialogSelector","activeDialogSelector","dialogButtonSelector","dialogInputSelector","getInputForDialog","getAttributeName","getActionName","ToolbarController","didClickAttributeButton","didClickDialogButton","didKeyDownDialogInput","actions","resetDialogInputs","toolbarDidClickButton","actionName","getDialog","toggleDialog","toolbarDidInvokeAction","toolbarDidToggleAttribute","refreshAttributeButtons","dialogElement","dialog","hideDialog","updateActions","refreshActionButtons","eachActionButton","updateAttributes","eachAttributeButton","dialogIsVisible","applyKeyboardCommand","keyString","button","buttonKeys","dialogName","showDialog","toolbarWillShowDialog","disabledInput","toolbarDidShowDialog","willValidate","checkValidity","toolbarDidUpdateAttribute","toolbarDidRemoveAttribute","toolbarDidHideDialog","getDialogName","EditorController","editorElement","compositionController","toolbarController","toolbarElement","editor","notifyEditorElement","handlingInput","updateCurrentActions","pasting","pastedRange","attachmentLocationRange","loadingSnapshot","isFocused","requestedLocationRange","compositionRevisionWhenLocationRangeRequested","renderedCompositionRevision","runEditorFilters","isFocusedInvisibly","requestedRender","recordTypingUndoEntry","recordFormattingUndoEntry","locationRangeBeforeDrag","invokeAction","selectionFrozen","canInvokeAction","actionIsExternal","_this$actions$actionN","_this$actions$actionN2","_this$actions$actionN3","_this$actions$actionN4","getCurrentActions","currentActions","snapshotsAreEqual","updateInputElement","serializer","serializeToContentType","setInputElementValue","documentChangedSinceLastRender","getUndoContext","getLocationContext","getTimeContext","_this$editorElement$o","TrixToolbarElement","configureContentEditable","disableObjectResizing","setDefaultParagraphSeparator","_document$queryComman","_document","queryCommandSupported","execCommand","_document$queryComman2","_document2","cursorTargetStyles","TrixEditorElement","labels","label","_this$ownerDocument","toolbarId","_this$inputElement","inputElement","_this$ownerDocument2","inputId","nextElementSibling","_this$editorControlle","editorController","_this$inputElement2","_this$inputElement3","defaultValue","_this$editor","handleEventOnce","makeEditable","texts","contains","ensureAriaLabel","registerResetListener","registerClickListener","autofocus","_this$editorControlle2","unregisterResetListener","unregisterClickListener","resetListener","resetBubbled","clickListener","EventListener","eventTarget","eventOptions","unorderedBindings","bindingConnected","binding","bindingDisconnected","extendedEvent","immediatePropagationStopped","extendEvent","bindings","Dispatcher","application","eventListenerMaps","Map","eventListeners","eventListener","listeners","fetchEventListenerForBinding","handleError","fetchEventListener","eventListenerMap","fetchEventListenerMapForEventTarget","cacheKey","createEventListener","descriptorPattern","camelize","capitalize","dasherize","defaultEventNames","typecast","o_O","Binding","willBeInvokedByEvent","invokeWithEvent","controller","methodName","actionEvent","logDebugActivity","scope","containsElement","ElementObserver","mutationObserverInit","processMutations","pause","takeRecords","matchElementsInTree","removeElement","addElement","processMutation","processAttributeChange","processRemovedNodes","processAddedNodes","elementAttributeChanged","matchElement","elementFromNode","processTree","elementIsActive","processor","elementMatched","elementUnmatched","AttributeObserver","elementObserver","elementMatchedAttribute","elementUnmatchedAttribute","elementAttributeValueChanged","StringMapObserver","stringMap","attributeOldValue","knownAttributeNames","refreshAttribute","getStringMapKeyForAttribute","stringMapKeyAdded","stringMapValueChanged","stringMapKeyRemoved","currentAttributeNames","recordedAttributeNames","Multimap","valuesByKey","prune","del","hasKey","hasValue","some","getValuesForKey","getKeysForValue","TokenListObserver","attributeObserver","tokensByElement","tokensMatched","readTokensForElement","unmatchedTokens","matchedTokens","refreshTokensForElement","tokensUnmatched","tokens","tokenMatched","tokenUnmatched","previousTokens","currentTokens","firstDifferingIndex","zip","findIndex","previousToken","currentToken","tokenString","parseTokenString","ValueListObserver","tokenListObserver","parseResultsByToken","valuesByTokenByElement","fetchParseResultForToken","fetchValuesByTokenForElement","elementMatchedValue","elementUnmatchedValue","parseResult","parseToken","valuesByToken","parseValueForToken","BindingObserver","bindingsByAction","valueListObserver","actionAttribute","disconnectAllActions","schema","connectAction","disconnectAction","descriptor","getDefaultEventNameForElement","descriptorString","eventTargetName","parseActionDescriptorString","eventNameSuffix","getParamsFromEventTargetAttributes","pattern","forToken","ValueObserver","receiver","stringMapObserver","valueDescriptorMap","invokeChangedCallbacksForDefaultValues","invokeChangedCallback","writer","valueDescriptorNameMap","valueDescriptors","rawValue","rawOldValue","changedMethodName","changedMethod","descriptors","hasMethodName","TargetObserver","targetsByName","disconnectAllTargets","connectTarget","disconnectTarget","targetConnected","targetDisconnected","Context","functionName","controllerConstructor","bindingObserver","dispatcher","valueObserver","targetObserver","initialize","invokeControllerMethod","readInheritableStaticArrayValues","propertyName","getAncestorsForConstructor","getOwnStaticArrayValues","getOwnKeys","getOwnPropertySymbols","getOwnPropertyNames","extendWithReflect","extended","testReflectExtension","Module","shadowConstructor","shadowProperties","shadowingDescriptor","getOwnPropertyDescriptor","getShadowedDescriptor","getShadowProperties","shadow","blessedProperties","blessing","getBlessedProperties","blessDefinition","contextsByScope","connectedContexts","contexts","connectContextForScope","fetchContextForScope","disconnectContextForScope","ClassMap","getDataKey","getAll","getAttributeNameForKey","DataMap","Guide","warnedKeysByObject","warnedKeys","attributeValueContainsToken","TargetSet","targetName","targetNames","findTarget","findLegacyTarget","findAllTargets","findAllLegacyTargets","getSelectorForTargetName","findAllElements","targetAttributeForScope","getLegacySelectorForTargetName","deprecate","targetDescriptor","targetAttribute","revisedAttributeName","guide","Scope","classes","controllerSelector","queryElements","controllerAttribute","ScopeObserver","scopesByIdentifierByElement","scopeReferenceCounts","scopesByIdentifier","fetchScopesByIdentifierForElement","createScopeForElementAndIdentifier","referenceCount","scopeConnected","scopeDisconnected","Router","scopeObserver","modulesByIdentifier","modules","loadDefinition","unloadIdentifier","connectModule","disconnectModule","getContextForElementAndIdentifier","defaultSchema","Application","debug","logFormattedMessage","router","register","shouldLoad","load","rest","unload","controllers","getControllerForElementAndIdentifier","groupCollapsed","groupEnd","parseValueDefinitionPair","typeDefinition","typeFromObject","typeObject","parseValueTypeConstant","defaultValueType","parseValueTypeDefault","parseValueTypeObject","typeFromDefaultValue","typeFromConstant","parseValueTypeDefinition","constant","defaultValuesByType","defaultValueForDefinition","hasCustomDefaultValue","readers","writers","valueDescriptorForTokenAndTypeDefinition","Boolean","Number","boolean","writeJSON","blessings","classDefinition","targetDefinition","valueDefinitionPairs","pairs","getOwnStaticObjectPairs","readInheritableStaticObjectPairs","propertyDescriptorMap","valueDefinitionPair","valueDescriptor","propertiesForValueDefinitionPair","Stimulus","SimpleLightbox","sourceAttr","overlay","overlayOpacity","spinner","nav","navText","captions","captionDelay","captionSelector","captionType","captionsData","captionPosition","captionClass","closeText","swipeClose","showCounter","fileExt","animationSlide","animationSpeed","preloading","enableKeyboard","loop","rel","docClose","swipeTolerance","widthRatio","heightRatio","scaleImageToRatio","disableRightClick","disableScroll","alertError","alertErrorMessage","additionalHtml","throttleInterval","doubleTapZoom","maxZoom","htmlClass","rtl","fixedClass","fadeSpeed","uniqueImages","scrollZoom","scrollZoomFactor","transitionPrefix","isPassiveEventsSupported","transitionCapable","isTouchDevice","isAppleDevice","initialLocationHash","pushStateSupport","isAnimating","isClosing","isFadeIn","urlChangedOnce","hashReseted","historyHasChanges","historyUpdateTimeout","currentImage","eventNamespace","domNodes","loadedImages","initialImageIndex","currentImageIndex","initialSelector","globalScrollbarWidth","controlCoordinates","swipeDiff","swipeYDiff","swipeStart","swipeEnd","swipeYStart","swipeYEnd","mousedown","imageLeft","zoomed","containerHeight","containerWidth","containerOffsetX","containerOffsetY","imgHeight","imgWidth","capture","initialOffsetX","initialOffsetY","initialPointerOffsetX","initialPointerOffsetY","initialPointerOffsetX2","initialPointerOffsetY2","initialScale","initialPinchDistance","pointerOffsetX","pointerOffsetY","pointerOffsetX2","pointerOffsetY2","targetOffsetX","targetOffsetY","targetScale","pinchOffsetX","pinchOffsetY","limitOffsetX","limitOffsetY","scaleDifference","targetPinchDistance","touchCount","doubleTapped","touchmoveCount","checkPassiveEventsSupport","relatedElements","calculateTransitionPrefix","getRelated","imgArr","createDomNodes","wrapper","closeButton","navigation","openImage","throttle","loadImage","addEvents","supportsPassive","opts","opacityTarget","func","limit","inThrottle","isValidLink","toggleScrollbar","scrollbarWidth","fixedElements","fullWindowWidth","documentElementRect","getBoundingClientRect","abs","clientWidth","scrollDiv","paddingRight","offsetWidth","originalPaddingRight","actualPadding","calculatedPadding","parseFloat","padding","resetHash","fadeOut","minMax","prev","nextImage","prevImage","slideDirection","newIndex","slide","adjustImage","tmpImage","windowWidth","windowHeight","scale","translateX","translateY","zoomPanElement","dirIsDefined","alert","updateURL","captionContainer","captionText","imageWidth","imageHeight","ratio","forceFocus","fadeIn","setCaption","setZoomData","hashchangeHandler","getElementsByTagName","getDimensions","offsetLeft","offsetTop","delta","wheelDelta","pageX","pageY","touches","sqrt","possibleDir","offsetHeight","borderTopWidth","borderBottomWidth","paddingTop","paddingBottom","borderLeftWidth","borderRightWidth","paddingLeft","updateHash","newHash","speed","pos","targetURL","namespaces","passive","duration","getPropertyValue","step","fade","currentOpacity","initialDisplay","iterator","on","fullyNamespacedEvents","off","jQuery","getLighboxData","ssrDocument","blur","nodeName","createElementNS","host","hostname","ssrWindow","go","screen","matchMedia","win","Dom7","proto","makeReactive","arrayFlat","arr","res","arrayFilter","toCreate","tempParent","qsa","uniqueArray","arrayUnique","noTrigger","shortcut","trigger","Methods","addClass","classNames","removeClass","hasClass","toggleClass","toggle","attrs","attrName","removeAttr","transition","transitionDuration","eventType","targetSelector","listener","handleLiveEvent","eventData","dom7EventData","is","parents","k","j","dom7LiveListeners","proxyListener","dom7Listeners","handlers","dom7proxy","evt","dataIndex","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","outerHeight","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","props","each","compareWith","webkitMatchesSelector","msMatchesSelector","eq","returnIndex","els","newChild","tempDiv","nextAll","nextEls","prevAll","prevEls","parent","foundElements","found","isNode","noExtend","nextSource","keysArray","nextIndex","len","nextKey","__swiper__","varName","varValue","setProperty","animateCSSModeScroll","swiper","targetPosition","side","translate","startTime","wrapperEl","scrollSnapType","cssModeFrameID","isOutOfBound","current","animate","progress","easeProgress","cos","PI","overflow","support","deviceCached","getSupport","smoothScroll","DocumentTouch","passiveListener","gestures","calcSupport","priority","eventsListeners","once","onceHandler","__emitterProxy","onAny","eventsAnyListeners","offAny","eventHandler","emit","_len2","_key2","updateSize","$el","clientHeight","isHorizontal","isVertical","isNaN","updateSlides","getDirectionLabel","getDirectionPropertyValue","$wrapperEl","swiperSize","rtlTranslate","wrongRTL","isVirtual","virtual","previousSlidesLength","slides","slideClass","slidesLength","snapGrid","slidesGrid","slidesSizesGrid","offsetBefore","slidesOffsetBefore","offsetAfter","slidesOffsetAfter","previousSnapGridLength","previousSlidesGridLength","spaceBetween","slidePosition","prevSlideSize","virtualSize","marginLeft","marginRight","centeredSlides","cssMode","gridEnabled","grid","rows","slideSize","initSlides","shouldResetSlideSize","slidesPerView","breakpoints","updateSlide","slideStyles","currentTransform","currentWebKitTransform","webkitTransform","roundLengths","boxSizing","swiperSlideSize","slidesPerGroup","slidesPerGroupSkip","effect","setWrapperSize","updateWrapperSize","newSlidesGrid","slidesGridItem","slideIndex","centeredSlidesBounds","allSlidesSize","slideSizeValue","maxSnap","snap","centerInsufficientSlides","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","watchOverflow","checkOverflow","watchSlidesProgress","updateSlidesOffset","backFaceHiddenClass","containerModifierClass","hasClassBackfaceClassAdded","maxBackfaceHiddenSlides","updateAutoHeight","activeSlides","newHeight","setTransition","getSlideByIndex","visibleSlides","ceil","activeIndex","swiperSlideOffset","updateSlidesProgress","offsetCenter","slideVisibleClass","visibleSlidesIndexes","slideOffset","slideProgress","minTranslate","originalSlideProgress","slideBefore","slideAfter","originalProgress","updateProgress","multiplier","translatesDiff","maxTranslate","isBeginning","isEnd","wasBeginning","wasEnd","autoHeight","updateSlidesClasses","realIndex","activeSlide","slideActiveClass","slideNextClass","slidePrevClass","slideDuplicateActiveClass","slideDuplicateNextClass","slideDuplicatePrevClass","slideDuplicateClass","nextSlide","prevSlide","emitSlidesClasses","updateActiveIndex","newActiveIndex","previousIndex","previousRealIndex","previousSnapIndex","normalizeSlideIndex","skip","runCallbacksOnInit","updateClickedSlide","slideFound","clickedSlide","clickedIndex","slideToClickedSlide","getTranslate","axis","virtualTranslate","currentTranslate","matrix","curTransform","transformMatrix","curStyle","currentStyle","WebKitCSSMatrix","MozTransform","OTransform","MsTransform","msTransform","m41","m42","setTranslate","byController","newProgress","previousTranslate","translateTo","runCallbacks","translateBounds","internal","animating","preventInteractionOnTransition","newTranslate","isH","behavior","onTranslateToWrapperTransitionEnd","destroyed","transitionEmit","slideTo","indexAsNumber","isFinite","initialSlide","normalizedTranslate","normalizedGrid","normalizedGridNext","allowSlideNext","allowSlidePrev","transitionStart","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","loopedSlides","slideNext","perGroup","slidesPerGroupAuto","slidesPerViewDynamic","increment","loopPreventsSlide","loopFix","_clientLeft","rewind","slidePrev","normalize","normalizedSnapGrid","prevSnap","prevSnapIndex","prevIndex","slideReset","slideToClosest","threshold","currentSnap","slideToIndex","loopCreate","$selector","loopFillGroupWithBlank","blankSlidesNum","blankNode","slideBlankClass","loopAdditionalSlides","prependSlides","appendSlides","diff","loopDestroy","onTouchStart","touchEventsData","originalEvent","$targetEl","touchEventsTarget","isTouchEvent","isTouched","isMoved","noSwipingClass","shadowRoot","path","noSwipingSelector","isTargetShadow","noSwiping","__closestFrom","assignedSlot","getRootNode","closestElement","allowClick","swipeHandler","currentX","targetTouches","currentY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","swipeDirection","allowThresholdMove","focusableElements","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","freeMode","onTouchMove","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","diffX","diffY","touchAngle","atan2","touchMoveStopPropagation","nested","startTranslate","allowMomentumBounce","grabCursor","setGrabCursor","touchRatio","disableParentSwiper","resistanceRatio","resistance","followFinger","onTouchEnd","touchEndTime","timeDiff","pathTree","lastClickTime","currentPos","stopIndex","groupSize","rewindFirstIndex","rewindLastIndex","longSwipesMs","longSwipes","longSwipesRatio","shortSwipes","nextEl","prevEl","onResize","setBreakpoint","autoplay","running","onClick","preventClicks","preventClicksPropagation","dummyEventAttached","dummyEventListener","touchEvents","device","domMethod","swiperMethod","passiveListeners","move","updateOnWindowResize","ios","android","attachEvents","detachEvents","isGridEnabled","breakpoint","getBreakpoint","breakpointsBase","currentBreakpoint","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","emitContainerClasses","fill","directionChanged","needsReLoop","changeDirection","isEnabled","enable","containerEl","currentHeight","points","minRatio","substr","addClasses","suffixes","resultClasses","item","prepareClasses","removeClasses","imageEl","srcset","checkForComplete","onReady","preloadImages","imagesLoaded","imagesToLoad","updateOnImagesReady","currentSrc","resizeObserver","createElements","simulateTouch","uniqueNavElements","wrapperClass","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","eventsEmitter","moving","isLocked","cursor","unsetGrabCursor","wasLocked","lastSlideIndex","lastSlideRightEdge","images","extendedDefaults","Swiper","swipers","newParams","overrides","_temp","ua","screenWidth","screenHeight","ipad","ipod","iphone","windows","macos","os","calcDevice","isSafari","isWebView","calcBrowser","__modules__","mod","extendParams","swiperParams","defaults","passedParams","$","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","setProgress","cls","getSlideClasses","slideEl","updates","exact","spv","breakLoop","translateValue","translated","newDirection","needUpdate","currentDirection","mount","mounted","getWrapperSelector","getWrapper","deleteInstance","cleanStyles","deleteProps","newDefaults","m","installModule","prototypeGroup","protoMethod","use","animationFrame","resizeHandler","orientationChangeHandler","ResizeObserver","newWidth","_ref2","contentBoxSize","contentRect","inlineSize","blockSize","observers","attach","WebkitMutationObserver","observerUpdate","observeParents","observeSlideChildren","containerParents","forEvents","pfx","bulletSize","pagination","bulletElement","clickable","hideOnClick","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","hiddenClass","progressbarFillClass","progressbarOppositeClass","clickableClass","lockClass","horizontalClass","verticalClass","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","total","paginationType","firstIndex","midIndex","suffix","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","offsetProp","progressbarDirection","scaleX","scaleY","paginationHTML","numberOfBullets","checkProps","_s","targetEl","isHidden","timeout","$activeSlideEl","autoplayResult","reverseDirection","stopOnLastSlide","waitForTransition","onTransitionEnd","onVisibilityChange","onMouseEnter","disableOnInteraction","onMouseLeave","pauseOnMouseEnter","MicroEvent","_events","fct","event_array","arrayToPattern","chars","maxValueLength","sequencePattern","hasDuplicates","prev_char_count","prev_pattern","setToPattern","escape_regex","longest","unicodeLength","allSubstrings","subresult","tmp","code_points","unicode_map","multi_char_reg","latin_convert","latin_condensed","latin","unicode","convert_pat","asciifold","_asciifold","generateMap","unicode_sets","addMatching","folded","to_add","folded_set","patt","code_point_min","code_point_max","composed","code_point","generator","generateSets","multi_char","multi_char_patt","substringsToPattern","min_replacement","sub_pat","chars_replaced","mapSequence","sequencesToPattern","sequences","sequence","seq","substrs","inSequences","needle_seq","needle_parts","part","needle_part","Sequence","last","last_piece","last_part","last_substr","clone_last_len","getAttr","getAttrNesting","scoreValue","weight","score","regex","propToArray","iterate","cmp","Sifter","settings","diacritics","tokenize","query","respect_word_boundaries","weights","words","field_regex","word","field_match","field","match_str","overlapping","added_types","new_seq","old_seq","getPattern","getScoreFunction","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","sum","conjunction","getSortFunction","_getSortFunction","implicit_score","sort_flds","sort_empty","get_field","fld","sort_fld","optsUser","fn_score","fn_sort","hash_key","get_hash","escape_html","loadDebounce","loadedSearches","debounce_events","event_args","addEvent","isKeyDown","key_name","getId","addSlashes","getDom","jquery","isHtmlString","tpl","dom_el","event_name","applyCSS","elmts","norm_classes","classesArray","castAsArray","_classes","parentMatch","getTail","list","nodeIndex","amongst","setAttr","replaceNode","existing","replacement","KEY_SHORTCUT","optgroups","plugins","delimiter","splitOn","persist","createOnBlur","createFilter","clearAfterSelect","highlight","openOnFocus","shouldOpen","maxOptions","maxItems","hideSelected","duplicates","addPrecedence","selectOnTab","allowEmptyOption","refreshThrottle","loadThrottle","loadingClass","dataAttr","optgroupField","valueField","labelField","disabledField","optgroupLabelField","optgroupValueField","lockOptgroupOrder","sortField","searchField","searchConjunction","controlClass","dropdownClass","dropdownContentClass","itemClass","optionClass","dropdownParent","controlInput","copyClassesToDropdown","hidePlaceholder","getSettings","settings_user","attr_data","field_label","field_value","field_disabled","field_optgroup","field_optgroup_label","field_optgroup_value","tag_name","option","settings_element","optionsMap","group_count","$order","readData","addOption","option_data","$option","selected","optgroup","optgroup_data","addGroup","init_select","data_raw","opt","init_textbox","instance_i","TomSelect","Interface","requested","initializePlugins","queue","plugin","require","loadPlugin","MicroPlugin","input_arg","user_settings","order","isDisabled","isReadOnly","isInvalid","isValid","isInputHidden","isSetup","isDropdownContentStale","ignoreFocus","ignoreHover","hasOptions","lastValue","caretPos","activeOption","activeItems","userOptions","refreshTimeout","tomselect","is_select_tag","isRequired","required","sifter","setupCallbacks","setupTemplates","dropdown","_render","dropdown_content","inputMode","control_input","focus_node","setup","passive_event","listboxId","role","control_id","escapeQuery","label_click","for","label_id","minWidth","maxWidth","classes_plugins","target_match","onOptionHover","onOptionSelect","onItemSelect","onKeyDown","onKeyPress","onInput","onBlur","onFocus","onPaste","doc_mousedown","inputState","win_scroll","positionDropdown","input_invalid","refreshState","_destroy","revertSettings","insertAdjacentElement","refreshItems","onChange","setupOptions","addOptions","registerOptionGroup","templates","callbacks","get_settings","readOnly","setReadOnly","lastQuery","clearActiveItems","onMouseDown","pastedText","inputValue","splitInput","addItem","createItem","selectAll","getAdjacent","setActiveOption","canSelect","advanceSelection","deleteSelection","_onInput","refreshOptions","wasFocused","hasFocus","deactivate","setActiveItem","setCaret","closeAfterSelect","setTextboxValue","canLoad","loadCallback","clearActiveOption","addItems","setMaxItems","begin","swap","getLastActive","setActiveItemClass","removeActiveItem","last_active","idx","scroll","scrollToOption","height_menu","height_item","scrollBehavior","controlChildren","focusTarget","getSearchOptions","nesting","calculateScore","currentResults","hashed","triggerDropdown","has_create_option","active_group","groups","groups_order","same_query","results","active_option","show_dropdown","getGroupFragment","group_order_i","order_group","group_fragment","opt_value","opt_hash","option_el","getOption","self_optgroup","regGroup","optionGroupRegister","$id","group_order","group_heading","group_options","group_html","tok","highlightRecursive","spannode","middlebit","splitText","middleclone","highlightText","highlightChildren","add_template","template","canCreate","active_index","selectable","user_created","updateOption","dat","registerOption","addOptionGroup","hashed_id","removeOptionGroup","clearOptionGroups","item_new","index_item","value_old","value_new","data_old","getItem","uncacheValue","option_new","removeOption","removeItem","clearOptions","boundFilter","clearFilter","$div","last_item","wasFull","isFull","insertAtCaret","updateOriginalInput","caret","created","refreshValidityState","wrap_classList","validity","valid","empty_option","has_selected","AddSelected","visibility","rect","tail","selectionStart","selectionEnd","rm_items","rm_item","shouldDelete","onDelete","adjacent","moveCaret","new_pos","setLocked","setDisabled","templateName","hook","when","new_fn","orig_method","result_new","orig_onOptionSelect","cbOptions","checkedClassNames","uncheckedClassNames","UpdateChecked","checkbox","toCheck","checked","UpdateCheckbox","HTMLInputElement","orig_render_option","rendered","orig_lock","orig_unlock","drag_item","sortable","orig_render_item","dragOver","moveitem","targetitem","dragitem","referenceNode","newNode","_referenceNode$parent","_newNode","isBefore","_referenceNode$parent2","_drag_item","headerClass","titleRowClass","labelClass","closeClass","close_link","_self$input","orig_onBlur","relatedTarget","preventScroll","test_input","cssText","style_name","resize","orig_deleteSelection","orig_keydown","close_button","orig_canLoad","orig_clearActiveOption","orig_loadCallback","load_more_opt","default_pagination","loading_more","default_values","default_values_loaded","shouldLoadMore","firstUrl","canLoadMore","setNextUrl","next_url","getUrl","clearPagination","first_option","restoreDefaults","no_more_results","unauthenticated","unprocessableEntity","authenticationURL","responseJson","isTurboStream","metaContent","originalUrl","requestInterceptor","interceptor","renderTurboStream","addHeader","additionalHeaders","formattedBody","compact","csrfToken","Accept","accept","cookies","getCookie","responseKind","originalQuery","requestQuery","mergeEntries","bodyIsAString","__defProp","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","propertyIsEnumerable","__defNormalProp","__spreadValues","constructor2","enumerableOnly","symbols","sym","getOwnPropertyDescriptors","obj2","excluded","sourceKeys","sourceSymbolKeys","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","getParentOrHost","ctx","includeCTX","_throttleTimeout","R_SPACE","defaultView","selfOnly","appliedTransforms","matrixFn","DOMMatrix","CSSMatrix","MSCSSMatrix","getWindowScrollingElement","scrollingElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","elRect","containerRect","elMatrix","isScrolledPast","elSide","parentSide","getParentAutoScrollElement","elSideVal","parentSideVal","getChild","childNum","includeDragEl","currentChild","Sortable","ghost","dragged","draggable","lastElementChild","index2","getRelativeScrollOffset","winScroller","includeSelf","gotSelf","scrollWidth","elemCSS","overflowX","overflowY","isRectEqual","rect1","rect2","round","ms","_this","scrollBy","Polymer","Zepto","expando","initializeByDefault","PluginManager","option2","pluginName","pluginEvent","eventCanceled","eventNameGlobal","defaults2","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","_excluded","pluginEvent2","dragEl","parentEl","ghostEl","rootEl","lastDownEl","cloneEl","cloneHidden","dragStarted","moved","putSortable","activeSortable","active","oldIndex","oldDraggableIndex","newDraggableIndex","hideGhostForTarget","_hideGhostForTarget","unhideGhostForTarget","_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","_dispatchEvent","info","rootEl2","cloneEl2","toEl","fromEl","oldIndex2","newIndex2","oldDraggableIndex2","newDraggableIndex2","putSortable2","extraEventProperties","onName","pullMode","lastPutMode","allEventProperties","activeGroup","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","targetMoveDistance","ghostRelativeParent","awaitingDragStarted","ignoreNextClick","sortables","pastFirstInvertThresh","isCircumstantialInvert","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","supportCssPointerEvents","pointerEvents","_detectDirection","elCSS","elWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","secondChildWidth","flexDirection","gridTemplateColumns","touchingSideChild2","_prepareGroup","toFn","pull","dragEl2","sameGroup","otherGroup","originalGroup","checkPull","checkPut","revertClone","nearestEmptyInsertDetectEvent","nearest","emptyInsertThreshold","insideHorizontally","insideVertically","ret","_onDragOver","_checkOutsideTargetEl","_isOutsideThisEl","animationCallbackId","animationStates","store","handle","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","animation","easing","dropBubble","dragoverBubble","dataIdAttr","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","captureAnimationState","fromRect","thisAnimationDuration","childMatrix","f","addAnimationState","removeAnimationState","indexOfObject","animateAll","animationTime","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","animationResetTimer","currentRect","animatingX","animatingY","forRepaintDummy","repaint","animated","_onMove","dragRect","targetRect","willInsertAfter","retVal","onMoveFn","onMove","draggedRect","related","relatedRect","_disableDraggable","_unsilent","_generateId","_nextTick","_cancelNextTick","_getDirection","pointerType","originalTarget","root","inputs","_saveInputCheckedState","criteria","_prepareDragStart","dragStartFn","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","_onTouchMove","_onDragStart","empty","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","ghostMatrix","relativeScrollOffset","dx","dy","cssMatrix","_hideClone","cloneId","_loopId","effectAllowed","_dragStartId","revert","vertical","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_ignoreWhileAnimating","elLastChild","_ghostIsLast","changed","_ghostIsFirst","targetBeforeFirstSwap","sibling","differentLevel","differentRowCol","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_dragElInRowColumn","side1","scrolledPastTop","scrollBefore","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","_getSwapDirection","dragIndex","moveVector","target2","after2","_showClone","_offMoveEvents","_offUpEvents","save","dropEffect","_globalDragOver","useAnimation","el2","utils","dst","nextTick","cancelNextTick","detectDirection","plugins2","version","scrollEl","scrollRootEl","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","autoScrolls","scrolling","clearAutoScrolls","autoScroll2","pid","clearPointerElemChangedInterval","autoScroll","isFallback","scrollCustomFn","sens","scrollSensitivity","scrollSpeed","scrollThisInstance","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","bubbleScroll","toSortable","onSpill","Revert","Remove","dragStart","_ref3","_ref4","parentSortable","AutoScroll","forceAutoScrollFallback","_handleAutoScroll","_handleFallbackAutoScroll","dragOverCompleted","dragOverBubble","nulling","ogElemScroller","newElem","cookie2","src_default","sortableUpdateUrl","param","resourceNameValue","paramNameValue","responseKindValue","animationValue","handleValue","onEnd","resourceName","paramName","hasButtonTarget","originalText","buttonTarget","innerText","sourceTarget","copied","successDurationValue","successDuration","onUpdate","getOriginalOrder","isShowMenu","toggleSetting","settingContainerTarget","isShowingDropdown","toggleDropdown","dropdownMenuTarget","loadSimpleLightBox","provinceChanged","districtSelectDomTarget","subDistrictSelectDomTarget","postalCodeInputDomTarget","tempPostalCodeInputDomTarget","selectedOptions","districtChanged","selectedImage","previewImageTarget","readAsDataURL","submitLabelTarget","previewImageContainerTarget","defaultTab","tabTargets","defaultTabValue","btnTargets","activeClasses","selectedTab","addAssociation","templateTarget","add_itemTarget","insertAdjacentHTML","removeAssociation","isOpenMenu","toggleMenu","leftMobileMenuTarget","kindTarget","onKindChange","recompute","hasSupplierWrapperTarget","supplierWrapperTarget","comboboxKindValue","grand","subtotalTarget","vatTarget","whtTarget","grandPreviewTarget","toLocaleString","currency","kind","display_kind","placeholderValue","urlValue","kindValue","kindValueChanged","addAndSelect","boundKeydown","handleKeydown","boundSupplierCreated","onSupplierCreated","modalUrl","hasFrameTarget","frameTarget","overlayTarget","backdrop","supplier","ctrl","nameValue","detailValue","sparkMd5","undefined$1","hex_chr","md5cycle","md5blk","md5blks","md5blk_array","md51","lo","hi","rhex","hex","toUtf8","unescape","hexToBinaryString","SparkMD5","ArrayBuffer","clamp","num","targetArray","sourceArray","byteLength","factory","Uint8Array","appendBinary","_buff","_length","_hash","raw","buff","_finish","setState","hashBinary","first","second","returnUInt8Array","subarray","utf8Str2ArrayBuffer","md51_array","fileSlice","mozSlice","webkitSlice","FileChecksum","chunkSize","chunkCount","chunkIndex","md5Buffer","fileReader","fileReaderDidLoad","fileReaderDidError","readNextChunk","binaryDigest","base64digest","btoa","eventInit","BlobRecord","checksum","content_type","byte_size","xhr","XMLHttpRequest","responseType","setRequestHeader","requestDidLoad","requestDidError","blob","direct_upload","directUploadData","BlobUpload","DirectUpload","upload","DirectUploadController","directUpload","hiddenInput","dispatchError","signed_id","uploadRequestDidProgress","directUploadWillCreateBlobWithXHR","directUploadWillStoreFileWithXHR","DirectUploadsController","createDirectUploadControllers","startNextController","processingAttribute","submitButtonsByForm","didClick","didSubmitForm","handleFormSubmissionEvent","didSubmitRemoteElement","ActiveStorage","AttachmentUpload","directUploadUrl","directUploadDidComplete","sgid","attachable_sgid","createBlobUrl","signedId","blobUrlTemplate"],"sourceRoot":""}