{"version":3,"file":"admin-DnbBlsq2.js","sources":["../../../app/frontend/scripts/index.js","../../../app/frontend/scripts/scroll.js","../../../app/frontend/alpine/auto-complete.js","../../../app/frontend/alpine/auto-flag.js","../../../app/frontend/alpine/auto-update.js","../../../app/frontend/alpine/before-unload.js","../../../app/frontend/alpine/clipboard.js","../../../app/frontend/alpine/combobox.js","../../../app/frontend/alpine/dropdown.js","../../../app/frontend/alpine/file-upload.js","../../../node_modules/sortablejs/modular/sortable.esm.js","../../../app/frontend/alpine/form-builder.js","../../../app/frontend/alpine/google-maps-admin.js","../../../app/frontend/scripts/trap-focus.js","../../../app/frontend/alpine/modal.js","../../../app/frontend/alpine/moderation-filters.js","../../../app/frontend/alpine/moderation-mail-templates.js","../../../app/frontend/alpine/organization-settings.js","../../../app/frontend/alpine/project-path.js","../../../app/frontend/alpine/project-settings.js","../../../app/frontend/alpine/sidebar.js","../../../app/frontend/alpine/sortable-list.js","../../../app/frontend/alpine/sortable-homepage.js","../../../app/frontend/alpine/settings-wizard.js","../../../app/frontend/entrypoints/admin.js"],"sourcesContent":["// Helpers functions are used inside .js.haml files\n\nexport function replaceContent(query, content) {\n  const el = document.querySelector(query);\n  if (el) el.outerHTML = content;\n}\n\nexport function closeModal(id) {\n  const modal = document.querySelector(id);\n  const closeEvent = new Event('close');\n  modal.dispatchEvent(closeEvent);\n}\n\n// Attach all function to window\nwindow.bpart = {};\nwindow.bpart.closeModal = closeModal;\nwindow.bpart.replaceContent = replaceContent;\n","const scrollBehavior = {\n  behavior: 'smooth',\n  block: 'end',\n  inline: 'nearest',\n};\n\nexport function scrollIntoViewIfNeeded(element) {\n  if (checkInView(element)) return;\n\n  element.scrollIntoView(scrollBehavior);\n}\n\nexport const scrollToInvalid = () => {\n  const firstInvalidElement = document.querySelector('.input--invalid');\n  if (firstInvalidElement) firstInvalidElement.scrollIntoView(scrollBehavior);\n};\n\nfunction checkInView(element) {\n  // This heavily relies on the element to check being nested inside main\n  // and main being the parent in which scrolling happens)\n  const container = document.querySelector('main');\n  const containerBox = container.getBoundingClientRect();\n\n  const elementBox = element.getBoundingClientRect();\n\n  const inView = containerBox.bottom > elementBox.bottom;\n  return inView;\n}\n","import { scrollIntoViewIfNeeded } from '~/scripts/scroll';\n\nexport default function autocomplete({\n  activeClass = 'autocomplete__option--active',\n  selectedClass = 'autocomplete__option--selected',\n} = {}) {\n  return {\n    expanded: false,\n    query: '',\n    options: [],\n    groups: [],\n    activeIndex: -1,\n    selectedIndex: -1,\n    activeClasses: Array.isArray(activeClass) ? activeClass : [activeClass],\n    selectedClasses: Array.isArray(selectedClass) ? selectedClass : [selectedClass],\n\n    init() {\n      const value = this.$refs.field.value;\n\n      // Style element based on selectedIndex and activeIndex\n      // We need to setup these watchers before initializing the options\n      this.$watch('activeIndex', (index, oldIndex) => {\n        this.options[oldIndex]?.classList.remove(...this.activeClasses);\n        this.options[index]?.classList.add(...this.activeClasses);\n      });\n      this.$watch('selectedIndex', (index, oldIndex) => {\n        this.options[oldIndex]?.classList.remove(...this.selectedClasses);\n        this.options[index]?.classList.add(...this.selectedClasses);\n        let newValue = this.options[index].getAttribute('data-autocomplete-value');\n        if (newValue === 'new') {\n          let newOption = document.createElement('option');\n          newValue = this.query;\n          newOption.value = newValue;\n          this.$refs.field.appendChild(newOption);\n        }\n        this.$refs.field.value = newValue;\n      });\n\n      // Find all options and add event listeners\n      this.options = this.$el.querySelectorAll('[role=\"option\"]');\n      this.groups = this.$el.querySelectorAll('[role=\"optgroup\"]');\n      this.options.forEach((option, index) => {\n        option.addEventListener('mouseover', () => (this.activeIndex = index));\n        option.addEventListener('mouseout', () => (this.activeIndex = -1));\n        option.addEventListener('click', () => this.setSelectedOption());\n        if (option.getAttribute('data-autocomplete-value') === value) this.selectedIndex = index;\n      });\n\n      // Reset the activeElement when collapsing\n      this.$watch('expanded', () => !this.expanded && (this.activeIndex = -1));\n\n      // Make sure options are in view when opened\n      this.$watch('expanded', () => {\n        if (this.expanded) {\n          this.$nextTick(() => scrollIntoViewIfNeeded(this.$root.querySelector(\"[x-bind='target']\")));\n        }\n      });\n\n      // Filter options based on\n      this.$watch('query', () => this.filterOptions());\n\n      // Hide the fallback field\n      this.$refs.field.hidden = true;\n    },\n\n    setSelectedOption() {\n      if (this.activeIndex !== -1) this.selectedIndex = this.activeIndex;\n      this.expanded = !this.expanded;\n    },\n\n    filterOptions() {\n      this.options.forEach(\n        (o) =>\n        (o.hidden =\n          !(this.query.length === 0 || o.getAttribute('data-autocomplete-value') === 'new') &&\n          o.textContent.trim().toLowerCase().indexOf(this.query.toLowerCase()) === -1)\n      );\n      this.groups.forEach((g) => (g.hidden = g.querySelectorAll('[role=\"option\"]:not([hidden])').length === 0));\n    },\n\n    findNextActive(dir) {\n      const up = dir === 'up';\n      if (!this.expanded) this.expanded = true;\n      let newIndex = this.activeIndex;\n      do {\n        newIndex += up ? -1 : 1;\n        // Break out of loop if there is no next visible option\n        if ((up && newIndex === -1) || newIndex === this.options.length) return;\n      } while (this.options[newIndex].hidden || this.options.disabled);\n      this.activeIndex = newIndex;\n    },\n\n    get displayValue() {\n      if (this.expanded) return this.query;\n\n      const selectedOption = this.options[this.selectedIndex];\n      return selectedOption ? selectedOption.textContent : '';\n    },\n\n    trigger: {\n      ['@click']() {\n        this.expanded = true;\n      },\n      ['@keyup.esc.prevent.stop']() {\n        this.expanded = false;\n      },\n      ['@keyup.enter.prevent.stop']() {\n        this.setSelectedOption();\n      },\n      ['@keyup.arrow-up.prevent']() {\n        this.findNextActive('up');\n      },\n      ['@keyup.arrow-down.prevent']() {\n        this.findNextActive('down');\n      },\n      ['@input']($event) {\n        this.expanded = true;\n        this.query = $event.target.value;\n      },\n    },\n\n    target: {\n      ['x-show']() {\n        return this.expanded;\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-100';\n      },\n      ['x-transition:enter-start']() {\n        return 'transform opacity-0 scale-95';\n      },\n      ['x-transition:enter-end']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave']() {\n        return 'transition ease-in duration-75';\n      },\n      ['x-transition:leave-start']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'transform opacity-0 scale-95';\n      },\n    },\n  };\n}\n","export default function autoFlag(name, url) {\n  return {\n    name,\n    url,\n\n    init() {\n      this.$el.addEventListener(\"change\", () => this.handleChange());\n    },\n\n    handleChange() {\n      const body = { flags: {} };\n      body.flags[this.name] = this.$root.checked;\n\n      const token = document.querySelector('meta[name=csrf-token]')?.getAttribute('content');\n      const request = new Request(this.url, {\n        method: 'PATCH',\n        headers: {\n          'content-type': 'application/json',\n          'X-CSRF-Token': token,\n        },\n        body: JSON.stringify(body),\n      })\n      fetch(request)\n    }\n  }\n}\n","export default function autoUpdate(name, url) {\n  return {\n    name,\n    url,\n\n    init() {\n      this.$el.addEventListener(\"change\", () => this.handleChange());\n    },\n\n    handleChange() {\n      const body = { values: {} };\n      body.values[this.name] = this.$root.value;\n      const token = document.querySelector('meta[name=csrf-token]')?.getAttribute('content');\n      const request = new Request(this.url, {\n        method: 'PATCH',\n        headers: {\n          'content-type': 'application/json',\n          'X-CSRF-Token': token,\n        },\n        body: JSON.stringify(body),\n      })\n      fetch(request)\n    }\n  }\n}\n","import { translate } from '~/scripts/locales/translations';\n\nexport default function beforeUnload() {\n  return {\n    unsavedChanges: false,\n\n    init() {\n      this.$el.addEventListener('tinymcechange', () => this.setBeforeUnload());\n      this.beforeUnloadHandler = this.beforeUnloadHandler.bind(this);\n    },\n\n    beforeUnloadHandler(event) {\n      if (!this.unsavedChanges) return;\n\n      if (event.type == 'beforeunload') {\n        event.preventDefault();\n      } else {\n        const discardUnsavedChangesMsg = translate('before-unload', 'warning-message', document.documentElement.lang);\n\n        if (window.confirm(discardUnsavedChangesMsg)) {\n          this.unsavedChanges = false;\n        } else {\n          event.preventDefault();\n        }\n      }\n    },\n\n    // 'closeModal' is a custom event fired by the modal component\n    setBeforeUnload() {\n      if (this.unsavedChanges) return;\n      this.unsavedChanges = true;\n      window.addEventListener('beforeunload', this.beforeUnloadHandler);\n      window.addEventListener('turbo:before-visit', this.beforeUnloadHandler);\n      window.addEventListener('closeModal', this.beforeUnloadHandler);\n    },\n\n    unsetBeforeUnload() {\n      this.unsavedChanges = false;\n      window.removeEventListener('beforeunload', this.beforeUnloadHandler);\n      window.removeEventListener('turbo:before-visit', this.beforeUnloadHandler);\n      window.removeEventListener('closeModal', this.beforeUnloadHandler);\n    },\n\n    form: {\n      ['x-on:input']() {\n        this.setBeforeUnload();\n      },\n      ['x-on:submit']() {\n        this.unsetBeforeUnload();\n      },\n    },\n\n    googleMaps: {\n      ['x-on:click']() {\n        this.setBeforeUnload();\n      },\n    },\n  };\n}\n","export default function clipboard(url) {\n  return {\n    url,\n    showSuccess: false,\n    showError: false,\n  \n    handleClick() {\n      try {\n        window.navigator.clipboard.writeText(this.url)\n        this.showSuccess = true;\n        setTimeout(() => this.showSuccess = false, 1500)\n      } catch {\n        this.showError = true;\n        setTimeout(() => this.showError = false, 1500)\n      }\n    }\n  }\n}\n","// NOTE(Robbe): This file shares a lot of similarities with the autocomplete component\n// It might be a good idea to have them share the underlying logic instead of duplicating the code\n\nimport { scrollIntoViewIfNeeded } from '~/scripts/scroll';\n\nexport default function combobox({\n  activeClass = 'combobox__option--active',\n  selectedClass = 'combobox__option--selected',\n} = {}) {\n  return {\n    expanded: false,\n    query: '',\n    options: [],\n    groups: [],\n    activeIndex: -1,\n    selectedIndexes: [],\n    selectedValues: [],\n    activeClasses: Array.isArray(activeClass) ? activeClass : [activeClass],\n    selectedClasses: Array.isArray(selectedClass) ? selectedClass : [selectedClass],\n\n    init() {\n      // Fill selectedValues from fallback select\n      [...this.$refs.field.selectedOptions].forEach((opt) => this.selectedValues.push(opt.value));\n\n      // Style element based on selectedIndex and activeIndex\n      // We need to setup these watchers before initializing the options\n      this.$watch('activeIndex', (index, oldIndex) => {\n        this.options[oldIndex]?.classList.remove(...this.activeClasses);\n        this.options[index]?.classList.add(...this.activeClasses);\n      });\n      this.$watch('selectedIndexes', (indexes, oldIndexes) => {\n        oldIndexes.forEach((oldIndex) => this.options[oldIndex]?.classList.remove(...this.selectedClasses));\n        indexes.forEach((index) => this.options[index]?.classList.add(...this.selectedClasses));\n      });\n\n      // Find all options and add event listeners\n      this.options = this.$el.querySelectorAll('[role=\"option\"]');\n      this.groups = this.$el.querySelectorAll('[role=\"optgroup\"]');\n      this.options.forEach((option, index) => {\n        option.addEventListener('mouseover', () => (this.activeIndex = index));\n        option.addEventListener('mouseout', () => (this.activeIndex = -1));\n        option.addEventListener('click', () => this.toggleSelectedOption());\n        if (this.selectedValues.includes(option.getAttribute('data-combobox-value'))) this.selectedIndexes.push(index);\n      });\n\n      // Reset the activeElement when collapsing\n      this.$watch('expanded', () => !this.expanded && (this.activeIndex = -1));\n\n      // Make sure options are in view after opening\n      this.$watch('expanded', () => {\n        if (this.expanded) {\n          this.$nextTick(() => scrollIntoViewIfNeeded(this.$root.querySelector(\"[x-bind='target']\")));\n        }\n      });\n\n      // Filter options based on\n      this.$watch('query', () => this.filterOptions());\n\n      // Hide the fallback field\n      this.$refs.field.hidden = true;\n    },\n\n    toggleSelectedOption() {\n      if (this.activeIndex !== -1) {\n        this.selectedIndexes.includes(this.activeIndex) ? this.removeSelectedOption() : this.addSelectedOption();\n      } else {\n        this.addSelectedOption();\n      }\n\n      this.expanded = !this.expanded;\n    },\n\n    addSelectedOption() {\n      // Don't add duplicate values\n      if (this.selectedValues.includes(this.query)) {\n        this.resetQuery();\n        return;\n      }\n\n      let newValue = Array.from(this.options).at(this.activeIndex).getAttribute('data-combobox-value');\n\n      if (newValue === 'new') {\n        // Don't add empty values\n        if (!!!this.query) return;\n        // if new value, create an option in fallback and mark it as selected\n        let newOption = document.createElement('option');\n        newValue = this.query;\n        newOption.value = newValue;\n        newOption.setAttribute('selected', 'selected');\n        this.$refs.field.appendChild(newOption);\n      } else {\n        // if existing value, find the option and mark it as selected\n        this.selectedIndexes.push(this.activeIndex);\n        this.$refs.field.querySelector(`[value=\"${newValue}\"]`).setAttribute('selected', 'selected');\n      }\n      // Add value to list\n      this.selectedValues.push(newValue);\n\n      this.resetQuery();\n\n      this.$dispatch('combobox-selection-changed');\n    },\n\n    resetQuery() {\n      this.query = '';\n      this.$refs.input.value = '';\n    },\n\n    removeSelectedOption(value = null) {\n      // If we pass a value, get the index in the options list of that value\n      if (value) this.activeIndex = [...this.options].findIndex((o) => o.value === value);\n\n      // Remove from list of selectedIndexes\n      const index = this.selectedIndexes.findIndex((opt) => opt === this.activeIndex);\n      if (index !== -1) this.selectedIndexes.splice(index, 1);\n\n      // Find value of option if not present\n      if (!value) value = this.options[this.activeIndex].getAttribute('data-combobox-value');\n\n      // Deselect option\n      this.$refs.field.querySelector(`[value=\"${value}\"]`).removeAttribute('selected');\n\n      // Remove option from list of selectedValues\n      const valueIndex = this.selectedValues.findIndex((v) => v === value);\n      if (valueIndex !== -1) this.selectedValues.splice(valueIndex, 1);\n\n      this.$dispatch('combobox-selection-changed');\n    },\n\n    filterOptions() {\n      this.options.forEach(\n        (o) =>\n          (o.hidden =\n            !(this.query.length === 0 || o.getAttribute('data-combobox-value') === 'new') &&\n            o.textContent.trim().toLowerCase().indexOf(this.query.toLowerCase()) === -1)\n      );\n      this.groups.forEach((g) => (g.hidden = g.querySelectorAll('[role=\"option\"]:not([hidden])').length === 0));\n    },\n\n    findNextActive(dir) {\n      const up = dir === 'up';\n      if (!this.expanded) this.expanded = true;\n      let newIndex = this.activeIndex;\n      do {\n        newIndex += up ? -1 : 1;\n        // Break out of loop if there is no next visible option\n        if ((up && newIndex === -1) || newIndex === this.options.length) return;\n      } while (this.options[newIndex].hidden || this.options.disabled);\n      this.activeIndex = newIndex;\n    },\n\n    trigger: {\n      ['@keyup.backspace.prevent.stop']() {\n        if (this.selectedValues.length > 0) this.removeSelectedOption(this.selectedValues.at(-1));\n      },\n      ['@keyup.esc.prevent.stop']() {\n        this.expanded = false;\n      },\n      ['@keydown.enter.prevent.stop']() {\n        this.toggleSelectedOption();\n      },\n      ['@keyup.arrow-up.prevent']() {\n        this.findNextActive('up');\n      },\n      ['@keyup.arrow-down.prevent']() {\n        this.findNextActive('down');\n      },\n      ['@input']($event) {\n        this.expanded = true;\n        this.query = $event.target.value.trim();\n      },\n    },\n\n    target: {\n      ['x-show']() {\n        return this.expanded;\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-100';\n      },\n      ['x-transition:enter-start']() {\n        return 'transform opacity-0 scale-95';\n      },\n      ['x-transition:enter-end']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave']() {\n        return 'transition ease-in duration-75';\n      },\n      ['x-transition:leave-start']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'transform opacity-0 scale-95';\n      },\n    },\n  };\n}\n","  export default function dropdown({ activeClass = 'dropdown__item--active' } = {}) {\n  return {\n    expanded: false,\n    activeIndex: -1,\n    activeClasses: Array.isArray(activeClass) ? activeClass : [activeClass],\n\n    init() {\n      this.items = this.$el.querySelectorAll('[role=\"menuitem\"]');\n      this.items.forEach((item, index) => {\n        item.addEventListener('mouseover', () => (this.activeIndex = index));\n        item.addEventListener('mouseout', () => (this.activeIndex = -1));\n      });\n      this.$watch('expanded', () => !this.expanded && (this.activeIndex = -1));\n      this.$watch('activeIndex', (index, oldIndex) => {\n        this.items[oldIndex]?.classList.remove(...this.activeClasses);\n        this.items[index]?.classList.add(...this.activeClasses);\n      });\n    },\n\n    searchMatch(searchTerm, word) {\n      if (searchTerm.replace(/\\s/g, '') == '') return true;\n      return word.toLowerCase().includes(searchTerm.toLowerCase());\n    },\n\n    trigger: {\n      ['@click']() {\n        this.expanded = !this.expanded;\n        if (this.expanded) this.$refs.input?.focus();\n        if (!this.expanded) this.$refs.input?.blur();\n      },\n      ['@keyup.arrow-up.prevent']() {\n        if (!this.expanded) this.expanded = true;\n        this.activeIndex !== 0 &&\n          (this.activeIndex = this.activeIndex === -1 ? this.items.length - 1 : this.activeIndex - 1);\n      },\n      ['@keyup.arrow-down.prevent']() {\n        if (!this.expanded) this.expanded = true;\n        this.activeIndex !== this.items.length - 1 && this.activeIndex++;\n      },\n      ['@focusout']() {\n        // We need to make sure a click inside the dropdown is followed before we collapse the dropdown\n        setTimeout(() => (this.expanded = false), 500);\n      },\n    },\n\n    target: {\n      ['x-show']() {\n        return this.expanded;\n      },\n      ['@keyup.arrow-up.prevent']() {\n        this.activeIndex !== 0 && (this.activeIndex === -1 ? this.items.length - 1 : this.activeIndex - 1);\n      },\n      ['@keyup.arrow-down.prevent']() {\n        this.activeIndex !== this.items.length - 1 && this.activeIndex++;\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-100';\n      },\n      ['x-transition:enter-start']() {\n        return 'transform opacity-0 scale-95';\n      },\n      ['x-transition:enter-end']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave']() {\n        return 'transition ease-in duration-75';\n      },\n      ['x-transition:leave-start']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'transform opacity-0 scale-95';\n      },\n    },\n  };\n}\n","import ImageBlobReduce from 'image-blob-reduce';\n\n// utils\nimport fireSwal from '~/scripts/fire-swal';\nimport { translate } from '~/scripts/locales/translations';\n\nconst MAX_IMAGE_SIZE = 10485760; // 10 MB\nconst MAX_IMAGE_DIMENSION = 1600; // px\n\nconst reduce = new ImageBlobReduce();\nconst locale = document.querySelector('html').getAttribute('lang');\n\nexport default function fileUpload({ filename, fileExists }) {\n  return {\n    filename: filename || translate('img-resize', 'no-file-selected', locale),\n    open: false,\n    image_url: null,\n    fileExists: fileExists == 'true',\n    showPlaceholder: fileExists != 'true',\n\n    async handleImageURL(url) {\n      const preview = this.$refs.preview;\n      const filename = String(this.image_url).split('/').pop();\n      const fileExtension = filename.split('.').pop();\n      const videoExtensions = ['mp4', 'mov', 'avi', 'wmf', 'flv', 'webm'];\n      const errorElement = document.getElementById('file-input__error-message');\n      const inputField = document.getElementById(url);\n\n      if (this.image_url) {\n        const re = new RegExp('^https*://', 'i');\n        if (re.test(this.image_url)) {\n          if (videoExtensions.includes(fileExtension)) {\n            if (preview) {\n              preview.src =\n                '/assets/file_icons/video-27171972abad8c900fcd039956ad4816c8d6e4f15e3b9a4e023832356e9c40e2.png';\n              preview.classList.remove('image-upload__preview');\n            }\n          } else {\n            if (preview) {\n              preview.src = this.image_url;\n              if (!preview.classList.contains('image-upload__preview')) {\n                preview.classList.add('image-upload__preview');\n              }\n            }\n          }\n          this.filename = filename;\n          this.open = false;\n          this.showPlaceholder = false;\n          const input = this.$refs.input;\n          input.value = null;\n        } else {\n          errorElement.innerHTML = translate('img-upload', 'error-message', locale);\n          inputField.classList.add('border-red-600');\n        }\n      }\n    },\n\n    handleInput() {\n      const preview = this.$refs.preview;\n      const input = this.$refs.input;\n      const file = input.files[0];\n\n      if (file) {\n        if (file.type.includes('image')) {\n          fireSwal.loading({ title: translate('img-resize', 'analyzing', locale) });\n          if (file.size > MAX_IMAGE_SIZE) {\n            fireSwal.error({\n              title: translate('img-resize', 'size-too-large__title', locale),\n              text: translate('img-resize', 'size-too-large__text', locale),\n            });\n            input.value = null;\n            return;\n          } else if (file.name.includes('`')) {\n            fireSwal.error({\n              title: translate('img-resize', 'no-backtick-allowed__title', locale),\n              text: translate('img-resize', 'no-backtick-allowed__text', locale),\n            });\n            input.value = null;\n            return;\n          }\n        } else {\n          if (preview)\n            preview.src =\n              '/assets/file_icons/video-27171972abad8c900fcd039956ad4816c8d6e4f15e3b9a4e023832356e9c40e2.png';\n          this.filename = file.name;\n          this.open = false;\n          return;\n        }\n\n        const img = new Image();\n        const reader = new FileReader();\n        reader.readAsDataURL(file);\n\n        // we wait for the reader to load the file\n        reader.onload = () => {\n          img.src = reader.result;\n          // we wait for the image to read the reader\n          img.onload = () => {\n            // validate dimension\n            if (img.width > MAX_IMAGE_DIMENSION || img.height > MAX_IMAGE_DIMENSION) {\n              fireSwal.loading({ title: translate('img-resize', 'loading', locale) });\n\n              reduce\n                .toBlob(file, { max: MAX_IMAGE_DIMENSION })\n                .then((blob) => {\n                  // transfer reduced image back to input\n                  let transfer = new DataTransfer();\n                  const reducedImg = new File([blob], file.name);\n                  transfer.items.add(reducedImg);\n                  input.files = transfer.files;\n\n                  fireSwal.success({ title: translate('img-resize', 'success', locale) });\n                })\n                .catch((e) => {\n                  fireSwal.error({\n                    title: translate('img-resize', 'error__title', locale),\n                    text: translate('img-resize', 'error__text', locale),\n                  });\n                });\n            } else {\n              fireSwal.success({ title: translate('img-resize', 'size-ok', locale) });\n            }\n          };\n\n          // if there is a preview image (e.g. carousel)\n          if (preview) preview.src = reader.result;\n          this.filename = file.name;\n          this.open = false;\n          this.image_url = null;\n          this.showPlaceholder = false;\n        };\n      }\n    },\n\n    handleDrop(event) {\n      // Ignore if dataTransfer doesn't contain exactly one item\n      if (event.dataTransfer.files.length !== 1) return;\n\n      this.$refs.input.files = event.dataTransfer.files;\n      this.handleInput();\n    },\n\n    dropzone: {\n      ['@drop.prevent'](event) {\n        this.handleDrop(event);\n      },\n      ['@dragover.prevent']() {\n        // Just here to prevent the file from being opened\n      },\n    },\n\n    overlay: {\n      ['x-show']() {\n        return this.open;\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-300';\n      },\n      ['x-transition:enter-start']() {\n        return 'opacity-0';\n      },\n      ['x-transition:enter-end']() {\n        return 'opacity-100';\n      },\n      ['x-transition:leave']() {\n        return 'ease-in duration-200';\n      },\n      ['x-transition:leave-start']() {\n        return 'opacity-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'opacity-0';\n      },\n      ['@click']() {\n        this.open = false;\n      },\n    },\n\n    panel: {\n      ['x-show']() {\n        return this.open;\n      },\n      ['x-on:close']() {\n        this.open = false;\n      },\n      ['x-on:click.outside']() {\n        this.open = false;\n      },\n      ['@keyup.esc.prevent']() {\n        this.open = false;\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-300';\n      },\n      ['x-transition:enter-start']() {\n        return 'transform opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95';\n      },\n      ['x-transition:enter-end']() {\n        return 'opacity-100 translate-y-0 sm:scale-100';\n      },\n      ['x-transition:leave']() {\n        return 'ease-in duration-200';\n      },\n      ['x-transition:leave-start']() {\n        return 'opacity-100 translate-y-0 sm:scale-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95';\n      },\n    },\n  };\n}\n","/**!\n * Sortable 1.15.6\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\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  return _typeof(obj);\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  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) 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) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) 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) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n  return target;\n}\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\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}\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\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\nvar version = \"1.15.6\";\n\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);\n\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( /**HTMLElement*/el, /**String*/selector) {\n  if (!selector) 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( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/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) break;\n      /* jshint boss:true */\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      /* jshint boss:true */\n    } while (!selfOnly && (el = el.parentNode));\n  }\n  var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n  /*jshint -W056 */\n  return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n  if (ctx) {\n    var list = ctx.getElementsByTagName(tagName),\n      i = 0,\n      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}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param  {HTMLElement} el                       The element whose boundingClientRect is wanted\r\n * @param  {[Boolean]} relativeToContainingBlock  Whether the rect should be relative to the containing block of (including) the container\r\n * @param  {[Boolean]} relativeToNonStaticParent  Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param  {[Boolean]} undoScale                  Whether the container's scale() should be undone\r\n * @param  {[HTMLElement]} container              The parent the element will be placed in\r\n * @return {Object}                               The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n  if (!el.getBoundingClientRect && el !== window) 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    // Adjust for translate()\n    container = container || el.parentNode;\n\n    // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n    // Not needed on <= IE11\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\n          // Set relative to edges of padding box of container\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        /* jshint boss:true */\n      } while (container = container.parentNode);\n    }\n  }\n  if (undoScale && el !== window) {\n    // Adjust for scale()\n    var elMatrix = matrix(container || el),\n      scaleX = elMatrix && elMatrix.a,\n      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: top,\n    left: left,\n    bottom: bottom,\n    right: right,\n    width: width,\n    height: height\n  };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param  {HTMLElement}  el           The element who's side being scrolled out of view is in question\r\n * @param  {String}       elSide       Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param  {String}       parentSide   Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement}               The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n  var parent = getParentAutoScrollElement(el, true),\n    elSideVal = getRect(el)[elSide];\n\n  /* jshint boss:true */\n  while (parent) {\n    var parentSideVal = getRect(parent)[parentSide],\n      visible = void 0;\n    if (parentSide === 'top' || parentSide === 'left') {\n      visible = elSideVal >= parentSideVal;\n    } else {\n      visible = elSideVal <= parentSideVal;\n    }\n    if (!visible) return parent;\n    if (parent === getWindowScrollingElement()) break;\n    parent = getParentAutoScrollElement(parent, false);\n  }\n  return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param  {HTMLElement} el       The parent element\r\n * @param  {Number} childNum      The index of the child\r\n * @param  {Object} options       Parent Sortable's options\r\n * @return {HTMLElement}          The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n  var currentChild = 0,\n    i = 0,\n    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}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param  {HTMLElement} el       Parent element\r\n * @param  {selector} selector    Any other elements that should be ignored\r\n * @return {HTMLElement}          The last child, ignoring ghostEl\r\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}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param  {HTMLElement} el\r\n * @param  {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n  var index = 0;\n  if (!el || !el.parentNode) {\n    return -1;\n  }\n\n  /* jshint boss:true */\n  while (el = el.previousElementSibling) {\n    if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n      index++;\n    }\n  }\n  return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param  {HTMLElement} el\r\n * @return {Array}             Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n  var offsetLeft = 0,\n    offsetTop = 0,\n    winScroller = getWindowScrollingElement();\n  if (el) {\n    do {\n      var elMatrix = matrix(el),\n        scaleX = elMatrix.a,\n        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}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param  {Array} arr   Array that may or may not hold the object\r\n * @param  {Object} obj  An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number}      The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n  for (var i in arr) {\n    if (!arr.hasOwnProperty(i)) continue;\n    for (var key in obj) {\n      if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n    }\n  }\n  return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n  // skip to window\n  if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n  var elem = el;\n  var gotSelf = false;\n  do {\n    // we don't need to get elem css if it isn't even overflowing in the first place (performance)\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) return getWindowScrollingElement();\n        if (gotSelf || includeSelf) return elem;\n        gotSelf = true;\n      }\n    }\n    /* jshint boss:true */\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,\n        _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}\nfunction setRect(el, rect) {\n  css(el, 'position', 'absolute');\n  css(el, 'top', rect.top);\n  css(el, 'left', rect.left);\n  css(el, 'width', rect.width);\n  css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n  css(el, 'position', '');\n  css(el, 'top', '');\n  css(el, 'left', '');\n  css(el, 'width', '');\n  css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n  var rect = {};\n  Array.from(container.children).forEach(function (child) {\n    var _rect$left, _rect$top, _rect$right, _rect$bottom;\n    if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n    var childRect = getRect(child);\n    rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n    rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n    rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n    rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n  });\n  rect.width = rect.right - rect.left;\n  rect.height = rect.bottom - rect.top;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n  var animationStates = [],\n    animationCallbackId;\n  return {\n    captureAnimationState: function captureAnimationState() {\n      animationStates = [];\n      if (!this.options.animation) return;\n      var children = [].slice.call(this.el.children);\n      children.forEach(function (child) {\n        if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n        animationStates.push({\n          target: child,\n          rect: getRect(child)\n        });\n        var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n        // If animating: compensate for current animation\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: 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') callback();\n        return;\n      }\n      var animating = false,\n        animationTime = 0;\n      animationStates.forEach(function (state) {\n        var time = 0,\n          target = state.target,\n          fromRect = target.fromRect,\n          toRect = getRect(target),\n          prevFromRect = target.prevFromRect,\n          prevToRect = target.prevToRect,\n          animatingRect = state.rect,\n          targetMatrix = matrix(target, true);\n        if (targetMatrix) {\n          // Compensate for current animation\n          toRect.top -= targetMatrix.f;\n          toRect.left -= targetMatrix.e;\n        }\n        target.toRect = toRect;\n        if (target.thisAnimationDuration) {\n          // Could also check if animatingRect is between fromRect and toRect\n          if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n          // Make sure animatingRect is on line between toRect & fromRect\n          (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n            // If returning to same place as started from animation and on same axis\n            time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n          }\n        }\n\n        // if fromRect != toRect: animate\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') callback();\n      } else {\n        animationCallbackId = setTimeout(function () {\n          if (typeof callback === 'function') 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),\n          scaleX = elMatrix && elMatrix.a,\n          scaleY = elMatrix && elMatrix.d,\n          translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n          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); // repaint\n\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}\n\nvar plugins = [];\nvar defaults = {\n  initializeByDefault: true\n};\nvar PluginManager = {\n  mount: function mount(plugin) {\n    // Set default static properties\n    for (var option in defaults) {\n      if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n        plugin[option] = defaults[option];\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]) return;\n      // Fire global events if it exists in this sortable\n      if (sortable[plugin.pluginName][eventNameGlobal]) {\n        sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n          sortable: sortable\n        }, evt));\n      }\n\n      // Only fire plugin event if plugin is enabled in this sortable,\n      // and plugin has event defined\n      if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n        sortable[plugin.pluginName][eventName](_objectSpread2({\n          sortable: sortable\n        }, evt));\n      }\n    });\n  },\n  initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n    plugins.forEach(function (plugin) {\n      var pluginName = plugin.pluginName;\n      if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n      var initialized = new plugin(sortable, el, sortable.options);\n      initialized.sortable = sortable;\n      initialized.options = sortable.options;\n      sortable[pluginName] = initialized;\n\n      // Add default options from plugin\n      _extends(defaults, initialized.defaults);\n    });\n    for (var option in sortable.options) {\n      if (!sortable.options.hasOwnProperty(option)) continue;\n      var modified = this.modifyOption(sortable, option, sortable.options[option]);\n      if (typeof modified !== 'undefined') {\n        sortable.options[option] = modified;\n      }\n    }\n  },\n  getEventProperties: function getEventProperties(name, sortable) {\n    var eventProperties = {};\n    plugins.forEach(function (plugin) {\n      if (typeof plugin.eventProperties !== 'function') 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      // Plugin must exist on the Sortable\n      if (!sortable[plugin.pluginName]) return;\n\n      // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\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};\n\nfunction dispatchEvent(_ref) {\n  var sortable = _ref.sortable,\n    rootEl = _ref.rootEl,\n    name = _ref.name,\n    targetEl = _ref.targetEl,\n    cloneEl = _ref.cloneEl,\n    toEl = _ref.toEl,\n    fromEl = _ref.fromEl,\n    oldIndex = _ref.oldIndex,\n    newIndex = _ref.newIndex,\n    oldDraggableIndex = _ref.oldDraggableIndex,\n    newDraggableIndex = _ref.newDraggableIndex,\n    originalEvent = _ref.originalEvent,\n    putSortable = _ref.putSortable,\n    extraEventProperties = _ref.extraEventProperties;\n  sortable = sortable || rootEl && rootEl[expando];\n  if (!sortable) return;\n  var evt,\n    options = sortable.options,\n    onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n  // Support for new CustomEvent feature\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 || rootEl;\n  evt.from = fromEl || rootEl;\n  evt.item = targetEl || rootEl;\n  evt.clone = cloneEl;\n  evt.oldIndex = oldIndex;\n  evt.newIndex = newIndex;\n  evt.oldDraggableIndex = oldDraggableIndex;\n  evt.newDraggableIndex = newDraggableIndex;\n  evt.originalEvent = originalEvent;\n  evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n  var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n  for (var option in allEventProperties) {\n    evt[option] = allEventProperties[option];\n  }\n  if (rootEl) {\n    rootEl.dispatchEvent(evt);\n  }\n  if (options[onName]) {\n    options[onName].call(sortable, evt);\n  }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n    originalEvent = _ref.evt,\n    data = _objectWithoutProperties(_ref, _excluded);\n  PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n    dragEl: dragEl,\n    parentEl: parentEl,\n    ghostEl: ghostEl,\n    rootEl: rootEl,\n    nextEl: nextEl,\n    lastDownEl: lastDownEl,\n    cloneEl: cloneEl,\n    cloneHidden: cloneHidden,\n    dragStarted: moved,\n    putSortable: putSortable,\n    activeSortable: Sortable.active,\n    originalEvent: originalEvent,\n    oldIndex: oldIndex,\n    oldDraggableIndex: oldDraggableIndex,\n    newIndex: newIndex,\n    newDraggableIndex: 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: sortable,\n        name: name,\n        originalEvent: originalEvent\n      });\n    }\n  }, data));\n};\nfunction _dispatchEvent(info) {\n  dispatchEvent(_objectSpread2({\n    putSortable: putSortable,\n    cloneEl: cloneEl,\n    targetEl: dragEl,\n    rootEl: rootEl,\n    oldIndex: oldIndex,\n    oldDraggableIndex: oldDraggableIndex,\n    newIndex: newIndex,\n    newDraggableIndex: newDraggableIndex\n  }, info));\n}\nvar dragEl,\n  parentEl,\n  ghostEl,\n  rootEl,\n  nextEl,\n  lastDownEl,\n  cloneEl,\n  cloneHidden,\n  oldIndex,\n  newIndex,\n  oldDraggableIndex,\n  newDraggableIndex,\n  activeGroup,\n  putSortable,\n  awaitingDragStarted = false,\n  ignoreNextClick = false,\n  sortables = [],\n  tapEvt,\n  touchEvt,\n  lastDx,\n  lastDy,\n  tapDistanceLeft,\n  tapDistanceTop,\n  moved,\n  lastTarget,\n  lastDirection,\n  pastFirstInvertThresh = false,\n  isCircumstantialInvert = false,\n  targetMoveDistance,\n  // For positioning ghost absolutely\n  ghostRelativeParent,\n  ghostRelativeParentInitialScroll = [],\n  // (left, top)\n\n  _silent = false,\n  savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n  PositionGhostAbsolutely = IOS,\n  CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n  // This will not pass for IE9, because IE9 DnD only works on anchors\n  supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n  supportCssPointerEvents = function () {\n    if (!documentExists) return;\n    // false when <= IE11\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  }(),\n  _detectDirection = function _detectDirection(el, options) {\n    var elCSS = css(el),\n      elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n      child1 = getChild(el, 0, options),\n      child2 = getChild(el, 1, options),\n      firstChildCSS = child1 && css(child1),\n      secondChildCSS = child2 && css(child2),\n      firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n      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  },\n  _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n    var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n      dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n      dragElOppLength = vertical ? dragRect.width : dragRect.height,\n      targetS1Opp = vertical ? targetRect.left : targetRect.top,\n      targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n      targetOppLength = vertical ? targetRect.width : targetRect.height;\n    return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n  },\n  /**\r\n   * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n   * @param  {Number} x      X position\r\n   * @param  {Number} y      Y position\r\n   * @return {HTMLElement}   Element of the first found nearest Sortable\r\n   */\n  _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n    var ret;\n    sortables.some(function (sortable) {\n      var threshold = sortable[expando].options.emptyInsertThreshold;\n      if (!threshold || lastChild(sortable)) return;\n      var rect = getRect(sortable),\n        insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n        insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n      if (insideHorizontally && insideVertically) {\n        return ret = sortable;\n      }\n    });\n    return ret;\n  },\n  _prepareGroup = function _prepareGroup(options) {\n    function toFn(value, pull) {\n      return function (to, from, dragEl, 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          // Default pull value\n          // Default pull and put value if same group\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, dragEl, evt), pull)(to, from, dragEl, 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  },\n  _hideGhostForTarget = function _hideGhostForTarget() {\n    if (!supportCssPointerEvents && ghostEl) {\n      css(ghostEl, 'display', 'none');\n    }\n  },\n  _unhideGhostForTarget = function _unhideGhostForTarget() {\n    if (!supportCssPointerEvents && ghostEl) {\n      css(ghostEl, 'display', '');\n    }\n  };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\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 nearestEmptyInsertDetectEvent(evt) {\n  if (dragEl) {\n    evt = evt.touches ? evt.touches[0] : evt;\n    var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n    if (nearest) {\n      // Create imitation event\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 _checkOutsideTargetEl(evt) {\n  if (dragEl) {\n    dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n  }\n};\n\n/**\r\n * @class  Sortable\r\n * @param  {HTMLElement}  el\r\n * @param  {Object}       [options]\r\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; // root element\n  this.options = options = _extends({}, options);\n\n  // Export instance\n  el[expando] = this;\n  var defaults = {\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    // percentage; 0 <= x <= 1\n    invertSwap: false,\n    // invert always\n    invertedSwapThreshold: null,\n    // will be set to same as swapThreshold if default\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, dragEl) {\n      dataTransfer.setData('Text', dragEl.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    // Disabled on Safari: #1571; Enabled on Safari IOS: #2244\n    supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && (!Safari || IOS),\n    emptyInsertThreshold: 5\n  };\n  PluginManager.initializePlugins(this, el, defaults);\n\n  // Set default options\n  for (var name in defaults) {\n    !(name in options) && (options[name] = defaults[name]);\n  }\n  _prepareGroup(options);\n\n  // Bind all private methods\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  // Setup drag mode\n  this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n  if (this.nativeDraggable) {\n    // Touch start threshold cannot be greater than the native dragstart threshold\n    this.options.touchStartThreshold = 1;\n  }\n\n  // Bind events\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\n  // Restore sorting\n  options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n  // Add animation state manager\n  _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.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( /** Event|TouchEvent */evt) {\n    if (!evt.cancelable) return;\n    var _this = this,\n      el = this.el,\n      options = this.options,\n      preventOnFilter = options.preventOnFilter,\n      type = evt.type,\n      touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n      target = (touch || evt).target,\n      originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n      filter = options.filter;\n    _saveInputCheckedState(el);\n\n    // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n    if (dragEl) {\n      return;\n    }\n    if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n      return; // only left button and enabled\n    }\n\n    // cancel dnd if original target is content editable\n    if (originalTarget.isContentEditable) {\n      return;\n    }\n\n    // Safari ignores further event handling after mousedown\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      // Ignoring duplicate `down`\n      return;\n    }\n\n    // Get the index of the dragged element within its parent\n    oldIndex = index(target);\n    oldDraggableIndex = index(target, options.draggable);\n\n    // Check filter\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        pluginEvent('filter', _this, {\n          evt: evt\n        });\n        preventOnFilter && evt.preventDefault();\n        return; // cancel dnd\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          pluginEvent('filter', _this, {\n            evt: evt\n          });\n          return true;\n        }\n      });\n      if (filter) {\n        preventOnFilter && evt.preventDefault();\n        return; // cancel dnd\n      }\n    }\n    if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n      return;\n    }\n\n    // Prepare `dragstart`\n    this._prepareDragStart(evt, touch, target);\n  },\n  _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n    var _this = this,\n      el = _this.el,\n      options = _this.options,\n      ownerDocument = el.ownerDocument,\n      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 dragStartFn() {\n        pluginEvent('delayEnded', _this, {\n          evt: evt\n        });\n        if (Sortable.eventCanceled) {\n          _this._onDrop();\n          return;\n        }\n        // Delayed drag has been triggered\n        // we can re-enable the events: touchmove/mousemove\n        _this._disableDelayedDragEvents();\n        if (!FireFox && _this.nativeDraggable) {\n          dragEl.draggable = true;\n        }\n\n        // Bind the events: dragstart/dragend\n        _this._triggerDragStart(evt, touch);\n\n        // Drag start event\n        _dispatchEvent({\n          sortable: _this,\n          name: 'choose',\n          originalEvent: evt\n        });\n\n        // Chosen item\n        toggleClass(dragEl, options.chosenClass, true);\n      };\n\n      // Disable \"draggable\"\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      if (options.supportPointer) {\n        on(ownerDocument, 'pointerup', _this._onDrop);\n        // Native D&D triggers pointercancel\n        !this.nativeDraggable && on(ownerDocument, 'pointercancel', _this._onDrop);\n      } else {\n        on(ownerDocument, 'mouseup', _this._onDrop);\n        on(ownerDocument, 'touchend', _this._onDrop);\n        on(ownerDocument, 'touchcancel', _this._onDrop);\n      }\n\n      // Make dragEl draggable (must be before delay for FireFox)\n      if (FireFox && this.nativeDraggable) {\n        this.options.touchStartThreshold = 4;\n        dragEl.draggable = true;\n      }\n      pluginEvent('delayStart', this, {\n        evt: evt\n      });\n\n      // Delay is impossible for native DnD in Edge or IE\n      if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n        if (Sortable.eventCanceled) {\n          this._onDrop();\n          return;\n        }\n        // If the user moves the pointer or let go the click or touch\n        // before the delay has been reached:\n        // disable the delayed drag\n        if (options.supportPointer) {\n          on(ownerDocument, 'pointerup', _this._disableDelayedDrag);\n          on(ownerDocument, 'pointercancel', _this._disableDelayedDrag);\n        } else {\n          on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n          on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n          on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n        }\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( /** TouchEvent|PointerEvent **/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, 'pointerup', this._disableDelayedDrag);\n    off(ownerDocument, 'pointercancel', 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( /** Event */evt, /** Touch */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  _dragStarted: function _dragStarted(fallback, evt) {\n    awaitingDragStarted = false;\n    if (rootEl && dragEl) {\n      pluginEvent('dragStarted', this, {\n        evt: evt\n      });\n      if (this.nativeDraggable) {\n        on(document, 'dragover', _checkOutsideTargetEl);\n      }\n      var options = this.options;\n\n      // Apply effect\n      !fallback && toggleClass(dragEl, options.dragClass, false);\n      toggleClass(dragEl, options.ghostClass, true);\n      Sortable.active = this;\n      fallback && this._appendGhost();\n\n      // Drag start event\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) 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: target,\n              rootEl: parent\n            });\n            if (inserted && !this.options.dragoverBubble) {\n              break;\n            }\n          }\n          target = parent; // store last element\n        }\n        /* jshint boss:true */ while (parent = getParentOrHost(parent));\n      }\n      _unhideGhostForTarget();\n    }\n  },\n  _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n    if (tapEvt) {\n      var options = this.options,\n        fallbackTolerance = options.fallbackTolerance,\n        fallbackOffset = options.fallbackOffset,\n        touch = evt.touches ? evt.touches[0] : evt,\n        ghostMatrix = ghostEl && matrix(ghostEl, true),\n        scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n        scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n        relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n        dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n        dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n      // only set the status to dragging, when we are actually dragging\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    // Bug if using scale(): https://stackoverflow.com/questions/2637058\n    // Not being adjusted for\n    if (!ghostEl) {\n      var container = this.options.fallbackOnBody ? document.body : rootEl,\n        rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n        options = this.options;\n\n      // Position absolutely\n      if (PositionGhostAbsolutely) {\n        // Get relatively positioned parent\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) 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\n      // Set transform-origin\n      css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n    }\n  },\n  _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n    var _this = this;\n    var dataTransfer = evt.dataTransfer;\n    var options = _this.options;\n    pluginEvent('dragStart', this, {\n      evt: evt\n    });\n    if (Sortable.eventCanceled) {\n      this._onDrop();\n      return;\n    }\n    pluginEvent('setupClone', this);\n    if (!Sortable.eventCanceled) {\n      cloneEl = clone(dragEl);\n      cloneEl.removeAttribute(\"id\");\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\n    // #1143: IFrame support workaround\n    _this.cloneId = _nextTick(function () {\n      pluginEvent('clone', _this);\n      if (Sortable.eventCanceled) 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\n    // Set proper drop events\n    if (fallback) {\n      ignoreNextClick = true;\n      _this._loopId = setInterval(_this._emulateDragOver, 50);\n    } else {\n      // Undo what was set in _prepareDragStart before drag started\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\n      // #1276 fix:\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    window.getSelection().removeAllRanges();\n    if (Safari) {\n      css(document.body, 'user-select', 'none');\n    }\n  },\n  // Returns true - if no further action is needed (either inserted or another condition)\n  _onDragOver: function _onDragOver( /**Event*/evt) {\n    var el = this.el,\n      target = evt.target,\n      dragRect,\n      targetRect,\n      revert,\n      options = this.options,\n      group = options.group,\n      activeSortable = Sortable.active,\n      isOwner = activeGroup === group,\n      canSort = options.sort,\n      fromSortable = putSortable || activeSortable,\n      vertical,\n      _this = this,\n      completedFired = false;\n    if (_silent) return;\n    function dragOverEvent(name, extra) {\n      pluginEvent(name, _this, _objectSpread2({\n        evt: evt,\n        isOwner: isOwner,\n        axis: vertical ? 'vertical' : 'horizontal',\n        revert: revert,\n        dragRect: dragRect,\n        targetRect: targetRect,\n        canSort: canSort,\n        fromSortable: fromSortable,\n        target: target,\n        completed: completed,\n        onMove: function onMove(target, after) {\n          return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n        },\n        changed: changed\n      }, extra));\n    }\n\n    // Capture animation state\n    function capture() {\n      dragOverEvent('dragOverAnimationCapture');\n      _this.captureAnimationState();\n      if (_this !== fromSortable) {\n        fromSortable.captureAnimationState();\n      }\n    }\n\n    // Return invocation when dragEl is inserted (or completed)\n    function completed(insertion) {\n      dragOverEvent('dragOverCompleted', {\n        insertion: insertion\n      });\n      if (insertion) {\n        // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n        if (isOwner) {\n          activeSortable._hideClone();\n        } else {\n          activeSortable._showClone(_this);\n        }\n        if (_this !== fromSortable) {\n          // Set ghost class to new sortable's ghost class\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\n        // Animation\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\n      // Null lastTarget if it is not inside a previously swapped element\n      if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n        lastTarget = null;\n      }\n\n      // no bubbling and not fallback\n      if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n        dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n        // Do not detect for empty insert if already inserted\n        !insertion && nearestEmptyInsertDetectEvent(evt);\n      }\n      !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n      return completedFired = true;\n    }\n\n    // Call when dragEl has been inserted\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: newIndex,\n        newDraggableIndex: 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) 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) // Reverting item into the original list\n    : 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) return completedFired;\n      if (revert) {\n        parentEl = rootEl; // actualization\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        // Insert to end of list\n\n        // If already at end of list: Do not insert\n        if (elLastChild === dragEl) {\n          return completed(false);\n        }\n\n        // if there is a last element, it is the target\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          if (elLastChild && elLastChild.nextSibling) {\n            // the last draggable element is not the last node\n            el.insertBefore(dragEl, elLastChild.nextSibling);\n          } else {\n            el.appendChild(dragEl);\n          }\n          parentEl = el; // actualization\n\n          changed();\n          return completed(true);\n        }\n      } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n        // Insert to start of list\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; // actualization\n\n          changed();\n          return completed(true);\n        }\n      } else if (target.parentNode === el) {\n        targetRect = getRect(target);\n        var direction = 0,\n          targetBeforeFirstSwap,\n          differentLevel = dragEl.parentNode !== el,\n          differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n          side1 = vertical ? 'top' : 'left',\n          scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n          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          // Check if target is beside dragEl in respective direction (ignoring hidden elements)\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 dragEl is already beside target: Do not insert\n        if (direction === 0 || sibling === target) {\n          return completed(false);\n        }\n        lastTarget = target;\n        lastDirection = direction;\n        var nextSibling = target.nextElementSibling,\n          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\n          // Undo chrome's scroll adjustment (has no effect on other browsers)\n          if (scrolledPastTop) {\n            scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n          }\n          parentEl = dragEl.parentNode; // actualization\n\n          // must be done before animation\n          if (targetBeforeFirstSwap !== undefined && !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, 'pointercancel', this._onDrop);\n    off(ownerDocument, 'touchcancel', this._onDrop);\n    off(document, 'selectstart', this);\n  },\n  _onDrop: function _onDrop( /**Event*/evt) {\n    var el = this.el,\n      options = this.options;\n\n    // Get the index of the dragged element within its parent\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    pluginEvent('drop', this, {\n      evt: evt\n    });\n    parentEl = dragEl && dragEl.parentNode;\n\n    // Get again after plugin event\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\n    // Unbind events\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        // Remove clone(s)\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\n        // Remove classes\n        // ghostClass is added in dragStarted\n        if (moved && !awaitingDragStarted) {\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n        }\n        toggleClass(dragEl, this.options.chosenClass, false);\n\n        // Drag stop event\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            // Add event\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: 'add',\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n\n            // Remove event\n            _dispatchEvent({\n              sortable: this,\n              name: 'remove',\n              toEl: parentEl,\n              originalEvent: evt\n            });\n\n            // drag from one list and drop into another\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              // drag & drop within the same list\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          /* jshint eqnull:true */\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\n          // Save sorting\n          this.save();\n        }\n      }\n    }\n    this._nulling();\n  },\n  _nulling: function _nulling() {\n    pluginEvent('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( /**Event*/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  /**\r\n   * Serializes the item into an array of string.\r\n   * @returns {String[]}\r\n   */\n  toArray: function toArray() {\n    var order = [],\n      el,\n      children = this.el.children,\n      i = 0,\n      n = children.length,\n      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  /**\r\n   * Sorts the elements according to the array.\r\n   * @param  {String[]}  order  order of the items\r\n   */\n  sort: function sort(order, useAnimation) {\n    var items = {},\n      rootEl = this.el;\n    this.toArray().forEach(function (id, i) {\n      var el = rootEl.children[i];\n      if (closest(el, this.options.draggable, rootEl, false)) {\n        items[id] = el;\n      }\n    }, this);\n    useAnimation && this.captureAnimationState();\n    order.forEach(function (id) {\n      if (items[id]) {\n        rootEl.removeChild(items[id]);\n        rootEl.appendChild(items[id]);\n      }\n    });\n    useAnimation && this.animateAll();\n  },\n  /**\r\n   * Save the current sorting\r\n   */\n  save: function save() {\n    var store = this.options.store;\n    store && store.set && store.set(this);\n  },\n  /**\r\n   * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n   * @param   {HTMLElement}  el\r\n   * @param   {String}       [selector]  default: `options.draggable`\r\n   * @returns {HTMLElement|null}\r\n   */\n  closest: function closest$1(el, selector) {\n    return closest(el, selector || this.options.draggable, this.el, false);\n  },\n  /**\r\n   * Set/get option\r\n   * @param   {string} name\r\n   * @param   {*}      [value]\r\n   * @returns {*}\r\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  /**\r\n   * Destroy\r\n   */\n  destroy: function destroy() {\n    pluginEvent('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    // Remove draggable attributes\n    Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n      el.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      pluginEvent('hideClone', this);\n      if (Sortable.eventCanceled) 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(putSortable) {\n    if (putSortable.lastPutMode !== 'clone') {\n      this._hideClone();\n      return;\n    }\n    if (cloneHidden) {\n      pluginEvent('showClone', this);\n      if (Sortable.eventCanceled) return;\n\n      // show clone at dragEl or original position\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( /**Event*/evt) {\n  if (evt.dataTransfer) {\n    evt.dataTransfer.dropEffect = 'move';\n  }\n  evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n  var evt,\n    sortable = fromEl[expando],\n    onMoveFn = sortable.options.onMove,\n    retVal;\n  // Support for new CustomEvent feature\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 = dragEl;\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 firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n  var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n  var spacer = 10;\n  return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n  var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n  var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n  var spacer = 10;\n  return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n  var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n    targetLength = vertical ? targetRect.height : targetRect.width,\n    targetS1 = vertical ? targetRect.top : targetRect.left,\n    targetS2 = vertical ? targetRect.bottom : targetRect.right,\n    invert = false;\n  if (!invertSwap) {\n    // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n    if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n      // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n      // check if past first invert threshold on side opposite of lastDirection\n      if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n        // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n        pastFirstInvertThresh = true;\n      }\n      if (!pastFirstInvertThresh) {\n        // dragEl shadow (target move distance shadow)\n        if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n        : mouseOnAxis > targetS2 - targetMoveDistance) {\n          return -lastDirection;\n        }\n      } else {\n        invert = true;\n      }\n    } else {\n      // Regular\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    // Invert of regular\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}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param  {HTMLElement} target       The target whose position dragEl is being inserted at\r\n * @return {Number}                   Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n  if (index(dragEl) < index(target)) {\n    return 1;\n  } else {\n    return -1;\n  }\n}\n\n/**\r\n * Generate id\r\n * @param   {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n  var str = el.tagName + el.className + el.src + el.href + el.textContent,\n    i = str.length,\n    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}\n\n// Fixed #973:\nif (documentExists) {\n  on(document, 'touchmove', function (evt) {\n    if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n      evt.preventDefault();\n    }\n  });\n}\n\n// Export utils\nSortable.utils = {\n  on: on,\n  off: off,\n  css: css,\n  find: find,\n  is: function is(el, selector) {\n    return !!closest(el, selector, el, false);\n  },\n  extend: extend,\n  throttle: throttle,\n  closest: closest,\n  toggleClass: toggleClass,\n  clone: clone,\n  index: index,\n  nextTick: _nextTick,\n  cancelNextTick: _cancelNextTick,\n  detectDirection: _detectDirection,\n  getChild: getChild,\n  expando: expando\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param  {HTMLElement} element The element\r\n * @return {Sortable|undefined}         The instance of Sortable\r\n */\nSortable.get = function (element) {\n  return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param  {...SortablePlugin|SortablePlugin[]} plugins       Plugins being mounted\r\n */\nSortable.mount = function () {\n  for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n    plugins[_key] = arguments[_key];\n  }\n  if (plugins[0].constructor === Array) plugins = plugins[0];\n  plugins.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) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n    PluginManager.mount(plugin);\n  });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement}  el\r\n * @param {Object}      [options]\r\n */\nSortable.create = function (el, options) {\n  return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n  scrollEl,\n  scrollRootEl,\n  scrolling = false,\n  lastAutoScrollX,\n  lastAutoScrollY,\n  touchEvt$1,\n  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\n    // Bind all private methods\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      // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n      if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n        this._handleAutoScroll(originalEvent);\n      }\n    },\n    drop: function drop() {\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,\n        y = (evt.touches ? evt.touches[0] : evt).clientY,\n        elem = document.elementFromPoint(x, y);\n      touchEvt$1 = evt;\n\n      // IE does not seem to have native autoscroll,\n      // Edge's autoscroll seems too conditional,\n      // MACOS Safari does not have autoscroll,\n      // Firefox and Chrome are good\n      if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n        autoScroll(evt, this.options, elem, fallback);\n\n        // Listener for pointer element change\n        var ogElemScroller = getParentAutoScrollElement(elem, true);\n        if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n          pointerElemChangedInterval && clearPointerElemChangedInterval();\n          // Detect for pointer elem change, emulating native DnD behaviour\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 DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\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 (autoScroll) {\n    clearInterval(autoScroll.pid);\n  });\n  autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n  clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n  // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n  if (!options.scroll) return;\n  var x = (evt.touches ? evt.touches[0] : evt).clientX,\n    y = (evt.touches ? evt.touches[0] : evt).clientY,\n    sens = options.scrollSensitivity,\n    speed = options.scrollSpeed,\n    winScroller = getWindowScrollingElement();\n  var scrollThisInstance = false,\n    scrollCustomFn;\n\n  // New scroll root, set scrollEl\n  if (scrollRootEl !== rootEl) {\n    scrollRootEl = rootEl;\n    clearAutoScrolls();\n    scrollEl = options.scroll;\n    scrollCustomFn = options.scrollFn;\n    if (scrollEl === true) {\n      scrollEl = getParentAutoScrollElement(rootEl, true);\n    }\n  }\n  var layersOut = 0;\n  var currentParent = scrollEl;\n  do {\n    var el = currentParent,\n      rect = getRect(el),\n      top = rect.top,\n      bottom = rect.bottom,\n      left = rect.left,\n      right = rect.right,\n      width = rect.width,\n      height = rect.height,\n      canScrollX = void 0,\n      canScrollY = void 0,\n      scrollWidth = el.scrollWidth,\n      scrollHeight = el.scrollHeight,\n      elCSS = css(el),\n      scrollPosX = el.scrollLeft,\n      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        /* jshint loopfunc:true */\n        autoScrolls[layersOut].pid = setInterval(function () {\n          // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n          if (isFallback && this.layer === 0) {\n            Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\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; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n  var originalEvent = _ref.originalEvent,\n    putSortable = _ref.putSortable,\n    dragEl = _ref.dragEl,\n    activeSortable = _ref.activeSortable,\n    dispatchSortableEvent = _ref.dispatchSortableEvent,\n    hideGhostForTarget = _ref.hideGhostForTarget,\n    unhideGhostForTarget = _ref.unhideGhostForTarget;\n  if (!originalEvent) return;\n  var toSortable = putSortable || 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: dragEl,\n      putSortable: putSortable\n    });\n  }\n};\nfunction Revert() {}\nRevert.prototype = {\n  startIndex: null,\n  dragStart: function dragStart(_ref2) {\n    var oldDraggableIndex = _ref2.oldDraggableIndex;\n    this.startIndex = oldDraggableIndex;\n  },\n  onSpill: function onSpill(_ref3) {\n    var dragEl = _ref3.dragEl,\n      putSortable = _ref3.putSortable;\n    this.sortable.captureAnimationState();\n    if (putSortable) {\n      putSortable.captureAnimationState();\n    }\n    var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n    if (nextSibling) {\n      this.sortable.el.insertBefore(dragEl, nextSibling);\n    } else {\n      this.sortable.el.appendChild(dragEl);\n    }\n    this.sortable.animateAll();\n    if (putSortable) {\n      putSortable.animateAll();\n    }\n  },\n  drop: drop\n};\n_extends(Revert, {\n  pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n  onSpill: function onSpill(_ref4) {\n    var dragEl = _ref4.dragEl,\n      putSortable = _ref4.putSortable;\n    var parentSortable = putSortable || this.sortable;\n    parentSortable.captureAnimationState();\n    dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n    parentSortable.animateAll();\n  },\n  drop: drop\n};\n_extends(Remove, {\n  pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n  function Swap() {\n    this.defaults = {\n      swapClass: 'sortable-swap-highlight'\n    };\n  }\n  Swap.prototype = {\n    dragStart: function dragStart(_ref) {\n      var dragEl = _ref.dragEl;\n      lastSwapEl = dragEl;\n    },\n    dragOverValid: function dragOverValid(_ref2) {\n      var completed = _ref2.completed,\n        target = _ref2.target,\n        onMove = _ref2.onMove,\n        activeSortable = _ref2.activeSortable,\n        changed = _ref2.changed,\n        cancel = _ref2.cancel;\n      if (!activeSortable.options.swap) return;\n      var el = this.sortable.el,\n        options = this.options;\n      if (target && target !== el) {\n        var prevSwapEl = lastSwapEl;\n        if (onMove(target) !== false) {\n          toggleClass(target, options.swapClass, true);\n          lastSwapEl = target;\n        } else {\n          lastSwapEl = null;\n        }\n        if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n          toggleClass(prevSwapEl, options.swapClass, false);\n        }\n      }\n      changed();\n      completed(true);\n      cancel();\n    },\n    drop: function drop(_ref3) {\n      var activeSortable = _ref3.activeSortable,\n        putSortable = _ref3.putSortable,\n        dragEl = _ref3.dragEl;\n      var toSortable = putSortable || this.sortable;\n      var options = this.options;\n      lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n      if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n        if (dragEl !== lastSwapEl) {\n          toSortable.captureAnimationState();\n          if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n          swapNodes(dragEl, lastSwapEl);\n          toSortable.animateAll();\n          if (toSortable !== activeSortable) activeSortable.animateAll();\n        }\n      }\n    },\n    nulling: function nulling() {\n      lastSwapEl = null;\n    }\n  };\n  return _extends(Swap, {\n    pluginName: 'swap',\n    eventProperties: function eventProperties() {\n      return {\n        swapItem: lastSwapEl\n      };\n    }\n  });\n}\nfunction swapNodes(n1, n2) {\n  var p1 = n1.parentNode,\n    p2 = n2.parentNode,\n    i1,\n    i2;\n  if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n  i1 = index(n1);\n  i2 = index(n2);\n  if (p1.isEqualNode(p2) && i1 < i2) {\n    i2++;\n  }\n  p1.insertBefore(n2, p1.children[i1]);\n  p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n  multiDragClones = [],\n  lastMultiDragSelect,\n  // for selection with modifier key down (SHIFT)\n  multiDragSortable,\n  initialFolding = false,\n  // Initial multi-drag fold when drag started\n  folding = false,\n  // Folding any other time\n  dragStarted = false,\n  dragEl$1,\n  clonesFromRect,\n  clonesHidden;\nfunction MultiDragPlugin() {\n  function MultiDrag(sortable) {\n    // Bind all private methods\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    if (!sortable.options.avoidImplicitDeselect) {\n      if (sortable.options.supportPointer) {\n        on(document, 'pointerup', this._deselectMultiDrag);\n      } else {\n        on(document, 'mouseup', this._deselectMultiDrag);\n        on(document, 'touchend', this._deselectMultiDrag);\n      }\n    }\n    on(document, 'keydown', this._checkKeyDown);\n    on(document, 'keyup', this._checkKeyUp);\n    this.defaults = {\n      selectedClass: 'sortable-selected',\n      multiDragKey: null,\n      avoidImplicitDeselect: false,\n      setData: function setData(dataTransfer, dragEl) {\n        var data = '';\n        if (multiDragElements.length && multiDragSortable === sortable) {\n          multiDragElements.forEach(function (multiDragElement, i) {\n            data += (!i ? '' : ', ') + multiDragElement.textContent;\n          });\n        } else {\n          data = dragEl.textContent;\n        }\n        dataTransfer.setData('Text', data);\n      }\n    };\n  }\n  MultiDrag.prototype = {\n    multiDragKeyDown: false,\n    isMultiDrag: false,\n    delayStartGlobal: function delayStartGlobal(_ref) {\n      var dragged = _ref.dragEl;\n      dragEl$1 = dragged;\n    },\n    delayEnded: function delayEnded() {\n      this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n    },\n    setupClone: function setupClone(_ref2) {\n      var sortable = _ref2.sortable,\n        cancel = _ref2.cancel;\n      if (!this.isMultiDrag) return;\n      for (var i = 0; i < multiDragElements.length; i++) {\n        multiDragClones.push(clone(multiDragElements[i]));\n        multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n        multiDragClones[i].draggable = false;\n        multiDragClones[i].style['will-change'] = '';\n        toggleClass(multiDragClones[i], this.options.selectedClass, false);\n        multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n      }\n      sortable._hideClone();\n      cancel();\n    },\n    clone: function clone(_ref3) {\n      var sortable = _ref3.sortable,\n        rootEl = _ref3.rootEl,\n        dispatchSortableEvent = _ref3.dispatchSortableEvent,\n        cancel = _ref3.cancel;\n      if (!this.isMultiDrag) return;\n      if (!this.options.removeCloneOnHide) {\n        if (multiDragElements.length && multiDragSortable === sortable) {\n          insertMultiDragClones(true, rootEl);\n          dispatchSortableEvent('clone');\n          cancel();\n        }\n      }\n    },\n    showClone: function showClone(_ref4) {\n      var cloneNowShown = _ref4.cloneNowShown,\n        rootEl = _ref4.rootEl,\n        cancel = _ref4.cancel;\n      if (!this.isMultiDrag) return;\n      insertMultiDragClones(false, rootEl);\n      multiDragClones.forEach(function (clone) {\n        css(clone, 'display', '');\n      });\n      cloneNowShown();\n      clonesHidden = false;\n      cancel();\n    },\n    hideClone: function hideClone(_ref5) {\n      var _this = this;\n      var sortable = _ref5.sortable,\n        cloneNowHidden = _ref5.cloneNowHidden,\n        cancel = _ref5.cancel;\n      if (!this.isMultiDrag) return;\n      multiDragClones.forEach(function (clone) {\n        css(clone, 'display', 'none');\n        if (_this.options.removeCloneOnHide && clone.parentNode) {\n          clone.parentNode.removeChild(clone);\n        }\n      });\n      cloneNowHidden();\n      clonesHidden = true;\n      cancel();\n    },\n    dragStartGlobal: function dragStartGlobal(_ref6) {\n      var sortable = _ref6.sortable;\n      if (!this.isMultiDrag && multiDragSortable) {\n        multiDragSortable.multiDrag._deselectMultiDrag();\n      }\n      multiDragElements.forEach(function (multiDragElement) {\n        multiDragElement.sortableIndex = index(multiDragElement);\n      });\n\n      // Sort multi-drag elements\n      multiDragElements = multiDragElements.sort(function (a, b) {\n        return a.sortableIndex - b.sortableIndex;\n      });\n      dragStarted = true;\n    },\n    dragStarted: function dragStarted(_ref7) {\n      var _this2 = this;\n      var sortable = _ref7.sortable;\n      if (!this.isMultiDrag) return;\n      if (this.options.sort) {\n        // Capture rects,\n        // hide multi drag elements (by positioning them absolute),\n        // set multi drag elements rects to dragRect,\n        // show multi drag elements,\n        // animate to rects,\n        // unset rects & remove from DOM\n\n        sortable.captureAnimationState();\n        if (this.options.animation) {\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            css(multiDragElement, 'position', 'absolute');\n          });\n          var dragRect = getRect(dragEl$1, false, true, true);\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            setRect(multiDragElement, dragRect);\n          });\n          folding = true;\n          initialFolding = true;\n        }\n      }\n      sortable.animateAll(function () {\n        folding = false;\n        initialFolding = false;\n        if (_this2.options.animation) {\n          multiDragElements.forEach(function (multiDragElement) {\n            unsetRect(multiDragElement);\n          });\n        }\n\n        // Remove all auxiliary multidrag items from el, if sorting enabled\n        if (_this2.options.sort) {\n          removeMultiDragElements();\n        }\n      });\n    },\n    dragOver: function dragOver(_ref8) {\n      var target = _ref8.target,\n        completed = _ref8.completed,\n        cancel = _ref8.cancel;\n      if (folding && ~multiDragElements.indexOf(target)) {\n        completed(false);\n        cancel();\n      }\n    },\n    revert: function revert(_ref9) {\n      var fromSortable = _ref9.fromSortable,\n        rootEl = _ref9.rootEl,\n        sortable = _ref9.sortable,\n        dragRect = _ref9.dragRect;\n      if (multiDragElements.length > 1) {\n        // Setup unfold animation\n        multiDragElements.forEach(function (multiDragElement) {\n          sortable.addAnimationState({\n            target: multiDragElement,\n            rect: folding ? getRect(multiDragElement) : dragRect\n          });\n          unsetRect(multiDragElement);\n          multiDragElement.fromRect = dragRect;\n          fromSortable.removeAnimationState(multiDragElement);\n        });\n        folding = false;\n        insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n      }\n    },\n    dragOverCompleted: function dragOverCompleted(_ref10) {\n      var sortable = _ref10.sortable,\n        isOwner = _ref10.isOwner,\n        insertion = _ref10.insertion,\n        activeSortable = _ref10.activeSortable,\n        parentEl = _ref10.parentEl,\n        putSortable = _ref10.putSortable;\n      var options = this.options;\n      if (insertion) {\n        // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n        if (isOwner) {\n          activeSortable._hideClone();\n        }\n        initialFolding = false;\n        // If leaving sort:false root, or already folding - Fold to new location\n        if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n          // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n          var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            setRect(multiDragElement, dragRectAbsolute);\n\n            // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n            // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n            parentEl.appendChild(multiDragElement);\n          });\n          folding = true;\n        }\n\n        // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n        if (!isOwner) {\n          // Only remove if not folding (folding will remove them anyways)\n          if (!folding) {\n            removeMultiDragElements();\n          }\n          if (multiDragElements.length > 1) {\n            var clonesHiddenBefore = clonesHidden;\n            activeSortable._showClone(sortable);\n\n            // Unfold animation for clones if showing from hidden\n            if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n              multiDragClones.forEach(function (clone) {\n                activeSortable.addAnimationState({\n                  target: clone,\n                  rect: clonesFromRect\n                });\n                clone.fromRect = clonesFromRect;\n                clone.thisAnimationDuration = null;\n              });\n            }\n          } else {\n            activeSortable._showClone(sortable);\n          }\n        }\n      }\n    },\n    dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n      var dragRect = _ref11.dragRect,\n        isOwner = _ref11.isOwner,\n        activeSortable = _ref11.activeSortable;\n      multiDragElements.forEach(function (multiDragElement) {\n        multiDragElement.thisAnimationDuration = null;\n      });\n      if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n        clonesFromRect = _extends({}, dragRect);\n        var dragMatrix = matrix(dragEl$1, true);\n        clonesFromRect.top -= dragMatrix.f;\n        clonesFromRect.left -= dragMatrix.e;\n      }\n    },\n    dragOverAnimationComplete: function dragOverAnimationComplete() {\n      if (folding) {\n        folding = false;\n        removeMultiDragElements();\n      }\n    },\n    drop: function drop(_ref12) {\n      var evt = _ref12.originalEvent,\n        rootEl = _ref12.rootEl,\n        parentEl = _ref12.parentEl,\n        sortable = _ref12.sortable,\n        dispatchSortableEvent = _ref12.dispatchSortableEvent,\n        oldIndex = _ref12.oldIndex,\n        putSortable = _ref12.putSortable;\n      var toSortable = putSortable || this.sortable;\n      if (!evt) return;\n      var options = this.options,\n        children = parentEl.children;\n\n      // Multi-drag selection\n      if (!dragStarted) {\n        if (options.multiDragKey && !this.multiDragKeyDown) {\n          this._deselectMultiDrag();\n        }\n        toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n        if (!~multiDragElements.indexOf(dragEl$1)) {\n          multiDragElements.push(dragEl$1);\n          dispatchEvent({\n            sortable: sortable,\n            rootEl: rootEl,\n            name: 'select',\n            targetEl: dragEl$1,\n            originalEvent: evt\n          });\n\n          // Modifier activated, select from last to dragEl\n          if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n            var lastIndex = index(lastMultiDragSelect),\n              currentIndex = index(dragEl$1);\n            if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n              (function () {\n                // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n                // (but previous selection existed)\n                var n, i;\n                if (currentIndex > lastIndex) {\n                  i = lastIndex;\n                  n = currentIndex;\n                } else {\n                  i = currentIndex;\n                  n = lastIndex + 1;\n                }\n                var filter = options.filter;\n                for (; i < n; i++) {\n                  if (~multiDragElements.indexOf(children[i])) continue;\n                  // Check if element is draggable\n                  if (!closest(children[i], options.draggable, parentEl, false)) continue;\n                  // Check if element is filtered\n                  var filtered = filter && (typeof filter === 'function' ? filter.call(sortable, evt, children[i], sortable) : filter.split(',').some(function (criteria) {\n                    return closest(children[i], criteria.trim(), parentEl, false);\n                  }));\n                  if (filtered) continue;\n                  toggleClass(children[i], options.selectedClass, true);\n                  multiDragElements.push(children[i]);\n                  dispatchEvent({\n                    sortable: sortable,\n                    rootEl: rootEl,\n                    name: 'select',\n                    targetEl: children[i],\n                    originalEvent: evt\n                  });\n                }\n              })();\n            }\n          } else {\n            lastMultiDragSelect = dragEl$1;\n          }\n          multiDragSortable = toSortable;\n        } else {\n          multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n          lastMultiDragSelect = null;\n          dispatchEvent({\n            sortable: sortable,\n            rootEl: rootEl,\n            name: 'deselect',\n            targetEl: dragEl$1,\n            originalEvent: evt\n          });\n        }\n      }\n\n      // Multi-drag drop\n      if (dragStarted && this.isMultiDrag) {\n        folding = false;\n        // Do not \"unfold\" after around dragEl if reverted\n        if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n          var dragRect = getRect(dragEl$1),\n            multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n          if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n          toSortable.captureAnimationState();\n          if (!initialFolding) {\n            if (options.animation) {\n              dragEl$1.fromRect = dragRect;\n              multiDragElements.forEach(function (multiDragElement) {\n                multiDragElement.thisAnimationDuration = null;\n                if (multiDragElement !== dragEl$1) {\n                  var rect = folding ? getRect(multiDragElement) : dragRect;\n                  multiDragElement.fromRect = rect;\n\n                  // Prepare unfold animation\n                  toSortable.addAnimationState({\n                    target: multiDragElement,\n                    rect: rect\n                  });\n                }\n              });\n            }\n\n            // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n            // properly they must all be removed\n            removeMultiDragElements();\n            multiDragElements.forEach(function (multiDragElement) {\n              if (children[multiDragIndex]) {\n                parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n              } else {\n                parentEl.appendChild(multiDragElement);\n              }\n              multiDragIndex++;\n            });\n\n            // If initial folding is done, the elements may have changed position because they are now\n            // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n            // must be fired here as Sortable will not.\n            if (oldIndex === index(dragEl$1)) {\n              var update = false;\n              multiDragElements.forEach(function (multiDragElement) {\n                if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n                  update = true;\n                  return;\n                }\n              });\n              if (update) {\n                dispatchSortableEvent('update');\n                dispatchSortableEvent('sort');\n              }\n            }\n          }\n\n          // Must be done after capturing individual rects (scroll bar)\n          multiDragElements.forEach(function (multiDragElement) {\n            unsetRect(multiDragElement);\n          });\n          toSortable.animateAll();\n        }\n        multiDragSortable = toSortable;\n      }\n\n      // Remove clones if necessary\n      if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n        multiDragClones.forEach(function (clone) {\n          clone.parentNode && clone.parentNode.removeChild(clone);\n        });\n      }\n    },\n    nullingGlobal: function nullingGlobal() {\n      this.isMultiDrag = dragStarted = false;\n      multiDragClones.length = 0;\n    },\n    destroyGlobal: function destroyGlobal() {\n      this._deselectMultiDrag();\n      off(document, 'pointerup', this._deselectMultiDrag);\n      off(document, 'mouseup', this._deselectMultiDrag);\n      off(document, 'touchend', this._deselectMultiDrag);\n      off(document, 'keydown', this._checkKeyDown);\n      off(document, 'keyup', this._checkKeyUp);\n    },\n    _deselectMultiDrag: function _deselectMultiDrag(evt) {\n      if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n      // Only deselect if selection is in this sortable\n      if (multiDragSortable !== this.sortable) return;\n\n      // Only deselect if target is not item in this sortable\n      if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n      // Only deselect if left click\n      if (evt && evt.button !== 0) return;\n      while (multiDragElements.length) {\n        var el = multiDragElements[0];\n        toggleClass(el, this.options.selectedClass, false);\n        multiDragElements.shift();\n        dispatchEvent({\n          sortable: this.sortable,\n          rootEl: this.sortable.el,\n          name: 'deselect',\n          targetEl: el,\n          originalEvent: evt\n        });\n      }\n    },\n    _checkKeyDown: function _checkKeyDown(evt) {\n      if (evt.key === this.options.multiDragKey) {\n        this.multiDragKeyDown = true;\n      }\n    },\n    _checkKeyUp: function _checkKeyUp(evt) {\n      if (evt.key === this.options.multiDragKey) {\n        this.multiDragKeyDown = false;\n      }\n    }\n  };\n  return _extends(MultiDrag, {\n    // Static methods & properties\n    pluginName: 'multiDrag',\n    utils: {\n      /**\r\n       * Selects the provided multi-drag item\r\n       * @param  {HTMLElement} el    The element to be selected\r\n       */\n      select: function select(el) {\n        var sortable = el.parentNode[expando];\n        if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n        if (multiDragSortable && multiDragSortable !== sortable) {\n          multiDragSortable.multiDrag._deselectMultiDrag();\n          multiDragSortable = sortable;\n        }\n        toggleClass(el, sortable.options.selectedClass, true);\n        multiDragElements.push(el);\n      },\n      /**\r\n       * Deselects the provided multi-drag item\r\n       * @param  {HTMLElement} el    The element to be deselected\r\n       */\n      deselect: function deselect(el) {\n        var sortable = el.parentNode[expando],\n          index = multiDragElements.indexOf(el);\n        if (!sortable || !sortable.options.multiDrag || !~index) return;\n        toggleClass(el, sortable.options.selectedClass, false);\n        multiDragElements.splice(index, 1);\n      }\n    },\n    eventProperties: function eventProperties() {\n      var _this3 = this;\n      var oldIndicies = [],\n        newIndicies = [];\n      multiDragElements.forEach(function (multiDragElement) {\n        oldIndicies.push({\n          multiDragElement: multiDragElement,\n          index: multiDragElement.sortableIndex\n        });\n\n        // multiDragElements will already be sorted if folding\n        var newIndex;\n        if (folding && multiDragElement !== dragEl$1) {\n          newIndex = -1;\n        } else if (folding) {\n          newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n        } else {\n          newIndex = index(multiDragElement);\n        }\n        newIndicies.push({\n          multiDragElement: multiDragElement,\n          index: newIndex\n        });\n      });\n      return {\n        items: _toConsumableArray(multiDragElements),\n        clones: [].concat(multiDragClones),\n        oldIndicies: oldIndicies,\n        newIndicies: newIndicies\n      };\n    },\n    optionListeners: {\n      multiDragKey: function multiDragKey(key) {\n        key = key.toLowerCase();\n        if (key === 'ctrl') {\n          key = 'Control';\n        } else if (key.length > 1) {\n          key = key.charAt(0).toUpperCase() + key.substr(1);\n        }\n        return key;\n      }\n    }\n  });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n  multiDragElements.forEach(function (multiDragElement, i) {\n    var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n    if (target) {\n      rootEl.insertBefore(multiDragElement, target);\n    } else {\n      rootEl.appendChild(multiDragElement);\n    }\n  });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param  {[Boolean]} elementsInserted  Whether the multi-drag elements are inserted\r\n * @param  {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n  multiDragClones.forEach(function (clone, i) {\n    var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n    if (target) {\n      rootEl.insertBefore(clone, target);\n    } else {\n      rootEl.appendChild(clone);\n    }\n  });\n}\nfunction removeMultiDragElements() {\n  multiDragElements.forEach(function (multiDragElement) {\n    if (multiDragElement === dragEl$1) return;\n    multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n  });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","import Sortable from 'sortablejs';\n\nexport default function formBuilder(activeLocale, locales, attributable_type) {\n  return {\n    activeLocale: activeLocale,\n    locales: locales,\n    attributable_type: attributable_type,\n    activeFormField: '',\n    sortable: null,\n    dynAttrs: {},\n    openConfirmationModal: false,\n    openAdvanced: false,\n    messageId: '',\n    importCode: '',\n\n    init() {\n      // load and use relevant form field data\n      document.querySelectorAll('.form-builder__settings-card').forEach((formField) => {\n        const da = JSON.parse(formField.dataset.da);\n        this.dynAttrs[da.id] = { count: da.count };\n\n        if (da.required) {\n          this.toggleRequired(da.id, true);\n        }\n\n        if (da.private) {\n          this.togglePrivate(da.id, true);\n        }\n      });\n\n      // initialize sortable\n      this.sortable = new Sortable(formFieldList, {\n        dataIdAttr: 'data-da-id',\n        handle: '.form-card__header',\n        filter: '.form-builder__header',\n        group: 'list-group-item',\n        onUpdate: () => this.updateSortable(),\n      });\n\n      // highlight first form field and style sortable arrows\n      const firstFormField = document.querySelector('.form-builder__field-wrapper');\n      if (firstFormField) {\n        this.activateFormField(firstFormField.dataset.daId);\n        this.hideFirstAndLastArrows();\n      }\n\n      // hide the spinner once everything is loaded\n      this.$nextTick(() => {\n        document.querySelectorAll('.loading-ring__wrapper').forEach((spinner) => {\n          spinner.classList.add('hidden');\n        });\n      });\n    },\n\n    changeMarkerURL() {\n      const marker = document.querySelector('gmp-advanced-marker');\n      const image = marker.querySelector('img');\n      image.src =\n        this.$refs.markerURL.value ||\n        'https://bpart-default-assets.s3.eu-central-1.amazonaws.com/img/map-default-marker.png';\n    },\n\n    hasFormFields() {\n      return Object.keys(this.dynAttrs).length > 0;\n    },\n\n    hasNoFormFields() {\n      return !this.hasFormFields();\n    },\n\n    // ADDING FORM FIELDS\n\n    showNewFieldSelector() {\n      this.deactivateFormFields();\n      this.activateSettingsField('formFieldSelector');\n    },\n\n    // Note(wh): New form fields are cloned from templates included in the DOM. These do not have an id.\n    // For Alpine to identify these new form fields, we generate a unique temporary id when a new field is added.\n    // When adding the form field to the DOM, Alpine will insert this temporary id where needed.\n    // This id is also used to replace the child_indexes of the fields_for (named INDEX_TO_REPLACE), so Rails\n    // will correctly identify the data for each new form field (e.g. topic[dynamic_attributes_attributes][child_index][sort_order]).\n\n    addField(type, object) {\n      let id = 1;\n      if (Object.keys(this.dynAttrs).length > 0) {\n        // To make sure that the new id (that will be used as a child index in the fields_for) does not overlap\n        // with the existing child indexes, we multiply the highest existing id by 4\n        id = Math.max(...Object.keys(this.dynAttrs)) * 4;\n      }\n      // We identify new form fields by a negative count, e.g. in this.isExistingFormField(id)\n      this.dynAttrs[id] = { count: -1 };\n\n      this.deactivateFormFields();\n\n      this.addNewFormField(id, type, object);\n      this.addNewSettingsField(id, type, object);\n\n      const newFieldBottomButton = document.querySelector('#formFieldList');\n      this.$nextTick(() => newFieldBottomButton?.scrollIntoView({ block: 'end', behavior: 'smooth' }));\n    },\n\n    addNewFormField(id, type, object) {\n      const formFieldTemplate = document.getElementById(`new_${type}_field`);\n      const newFormField = formFieldTemplate.content.firstElementChild.cloneNode(true);\n      const formFieldList = document.getElementById('formFieldList');\n      formFieldList.appendChild(newFormField);\n\n      this.initialiseFormField(newFormField, id, type, object);\n\n      this.activateFormField(newFormField.dataset.daId);\n\n      this.updateSortable();\n    },\n\n    addNewSettingsField(id, type, object) {\n      const formSettingsTemplate = document.getElementById(`new_settings_${type}_field`);\n      const newSettingsField = formSettingsTemplate.content.firstElementChild.cloneNode(true);\n      const formFieldSettings = document.getElementById('formFieldSettingsList');\n      formFieldSettings.appendChild(newSettingsField);\n\n      this.initialiseSettingsField(newSettingsField, id, type, object);\n    },\n\n    initialiseFormField(formField, id, type, object) {\n      formField.dataset.daId = id;\n\n      const formFieldHeader = formField.querySelector('.form-card');\n      formFieldHeader.setAttribute('x-bind:class', `activeFormField === '${id}' ? 'form-card--active' : ''`);\n\n      const formFieldHeaderDelete = formFieldHeader.querySelector('.form-card__delete-button');\n      formFieldHeaderDelete.setAttribute('x-on:click', `deleteFormField('${id}')`);\n\n      const sortOrderInput = formField.querySelector('input[x-ref=\"sortOrder_\"]');\n      sortOrderInput.setAttribute('x-ref', `sortOrder_${id}`);\n      sortOrderInput.setAttribute('value', id);\n\n      formField.querySelectorAll('input, textarea').forEach((input) => {\n        const regex = /INDEX_TO_REPLACE/;\n        input.name = input.name.replace(regex, id);\n        input.id = input.id.replace(regex, id);\n      });\n\n      if (['checkboxes', 'radio', 'select'].includes(type)) {\n        this.initialiseOptions(formField, id);\n      }\n\n      if (object) this.useImportedFields(formField, id, object);\n    },\n\n    useImportedFields(formField, id, object) {\n      locales.forEach((locale) => {\n        const formFieldForLocale = formField.querySelector(`.form-field[x-show=\"activeLocale === '${locale}'\"]`);\n        const name = formFieldForLocale.querySelector('input.form-card__name');\n        name.value = object.name[locale];\n        if (['text', 'string'].includes(object.attributeType)) {\n          const placeholder = formFieldForLocale.querySelector('textarea.form-card__placeholder');\n          placeholder.innerHTML = object.placeholder[locale];\n        } else if (['item', 'attachment', 'map'].includes(object.attributeType)) {\n          const placeholder = formFieldForLocale.querySelector(\n            `#${this.attributable_type}_dynamic_attributes_attributes_${id}_placeholder_${locale}`\n          );\n          placeholder.value = object.placeholder[locale];\n        } else if (['checkboxes', 'radio', 'select'].includes(object.attributeType)) {\n          // remove the default options\n          [0, 1, 2].forEach((index) => {\n            const optionForLocale = formFieldForLocale.querySelector(`.option__${index}`);\n            optionForLocale.remove();\n          });\n\n          // add the imported options value to the hidden input field\n          const optionsInputForLocale = formFieldForLocale.querySelector(`#optionsInput_${locale}_${id}`);\n          optionsInputForLocale.value = object.options[locale]?.join('\\r\\n');\n\n          // add a visual representation for each imported option\n          object.options[locale].forEach((option, index) => {\n            const optionTemplate = formFieldForLocale.querySelector(`#newOption_${id}_${locale}`);\n            const newOption = optionTemplate.content.firstElementChild.cloneNode(true);\n            newOption.classList.add(`option_${id}_${index}`);\n            newOption.querySelector('.form-card__option').value = option;\n            newOption.querySelector('.form-card__option').addEventListener('change', () => this.changeOptions(id));\n            newOption\n              .querySelector('.form-card__delete-option')\n              .addEventListener('click', () => this.removeOption(id, index));\n            formFieldForLocale.appendChild(newOption);\n          });\n        }\n      });\n    },\n\n    initialiseOptions(formField, id) {\n      formField.querySelector('.button--outline').addEventListener('click', () => this.addOption(id));\n      // adapting the x-show attribute to the new id causes Alpine to throw an error in console, so we replace it by an x-bind:class toggling hidden;\n      formField.querySelector(`.form-card__add-option`).removeAttribute('x-show');\n      formField\n        .querySelector(`.form-card__add-option`)\n        .setAttribute('x-bind:class', `activeFormField === '${id}' ? '' : 'hidden'`);\n\n      this.locales.forEach((locale) => {\n        const optionsInputForLocale = formField.querySelector(`#optionsInput_${locale}_`);\n        optionsInputForLocale.setAttribute('id', `optionsInput_${locale}_${id}`);\n\n        const newOptionForLocale = optionsInputForLocale.parentNode.querySelector(`#newOption__${locale}`);\n        newOptionForLocale.setAttribute('id', `newOption_${id}_${locale}`);\n\n        // A new checkboxes, radio or select field always starts with 3 options\n        [0, 1, 2].forEach((index) => {\n          const optionForLocale = optionsInputForLocale.parentNode.querySelector(`.option__${index}`);\n          if (optionForLocale) {\n            optionForLocale.classList.add(`option_${id}_${index}`);\n            optionForLocale\n              .querySelector('.form-card__option')\n              .addEventListener('change', () => this.changeOptions(id));\n            optionForLocale\n              .querySelector('.form-card__delete-option')\n              .addEventListener('click', () => this.removeOption(id, index));\n          }\n        });\n      });\n    },\n\n    initialiseSettingsField(settingsField, id, type, object) {\n      settingsField.dataset.daId = id;\n\n      settingsField.querySelectorAll('input').forEach((input) => {\n        const regex = /INDEX_TO_REPLACE/;\n        input.name = input.name.replace(regex, id);\n        input.id = input.id.replace(regex, id);\n      });\n      // adapting the x-show attribute to the new id causes Alpine to throw an error in console, so we replace it by an x-bind:class toggling hidden;\n      settingsField.removeAttribute('x-show');\n      settingsField.setAttribute('x-bind:class', `activeFormField === '${id}' ? '' : 'hidden'`);\n\n      const requiredField = settingsField\n        .querySelector(`.${this.attributable_type}_dynamic_required`)\n        .querySelector('input[type=\"checkbox\"]');\n      requiredField.addEventListener('click', () => this.toggleRequired(id, requiredField.checked));\n      const privateField = settingsField\n        .querySelector(`.${this.attributable_type}_dynamic_private`)\n        .querySelector('input[type=\"checkbox\"]');\n      privateField.addEventListener('click', () => this.togglePrivate(id, privateField.checked));\n\n      if (['text', 'string'].includes(type)) {\n        const maxCharsField = settingsField\n          .querySelector(`.${this.attributable_type}_dynamic_maxlength`)\n          .querySelector('input[type=\"number\"]');\n        maxCharsField.addEventListener('change', () => this.changeMaxChars(id, maxCharsField.value));\n      }\n\n      if (object) this.useImportedSettings(settingsField, id, object);\n    },\n\n    useImportedSettings(settingsField, id, object) {\n      const internal_name = settingsField.querySelector(\n        `#${this.attributable_type}_dynamic_attributes_attributes_${id}_internal_name`\n      );\n      internal_name.value = object.internalName;\n      const requiredCheckbox = settingsField.querySelector(\n        `#${this.attributable_type}_dynamic_attributes_attributes_${id}_required`\n      );\n      requiredCheckbox.checked = object.required;\n      const privateCheckbox = settingsField.querySelector(\n        `#${this.attributable_type}_dynamic_attributes_attributes_${id}_private`\n      );\n      privateCheckbox.checked = object.private;\n\n      if (['text', 'string'].includes(object.attributeType)) {\n        const maxChars = settingsField.querySelector(\n          `#${this.attributable_type}_dynamic_attributes_attributes_${id}_maxlength`\n        );\n        maxChars.value = object.maxlength;\n        this.changeMaxChars(id, object.maxlength);\n      } else if (object.attributeType === 'map') {\n        const customMarkerUrl = settingsField.querySelector(\n          `#${this.attributable_type}_dynamic_attributes_attributes_${id}_custom_marker_url`\n        );\n        customMarkerUrl.value = object.customMarkerUrl;\n      }\n    },\n\n    // SORTING FORM FIELDS\n\n    updateSortable() {\n      const sortableArray = this.sortable.toArray();\n      sortableArray.forEach((id, index) => {\n        if (this.$refs[`sortOrder_${id}`]) {\n          this.$refs[`sortOrder_${id}`].value = index + 1;\n        }\n      });\n\n      this.hideFirstAndLastArrows();\n    },\n\n    moveFormField(direction) {\n      const currentFormField = this.$el.closest('.form-builder__field-wrapper'); // the form field we clicked on\n      const otherFormField = this.findOtherFormField(currentFormField, direction); // the form field to swap with\n\n      if (otherFormField === null) return;\n\n      switch (direction) {\n        case 'up':\n          currentFormField.parentNode.insertBefore(currentFormField, otherFormField);\n          break;\n        case 'down':\n          currentFormField.parentNode.insertBefore(otherFormField, currentFormField);\n          break;\n      }\n\n      this.updateSortable();\n    },\n\n    hideFirstAndLastArrows() {\n      document.querySelectorAll('.form-builder__arrow--inactive')?.forEach((arrow) => {\n        arrow.classList.remove('form-builder__arrow--inactive');\n      });\n\n      const cards = document.querySelectorAll('.form-builder__field-wrapper');\n\n      if (cards.length > 0) {\n        const firstCard = cards[0];\n        const firstArrow = firstCard.querySelector('.form-builder__arrow.up');\n        firstArrow.classList.add('form-builder__arrow--inactive');\n\n        const lastCard = cards[cards.length - 1];\n        const lastArrow = lastCard.querySelector('.form-builder__arrow.down');\n        lastArrow.classList.add('form-builder__arrow--inactive');\n      }\n    },\n\n    // Recursive function because there are hidden input fields on the same level as currentFormField that we need to skip\n    findOtherFormField(currentFormField, direction) {\n      const otherFormField =\n        direction === 'down' ? currentFormField.nextElementSibling : currentFormField.previousElementSibling;\n\n      if (otherFormField === null || otherFormField.classList.contains('form-builder__field-wrapper')) {\n        return otherFormField;\n      } else {\n        return this.findOtherFormField(otherFormField, direction);\n      }\n    },\n\n    // DELETING FORM FIELDS\n\n    confirmFormFieldDeletion(id) {\n      if (id && this.dynAttrs[id].count > 0) {\n        this.messageId = id;\n        this.openConfirmationModal = true;\n      } else {\n        this.deleteFormField(id);\n      }\n    },\n\n    deleteFormField(id, viaConfirmation = false) {\n      // If confirmed via the modal, we hide the confirmation message and close the modal\n      if (viaConfirmation) {\n        this.messageId = '';\n        this.openConfirmationModal = false;\n      }\n\n      // for an existing form field: hide and flag for destruction,\n      // for a new form field: remove from the DOM\n      if (this.isExistingFormField(id)) {\n        this.$refs[`destroy_${id}`].value = true;\n\n        // Hide the form field\n        const formField = document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`);\n        formField.classList.add('hidden');\n\n        // Hide the settings card\n        const formFieldSettings = document.querySelector(\n          `.form-builder__settings-card[x-show=\"activeFormField === '${id}'\"]`\n        );\n        formFieldSettings.classList.add('hidden');\n      } else {\n        id ||= this.$el.closest('.form-builder__field-wrapper').dataset.daId;\n        document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`).remove();\n        document.querySelector(`.form-builder__settings-card[data-da-id=\"${id}\"]`).remove();\n      }\n\n      delete this.dynAttrs[id];\n      this.hideFirstAndLastArrows();\n    },\n\n    isExistingFormField(id) {\n      return this.dynAttrs[id].count >= 0;\n    },\n\n    // SETTING CORRECT STYLING FOR (ACTIVE) FORM FIELDS\n\n    activateFormField(id) {\n      this.activeFormField = id.toString();\n      this.closeSummary();\n    },\n\n    deactivateFormFields() {\n      this.activeFormField = '';\n    },\n\n    activateSettingsField(id) {\n      this.activeFormField = id.toString();\n    },\n\n    closeSummary() {\n      document.querySelector('.form-builder__header--settings').removeAttribute('open');\n    },\n\n    toggleRequired(id, boolean) {\n      const formField = document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`);\n      if (boolean) {\n        formField.querySelectorAll('.form-card__required').forEach((formField) => {\n          formField.classList.remove('hidden');\n        });\n      } else {\n        formField.querySelectorAll('.form-card__required').forEach((formField) => {\n          formField.classList.add('hidden');\n        });\n      }\n    },\n\n    togglePrivate(id, boolean) {\n      const formField = document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`);\n      if (boolean) {\n        formField.querySelectorAll('.form-card__hint').forEach((formField) => {\n          formField.classList.remove('hidden');\n        });\n      } else {\n        formField.querySelectorAll('.form-card__hint').forEach((formField) => {\n          formField.classList.add('hidden');\n        });\n      }\n    },\n\n    changeMaxChars(id, value) {\n      const formField = document.querySelector(`.form-builder__field-wrapper[data-da-id=\"${id}\"]`);\n      if (value === '' || value === '0') {\n        formField.querySelector('.form-card__max-chars').textContent = '';\n      } else {\n        formField.querySelector('.form-card__max-chars').textContent = `0/${value}`;\n      }\n    },\n\n    // INTERACT WITH FORM FIELD OPTIONS (for checkboxes, radio buttons and select)\n\n    addOption(id) {\n      this.locales.forEach((locale) => {\n        const formField = document.querySelector(`#optionsInput_${locale}_${id}`);\n        const newIndex = formField.parentNode.querySelectorAll('.form-card__option').length;\n        const optionTemplate = document.querySelector(`#newOption_${id}_${locale}`);\n        const newOption = optionTemplate.content.firstElementChild.cloneNode(true);\n\n        newOption.classList.add(`option_${id}_${newIndex}`);\n        newOption.querySelector('.form-card__option').addEventListener('change', () => this.changeOptions(id));\n        newOption\n          .querySelector('.form-card__delete-option')\n          .addEventListener('click', () => this.removeOption(id, newIndex));\n\n        formField.parentNode.insertBefore(newOption, optionTemplate);\n        this.changeOptions(id);\n      });\n    },\n\n    removeOption(id, index) {\n      Array.from(document.querySelectorAll(`.option_${id}_${index}`)).forEach((field) => {\n        field.remove();\n      });\n      this.changeOptions(id);\n    },\n\n    changeOptions(id) {\n      this.locales.forEach((locale) => {\n        const formFieldOptionsInput = document.querySelector(`#optionsInput_${locale}_${id}`);\n        const formFieldOptions = formFieldOptionsInput.parentNode.querySelectorAll('.form-card__option');\n        let options = [];\n        formFieldOptions.forEach((field) => {\n          options.push(field.value);\n        });\n        formFieldOptionsInput.value = options.join('\\r\\n');\n      });\n    },\n\n    // COPY/PASTE FORM CODE\n\n    async copyFormCode() {\n      const url = window.location.href.replace('edit_form', 'dynamic_attributes.json');\n      const request = new Request(url);\n      const response = await fetch(request);\n      const data = await response.json();\n      const da = JSON.stringify(data.data.dynamicAttributes, null, '\\t');\n      window.navigator.clipboard.writeText(da);\n      this.showMessage('copy_success');\n      this.openAdvanced = false;\n    },\n\n    importFormCode() {\n      try {\n        // raise error if current form has linked entry values\n        Object.values(this.dynAttrs).every((v) => {\n          if (v.count > 0) {\n            throw 'cant_override';\n          }\n        });\n\n        // parse import string into JSON (and raise error if not correct syntax)\n        const code = JSON.parse(this.importCode);\n\n        // remove the existing form fields\n        Object.keys(this.dynAttrs).forEach((key) => {\n          this.deleteFormField(key);\n        });\n\n        // build the form fields\n        code.forEach((field) => {\n          this.addField(field.attributeType, field);\n        });\n\n        this.showMessage('import_successful');\n      } catch (e) {\n        if (e instanceof SyntaxError) {\n          this.showMessage('your_input_seems_incorrect');\n        } else if (e === 'cant_override') {\n          this.showMessage('cant_override');\n        }\n      } finally {\n        this.openAdvanced = false;\n      }\n    },\n\n    showMessage(type) {\n      const messageTemplate = document.getElementById(type);\n      const newMessage = messageTemplate.content.firstElementChild.cloneNode(true);\n      document.body.prepend(newMessage);\n    },\n\n    cardsWrapper: {\n      ['@click'](event) {\n        // We only want to trigger a change when clicking on a form field\n        const formField = event.target.closest('.form-builder__field-wrapper');\n        if (formField) {\n          this.deactivateFormFields();\n          this.activateFormField(formField.dataset.daId);\n          formField.scrollIntoView({ block: 'center', behavior: 'smooth' });\n        }\n      },\n    },\n\n    formField: {\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-100';\n      },\n      ['x-transition:enter-start']() {\n        return 'transform opacity-0';\n      },\n      ['x-transition:enter-end']() {\n        return 'transform opacity-100';\n      },\n      ['x-transition:leave']() {\n        return 'transition ease-in duration-75';\n      },\n      ['x-transition:leave-start']() {\n        return 'transform opacity-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'transform opacity-0';\n      },\n    },\n  };\n}\n","// NOTE(Robbe): For some reason this markers reference can't be kept inside Alpine's state\n// If we keep track of the markers within Alpine, the old markers don't disappear on setMap(null)\nconst searchResultMarkers = [];\n\nexport default function googleMapsAdmin(\n  originLatLng,\n  mapParams,\n  id,\n  isProjectSettingsPage = false,\n  noInteraction = false\n) {\n  const mapSettings = mapParams.mapSettings;\n  const mapOverlay = mapParams.mapOverlay;\n\n  return {\n    originLat: originLatLng.originLat,\n    originLng: originLatLng.originLng,\n    zoomLevel: mapSettings.zoomLevel,\n    markerURL:\n      mapParams.markerUrl || 'https://bpart-default-assets.s3.eu-central-1.amazonaws.com/img/map-default-marker.png',\n    overlayURL: mapOverlay.mapOverlayImageUrl,\n    geoJson: mapParams.geoJson,\n    showOverlay: mapOverlay.mapOverlayVisible,\n    mapType: mapSettings.mapType || 'roadmap',\n    showImageError: false,\n    showGeoJsonError: false,\n    overlayCoords: {\n      north: mapOverlay.overlayBoundNorth,\n      south: mapOverlay.overlayBoundSouth,\n      east: mapOverlay.overlayBoundEast,\n      west: mapOverlay.overlayBoundWest,\n    },\n    groundOverlay: null,\n    open: false,\n    latInput: this.$refs.latInput,\n    lngInput: this.$refs.lngInput,\n    map: null,\n\n    init() {\n      // Initialize the map (asynchronously)\n      this.initMap();\n\n      // If noInteraction is set to true, we don't want to watch for changes\n      if (noInteraction) return;\n\n      // Watch for changes in the overlay visibility\n      this.$watch('showOverlay', () => {\n        this.renderOverlays(this.map);\n      });\n      this.$watch('overlayCoords', () => {\n        if (this.overlayURL) {\n          this.removeOverlayImage();\n          this.renderOverlayImage(this.map);\n        }\n      });\n\n      // Since deleting an overlay image triggers a turbo-frame render,\n      // we listen to this event to remove the overlay image\n      const turboFrame = this.$el.querySelector('turbo-frame');\n      if (turboFrame) {\n        turboFrame.addEventListener('turbo:before-frame-render', (e) => {\n          if (this.overlayURL) {\n            this.removeOverlayImage();\n          }\n        });\n      }\n    },\n\n    async initMap() {\n      // Load the Google Maps API libraries\n      const { Map } = await google.maps.importLibrary('maps');\n      const { AdvancedMarkerElement } = await google.maps.importLibrary('marker');\n      const { Autocomplete } = await google.maps.importLibrary('places');\n\n      // add noInteraction boolen to change what is loaded\n      const lat = this.latInput?.value || this.originLat;\n      const lng = this.lngInput?.value || this.originLng;\n      const mapOptions = {\n        zoom: this.zoomLevel || 14,\n        center: { lat: parseFloat(lat), lng: parseFloat(lng) },\n        mapTypeId: this.mapType,\n        disableDefaultUI: noInteraction,\n        mapTypeControl: !noInteraction,\n        mapTypeControlOptions: {\n          style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,\n        },\n        gestureHandling: 'cooperative',\n        mapId: id,\n      };\n\n      // Create the map\n      let map = new Map(this.$refs.map, mapOptions);\n      this.map = map;\n\n      // Add a search box\n      if (this.$refs.searchBox) {\n        const placeAutocomplete = new Autocomplete(this.$refs.searchBox);\n\n        placeAutocomplete.addListener('place_changed', async (ev) => {\n          let value = this.$refs.searchBox.value;\n          await this.findPlaces(value, map, AdvancedMarkerElement);\n        });\n      }\n\n      // Add a listener to update the zoom level input unless noInteraction is set to true\n      if (!noInteraction) {\n        google.maps.event.addListener(map, 'zoom_changed', () => {\n          if (this.$refs.mapZoom) this.$refs.mapZoom.value = map.zoom;\n        });\n      }\n\n      // Add a marker when noInteraction is true\n      if (noInteraction) {\n        const icon = document.createElement('img');\n        icon.src = this.markerURL;\n\n        const markerLatLng = new google.maps.LatLng(lat, lng);\n\n        const marker = new AdvancedMarkerElement({\n          map: map,\n          position: markerLatLng,\n          content: icon,\n          gmpDraggable: false,\n        });\n\n        map.setCenter(markerLatLng);\n      }\n\n      // Add a clickable or draggable marker to input a location (for entry or profile)\n      // Draggable markers can be moved by using the keyboard. To activate dragging,\n      // press Option + Space or Option + Enter (Mac), ALT + Space or Alt + Enter (Windows).\n      if (this.latInput && this.lngInput) {\n        const icon = document.createElement('img');\n        icon.src = this.markerURL;\n\n        const markerLatLng = new google.maps.LatLng(lat, lng);\n\n        const marker = new AdvancedMarkerElement({\n          map: map,\n          position: markerLatLng,\n          content: icon,\n          gmpDraggable: true,\n        });\n\n        map.setCenter(markerLatLng);\n\n        if (!noInteraction) {\n          map.addListener('click', (mapsMouseEvent) => {\n            const mapPosition = mapsMouseEvent.latLng;\n            this.latInput.setAttribute('value', mapPosition.lat());\n            this.lngInput.setAttribute('value', mapPosition.lng());\n            marker.position = mapPosition;\n          });\n\n          marker.addListener('dragend', (evt) => {\n            const markerPosition = marker.position;\n            this.latInput.setAttribute('value', markerPosition.lat);\n            this.lngInput.setAttribute('value', markerPosition.lng);\n          });\n        }\n      }\n\n      // Add the overlay and geoJson to the map\n      this.renderOverlays(map);\n    },\n\n    renderOverlays(map) {\n      if (google && ((isProjectSettingsPage && this.showOverlay) || !isProjectSettingsPage)) {\n        if (this.overlayURL) this.renderOverlayImage(map);\n        if (this.geoJson) this.renderGeoJson(map);\n      } else {\n        this.removeOverlayImage();\n        this.removeGeoJson();\n      }\n    },\n\n    // Overlay Image\n\n    setOverlayImageURL(url) {\n      if (url) {\n        this.overlayURL = url;\n      } else {\n        this.overlayURL = this.$el.files[0] ? URL.createObjectURL(this.$el.files[0]) : '';\n      }\n    },\n\n    renderOverlayImage(map) {\n      //Extend the Overlay class so we can add a ground overlay to the map\n      class MapOverlay extends google.maps.OverlayView {\n        constructor(bounds, image) {\n          super();\n          this.bounds = bounds;\n          this.image = image;\n        }\n        //  onAdd is called when the map's panes are ready and the overlay has been added to the map.\n        onAdd() {\n          this.div = document.createElement('div');\n          this.div.style.borderStyle = 'none';\n          this.div.style.borderWidth = '0px';\n          this.div.style.position = 'absolute';\n          // Create the img element and attach it to the div.\n          const img = document.createElement('img');\n          img.src = this.image;\n          img.style.width = '100%';\n          img.style.height = '100%';\n          img.style.position = 'absolute';\n          this.div.appendChild(img);\n          // Add the element to the \"overlayLayer\" pane.\n          const panes = this.getPanes();\n          panes.overlayLayer.appendChild(this.div);\n        }\n        draw() {\n          // We use the south-west and north-east coordinates of the overlay to peg it to the correct position and size.\n          // To do this, we need to retrieve the projection from the overlay.\n          const overlayProjection = this.getProjection();\n          // Retrieve the south-west and north-east coordinates of this overlay in LatLngs and convert them to pixel coordinates.\n          // We'll use these coordinates to resize the div.\n          const sw = overlayProjection.fromLatLngToDivPixel(this.bounds.getSouthWest());\n          const ne = overlayProjection.fromLatLngToDivPixel(this.bounds.getNorthEast());\n\n          // Resize the image's div to fit the indicated dimensions.\n          if (this.div) {\n            this.div.style.left = sw.x + 'px';\n            this.div.style.top = ne.y + 'px';\n            this.div.style.width = ne.x - sw.x + 'px';\n            this.div.style.height = sw.y - ne.y + 'px';\n          }\n        }\n        //  The onRemove() method will be called automatically from the API if we ever set the overlay's map property to 'null'.\n        onRemove() {\n          if (this.div) {\n            this.div.parentNode.removeChild(this.div);\n            delete this.div;\n          }\n        }\n      }\n      if (checkOverlayValidity(this.overlayBounds(), this.overlayURL)) {\n        this.showImageError = false;\n        if (!google || !this.$refs.map) return;\n\n        this.groundOverlay = new MapOverlay(this.overlayBounds(), this.overlayURL);\n        this.groundOverlay.setMap(map);\n      } else {\n        this.showImageError = true;\n      }\n    },\n\n    overlayBounds() {\n      const overlayNorth = parseFloat(this.overlayCoords.north);\n      const overlaySouth = parseFloat(this.overlayCoords.south);\n      const overlayEast = parseFloat(this.overlayCoords.east);\n      const overlayWest = parseFloat(this.overlayCoords.west);\n\n      const bounds = new google.maps.LatLngBounds(\n        new google.maps.LatLng(overlaySouth, overlayWest),\n        new google.maps.LatLng(overlayNorth, overlayEast)\n      );\n      return bounds;\n    },\n\n    previewOverlayImage(url = null) {\n      this.removeOverlayImage();\n      this.setOverlayImageURL(url);\n      if (this.overlayURL) this.renderOverlayImage(this.map);\n    },\n\n    removeOverlayImage() {\n      this.groundOverlay && this.groundOverlay.setMap(null);\n    },\n\n    // GeoJSON\n\n    setGeoJson() {\n      const file = this.$el.files[0];\n      if (file) {\n        const reader = new FileReader();\n        reader.readAsText(file);\n        reader.onload = () => {\n          this.geoJson = reader.result;\n          this.renderGeoJson(this.map);\n        };\n      }\n    },\n\n    removeGeoJson() {\n      this.map.data.forEach((feature) => this.map.data.remove(feature));\n    },\n\n    renderGeoJson(map) {\n      if (checkGeoJsonValidity(this.geoJson)) {\n        this.showGeoJsonError = false;\n        if (!google || !this.$refs.map) return;\n\n        map.data.addGeoJson(JSON.parse(this.geoJson));\n        map.data.setStyle((feature) => {\n          return {\n            fillColor: feature.getProperty('fill'),\n            fillOpacity: feature.getProperty('fill-opacity'),\n            strokeColor: feature.getProperty('stroke'),\n            strokeOpacity: feature.getProperty('stroke-opacity'),\n            strokeWeight: feature.getProperty('stroke-width'),\n            title: feature.getProperty('title'),\n            clickable: false,\n          };\n        });\n      } else {\n        this.showGeoJsonError = true;\n      }\n    },\n\n    previewGeoJson() {\n      this.removeGeoJson();\n      this.setGeoJson();\n    },\n\n    async findPlaces(searchTerm, map) {\n      const { Place } = await google.maps.importLibrary('places');\n      const request = {\n        textQuery: searchTerm,\n        fields: ['displayName', 'location'],\n      };\n\n      const { places } = await Place.searchByText(request);\n\n      if (places.length) {\n        const { LatLngBounds } = await google.maps.importLibrary('core');\n        const bounds = new LatLngBounds();\n\n        // Loop through and get all the results.\n        places.forEach((place) => {\n          bounds.extend(place.location);\n        });\n\n        // zoom to the bounds if there are multiple places\n        if (places.length > 1) {\n          map.fitBounds(bounds);\n        } else {\n          map.setCenter(bounds.getCenter());\n          map.setZoom(this.zoomLevel || 14);\n        }\n      } else {\n        console.log('No results');\n      }\n    },\n\n    searchInput: {\n      ['@keydown.enter.prevent']() {\n        // Just here to prevent enter from submitting the form\n      },\n    },\n  };\n}\n\nconst checkOverlayValidity = (bounds, overlayURL) => {\n  if (bounds === false) return false;\n\n  const overlayBounds = bounds.toJSON();\n  const areImageBoundsValid = Object.values(overlayBounds).every((coord) => coord > 0);\n  const isImageUrlValid = overlayURL?.length > 0;\n\n  return areImageBoundsValid && isImageUrlValid;\n};\n\nconst checkGeoJsonValidity = (geoJson) => {\n  if (geoJson === '') return false;\n\n  const geoJsonObj = JSON.parse(geoJson);\n  // For definition of geoJson, see https://datatracker.ietf.org/doc/html/rfc7946#section-1.4\n  const typeList = [\n    'Feature',\n    'FeatureCollection',\n    'Point',\n    'MultiPoint',\n    'LineString',\n    'MultiLineString',\n    'Polygon',\n    'MultiPolygon',\n    'GeometryCollection',\n  ];\n\n  return typeList.includes(geoJsonObj.type);\n};\n","export function trapFocus(element, focusableEls) {\n  var firstFocusableEl = focusableEls[0];\n  var lastFocusableEl = focusableEls[focusableEls.length - 1];\n\n  element.addEventListener('keydown', function (e) {\n    var isTabPressed = (e.key === 'Tab' || e.keyCode === 9);\n\n    if (!isTabPressed) {\n      return;\n    }\n\n    if (e.shiftKey) /* shift + tab */ {\n      if (document.activeElement === firstFocusableEl) {\n        lastFocusableEl.focus();\n        e.preventDefault();\n      }\n    } else /* tab */ {\n      if (document.activeElement === lastFocusableEl) {\n        firstFocusableEl.focus();\n        e.preventDefault();\n      }\n    }\n  });\n}\n","import { trapFocus } from '~/scripts/trap-focus';\n\nexport default function modal(dynamicFocusableEls, trackUnsavedChanges = true) {\n  return {\n    open: false,\n    focusableEls: null,\n    dynamicFocusableEls: dynamicFocusableEls || false,\n    trackUnsavedChanges: trackUnsavedChanges,\n\n    init() {\n      // If the content of the modal is updated dynamically (e.g. via the x-show directive),\n      // set dynamicFocusableEls to true and dynamically assign the focusable elements\n      // to focusableEls.\n      if (this.dynamicFocusableEls) {\n        this.$watch('focusableEls', () => {\n          trapFocus(this.$refs.panel, this.focusableEls);\n        });\n      } else {\n        this.focusableEls = this.$refs.panel.querySelectorAll(\n          'a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])'\n        );\n\n        this.$watch('open', () => {\n          trapFocus(this.$refs.panel, this.focusableEls);\n        });\n      }\n    },\n\n    overlay: {\n      ['x-show']() {\n        return this.open;\n      },\n      ['@keyup.esc.prevent']() {\n        this.$refs.close.click();\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-300';\n      },\n      ['x-transition:enter-start']() {\n        return 'opacity-0';\n      },\n      ['x-transition:enter-end']() {\n        return 'opacity-100';\n      },\n      ['x-transition:leave']() {\n        return 'ease-in duration-200';\n      },\n      ['x-transition:leave-start']() {\n        return 'opacity-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'opacity-0';\n      },\n    },\n\n    input: {\n      ['x-on:keydown.enter.prevent']() {\n        return true;\n      },\n    },\n\n    close: {\n      ['x-on:click']() {\n        if (this.trackUnsavedChanges) {\n          this.$dispatch('closeModal');\n          if (!this.unsavedChanges) this.open = false;\n        } else {\n          this.open = false;\n        }\n      },\n    },\n\n    panel: {\n      ['x-show']() {\n        return this.open;\n      },\n      ['x-on:close']() {\n        this.$dispatch('closeModal');\n        if (!this.unsavedChanges) this.open = false;\n      },\n      ['x-on:click.outside']() {\n        this.$refs.close.click();\n      },\n      ['@keyup.esc.prevent']() {\n        this.$refs.close.click();\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-300';\n      },\n      ['x-transition:enter-start']() {\n        return 'transform opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95';\n      },\n      ['x-transition:enter-end']() {\n        return 'opacity-100 translate-y-0 sm:scale-100';\n      },\n      ['x-transition:leave']() {\n        return 'ease-in duration-200';\n      },\n      ['x-transition:leave-start']() {\n        return 'opacity-100 translate-y-0 sm:scale-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95';\n      },\n    },\n  };\n}\n","export default function moderationFilters(opts = {}) {\n  let timeout;\n\n  const debounce = (fn, ms) => {\n    clearTimeout(timeout);\n    timeout = setTimeout(fn, ms);\n  };\n\n  return {\n    showFilters: true,\n    openTopics: false,\n    openTags: false,\n    searchQuery: '',\n    publishStatus: opts.publishStatus,\n    moderationStatus: opts.moderationStatus,\n    topicsAvailable: opts.topics,\n    topicsSelected: [],\n    tagsAvailable: opts.tags,\n    tagsSelected: [],\n    activeFilters: {\n      publishStatus: false,\n      moderationStatus: false,\n      query: false,\n      topics: false,\n      tags: false,\n    },\n    activeFilterCount: 0,\n    sortBy: opts.sortBy,\n\n    init() {\n      this.setPublishStatusFilter(this.publishStatus, true);\n      this.setModerationStatusFilter(this.moderationStatus, true);\n      this.setTopicsFilter(true);\n      this.setTagsFilter(true);\n      this.$watch('searchQuery', () => this.submitFilters());\n    },\n\n    setPublishStatusFilter(status, skipSubmit = false) {\n      this.publishStatus = status;\n      this.$refs.publishStatus.value = status;\n      this.setActiveFilters();\n      if (!skipSubmit) this.submitFilters();\n    },\n\n    setModerationStatusFilter(status, skipSubmit = false) {\n      this.moderationStatus = status;\n      this.$refs.moderationStatus.value = status;\n      this.setActiveFilters();\n      if (!skipSubmit) this.submitFilters();\n    },\n\n    setTopicsFilter(skipSubmit = false) {\n      let ids = [];\n      this.$refs.topicFilters.querySelectorAll('input[data-topic-filter]').forEach((input) => {\n        if (input.checked) ids.push(parseInt(input.dataset.topicFilter));\n      });\n      this.topicsSelected = ids;\n      this.$refs.checkAllTopics.checked = this.allTopicsSelected();\n      this.setActiveFilters();\n      if (!skipSubmit) this.submitFilters();\n    },\n\n    toggleAllTopics() {\n      if (this.allTopicsSelected()) {\n        this.topicsSelected = [];\n        this.uncheckAllTopics();\n      } else {\n        this.topicsSelected = [...this.topicsAvailable];\n        this.checkAllTopics();\n      }\n    },\n\n    allTopicsSelected() {\n      return this.topicsAvailable.every((id) => this.topicsSelected.includes(id));\n    },\n\n    setTagsFilter(skipSubmit = false) {\n      let ids = [];\n      this.$refs.tagFilters.querySelectorAll('input[data-tag-filter]').forEach((input) => {\n        if (input.checked) ids.push(parseInt(input.dataset.tagFilter));\n      });\n      this.tagsSelected = ids;\n      this.$refs.checkAllTags.checked = this.allTagsSelected();\n      this.setActiveFilters();\n      if (!skipSubmit) this.submitFilters();\n    },\n\n    toggleAllTags() {\n      if (this.allTagsSelected()) {\n        this.tagsSelected = [];\n        this.uncheckAllTags();\n      } else {\n        this.tagsSelected = [...this.tagsAvailable];\n        this.checkAllTags();\n      }\n    },\n\n    allTagsSelected() {\n      return this.tagsAvailable.every((id) => this.tagsSelected.includes(id));\n    },\n\n    submitFilters() {\n      debounce(() => {\n        this.setActiveFilters();\n        this.$root.requestSubmit();\n      }, 550);\n    },\n\n    checkAllTopics(skipSubmit = false) {\n      this.$refs.topicFilters.querySelectorAll('input').forEach((input) => {\n        input.checked = true;\n      });\n      if (!skipSubmit) this.submitFilters();\n    },\n\n    uncheckAllTopics(skipSubmit = false) {\n      this.$refs.topicFilters.querySelectorAll('input').forEach((input) => {\n        input.checked = false;\n      });\n      if (!skipSubmit) this.submitFilters();\n    },\n\n    checkAllTags(skipSubmit = false) {\n      this.$refs.tagFilters.querySelectorAll('input').forEach((input) => {\n        input.checked = true;\n      });\n      if (!skipSubmit) this.submitFilters();\n    },\n\n    uncheckAllTags(skipSubmit = false) {\n      this.$refs.tagFilters.querySelectorAll('input').forEach((input) => {\n        input.checked = false;\n      });\n      if (!skipSubmit) this.submitFilters();\n    },\n\n    setActiveFilters() {\n      this.activeFilters = {\n        publishStatus: this.publishStatus !== 'all',\n        moderationStatus: this.moderationStatus !== 'all',\n        query: this.searchQuery !== '',\n        topics: this.topicsSelected.length > 0 && this.topicsSelected.length !== this.topicsAvailable.length,\n        tags: this.tagsSelected.length > 0,\n      };\n      this.activeFilterCount = Object.values(this.activeFilters).filter((active) => active).length;\n    },\n\n    resetFilters() {\n      this.setPublishStatusFilter('all', true);\n      this.setModerationStatusFilter('all', true);\n      this.uncheckAllTags(true);\n      this.setTagsFilter(true);\n      this.uncheckAllTopics(true);\n      this.setTopicsFilter(true);\n      this.submitFilters();\n      this.showFilters = true;\n      this.openTopics = false;\n    },\n\n    removeTopic(topicToRemove) {\n      this.$refs.topicFilters.querySelector(`input[data-topic-filter='${topicToRemove}']`).checked = false;\n      this.setTopicsFilter();\n    },\n\n    removeTag(tagToRemove) {\n      this.$refs.tagFilters.querySelector(`input[data-tag-filter='${tagToRemove}']`).checked = false;\n      this.setTagsFilter();\n    },\n\n    clearSearch() {\n      this.$refs.search.value = '';\n      this.searchQuery = '';\n      this.submitFilters();\n    },\n\n    reset: {\n      ['x-on:click.prevent.stop']() {\n        this.resetFilters();\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-100';\n      },\n      ['x-transition:enter-start']() {\n        return 'transform opacity-0 scale-95';\n      },\n      ['x-transition:enter-end']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave']() {\n        return 'transition ease-in duration-75';\n      },\n      ['x-transition:leave-start']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'transform opacity-0 scale-95';\n      },\n    },\n\n    filters: {\n      ['x-show']() {\n        return this.showFilters;\n      },\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-100';\n      },\n      ['x-transition:enter-start']() {\n        return 'transform opacity-0 scale-95';\n      },\n      ['x-transition:enter-end']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave']() {\n        return 'transition ease-in duration-75';\n      },\n      ['x-transition:leave-start']() {\n        return 'transform opacity-100 scale-100';\n      },\n      ['x-transition:leave-end']() {\n        return 'transform opacity-0 scale-95';\n      },\n    },\n  };\n}\n","export default function moderationMailTemplates(participantEmail = '') {\n  return {\n    selectedTemplate: null,\n\n    handleTemplateSelected(evt) {\n      const selectedTemplateId = evt.target.value;\n      this.selectedTemplate = document.querySelector(`[data-template-id='${selectedTemplateId}']`);\n\n      this.setEditorContent();\n      this.setRecipients();\n      this.setSubject();\n    },\n\n    setEditorContent() {\n      const content = this.selectedTemplate?.innerHTML || '';\n      this.$refs.editor && tinymce.get(this.$refs.editor.id).setContent(content);\n    },\n\n    setRecipients() {\n      const recipients = this.selectedTemplate?.dataset?.recipients ?? participantEmail;\n      this.$refs.recipients.value = recipients;\n    },\n\n    setSubject() {\n      const subject = this.selectedTemplate?.dataset?.subject || '';\n      this.$refs.subject.value = subject;\n    },\n  };\n}\n","export default function organizationSettings() {\n  return {\n    openAllSections: false,\n    useTwoColumns: false,\n    openGeneral: false,\n    openEmail: false,\n    openLanding: false,\n    openLanguage: false,\n    openSocialSignIn: false,\n    openAnalytics: false,\n    openFooter: false,\n    openCustom: false,\n    openStyling: false,\n    openOpenId: false,\n\n    init() {\n      if (this.supports_html5_storage()) {\n        if (localStorage.getItem('organisationSettingsUseTwoColumns')) {\n          this.useTwoColumns = localStorage.getItem('organisationSettingsUseTwoColumns') === 'true';\n        }\n        if (localStorage.getItem('organisationSettingsopenAllSections')) {\n          this.openAllSections = localStorage.getItem('organisationSettingsopenAllSections') === 'true';\n        }\n      }\n      this.setColumnLayout();\n      this.setSectionFold();\n    },\n\n    switchSectionFold() {\n      this.openAllSections = !this.openAllSections;\n      localStorage.setItem('organisationSettingsopenAllSections', this.openAllSections);\n\n      this.setSectionFold();\n    },\n\n    switchColumnView() {\n      this.useTwoColumns = !this.useTwoColumns;\n      localStorage.setItem('organisationSettingsUseTwoColumns', this.useTwoColumns);\n\n      this.setColumnLayout();\n    },\n\n    setSectionFold() {\n      // these attributes only control the chevron icon to point up or down\n      this.openGeneral = this.openAllSections;\n      this.openEmail = this.openAllSections;\n      this.openLanding = this.openAllSections;\n      this.openLanguage = this.openAllSections;\n      this.openSocialSignIn = this.openAllSections;\n      this.openAnalytics = this.openAllSections;\n      this.openFooter = this.openAllSections;\n      this.openCustom = this.openAllSections;\n      this.openStyling = this.openAllSections;\n      this.openOpenId = this.openAllSections;\n\n      // open or close all sections\n      const cardIds = [\n        'general',\n        'email',\n        'landing',\n        'language',\n        'socialSignIn',\n        'analytics',\n        'footer',\n        'custom',\n        'styling',\n        'openId',\n      ];\n\n      cardIds.forEach((cardId) => {\n        if (document.getElementById(cardId)) {\n          document.getElementById(cardId).open = this.openAllSections;\n        }\n      });\n    },\n\n    setColumnLayout() {\n      if (this.useTwoColumns) {\n        document.getElementById('settingsWrapper').classList.add('xl:flex', 'xl:gap-4', 'xl:space-y-0');\n      } else {\n        document.getElementById('settingsWrapper').classList.remove('xl:flex', 'xl:gap-4', 'xl:space-y-0');\n      }\n    },\n\n    supports_html5_storage() {\n      try {\n        return 'localStorage' in window && window['localStorage'] !== null;\n      } catch (e) {\n        return false;\n      }\n    },\n  };\n}\n","import { translate } from '~/scripts/locales/translations';\n\nconst locale = document.querySelector('html').getAttribute('lang');\n\nexport default function projectPath({ permittedDomains, currentDomainId, currentPath, forbiddenUrls }) {\n  return {\n    permittedDomains: JSON.parse(permittedDomains),\n    currentDomainId,\n    currentPath,\n    forbiddenUrls: JSON.parse(forbiddenUrls),\n    validPath: true,\n    newDomainId: null,\n    newPath: null,\n\n    init() {\n      this.newDomainId = Object.keys(this.permittedDomains)[0];\n      this.$watch('newPath', () => {\n        this.isValidPath();\n      });\n      this.$watch('newDomainId', () => {\n        this.isValidPath();\n      });\n      this.isValidPath();\n      this.errorMessage();\n    },\n\n    isValidPath() {\n      this.validPath = this.isValidUrl() && this.isCorrectFormat() && this.isCorrectLength();\n    },\n\n    isValidUrl() {\n      const domain = this.newDomainId\n        ? this.permittedDomains[this.newDomainId]\n        : this.permittedDomains[this.currentDomainId];\n      const path = this.newPath !== null ? this.newPath : this.currentPath;\n      const url = [domain, path].join('/').replace(/\\/$/, '');\n      return !Object.values(this.forbiddenUrls).includes(url);\n    },\n\n    isCorrectFormat() {\n      if (!this.newPath) return true;\n\n      return /^[a-zA-Z0-9-_]*$/.test(this.newPath);\n    },\n\n    isCorrectLength() {\n      if (!this.newPath) return true;\n\n      return this.newPath.length >= 3 && this.newPath.length <= 50;\n    },\n\n    errorMessage() {\n      if (!this.isValidUrl) {\n        this.$refs.pathErrorMessage.innerHTML = translate('path_error_messages', 'already_taken', locale);\n        this.$refs.pathInput.classList.remove('input--invalid');\n      } else if (!this.isCorrectFormat()) {\n        this.$refs.pathErrorMessage.innerHTML = translate('path_error_messages', 'wrong_format', locale);\n        this.$refs.pathInput.classList.add('input--invalid');\n      } else if (!this.isCorrectLength()) {\n        this.$refs.pathErrorMessage.innerHTML = translate('path_error_messages', 'wrong_length', locale);\n        this.$refs.pathInput.classList.add('input--invalid');\n      } else {\n        this.$refs.pathErrorMessage.innerHTML = '';\n        this.$refs.pathInput.classList.remove('input--invalid');\n      }\n    },\n  };\n}\n","export default function projectSettings() {\n  return {\n    openAllSections: false,\n    useTwoColumns: false,\n    openGeneral: false,\n    openSocial: false,\n    openIdeation: false,\n    openHomepage: false,\n    openGoogle: false,\n    openLanding: false,\n    openAuthentication: false,\n    openEmails: false,\n    openAnalytics: false,\n    openLanguage: false,\n    openTemplate: false,\n    openFooter: false,\n    openCcmServices: false,\n    openVoting: false,\n    openUrl: false,\n\n    init() {\n      if (this.supports_html5_storage()) {\n        if (localStorage.getItem('projectSettingsUseTwoColumns')) {\n          this.useTwoColumns = localStorage.getItem('projectSettingsUseTwoColumns') === 'true';\n        }\n        if (localStorage.getItem('projectSettingsopenAllSections')) {\n          this.openAllSections = localStorage.getItem('projectSettingsopenAllSections') === 'true';\n        }\n      }\n      this.setColumnLayout();\n      this.setSectionFold();\n    },\n\n    switchSectionFold() {\n      this.openAllSections = !this.openAllSections;\n      localStorage.setItem('projectSettingsopenAllSections', this.openAllSections);\n\n      this.setSectionFold();\n    },\n\n    switchColumnView() {\n      this.useTwoColumns = !this.useTwoColumns;\n      localStorage.setItem('projectSettingsUseTwoColumns', this.useTwoColumns);\n\n      this.setColumnLayout();\n    },\n\n    setSectionFold() {\n      // these attributes only control the chevron icon to point up or down\n      this.openGeneral = this.openAllSections;\n      this.openSocial = this.openAllSections;\n      this.openIdeation = this.openAllSections;\n      this.openHomepage = this.openAllSections;\n      this.openGoogle = this.openAllSections;\n      this.openLanding = this.openAllSections;\n      this.openAuthentication = this.openAllSections;\n      this.openEmails = this.openAllSections;\n      this.openAnalytics = this.openAllSections;\n      this.openLanguage = this.openAllSections;\n      this.openTemplate = this.openAllSections;\n      this.openFooter = this.openAllSections;\n      this.openCcmServices = this.openAllSections;\n      this.openVoting = this.openAllSections;\n      this.openUrl = this.openAllSections;\n\n      // open or close all sections\n      const cardIds = [\n        'general',\n        'social',\n        'ideation',\n        'homepage',\n        'google',\n        'landing',\n        'authentication',\n        'emails',\n        'analytics',\n        'language',\n        'template',\n        'footer',\n        'services',\n        'initial',\n        'voting',\n        'url',\n      ];\n\n      cardIds.forEach((cardId) => {\n        if (document.getElementById(cardId)) {\n          document.getElementById(cardId).open = this.openAllSections;\n        }\n      });\n    },\n\n    setColumnLayout() {\n      if (this.useTwoColumns) {\n        document.getElementById('settingsWrapper').classList.add('xl:flex', 'xl:gap-4', 'xl:space-y-0');\n      } else {\n        document.getElementById('settingsWrapper').classList.remove('xl:flex', 'xl:gap-4', 'xl:space-y-0');\n      }\n    },\n\n    supports_html5_storage() {\n      try {\n        return 'localStorage' in window && window['localStorage'] !== null;\n      } catch (e) {\n        return false;\n      }\n    },\n  };\n}\n","export default function sidebar() {\n  return {\n    expanded: false,\n    openGroup: \"\",\n\n    init() {\n      const trigger = document.getElementById('sidebar-collapse-trigger');\n      trigger.addEventListener('click', () => {\n        this.expanded = !this.expanded;\n      });\n\n      const groups = this.$root.querySelectorAll('[x-bind=\"groupContent\"]');\n      \n      groups.forEach((group) => {\n        if (group.querySelector('.nav__item--active')) this.openGroup = group.id;\n      })\n    },\n    toggleGroup(id) {\n      this.openGroup = this.openGroup === id ? \"\" : id;\n    },\n\n    groupContent: {\n      ['x-transition:enter']() {\n        return 'transition ease-out duration-1000 overflow-y-hidden';\n      },\n      ['x-transition:enter-start']() {\n        return 'h-0';\n      },\n      ['x-transition:enter-end']() {\n        return 'h-full';\n      },\n      ['x-transition:leave']() {\n        return 'transition ease-in duration-1000 overflow-y-hidden';\n      },\n      ['x-transition:leave-start']() {\n        return 'h-full';\n      },\n      ['x-transition:leave-end']() {\n        return 'h-0';\n      },\n    }\n  }\n}","import Sortable from 'sortablejs';\n\n// A tiny wrapper around Sortable\n// By default we use the root element of this component\n// You can also set an element within this component with target\nexport default function sortableList({ paramKey, target = null }) {\n  return {\n    sortable: null,\n    paramKey: paramKey,\n\n    init() {\n      const selectedTarget = this.$el.querySelector(target);\n      this.sortable = new Sortable(selectedTarget ?? this.$el, {\n        handle: '[data-sortable=\"handle\"]',\n        dataIdAttr: 'data-sortable-id',\n        onUpdate: () => this.update(),\n      });\n      \n    },\n\n    update() {\n      const body = {}\n      body[this.paramKey] = this.sortable.toArray();\n      const token = document.querySelector('meta[name=csrf-token]')?.getAttribute('content');\n      const request = new Request(this.$root.getAttribute('data-sortable-update-url'), {\n        method: 'POST',\n        headers: {\n          'content-type': 'application/json',\n          'X-CSRF-Token': token,\n        },\n        body: JSON.stringify(body),\n      });\n      fetch(request);\n    },\n    \n  };\n}\n","import Sortable from 'sortablejs';\n\n// A tiny wrapper around Sortable\n// By default we use the root element of this component\n// You can also set an element within this component with target\nexport default function sortableHomepage({ paramKey, target = null }) {\n  return {\n    sortable: null,\n    paramKey: paramKey,\n\n    init() {\n      const selectedTarget = this.$el.querySelector(target);\n      this.sortable = new Sortable(selectedTarget ?? this.$el, {\n        handle: '[data-sortable=\"handle\"]',\n        dataIdAttr: 'data-sortable-id',\n        onUpdate: () => this.update(),\n      });\n      \n    },\n\n    update() {\n      const sortorder = this.sortable.toArray();\n      sortorder.forEach((element, index) => {\n        const selected = document.getElementById(`project_${element}_homepage_sortorder`);\n        selected.value = index + 1;\n      });\n    },\n    \n  };\n}\n","export default function settingsWizard() {\n  return {\n    openPage: 1,\n\n    init() {\n      this.$watch('open', () => { this.focusableEls = this.setFocusableElements() });\n      this.$watch('openPage', () => { this.focusableEls = this.setFocusableElements() });\n    },\n\n    setFocusableElements() {\n      const visibleModalElement = document.querySelector(`.settings-wizard__card[x-show=\"openPage === ${this.openPage}\"]`);\n      const selectors = 'a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input[type=\"text\"]:not([disabled]), input[type=\"radio\"]:not([disabled]), input[type=\"checkbox\"]:not([disabled]), select:not([disabled])';\n      const modalClose = document.querySelector('.modal__close');\n      let focusableElements = visibleModalElement.querySelectorAll(selectors);\n\n      focusableElements = Array.from(focusableElements);\n\n      focusableElements.unshift(modalClose);\n\n      return focusableElements;\n    }\n  }\n}\n","import 'core-js/stable';\nimport 'regenerator-runtime/runtime';\nimport '@hotwired/turbo-rails';\n\n// Import and start extra dependencies\nimport '../scripts';\nimport { scrollToInvalid } from '../scripts/scroll';\n\n// Setup Alpine and components\nimport Alpine from 'alpinejs';\nimport autocomplete from '../alpine/auto-complete';\nimport autoFlag from '../alpine/auto-flag';\nimport autoUpdate from '../alpine/auto-update';\nimport beforeUnload from '../alpine/before-unload';\nimport clipboard from '../alpine/clipboard';\nimport combobox from '../alpine/combobox';\nimport dropdown from '../alpine/dropdown';\nimport fileUpload from '../alpine/file-upload';\nimport formBuilder from '../alpine/form-builder';\nimport googleMapsAdmin from '../alpine/google-maps-admin';\nimport modal from '../alpine/modal';\nimport moderationFilters from '../alpine/moderation-filters';\nimport moderationMailTemplates from '../alpine/moderation-mail-templates';\nimport organizationSettings from '../alpine/organization-settings';\nimport projectPath from '../alpine/project-path';\nimport projectSettings from '../alpine/project-settings';\nimport sidebar from '../alpine/sidebar';\nimport sortableList from '../alpine/sortable-list';\nimport sortableHomepage from '../alpine/sortable-homepage';\nimport settingsWizard from '../alpine/settings-wizard';\n\nwindow.Alpine = Alpine;\nAlpine.data('autocomplete', autocomplete);\nAlpine.data('autoFlag', autoFlag);\nAlpine.data('autoUpdate', autoUpdate);\nAlpine.data('beforeUnload', beforeUnload);\nAlpine.data('clipboard', clipboard);\nAlpine.data('combobox', combobox);\nAlpine.data('dropdown', dropdown);\nAlpine.data('fileUpload', fileUpload);\nAlpine.data('formBuilder', formBuilder);\nAlpine.data('googleMapsAdmin', googleMapsAdmin);\nAlpine.data('modal', modal);\nAlpine.data('moderationFilters', moderationFilters);\nAlpine.data('moderationMailTemplates', moderationMailTemplates);\nAlpine.data('organizationSettings', organizationSettings);\nAlpine.data('projectPath', projectPath);\nAlpine.data('projectSettings', projectSettings);\nAlpine.data('sidebar', sidebar);\nAlpine.data('sortableList', sortableList);\nAlpine.data('sortableHomepage', sortableHomepage);\nAlpine.data('settingsWizard', settingsWizard);\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  Alpine.start();\n  scrollToInvalid();\n});\n"],"names":["replaceContent","query","content","el","closeModal","id","modal","closeEvent","scrollBehavior","scrollIntoViewIfNeeded","element","checkInView","scrollToInvalid","firstInvalidElement","containerBox","elementBox","autocomplete","activeClass","selectedClass","value","index","oldIndex","_a","_b","newValue","newOption","option","o","g","dir","up","newIndex","selectedOption","$event","autoFlag","name","url","body","token","request","autoUpdate","beforeUnload","event","discardUnsavedChangesMsg","translate","clipboard","combobox","opt","indexes","oldIndexes","valueIndex","v","dropdown","item","searchTerm","word","MAX_IMAGE_SIZE","MAX_IMAGE_DIMENSION","reduce","ImageBlobReduce","locale","fileUpload","filename","fileExists","preview","fileExtension","videoExtensions","errorElement","inputField","input","file","fireSwal","img","reader","blob","transfer","reducedImg","e","ownKeys","object","enumerableOnly","keys","symbols","sym","_objectSpread2","target","i","source","key","_defineProperty","_typeof","obj","_extends","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","version","userAgent","pattern","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","on","fn","off","matches","selector","getParentOrHost","closest","ctx","includeCTX","R_SPACE","toggleClass","state","className","css","prop","val","style","matrix","selfOnly","appliedTransforms","transform","matrixFn","find","tagName","iterator","list","n","getWindowScrollingElement","scrollingElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","container","elRect","top","left","bottom","right","height","width","containerRect","elMatrix","scaleX","scaleY","isScrolledPast","elSide","parentSide","parent","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","options","includeDragEl","currentChild","children","Sortable","lastChild","last","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","indexOfObject","arr","includeSelf","elem","gotSelf","elemCSS","extend","dst","src","isRectEqual","rect1","rect2","_throttleTimeout","throttle","callback","ms","args","_this","cancelThrottle","scrollBy","x","y","clone","Polymer","$","getChildContainingRectFromElement","ghostEl","rect","child","_rect$left","_rect$top","_rect$right","_rect$bottom","childRect","expando","AnimationStateManager","animationStates","animationCallbackId","fromRect","childMatrix","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","currentRect","duration","translateX","translateY","repaint","plugins","defaults","PluginManager","plugin","p","eventName","sortable","evt","eventNameGlobal","pluginName","initialized","modified","eventProperties","modifiedValue","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","allEventProperties","_excluded","pluginEvent","data","dragEl","parentEl","nextEl","lastDownEl","cloneHidden","moved","_hideGhostForTarget","_unhideGhostForTarget","_dispatchEvent","info","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","supportCssPointerEvents","_detectDirection","elCSS","elWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","secondChildWidth","touchingSideChild2","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","ret","threshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","to","from","sameGroup","otherGroup","group","originalGroup","nearestEmptyInsertDetectEvent","nearest","_checkOutsideTargetEl","dataTransfer","preventOnFilter","type","touch","originalTarget","filter","_saveInputCheckedState","criteria","ownerDocument","dragStartFn","_disableDraggable","_nextTick","fallback","inserted","fallbackTolerance","fallbackOffset","ghostMatrix","relativeScrollOffset","dx","dy","cssMatrix","revert","activeSortable","isOwner","canSort","fromSortable","completedFired","dragOverEvent","extra","completed","after","_onMove","changed","capture","insertion","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","direction","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","dragIndex","nextSibling","moveVector","_unsilent","_cancelNextTick","_globalDragOver","order","_generateId","useAnimation","items","store","willInsertAfter","onMoveFn","retVal","firstElRect","childContainingRect","spacer","lastElRect","swapThreshold","invertedSwapThreshold","invertSwap","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","str","sum","root","inputs","idx","_len","_key","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","_ref2","clearPointerElemChangedInterval","clearAutoScrolls","autoScroll","ogElemScroller","newElem","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","layersOut","currentParent","canScrollX","canScrollY","scrollWidth","scrollHeight","scrollPosX","scrollPosY","vx","vy","scrollOffsetY","scrollOffsetX","drop","dispatchSortableEvent","hideGhostForTarget","unhideGhostForTarget","toSortable","Revert","_ref3","Remove","_ref4","parentSortable","formBuilder","activeLocale","locales","attributable_type","formField","da","firstFormField","spinner","image","newFieldBottomButton","newFormField","newSettingsField","formFieldHeader","sortOrderInput","regex","formFieldForLocale","placeholder","optionsInputForLocale","optionForLocale","settingsField","requiredField","privateField","maxCharsField","internal_name","requiredCheckbox","privateCheckbox","maxChars","customMarkerUrl","currentFormField","otherFormField","arrow","cards","viaConfirmation","boolean","optionTemplate","field","formFieldOptionsInput","formFieldOptions","code","newMessage","googleMapsAdmin","originLatLng","mapParams","isProjectSettingsPage","noInteraction","mapSettings","mapOverlay","turboFrame","Map","AdvancedMarkerElement","Autocomplete","lat","lng","mapOptions","map","ev","icon","markerLatLng","marker","mapsMouseEvent","mapPosition","markerPosition","MapOverlay","bounds","overlayProjection","sw","ne","checkOverlayValidity","overlayNorth","overlaySouth","overlayEast","overlayWest","feature","checkGeoJsonValidity","Place","places","LatLngBounds","place","overlayURL","overlayBounds","areImageBoundsValid","coord","isImageUrlValid","geoJson","geoJsonObj","trapFocus","focusableEls","firstFocusableEl","lastFocusableEl","isTabPressed","dynamicFocusableEls","trackUnsavedChanges","moderationFilters","opts","timeout","debounce","status","skipSubmit","ids","active","topicToRemove","tagToRemove","moderationMailTemplates","participantEmail","selectedTemplateId","recipients","subject","organizationSettings","cardId","projectPath","permittedDomains","currentDomainId","currentPath","forbiddenUrls","domain","path","projectSettings","sidebar","sortableList","paramKey","selectedTarget","sortableHomepage","selected","settingsWizard","visibleModalElement","selectors","modalClose","focusableElements","Alpine"],"mappings":"kKAEO,SAASA,GAAeC,EAAOC,EAAS,CAC7C,MAAMC,EAAK,SAAS,cAAcF,CAAK,EACnCE,IAAIA,EAAG,UAAYD,EACzB,CAEO,SAASE,GAAWC,EAAI,CAC7B,MAAMC,EAAQ,SAAS,cAAcD,CAAE,EACjCE,EAAa,IAAI,MAAM,OAAO,EACpCD,EAAM,cAAcC,CAAU,CAChC,CAGA,OAAO,MAAQ,CAAE,EACjB,OAAO,MAAM,WAAaH,GAC1B,OAAO,MAAM,eAAiBJ,GChB9B,MAAMQ,GAAiB,CACrB,SAAU,SACV,MAAO,MACP,OAAQ,SACV,EAEO,SAASC,GAAuBC,EAAS,CAC1CC,GAAYD,CAAO,GAEvBA,EAAQ,eAAeF,EAAc,CACvC,CAEO,MAAMI,GAAkB,IAAM,CACnC,MAAMC,EAAsB,SAAS,cAAc,iBAAiB,EAChEA,GAAqBA,EAAoB,eAAeL,EAAc,CAC5E,EAEA,SAASG,GAAYD,EAAS,CAI5B,MAAMI,EADY,SAAS,cAAc,MAAM,EAChB,sBAAuB,EAEhDC,EAAaL,EAAQ,sBAAuB,EAGlD,OADeI,EAAa,OAASC,EAAW,MAElD,CCzBe,SAASC,GAAa,CACnC,YAAAC,EAAc,+BACd,cAAAC,EAAgB,gCAClB,EAAI,GAAI,CACN,MAAO,CACL,SAAU,GACV,MAAO,GACP,QAAS,CAAE,EACX,OAAQ,CAAE,EACV,YAAa,GACb,cAAe,GACf,cAAe,MAAM,QAAQD,CAAW,EAAIA,EAAc,CAACA,CAAW,EACtE,gBAAiB,MAAM,QAAQC,CAAa,EAAIA,EAAgB,CAACA,CAAa,EAE9E,MAAO,CACL,MAAMC,EAAQ,KAAK,MAAM,MAAM,MAI/B,KAAK,OAAO,cAAe,CAACC,EAAOC,IAAa,UAC9CC,EAAA,KAAK,QAAQD,CAAQ,IAArB,MAAAC,EAAwB,UAAU,OAAO,GAAG,KAAK,gBACjDC,EAAA,KAAK,QAAQH,CAAK,IAAlB,MAAAG,EAAqB,UAAU,IAAI,GAAG,KAAK,cACnD,CAAO,EACD,KAAK,OAAO,gBAAiB,CAACH,EAAOC,IAAa,UAChDC,EAAA,KAAK,QAAQD,CAAQ,IAArB,MAAAC,EAAwB,UAAU,OAAO,GAAG,KAAK,kBACjDC,EAAA,KAAK,QAAQH,CAAK,IAAlB,MAAAG,EAAqB,UAAU,IAAI,GAAG,KAAK,iBAC3C,IAAIC,EAAW,KAAK,QAAQJ,CAAK,EAAE,aAAa,yBAAyB,EACzE,GAAII,IAAa,MAAO,CACtB,IAAIC,EAAY,SAAS,cAAc,QAAQ,EAC/CD,EAAW,KAAK,MAChBC,EAAU,MAAQD,EAClB,KAAK,MAAM,MAAM,YAAYC,CAAS,CAChD,CACQ,KAAK,MAAM,MAAM,MAAQD,CACjC,CAAO,EAGD,KAAK,QAAU,KAAK,IAAI,iBAAiB,iBAAiB,EAC1D,KAAK,OAAS,KAAK,IAAI,iBAAiB,mBAAmB,EAC3D,KAAK,QAAQ,QAAQ,CAACE,EAAQN,IAAU,CACtCM,EAAO,iBAAiB,YAAa,IAAO,KAAK,YAAcN,CAAM,EACrEM,EAAO,iBAAiB,WAAY,IAAO,KAAK,YAAc,EAAG,EACjEA,EAAO,iBAAiB,QAAS,IAAM,KAAK,kBAAiB,CAAE,EAC3DA,EAAO,aAAa,yBAAyB,IAAMP,IAAO,KAAK,cAAgBC,EAC3F,CAAO,EAGD,KAAK,OAAO,WAAY,IAAM,CAAC,KAAK,WAAa,KAAK,YAAc,GAAG,EAGvE,KAAK,OAAO,WAAY,IAAM,CACxB,KAAK,UACP,KAAK,UAAU,IAAMX,GAAuB,KAAK,MAAM,cAAc,mBAAmB,CAAC,CAAC,CAEpG,CAAO,EAGD,KAAK,OAAO,QAAS,IAAM,KAAK,cAAa,CAAE,EAG/C,KAAK,MAAM,MAAM,OAAS,EAC3B,EAED,mBAAoB,CACd,KAAK,cAAgB,KAAI,KAAK,cAAgB,KAAK,aACvD,KAAK,SAAW,CAAC,KAAK,QACvB,EAED,eAAgB,CACd,KAAK,QAAQ,QACVkB,GACAA,EAAE,OACD,EAAE,KAAK,MAAM,SAAW,GAAKA,EAAE,aAAa,yBAAyB,IAAM,QAC3EA,EAAE,YAAY,KAAM,EAAC,YAAa,EAAC,QAAQ,KAAK,MAAM,YAAa,CAAA,IAAM,EAC5E,EACD,KAAK,OAAO,QAASC,GAAOA,EAAE,OAASA,EAAE,iBAAiB,+BAA+B,EAAE,SAAW,CAAE,CACzG,EAED,eAAeC,EAAK,CAClB,MAAMC,EAAKD,IAAQ,KACd,KAAK,WAAU,KAAK,SAAW,IACpC,IAAIE,EAAW,KAAK,YACpB,EAGE,IAFAA,GAAYD,EAAK,GAAK,EAEjBA,GAAMC,IAAa,IAAOA,IAAa,KAAK,QAAQ,OAAQ,aAC1D,KAAK,QAAQA,CAAQ,EAAE,QAAU,KAAK,QAAQ,UACvD,KAAK,YAAcA,CACpB,EAED,IAAI,cAAe,CACjB,GAAI,KAAK,SAAU,OAAO,KAAK,MAE/B,MAAMC,EAAiB,KAAK,QAAQ,KAAK,aAAa,EACtD,OAAOA,EAAiBA,EAAe,YAAc,EACtD,EAED,QAAS,CACN,UAAY,CACX,KAAK,SAAW,EACjB,EACA,2BAA6B,CAC5B,KAAK,SAAW,EACjB,EACA,6BAA+B,CAC9B,KAAK,kBAAmB,CACzB,EACA,2BAA6B,CAC5B,KAAK,eAAe,IAAI,CACzB,EACA,6BAA+B,CAC9B,KAAK,eAAe,MAAM,CAC3B,EACA,SAAUC,EAAQ,CACjB,KAAK,SAAW,GAChB,KAAK,MAAQA,EAAO,OAAO,KAC5B,CACF,EAED,OAAQ,CACL,UAAY,CACX,OAAO,KAAK,QACb,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,8BACR,EACA,0BAA4B,CAC3B,MAAO,iCACR,EACA,sBAAwB,CACvB,MAAO,gCACR,EACA,4BAA8B,CAC7B,MAAO,iCACR,EACA,0BAA4B,CAC3B,MAAO,8BACR,CACF,CACF,CACH,CCjJe,SAASC,GAASC,EAAMC,EAAK,CAC1C,MAAO,CACL,KAAAD,EACA,IAAAC,EAEA,MAAO,CACL,KAAK,IAAI,iBAAiB,SAAU,IAAM,KAAK,cAAc,CAC9D,EAED,cAAe,OACb,MAAMC,EAAO,CAAE,MAAO,EAAI,EAC1BA,EAAK,MAAM,KAAK,IAAI,EAAI,KAAK,MAAM,QAEnC,MAAMC,GAAQhB,EAAA,SAAS,cAAc,uBAAuB,IAA9C,YAAAA,EAAiD,aAAa,WACtEiB,EAAU,IAAI,QAAQ,KAAK,IAAK,CACpC,OAAQ,QACR,QAAS,CACP,eAAgB,mBAChB,eAAgBD,CACjB,EACD,KAAM,KAAK,UAAUD,CAAI,CAC1B,CAAA,EACD,MAAME,CAAO,CACnB,CACA,CACA,CCzBe,SAASC,GAAWL,EAAMC,EAAK,CAC5C,MAAO,CACL,KAAAD,EACA,IAAAC,EAEA,MAAO,CACL,KAAK,IAAI,iBAAiB,SAAU,IAAM,KAAK,cAAc,CAC9D,EAED,cAAe,OACb,MAAMC,EAAO,CAAE,OAAQ,EAAI,EAC3BA,EAAK,OAAO,KAAK,IAAI,EAAI,KAAK,MAAM,MACpC,MAAMC,GAAQhB,EAAA,SAAS,cAAc,uBAAuB,IAA9C,YAAAA,EAAiD,aAAa,WACtEiB,EAAU,IAAI,QAAQ,KAAK,IAAK,CACpC,OAAQ,QACR,QAAS,CACP,eAAgB,mBAChB,eAAgBD,CACjB,EACD,KAAM,KAAK,UAAUD,CAAI,CAC1B,CAAA,EACD,MAAME,CAAO,CACnB,CACA,CACA,CCtBe,SAASE,IAAe,CACrC,MAAO,CACL,eAAgB,GAEhB,MAAO,CACL,KAAK,IAAI,iBAAiB,gBAAiB,IAAM,KAAK,iBAAiB,EACvE,KAAK,oBAAsB,KAAK,oBAAoB,KAAK,IAAI,CAC9D,EAED,oBAAoBC,EAAO,CACzB,GAAK,KAAK,eAEV,GAAIA,EAAM,MAAQ,eAChBA,EAAM,eAAgB,MACjB,CACL,MAAMC,EAA2BC,EAAU,gBAAiB,kBAAmB,SAAS,gBAAgB,IAAI,EAExG,OAAO,QAAQD,CAAwB,EACzC,KAAK,eAAiB,GAEtBD,EAAM,eAAgB,CAEhC,CACK,EAGD,iBAAkB,CACZ,KAAK,iBACT,KAAK,eAAiB,GACtB,OAAO,iBAAiB,eAAgB,KAAK,mBAAmB,EAChE,OAAO,iBAAiB,qBAAsB,KAAK,mBAAmB,EACtE,OAAO,iBAAiB,aAAc,KAAK,mBAAmB,EAC/D,EAED,mBAAoB,CAClB,KAAK,eAAiB,GACtB,OAAO,oBAAoB,eAAgB,KAAK,mBAAmB,EACnE,OAAO,oBAAoB,qBAAsB,KAAK,mBAAmB,EACzE,OAAO,oBAAoB,aAAc,KAAK,mBAAmB,CAClE,EAED,KAAM,CACH,cAAgB,CACf,KAAK,gBAAiB,CACvB,EACA,eAAiB,CAChB,KAAK,kBAAmB,CACzB,CACF,EAED,WAAY,CACT,cAAgB,CACf,KAAK,gBAAiB,CACvB,CACF,CACF,CACH,CC1De,SAASG,GAAUT,EAAK,CACrC,MAAO,CACL,IAAAA,EACA,YAAa,GACb,UAAW,GAEX,aAAc,CACZ,GAAI,CACF,OAAO,UAAU,UAAU,UAAU,KAAK,GAAG,EAC7C,KAAK,YAAc,GACnB,WAAW,IAAM,KAAK,YAAc,GAAO,IAAI,CACvD,MAAc,CACN,KAAK,UAAY,GACjB,WAAW,IAAM,KAAK,UAAY,GAAO,IAAI,CACrD,CACA,CACA,CACA,CCZe,SAASU,GAAS,CAC/B,YAAA7B,EAAc,2BACd,cAAAC,EAAgB,4BAClB,EAAI,GAAI,CACN,MAAO,CACL,SAAU,GACV,MAAO,GACP,QAAS,CAAE,EACX,OAAQ,CAAE,EACV,YAAa,GACb,gBAAiB,CAAE,EACnB,eAAgB,CAAE,EAClB,cAAe,MAAM,QAAQD,CAAW,EAAIA,EAAc,CAACA,CAAW,EACtE,gBAAiB,MAAM,QAAQC,CAAa,EAAIA,EAAgB,CAACA,CAAa,EAE9E,MAAO,CAEL,CAAC,GAAG,KAAK,MAAM,MAAM,eAAe,EAAE,QAAS6B,GAAQ,KAAK,eAAe,KAAKA,EAAI,KAAK,CAAC,EAI1F,KAAK,OAAO,cAAe,CAAC3B,EAAOC,IAAa,UAC9CC,EAAA,KAAK,QAAQD,CAAQ,IAArB,MAAAC,EAAwB,UAAU,OAAO,GAAG,KAAK,gBACjDC,EAAA,KAAK,QAAQH,CAAK,IAAlB,MAAAG,EAAqB,UAAU,IAAI,GAAG,KAAK,cACnD,CAAO,EACD,KAAK,OAAO,kBAAmB,CAACyB,EAASC,IAAe,CACtDA,EAAW,QAAS5B,GAAQ,OAAK,OAAAC,EAAA,KAAK,QAAQD,CAAQ,IAArB,YAAAC,EAAwB,UAAU,OAAO,GAAG,KAAK,iBAAgB,EAClG0B,EAAQ,QAAS5B,GAAK,OAAK,OAAAE,EAAA,KAAK,QAAQF,CAAK,IAAlB,YAAAE,EAAqB,UAAU,IAAI,GAAG,KAAK,iBAAgB,CAC9F,CAAO,EAGD,KAAK,QAAU,KAAK,IAAI,iBAAiB,iBAAiB,EAC1D,KAAK,OAAS,KAAK,IAAI,iBAAiB,mBAAmB,EAC3D,KAAK,QAAQ,QAAQ,CAACI,EAAQN,IAAU,CACtCM,EAAO,iBAAiB,YAAa,IAAO,KAAK,YAAcN,CAAM,EACrEM,EAAO,iBAAiB,WAAY,IAAO,KAAK,YAAc,EAAG,EACjEA,EAAO,iBAAiB,QAAS,IAAM,KAAK,qBAAoB,CAAE,EAC9D,KAAK,eAAe,SAASA,EAAO,aAAa,qBAAqB,CAAC,GAAG,KAAK,gBAAgB,KAAKN,CAAK,CACrH,CAAO,EAGD,KAAK,OAAO,WAAY,IAAM,CAAC,KAAK,WAAa,KAAK,YAAc,GAAG,EAGvE,KAAK,OAAO,WAAY,IAAM,CACxB,KAAK,UACP,KAAK,UAAU,IAAMX,GAAuB,KAAK,MAAM,cAAc,mBAAmB,CAAC,CAAC,CAEpG,CAAO,EAGD,KAAK,OAAO,QAAS,IAAM,KAAK,cAAa,CAAE,EAG/C,KAAK,MAAM,MAAM,OAAS,EAC3B,EAED,sBAAuB,CACjB,KAAK,cAAgB,GACvB,KAAK,gBAAgB,SAAS,KAAK,WAAW,EAAI,KAAK,qBAAoB,EAAK,KAAK,kBAAmB,EAExG,KAAK,kBAAmB,EAG1B,KAAK,SAAW,CAAC,KAAK,QACvB,EAED,mBAAoB,CAElB,GAAI,KAAK,eAAe,SAAS,KAAK,KAAK,EAAG,CAC5C,KAAK,WAAY,EACjB,MACR,CAEM,IAAIe,EAAW,MAAM,KAAK,KAAK,OAAO,EAAE,GAAG,KAAK,WAAW,EAAE,aAAa,qBAAqB,EAE/F,GAAIA,IAAa,MAAO,CAEtB,GAAI,CAAG,KAAK,MAAO,OAEnB,IAAIC,EAAY,SAAS,cAAc,QAAQ,EAC/CD,EAAW,KAAK,MAChBC,EAAU,MAAQD,EAClBC,EAAU,aAAa,WAAY,UAAU,EAC7C,KAAK,MAAM,MAAM,YAAYA,CAAS,CAC9C,MAEQ,KAAK,gBAAgB,KAAK,KAAK,WAAW,EAC1C,KAAK,MAAM,MAAM,cAAc,WAAWD,CAAQ,IAAI,EAAE,aAAa,WAAY,UAAU,EAG7F,KAAK,eAAe,KAAKA,CAAQ,EAEjC,KAAK,WAAY,EAEjB,KAAK,UAAU,4BAA4B,CAC5C,EAED,YAAa,CACX,KAAK,MAAQ,GACb,KAAK,MAAM,MAAM,MAAQ,EAC1B,EAED,qBAAqBL,EAAQ,KAAM,CAE7BA,IAAO,KAAK,YAAc,CAAC,GAAG,KAAK,OAAO,EAAE,UAAWQ,GAAMA,EAAE,QAAUR,CAAK,GAGlF,MAAMC,EAAQ,KAAK,gBAAgB,UAAW2B,GAAQA,IAAQ,KAAK,WAAW,EAC1E3B,IAAU,IAAI,KAAK,gBAAgB,OAAOA,EAAO,CAAC,EAGjDD,IAAOA,EAAQ,KAAK,QAAQ,KAAK,WAAW,EAAE,aAAa,qBAAqB,GAGrF,KAAK,MAAM,MAAM,cAAc,WAAWA,CAAK,IAAI,EAAE,gBAAgB,UAAU,EAG/E,MAAM+B,EAAa,KAAK,eAAe,UAAWC,GAAMA,IAAMhC,CAAK,EAC/D+B,IAAe,IAAI,KAAK,eAAe,OAAOA,EAAY,CAAC,EAE/D,KAAK,UAAU,4BAA4B,CAC5C,EAED,eAAgB,CACd,KAAK,QAAQ,QACVvB,GACEA,EAAE,OACD,EAAE,KAAK,MAAM,SAAW,GAAKA,EAAE,aAAa,qBAAqB,IAAM,QACvEA,EAAE,YAAY,KAAM,EAAC,YAAa,EAAC,QAAQ,KAAK,MAAM,YAAa,CAAA,IAAM,EAC9E,EACD,KAAK,OAAO,QAASC,GAAOA,EAAE,OAASA,EAAE,iBAAiB,+BAA+B,EAAE,SAAW,CAAE,CACzG,EAED,eAAeC,EAAK,CAClB,MAAMC,EAAKD,IAAQ,KACd,KAAK,WAAU,KAAK,SAAW,IACpC,IAAIE,EAAW,KAAK,YACpB,EAGE,IAFAA,GAAYD,EAAK,GAAK,EAEjBA,GAAMC,IAAa,IAAOA,IAAa,KAAK,QAAQ,OAAQ,aAC1D,KAAK,QAAQA,CAAQ,EAAE,QAAU,KAAK,QAAQ,UACvD,KAAK,YAAcA,CACpB,EAED,QAAS,CACN,iCAAmC,CAC9B,KAAK,eAAe,OAAS,GAAG,KAAK,qBAAqB,KAAK,eAAe,GAAG,EAAE,CAAC,CACzF,EACA,2BAA6B,CAC5B,KAAK,SAAW,EACjB,EACA,+BAAiC,CAChC,KAAK,qBAAsB,CAC5B,EACA,2BAA6B,CAC5B,KAAK,eAAe,IAAI,CACzB,EACA,6BAA+B,CAC9B,KAAK,eAAe,MAAM,CAC3B,EACA,SAAUE,EAAQ,CACjB,KAAK,SAAW,GAChB,KAAK,MAAQA,EAAO,OAAO,MAAM,KAAM,CACxC,CACF,EAED,OAAQ,CACL,UAAY,CACX,OAAO,KAAK,QACb,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,8BACR,EACA,0BAA4B,CAC3B,MAAO,iCACR,EACA,sBAAwB,CACvB,MAAO,gCACR,EACA,4BAA8B,CAC7B,MAAO,iCACR,EACA,0BAA4B,CAC3B,MAAO,8BACR,CACF,CACF,CACH,CCrMiB,SAASmB,GAAS,CAAE,YAAAnC,EAAc,wBAAwB,EAAK,CAAA,EAAI,CAClF,MAAO,CACL,SAAU,GACV,YAAa,GACb,cAAe,MAAM,QAAQA,CAAW,EAAIA,EAAc,CAACA,CAAW,EAEtE,MAAO,CACL,KAAK,MAAQ,KAAK,IAAI,iBAAiB,mBAAmB,EAC1D,KAAK,MAAM,QAAQ,CAACoC,EAAMjC,IAAU,CAClCiC,EAAK,iBAAiB,YAAa,IAAO,KAAK,YAAcjC,CAAM,EACnEiC,EAAK,iBAAiB,WAAY,IAAO,KAAK,YAAc,EAAG,CACvE,CAAO,EACD,KAAK,OAAO,WAAY,IAAM,CAAC,KAAK,WAAa,KAAK,YAAc,GAAG,EACvE,KAAK,OAAO,cAAe,CAACjC,EAAOC,IAAa,UAC9CC,EAAA,KAAK,MAAMD,CAAQ,IAAnB,MAAAC,EAAsB,UAAU,OAAO,GAAG,KAAK,gBAC/CC,EAAA,KAAK,MAAMH,CAAK,IAAhB,MAAAG,EAAmB,UAAU,IAAI,GAAG,KAAK,cACjD,CAAO,CACF,EAED,YAAY+B,EAAYC,EAAM,CAC5B,OAAID,EAAW,QAAQ,MAAO,EAAE,GAAK,GAAW,GACzCC,EAAK,YAAa,EAAC,SAASD,EAAW,YAAW,CAAE,CAC5D,EAED,QAAS,CACN,UAAY,SACX,KAAK,SAAW,CAAC,KAAK,SAClB,KAAK,YAAUhC,EAAA,KAAK,MAAM,QAAX,MAAAA,EAAkB,SAChC,KAAK,WAAUC,EAAA,KAAK,MAAM,QAAX,MAAAA,EAAkB,MACvC,EACA,2BAA6B,CACvB,KAAK,WAAU,KAAK,SAAW,IACpC,KAAK,cAAgB,IAClB,KAAK,YAAc,KAAK,cAAgB,GAAK,KAAK,MAAM,OAAS,EAAI,KAAK,YAAc,EAC5F,EACA,6BAA+B,CACzB,KAAK,WAAU,KAAK,SAAW,IACpC,KAAK,cAAgB,KAAK,MAAM,OAAS,GAAK,KAAK,aACpD,EACA,aAAe,CAEd,WAAW,IAAO,KAAK,SAAW,GAAQ,GAAG,CAC9C,CACF,EAED,OAAQ,CACL,UAAY,CACX,OAAO,KAAK,QACb,EACA,2BAA6B,CAC5B,KAAK,cAAgB,IAAM,KAAK,cAAgB,GAAK,KAAK,MAAM,OAAS,EAAI,KAAK,YAAc,EACjG,EACA,6BAA+B,CAC9B,KAAK,cAAgB,KAAK,MAAM,OAAS,GAAK,KAAK,aACpD,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,8BACR,EACA,0BAA4B,CAC3B,MAAO,iCACR,EACA,sBAAwB,CACvB,MAAO,gCACR,EACA,4BAA8B,CAC7B,MAAO,iCACR,EACA,0BAA4B,CAC3B,MAAO,8BACR,CACF,CACF,CACH,CCrEA,MAAMiC,GAAiB,SACjBC,GAAsB,KAEtBC,GAAS,IAAIC,GACbC,EAAS,SAAS,cAAc,MAAM,EAAE,aAAa,MAAM,EAElD,SAASC,GAAW,CAAE,SAAAC,EAAU,WAAAC,GAAc,CAC3D,MAAO,CACL,SAAUD,GAAYlB,EAAU,aAAc,mBAAoBgB,CAAM,EACxE,KAAM,GACN,UAAW,KACX,WAAYG,GAAc,OAC1B,gBAAiBA,GAAc,OAE/B,MAAM,eAAe3B,EAAK,CACxB,MAAM4B,EAAU,KAAK,MAAM,QACrBF,EAAW,OAAO,KAAK,SAAS,EAAE,MAAM,GAAG,EAAE,IAAK,EAClDG,EAAgBH,EAAS,MAAM,GAAG,EAAE,IAAK,EACzCI,EAAkB,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAM,EAC5DC,EAAe,SAAS,eAAe,2BAA2B,EAClEC,EAAa,SAAS,eAAehC,CAAG,EAE9C,GAAI,KAAK,UAEP,GADW,IAAI,OAAO,aAAc,GAAG,EAChC,KAAK,KAAK,SAAS,EAAG,CACvB8B,EAAgB,SAASD,CAAa,EACpCD,IACFA,EAAQ,IACN,gGACFA,EAAQ,UAAU,OAAO,uBAAuB,GAG9CA,IACFA,EAAQ,IAAM,KAAK,UACdA,EAAQ,UAAU,SAAS,uBAAuB,GACrDA,EAAQ,UAAU,IAAI,uBAAuB,GAInD,KAAK,SAAWF,EAChB,KAAK,KAAO,GACZ,KAAK,gBAAkB,GACvB,MAAMO,EAAQ,KAAK,MAAM,MACzBA,EAAM,MAAQ,IACxB,MACUF,EAAa,UAAYvB,EAAU,aAAc,gBAAiBgB,CAAM,EACxEQ,EAAW,UAAU,IAAI,gBAAgB,CAG9C,EAED,aAAc,CACZ,MAAMJ,EAAU,KAAK,MAAM,QACrBK,EAAQ,KAAK,MAAM,MACnBC,EAAOD,EAAM,MAAM,CAAC,EAE1B,GAAIC,EAAM,CACR,GAAIA,EAAK,KAAK,SAAS,OAAO,GAE5B,GADAC,GAAS,QAAQ,CAAE,MAAO3B,EAAU,aAAc,YAAagB,CAAM,EAAG,EACpEU,EAAK,KAAOd,GAAgB,CAC9Be,GAAS,MAAM,CACb,MAAO3B,EAAU,aAAc,wBAAyBgB,CAAM,EAC9D,KAAMhB,EAAU,aAAc,uBAAwBgB,CAAM,CAC1E,CAAa,EACDS,EAAM,MAAQ,KACd,MACD,SAAUC,EAAK,KAAK,SAAS,GAAG,EAAG,CAClCC,GAAS,MAAM,CACb,MAAO3B,EAAU,aAAc,6BAA8BgB,CAAM,EACnE,KAAMhB,EAAU,aAAc,4BAA6BgB,CAAM,CAC/E,CAAa,EACDS,EAAM,MAAQ,KACd,MACZ,MACe,CACDL,IACFA,EAAQ,IACN,iGACJ,KAAK,SAAWM,EAAK,KACrB,KAAK,KAAO,GACZ,MACV,CAEQ,MAAME,EAAM,IAAI,MACVC,EAAS,IAAI,WACnBA,EAAO,cAAcH,CAAI,EAGzBG,EAAO,OAAS,IAAM,CACpBD,EAAI,IAAMC,EAAO,OAEjBD,EAAI,OAAS,IAAM,CAEbA,EAAI,MAAQf,IAAuBe,EAAI,OAASf,IAClDc,GAAS,QAAQ,CAAE,MAAO3B,EAAU,aAAc,UAAWgB,CAAM,EAAG,EAEtEF,GACG,OAAOY,EAAM,CAAE,IAAKb,EAAqB,CAAA,EACzC,KAAMiB,GAAS,CAEd,IAAIC,EAAW,IAAI,aACnB,MAAMC,EAAa,IAAI,KAAK,CAACF,CAAI,EAAGJ,EAAK,IAAI,EAC7CK,EAAS,MAAM,IAAIC,CAAU,EAC7BP,EAAM,MAAQM,EAAS,MAEvBJ,GAAS,QAAQ,CAAE,MAAO3B,EAAU,aAAc,UAAWgB,CAAM,EAAG,CACvE,CAAA,EACA,MAAOiB,GAAM,CACZN,GAAS,MAAM,CACb,MAAO3B,EAAU,aAAc,eAAgBgB,CAAM,EACrD,KAAMhB,EAAU,aAAc,cAAegB,CAAM,CACvE,CAAmB,CACnB,CAAiB,GAEHW,GAAS,QAAQ,CAAE,MAAO3B,EAAU,aAAc,UAAWgB,CAAM,EAAG,CAEzE,EAGGI,IAASA,EAAQ,IAAMS,EAAO,QAClC,KAAK,SAAWH,EAAK,KACrB,KAAK,KAAO,GACZ,KAAK,UAAY,KACjB,KAAK,gBAAkB,EACxB,CACT,CACK,EAED,WAAW5B,EAAO,CAEZA,EAAM,aAAa,MAAM,SAAW,IAExC,KAAK,MAAM,MAAM,MAAQA,EAAM,aAAa,MAC5C,KAAK,YAAa,EACnB,EAED,SAAU,CACP,gBAAiBA,EAAO,CACvB,KAAK,WAAWA,CAAK,CACtB,EACA,qBAAuB,CAEvB,CACF,EAED,QAAS,CACN,UAAY,CACX,OAAO,KAAK,IACb,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,WACR,EACA,0BAA4B,CAC3B,MAAO,aACR,EACA,sBAAwB,CACvB,MAAO,sBACR,EACA,4BAA8B,CAC7B,MAAO,aACR,EACA,0BAA4B,CAC3B,MAAO,WACR,EACA,UAAY,CACX,KAAK,KAAO,EACb,CACF,EAED,MAAO,CACJ,UAAY,CACX,OAAO,KAAK,IACb,EACA,cAAgB,CACf,KAAK,KAAO,EACb,EACA,sBAAwB,CACvB,KAAK,KAAO,EACb,EACA,sBAAwB,CACvB,KAAK,KAAO,EACb,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,gEACR,EACA,0BAA4B,CAC3B,MAAO,wCACR,EACA,sBAAwB,CACvB,MAAO,sBACR,EACA,4BAA8B,CAC7B,MAAO,wCACR,EACA,0BAA4B,CAC3B,MAAO,sDACR,CACF,CACF,CACH,CCnNA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMA,SAASoC,GAAQC,EAAQC,EAAgB,CACvC,IAAIC,EAAO,OAAO,KAAKF,CAAM,EAC7B,GAAI,OAAO,sBAAuB,CAChC,IAAIG,EAAU,OAAO,sBAAsBH,CAAM,EAC7CC,IACFE,EAAUA,EAAQ,OAAO,SAAUC,EAAK,CACtC,OAAO,OAAO,yBAAyBJ,EAAQI,CAAG,EAAE,UAC5D,CAAO,GAEHF,EAAK,KAAK,MAAMA,EAAMC,CAAO,CACjC,CACE,OAAOD,CACT,CACA,SAASG,EAAeC,EAAQ,CAC9B,QAASC,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CACzC,IAAIC,EAAS,UAAUD,CAAC,GAAK,KAAO,UAAUA,CAAC,EAAI,CAAE,EACjDA,EAAI,EACNR,GAAQ,OAAOS,CAAM,EAAG,EAAI,EAAE,QAAQ,SAAUC,EAAK,CACnDC,GAAgBJ,EAAQG,EAAKD,EAAOC,CAAG,CAAC,CAChD,CAAO,EACQ,OAAO,0BAChB,OAAO,iBAAiBH,EAAQ,OAAO,0BAA0BE,CAAM,CAAC,EAExET,GAAQ,OAAOS,CAAM,CAAC,EAAE,QAAQ,SAAUC,EAAK,CAC7C,OAAO,eAAeH,EAAQG,EAAK,OAAO,yBAAyBD,EAAQC,CAAG,CAAC,CACvF,CAAO,CAEP,CACE,OAAOH,CACT,CACA,SAASK,GAAQC,EAAK,CACpB,0BAEA,OAAI,OAAO,QAAW,YAAc,OAAO,OAAO,UAAa,SAC7DD,GAAU,SAAUC,EAAK,CACvB,OAAO,OAAOA,CACf,EAEDD,GAAU,SAAUC,EAAK,CACvB,OAAOA,GAAO,OAAO,QAAW,YAAcA,EAAI,cAAgB,QAAUA,IAAQ,OAAO,UAAY,SAAW,OAAOA,CAC1H,EAEID,GAAQC,CAAG,CACpB,CACA,SAASF,GAAgBE,EAAKH,EAAKrE,EAAO,CACxC,OAAIqE,KAAOG,EACT,OAAO,eAAeA,EAAKH,EAAK,CAC9B,MAAOrE,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EAChB,CAAK,EAEDwE,EAAIH,CAAG,EAAIrE,EAENwE,CACT,CACA,SAASC,GAAW,CAClB,OAAAA,EAAW,OAAO,QAAU,SAAUP,EAAQ,CAC5C,QAASC,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAAK,CACzC,IAAIC,EAAS,UAAUD,CAAC,EACxB,QAASE,KAAOD,EACV,OAAO,UAAU,eAAe,KAAKA,EAAQC,CAAG,IAClDH,EAAOG,CAAG,EAAID,EAAOC,CAAG,EAGlC,CACI,OAAOH,CACR,EACMO,EAAS,MAAM,KAAM,SAAS,CACvC,CACA,SAASC,GAA8BN,EAAQO,EAAU,CACvD,GAAIP,GAAU,KAAM,MAAO,CAAE,EAC7B,IAAIF,EAAS,CAAE,EACXU,EAAa,OAAO,KAAKR,CAAM,EAC/BC,EAAKF,EACT,IAAKA,EAAI,EAAGA,EAAIS,EAAW,OAAQT,IACjCE,EAAMO,EAAWT,CAAC,EACd,EAAAQ,EAAS,QAAQN,CAAG,GAAK,KAC7BH,EAAOG,CAAG,EAAID,EAAOC,CAAG,GAE1B,OAAOH,CACT,CACA,SAASW,GAAyBT,EAAQO,EAAU,CAClD,GAAIP,GAAU,KAAM,MAAO,CAAE,EAC7B,IAAIF,EAASQ,GAA8BN,EAAQO,CAAQ,EACvDN,EAAKF,EACT,GAAI,OAAO,sBAAuB,CAChC,IAAIW,EAAmB,OAAO,sBAAsBV,CAAM,EAC1D,IAAKD,EAAI,EAAGA,EAAIW,EAAiB,OAAQX,IACvCE,EAAMS,EAAiBX,CAAC,EACpB,EAAAQ,EAAS,QAAQN,CAAG,GAAK,IACxB,OAAO,UAAU,qBAAqB,KAAKD,EAAQC,CAAG,IAC3DH,EAAOG,CAAG,EAAID,EAAOC,CAAG,EAE9B,CACE,OAAOH,CACT,CA2BA,IAAIa,GAAU,SAEd,SAASC,EAAUC,EAAS,CAC1B,GAAI,OAAO,OAAW,KAAe,OAAO,UAC1C,MAAO,CAAC,CAAe,UAAU,UAAU,MAAMA,CAAO,CAE5D,CACA,IAAIC,EAAaF,EAAU,uDAAuD,EAC9EG,GAAOH,EAAU,OAAO,EACxBI,GAAUJ,EAAU,UAAU,EAC9BK,GAASL,EAAU,SAAS,GAAK,CAACA,EAAU,SAAS,GAAK,CAACA,EAAU,UAAU,EAC/EM,GAAMN,EAAU,iBAAiB,EACjCO,GAAmBP,EAAU,SAAS,GAAKA,EAAU,UAAU,EAE/DQ,GAAc,CAChB,QAAS,GACT,QAAS,EACX,EACA,SAASC,EAAGzG,EAAIuC,EAAOmE,EAAI,CACzB1G,EAAG,iBAAiBuC,EAAOmE,EAAI,CAACR,GAAcM,EAAW,CAC3D,CACA,SAASG,EAAI3G,EAAIuC,EAAOmE,EAAI,CAC1B1G,EAAG,oBAAoBuC,EAAOmE,EAAI,CAACR,GAAcM,EAAW,CAC9D,CACA,SAASI,GAAyB5G,EAAe6G,EAAU,CACzD,GAAKA,EAEL,IADAA,EAAS,CAAC,IAAM,MAAQA,EAAWA,EAAS,UAAU,CAAC,GACnD7G,EACF,GAAI,CACF,GAAIA,EAAG,QACL,OAAOA,EAAG,QAAQ6G,CAAQ,EACrB,GAAI7G,EAAG,kBACZ,OAAOA,EAAG,kBAAkB6G,CAAQ,EAC/B,GAAI7G,EAAG,sBACZ,OAAOA,EAAG,sBAAsB6G,CAAQ,CAE3C,MAAW,CACV,MAAO,EACb,CAEE,MAAO,GACT,CACA,SAASC,GAAgB9G,EAAI,CAC3B,OAAOA,EAAG,MAAQA,IAAO,UAAYA,EAAG,KAAK,SAAWA,EAAG,KAAOA,EAAG,UACvE,CACA,SAAS+G,EAAyB/G,EAAe6G,EAA0BG,EAAKC,EAAY,CAC1F,GAAIjH,EAAI,CACNgH,EAAMA,GAAO,SACb,EAAG,CACD,GAAIH,GAAY,OAASA,EAAS,CAAC,IAAM,IAAM7G,EAAG,aAAegH,GAAOJ,GAAQ5G,EAAI6G,CAAQ,EAAID,GAAQ5G,EAAI6G,CAAQ,IAAMI,GAAcjH,IAAOgH,EAC7I,OAAOhH,EAET,GAAIA,IAAOgH,EAAK,KAEtB,OAAahH,EAAK8G,GAAgB9G,CAAE,EACpC,CACE,OAAO,IACT,CACA,IAAIkH,GAAU,OACd,SAASC,EAAYnH,EAAIgC,EAAMoF,EAAO,CACpC,GAAIpH,GAAMgC,EACR,GAAIhC,EAAG,UACLA,EAAG,UAAUoH,EAAQ,MAAQ,QAAQ,EAAEpF,CAAI,MACtC,CACL,IAAIqF,GAAa,IAAMrH,EAAG,UAAY,KAAK,QAAQkH,GAAS,GAAG,EAAE,QAAQ,IAAMlF,EAAO,IAAK,GAAG,EAC9FhC,EAAG,WAAaqH,GAAaD,EAAQ,IAAMpF,EAAO,KAAK,QAAQkF,GAAS,GAAG,CACjF,CAEA,CACA,SAASI,EAAItH,EAAIuH,EAAMC,EAAK,CAC1B,IAAIC,EAAQzH,GAAMA,EAAG,MACrB,GAAIyH,EAAO,CACT,GAAID,IAAQ,OACV,OAAI,SAAS,aAAe,SAAS,YAAY,iBAC/CA,EAAM,SAAS,YAAY,iBAAiBxH,EAAI,EAAE,EACzCA,EAAG,eACZwH,EAAMxH,EAAG,cAEJuH,IAAS,OAASC,EAAMA,EAAID,CAAI,EAEnC,EAAEA,KAAQE,IAAUF,EAAK,QAAQ,QAAQ,IAAM,KACjDA,EAAO,WAAaA,GAEtBE,EAAMF,CAAI,EAAIC,GAAO,OAAOA,GAAQ,SAAW,GAAK,KAE1D,CACA,CACA,SAASE,GAAO1H,EAAI2H,EAAU,CAC5B,IAAIC,EAAoB,GACxB,GAAI,OAAO5H,GAAO,SAChB4H,EAAoB5H,MAEpB,GAAG,CACD,IAAI6H,EAAYP,EAAItH,EAAI,WAAW,EAC/B6H,GAAaA,IAAc,SAC7BD,EAAoBC,EAAY,IAAMD,EAGzC,OAAQ,CAACD,IAAa3H,EAAKA,EAAG,aAEjC,IAAI8H,EAAW,OAAO,WAAa,OAAO,iBAAmB,OAAO,WAAa,OAAO,YAExF,OAAOA,GAAY,IAAIA,EAASF,CAAiB,CACnD,CACA,SAASG,GAAKf,EAAKgB,EAASC,EAAU,CACpC,GAAIjB,EAAK,CACP,IAAIkB,EAAOlB,EAAI,qBAAqBgB,CAAO,EACzC7C,EAAI,EACJgD,EAAID,EAAK,OACX,GAAID,EACF,KAAO9C,EAAIgD,EAAGhD,IACZ8C,EAASC,EAAK/C,CAAC,EAAGA,CAAC,EAGvB,OAAO+C,CACX,CACE,MAAO,CAAE,CACX,CACA,SAASE,GAA4B,CACnC,IAAIC,EAAmB,SAAS,iBAChC,OAAIA,GAGK,SAAS,eAEpB,CAWA,SAASC,EAAQtI,EAAIuI,EAA2BC,EAA2BC,EAAWC,EAAW,CAC/F,GAAI,GAAC1I,EAAG,uBAAyBA,IAAO,QACxC,KAAI2I,EAAQC,EAAKC,EAAMC,EAAQC,EAAOC,EAAQC,EAiB9C,GAhBIjJ,IAAO,QAAUA,EAAG,YAAcA,IAAOoI,KAC3CO,EAAS3I,EAAG,sBAAuB,EACnC4I,EAAMD,EAAO,IACbE,EAAOF,EAAO,KACdG,EAASH,EAAO,OAChBI,EAAQJ,EAAO,MACfK,EAASL,EAAO,OAChBM,EAAQN,EAAO,QAEfC,EAAM,EACNC,EAAO,EACPC,EAAS,OAAO,YAChBC,EAAQ,OAAO,WACfC,EAAS,OAAO,YAChBC,EAAQ,OAAO,aAEZV,GAA6BC,IAA8BxI,IAAO,SAErE0I,EAAYA,GAAa1I,EAAG,WAIxB,CAACkG,GACH,EACE,IAAIwC,GAAaA,EAAU,wBAA0BpB,EAAIoB,EAAW,WAAW,IAAM,QAAUF,GAA6BlB,EAAIoB,EAAW,UAAU,IAAM,UAAW,CACpK,IAAIQ,EAAgBR,EAAU,sBAAuB,EAGrDE,GAAOM,EAAc,IAAM,SAAS5B,EAAIoB,EAAW,kBAAkB,CAAC,EACtEG,GAAQK,EAAc,KAAO,SAAS5B,EAAIoB,EAAW,mBAAmB,CAAC,EACzEI,EAASF,EAAMD,EAAO,OACtBI,EAAQF,EAAOF,EAAO,MACtB,KACV,OAEeD,EAAYA,EAAU,YAGnC,GAAID,GAAazI,IAAO,OAAQ,CAE9B,IAAImJ,EAAWzB,GAAOgB,GAAa1I,CAAE,EACnCoJ,EAASD,GAAYA,EAAS,EAC9BE,EAASF,GAAYA,EAAS,EAC5BA,IACFP,GAAOS,EACPR,GAAQO,EACRH,GAASG,EACTJ,GAAUK,EACVP,EAASF,EAAMI,EACfD,EAAQF,EAAOI,EAErB,CACE,MAAO,CACL,IAAKL,EACL,KAAMC,EACN,OAAQC,EACR,MAAOC,EACP,MAAOE,EACP,OAAQD,CACT,EACH,CASA,SAASM,GAAetJ,EAAIuJ,EAAQC,EAAY,CAK9C,QAJIC,EAASC,GAA2B1J,EAAI,EAAI,EAC9C2J,EAAYrB,EAAQtI,CAAE,EAAEuJ,CAAM,EAGzBE,GAAQ,CACb,IAAIG,EAAgBtB,EAAQmB,CAAM,EAAED,CAAU,EAC5CK,EAAU,OAMZ,GAJEA,EAAUF,GAAaC,EAIrB,CAACC,EAAS,OAAOJ,EACrB,GAAIA,IAAWrB,IAA6B,MAC5CqB,EAASC,GAA2BD,EAAQ,EAAK,CACrD,CACE,MAAO,EACT,CAUA,SAASK,GAAS9J,EAAI+J,EAAUC,EAASC,EAAe,CAItD,QAHIC,EAAe,EACjB/E,EAAI,EACJgF,EAAWnK,EAAG,SACTmF,EAAIgF,EAAS,QAAQ,CAC1B,GAAIA,EAAShF,CAAC,EAAE,MAAM,UAAY,QAAUgF,EAAShF,CAAC,IAAMiF,EAAS,QAAUH,GAAiBE,EAAShF,CAAC,IAAMiF,EAAS,UAAYrD,EAAQoD,EAAShF,CAAC,EAAG6E,EAAQ,UAAWhK,EAAI,EAAK,EAAG,CACvL,GAAIkK,IAAiBH,EACnB,OAAOI,EAAShF,CAAC,EAEnB+E,GACN,CACI/E,GACJ,CACE,OAAO,IACT,CAQA,SAASkF,GAAUrK,EAAI6G,EAAU,CAE/B,QADIyD,EAAOtK,EAAG,iBACPsK,IAASA,IAASF,EAAS,OAAS9C,EAAIgD,EAAM,SAAS,IAAM,QAAUzD,GAAY,CAACD,GAAQ0D,EAAMzD,CAAQ,IAC/GyD,EAAOA,EAAK,uBAEd,OAAOA,GAAQ,IACjB,CASA,SAASrJ,EAAMjB,EAAI6G,EAAU,CAC3B,IAAI5F,EAAQ,EACZ,GAAI,CAACjB,GAAM,CAACA,EAAG,WACb,MAAO,GAIT,KAAOA,EAAKA,EAAG,wBACTA,EAAG,SAAS,YAAW,IAAO,YAAcA,IAAOoK,EAAS,QAAU,CAACvD,GAAYD,GAAQ5G,EAAI6G,CAAQ,IACzG5F,IAGJ,OAAOA,CACT,CAQA,SAASsJ,GAAwBvK,EAAI,CACnC,IAAIwK,EAAa,EACfC,EAAY,EACZC,EAActC,EAA2B,EAC3C,GAAIpI,EACF,EAAG,CACD,IAAImJ,EAAWzB,GAAO1H,CAAE,EACtBoJ,EAASD,EAAS,EAClBE,EAASF,EAAS,EACpBqB,GAAcxK,EAAG,WAAaoJ,EAC9BqB,GAAazK,EAAG,UAAYqJ,CAC7B,OAAQrJ,IAAO0K,IAAgB1K,EAAKA,EAAG,aAE1C,MAAO,CAACwK,EAAYC,CAAS,CAC/B,CAQA,SAASE,GAAcC,EAAKpF,EAAK,CAC/B,QAAS,KAAKoF,EACZ,GAAKA,EAAI,eAAe,CAAC,GACzB,QAASvF,KAAOG,EACd,GAAIA,EAAI,eAAeH,CAAG,GAAKG,EAAIH,CAAG,IAAMuF,EAAI,CAAC,EAAEvF,CAAG,EAAG,OAAO,OAAO,CAAC,EAG5E,MAAO,EACT,CACA,SAASqE,GAA2B1J,EAAI6K,EAAa,CAEnD,GAAI,CAAC7K,GAAM,CAACA,EAAG,sBAAuB,OAAOoI,EAA2B,EACxE,IAAI0C,EAAO9K,EACP+K,EAAU,GACd,EAEE,IAAID,EAAK,YAAcA,EAAK,aAAeA,EAAK,aAAeA,EAAK,aAAc,CAChF,IAAIE,EAAU1D,EAAIwD,CAAI,EACtB,GAAIA,EAAK,YAAcA,EAAK,cAAgBE,EAAQ,WAAa,QAAUA,EAAQ,WAAa,WAAaF,EAAK,aAAeA,EAAK,eAAiBE,EAAQ,WAAa,QAAUA,EAAQ,WAAa,UAAW,CACpN,GAAI,CAACF,EAAK,uBAAyBA,IAAS,SAAS,KAAM,OAAO1C,EAA2B,EAC7F,GAAI2C,GAAWF,EAAa,OAAOC,EACnCC,EAAU,EAClB,CACA,OAEWD,EAAOA,EAAK,YACrB,OAAO1C,EAA2B,CACpC,CACA,SAAS6C,GAAOC,EAAKC,EAAK,CACxB,GAAID,GAAOC,EACT,QAAS9F,KAAO8F,EACVA,EAAI,eAAe9F,CAAG,IACxB6F,EAAI7F,CAAG,EAAI8F,EAAI9F,CAAG,GAIxB,OAAO6F,CACT,CACA,SAASE,GAAYC,EAAOC,EAAO,CACjC,OAAO,KAAK,MAAMD,EAAM,GAAG,IAAM,KAAK,MAAMC,EAAM,GAAG,GAAK,KAAK,MAAMD,EAAM,IAAI,IAAM,KAAK,MAAMC,EAAM,IAAI,GAAK,KAAK,MAAMD,EAAM,MAAM,IAAM,KAAK,MAAMC,EAAM,MAAM,GAAK,KAAK,MAAMD,EAAM,KAAK,IAAM,KAAK,MAAMC,EAAM,KAAK,CAC5N,CACA,IAAIC,GACJ,SAASC,GAASC,EAAUC,EAAI,CAC9B,OAAO,UAAY,CACjB,GAAI,CAACH,GAAkB,CACrB,IAAII,EAAO,UACTC,EAAQ,KACND,EAAK,SAAW,EAClBF,EAAS,KAAKG,EAAOD,EAAK,CAAC,CAAC,EAE5BF,EAAS,MAAMG,EAAOD,CAAI,EAE5BJ,GAAmB,WAAW,UAAY,CACxCA,GAAmB,MACpB,EAAEG,CAAE,CACX,CACG,CACH,CACA,SAASG,IAAiB,CACxB,aAAaN,EAAgB,EAC7BA,GAAmB,MACrB,CACA,SAASO,GAAS9L,EAAI+L,EAAGC,EAAG,CAC1BhM,EAAG,YAAc+L,EACjB/L,EAAG,WAAagM,CAClB,CACA,SAASC,GAAMjM,EAAI,CACjB,IAAIkM,EAAU,OAAO,QACjBC,EAAI,OAAO,QAAU,OAAO,MAChC,OAAID,GAAWA,EAAQ,IACdA,EAAQ,IAAIlM,CAAE,EAAE,UAAU,EAAI,EAC5BmM,EACFA,EAAEnM,CAAE,EAAE,MAAM,EAAI,EAAE,CAAC,EAEnBA,EAAG,UAAU,EAAI,CAE5B,CAeA,SAASoM,GAAkC1D,EAAWsB,EAASqC,EAAS,CACtE,IAAIC,EAAO,CAAE,EACb,aAAM,KAAK5D,EAAU,QAAQ,EAAE,QAAQ,SAAU6D,EAAO,CACtD,IAAIC,EAAYC,EAAWC,EAAaC,EACxC,GAAI,GAAC5F,EAAQwF,EAAOvC,EAAQ,UAAWtB,EAAW,EAAK,GAAK6D,EAAM,UAAYA,IAAUF,GACxF,KAAIO,EAAYtE,EAAQiE,CAAK,EAC7BD,EAAK,KAAO,KAAK,KAAKE,EAAaF,EAAK,QAAU,MAAQE,IAAe,OAASA,EAAa,IAAUI,EAAU,IAAI,EACvHN,EAAK,IAAM,KAAK,KAAKG,EAAYH,EAAK,OAAS,MAAQG,IAAc,OAASA,EAAY,IAAUG,EAAU,GAAG,EACjHN,EAAK,MAAQ,KAAK,KAAKI,EAAcJ,EAAK,SAAW,MAAQI,IAAgB,OAASA,EAAc,KAAWE,EAAU,KAAK,EAC9HN,EAAK,OAAS,KAAK,KAAKK,EAAeL,EAAK,UAAY,MAAQK,IAAiB,OAASA,EAAe,KAAWC,EAAU,MAAM,EACxI,CAAG,EACDN,EAAK,MAAQA,EAAK,MAAQA,EAAK,KAC/BA,EAAK,OAASA,EAAK,OAASA,EAAK,IACjCA,EAAK,EAAIA,EAAK,KACdA,EAAK,EAAIA,EAAK,IACPA,CACT,CACA,IAAIO,EAAU,WAAa,IAAI,KAAI,EAAG,QAAS,EAE/C,SAASC,IAAwB,CAC/B,IAAIC,EAAkB,CAAE,EACtBC,EACF,MAAO,CACL,sBAAuB,UAAiC,CAEtD,GADAD,EAAkB,CAAE,EAChB,EAAC,KAAK,QAAQ,UAClB,KAAI5C,EAAW,CAAA,EAAG,MAAM,KAAK,KAAK,GAAG,QAAQ,EAC7CA,EAAS,QAAQ,SAAUoC,EAAO,CAChC,GAAI,EAAAjF,EAAIiF,EAAO,SAAS,IAAM,QAAUA,IAAUnC,EAAS,OAC3D,CAAA2C,EAAgB,KAAK,CACnB,OAAQR,EACR,KAAMjE,EAAQiE,CAAK,CAC7B,CAAS,EACD,IAAIU,EAAWhI,EAAe,GAAI8H,EAAgBA,EAAgB,OAAS,CAAC,EAAE,IAAI,EAGlF,GAAIR,EAAM,sBAAuB,CAC/B,IAAIW,EAAcxF,GAAO6E,EAAO,EAAI,EAChCW,IACFD,EAAS,KAAOC,EAAY,EAC5BD,EAAS,MAAQC,EAAY,EAEzC,CACQX,EAAM,SAAWU,EACzB,CAAO,EACF,EACD,kBAAmB,SAA2B7F,EAAO,CACnD2F,EAAgB,KAAK3F,CAAK,CAC3B,EACD,qBAAsB,SAA8BlC,EAAQ,CAC1D6H,EAAgB,OAAOpC,GAAcoC,EAAiB,CACpD,OAAQ7H,CACT,CAAA,EAAG,CAAC,CACN,EACD,WAAY,SAAoBuG,EAAU,CACxC,IAAIG,EAAQ,KACZ,GAAI,CAAC,KAAK,QAAQ,UAAW,CAC3B,aAAaoB,CAAmB,EAC5B,OAAOvB,GAAa,YAAYA,EAAU,EAC9C,MACR,CACM,IAAI0B,EAAY,GACdC,EAAgB,EAClBL,EAAgB,QAAQ,SAAU3F,EAAO,CACvC,IAAIiG,EAAO,EACTnI,EAASkC,EAAM,OACf6F,EAAW/H,EAAO,SAClBoI,EAAShF,EAAQpD,CAAM,EACvBqI,EAAerI,EAAO,aACtBsI,EAAatI,EAAO,WACpBuI,EAAgBrG,EAAM,KACtBsG,EAAehG,GAAOxC,EAAQ,EAAI,EAChCwI,IAEFJ,EAAO,KAAOI,EAAa,EAC3BJ,EAAO,MAAQI,EAAa,GAE9BxI,EAAO,OAASoI,EACZpI,EAAO,uBAELkG,GAAYmC,EAAcD,CAAM,GAAK,CAAClC,GAAY6B,EAAUK,CAAM,IAErEG,EAAc,IAAMH,EAAO,MAAQG,EAAc,KAAOH,EAAO,SAAWL,EAAS,IAAMK,EAAO,MAAQL,EAAS,KAAOK,EAAO,QAE9HD,EAAOM,GAAkBF,EAAeF,EAAcC,EAAY5B,EAAM,OAAO,GAK9ER,GAAYkC,EAAQL,CAAQ,IAC/B/H,EAAO,aAAe+H,EACtB/H,EAAO,WAAaoI,EACfD,IACHA,EAAOzB,EAAM,QAAQ,WAEvBA,EAAM,QAAQ1G,EAAQuI,EAAeH,EAAQD,CAAI,GAE/CA,IACFF,EAAY,GACZC,EAAgB,KAAK,IAAIA,EAAeC,CAAI,EAC5C,aAAanI,EAAO,mBAAmB,EACvCA,EAAO,oBAAsB,WAAW,UAAY,CAClDA,EAAO,cAAgB,EACvBA,EAAO,aAAe,KACtBA,EAAO,SAAW,KAClBA,EAAO,WAAa,KACpBA,EAAO,sBAAwB,IAChC,EAAEmI,CAAI,EACPnI,EAAO,sBAAwBmI,EAEzC,CAAO,EACD,aAAaL,CAAmB,EAC3BG,EAGHH,EAAsB,WAAW,UAAY,CACvC,OAAOvB,GAAa,YAAYA,EAAU,CAC/C,EAAE2B,CAAa,EAJZ,OAAO3B,GAAa,YAAYA,EAAU,EAMhDsB,EAAkB,CAAE,CACrB,EACD,QAAS,SAAiB7H,EAAQ0I,EAAaN,EAAQO,EAAU,CAC/D,GAAIA,EAAU,CACZvG,EAAIpC,EAAQ,aAAc,EAAE,EAC5BoC,EAAIpC,EAAQ,YAAa,EAAE,EAC3B,IAAIiE,EAAWzB,GAAO,KAAK,EAAE,EAC3B0B,EAASD,GAAYA,EAAS,EAC9BE,EAASF,GAAYA,EAAS,EAC9B2E,GAAcF,EAAY,KAAON,EAAO,OAASlE,GAAU,GAC3D2E,GAAcH,EAAY,IAAMN,EAAO,MAAQjE,GAAU,GAC3DnE,EAAO,WAAa,CAAC,CAAC4I,EACtB5I,EAAO,WAAa,CAAC,CAAC6I,EACtBzG,EAAIpC,EAAQ,YAAa,eAAiB4I,EAAa,MAAQC,EAAa,OAAO,EACnF,KAAK,gBAAkBC,GAAQ9I,CAAM,EAErCoC,EAAIpC,EAAQ,aAAc,aAAe2I,EAAW,MAAQ,KAAK,QAAQ,OAAS,IAAM,KAAK,QAAQ,OAAS,GAAG,EACjHvG,EAAIpC,EAAQ,YAAa,oBAAoB,EAC7C,OAAOA,EAAO,UAAa,UAAY,aAAaA,EAAO,QAAQ,EACnEA,EAAO,SAAW,WAAW,UAAY,CACvCoC,EAAIpC,EAAQ,aAAc,EAAE,EAC5BoC,EAAIpC,EAAQ,YAAa,EAAE,EAC3BA,EAAO,SAAW,GAClBA,EAAO,WAAa,GACpBA,EAAO,WAAa,EACrB,EAAE2I,CAAQ,CACnB,CACA,CACG,CACH,CACA,SAASG,GAAQ9I,EAAQ,CACvB,OAAOA,EAAO,WAChB,CACA,SAASyI,GAAkBF,EAAeR,EAAUK,EAAQtD,EAAS,CACnE,OAAO,KAAK,KAAK,KAAK,IAAIiD,EAAS,IAAMQ,EAAc,IAAK,CAAC,EAAI,KAAK,IAAIR,EAAS,KAAOQ,EAAc,KAAM,CAAC,CAAC,EAAI,KAAK,KAAK,KAAK,IAAIR,EAAS,IAAMK,EAAO,IAAK,CAAC,EAAI,KAAK,IAAIL,EAAS,KAAOK,EAAO,KAAM,CAAC,CAAC,EAAItD,EAAQ,SAC7N,CAEA,IAAIiE,GAAU,CAAE,EACZC,GAAW,CACb,oBAAqB,EACvB,EACIC,GAAgB,CAClB,MAAO,SAAeC,EAAQ,CAE5B,QAAS7M,KAAU2M,GACbA,GAAS,eAAe3M,CAAM,GAAK,EAAEA,KAAU6M,KACjDA,EAAO7M,CAAM,EAAI2M,GAAS3M,CAAM,GAGpC0M,GAAQ,QAAQ,SAAUI,EAAG,CAC3B,GAAIA,EAAE,aAAeD,EAAO,WAC1B,KAAM,iCAAiC,OAAOA,EAAO,WAAY,iBAAiB,CAE1F,CAAK,EACDH,GAAQ,KAAKG,CAAM,CACpB,EACD,YAAa,SAAqBE,EAAWC,EAAUC,EAAK,CAC1D,IAAI5C,EAAQ,KACZ,KAAK,cAAgB,GACrB4C,EAAI,OAAS,UAAY,CACvB5C,EAAM,cAAgB,EACvB,EACD,IAAI6C,EAAkBH,EAAY,SAClCL,GAAQ,QAAQ,SAAUG,EAAQ,CAC3BG,EAASH,EAAO,UAAU,IAE3BG,EAASH,EAAO,UAAU,EAAEK,CAAe,GAC7CF,EAASH,EAAO,UAAU,EAAEK,CAAe,EAAExJ,EAAe,CAC1D,SAAUsJ,CACX,EAAEC,CAAG,CAAC,EAKLD,EAAS,QAAQH,EAAO,UAAU,GAAKG,EAASH,EAAO,UAAU,EAAEE,CAAS,GAC9EC,EAASH,EAAO,UAAU,EAAEE,CAAS,EAAErJ,EAAe,CACpD,SAAUsJ,CACX,EAAEC,CAAG,CAAC,EAEf,CAAK,CACF,EACD,kBAAmB,SAA2BD,EAAUvO,EAAIkO,EAAUlE,EAAS,CAC7EiE,GAAQ,QAAQ,SAAUG,EAAQ,CAChC,IAAIM,EAAaN,EAAO,WACxB,GAAI,GAACG,EAAS,QAAQG,CAAU,GAAK,CAACN,EAAO,qBAC7C,KAAIO,EAAc,IAAIP,EAAOG,EAAUvO,EAAIuO,EAAS,OAAO,EAC3DI,EAAY,SAAWJ,EACvBI,EAAY,QAAUJ,EAAS,QAC/BA,EAASG,CAAU,EAAIC,EAGvBlJ,EAASyI,EAAUS,EAAY,QAAQ,EAC7C,CAAK,EACD,QAASpN,KAAUgN,EAAS,QAC1B,GAAKA,EAAS,QAAQ,eAAehN,CAAM,EAC3C,KAAIqN,EAAW,KAAK,aAAaL,EAAUhN,EAAQgN,EAAS,QAAQhN,CAAM,CAAC,EACvE,OAAOqN,EAAa,MACtBL,EAAS,QAAQhN,CAAM,EAAIqN,GAGhC,EACD,mBAAoB,SAA4B5M,EAAMuM,EAAU,CAC9D,IAAIM,EAAkB,CAAE,EACxB,OAAAZ,GAAQ,QAAQ,SAAUG,EAAQ,CAC5B,OAAOA,EAAO,iBAAoB,YACtC3I,EAASoJ,EAAiBT,EAAO,gBAAgB,KAAKG,EAASH,EAAO,UAAU,EAAGpM,CAAI,CAAC,CAC9F,CAAK,EACM6M,CACR,EACD,aAAc,SAAsBN,EAAUvM,EAAMhB,EAAO,CACzD,IAAI8N,EACJ,OAAAb,GAAQ,QAAQ,SAAUG,EAAQ,CAE3BG,EAASH,EAAO,UAAU,GAG3BA,EAAO,iBAAmB,OAAOA,EAAO,gBAAgBpM,CAAI,GAAM,aACpE8M,EAAgBV,EAAO,gBAAgBpM,CAAI,EAAE,KAAKuM,EAASH,EAAO,UAAU,EAAGpN,CAAK,EAE5F,CAAK,EACM8N,CACX,CACA,EAEA,SAASC,GAAcC,EAAM,CAC3B,IAAIT,EAAWS,EAAK,SAClBC,EAASD,EAAK,OACdhN,EAAOgN,EAAK,KACZE,EAAWF,EAAK,SAChBG,EAAUH,EAAK,QACfI,EAAOJ,EAAK,KACZK,EAASL,EAAK,OACd9N,EAAW8N,EAAK,SAChBpN,EAAWoN,EAAK,SAChBM,EAAoBN,EAAK,kBACzBO,EAAoBP,EAAK,kBACzBQ,EAAgBR,EAAK,cACrBS,EAAcT,EAAK,YACnBU,EAAuBV,EAAK,qBAE9B,GADAT,EAAWA,GAAYU,GAAUA,EAAOpC,CAAO,EAC3C,EAAC0B,EACL,KAAIC,EACFxE,EAAUuE,EAAS,QACnBoB,EAAS,KAAO3N,EAAK,OAAO,CAAC,EAAE,cAAgBA,EAAK,OAAO,CAAC,EAE1D,OAAO,aAAe,CAACkE,GAAc,CAACC,GACxCqI,EAAM,IAAI,YAAYxM,EAAM,CAC1B,QAAS,GACT,WAAY,EAClB,CAAK,GAEDwM,EAAM,SAAS,YAAY,OAAO,EAClCA,EAAI,UAAUxM,EAAM,GAAM,EAAI,GAEhCwM,EAAI,GAAKY,GAAQH,EACjBT,EAAI,KAAOa,GAAUJ,EACrBT,EAAI,KAAOU,GAAYD,EACvBT,EAAI,MAAQW,EACZX,EAAI,SAAWtN,EACfsN,EAAI,SAAW5M,EACf4M,EAAI,kBAAoBc,EACxBd,EAAI,kBAAoBe,EACxBf,EAAI,cAAgBgB,EACpBhB,EAAI,SAAWiB,EAAcA,EAAY,YAAc,OACvD,IAAIG,EAAqB3K,EAAeA,EAAe,GAAIyK,CAAoB,EAAGvB,GAAc,mBAAmBnM,EAAMuM,CAAQ,CAAC,EAClI,QAAShN,KAAUqO,EACjBpB,EAAIjN,CAAM,EAAIqO,EAAmBrO,CAAM,EAErC0N,GACFA,EAAO,cAAcT,CAAG,EAEtBxE,EAAQ2F,CAAM,GAChB3F,EAAQ2F,CAAM,EAAE,KAAKpB,EAAUC,CAAG,EAEtC,CAEA,IAAIqB,GAAY,CAAC,KAAK,EAClBC,EAAc,SAAqBxB,EAAWC,EAAU,CAC1D,IAAIS,EAAO,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAE,EAC/EQ,EAAgBR,EAAK,IACrBe,EAAOlK,GAAyBmJ,EAAMa,EAAS,EACjD1B,GAAc,YAAY,KAAK/D,CAAQ,EAAEkE,EAAWC,EAAUtJ,EAAe,CAC3E,OAAQ+K,EACR,SAAUC,EACV,QAAS5D,EACT,OAAQ4C,EACR,OAAQiB,GACR,WAAYC,GACZ,QAAShB,EACT,YAAaiB,GACb,YAAaC,GACb,YAAaZ,EACb,eAAgBrF,EAAS,OACzB,cAAeoF,EACf,SAAUtO,GACV,kBAAmBoO,GACnB,SAAU1N,EACV,kBAAmB2N,GACnB,mBAAoBe,GACpB,qBAAsBC,GACtB,eAAgB,UAA0B,CACxCH,GAAc,EACf,EACD,cAAe,UAAyB,CACtCA,GAAc,EACf,EACD,sBAAuB,SAA+BpO,EAAM,CAC1DwO,EAAe,CACb,SAAUjC,EACV,KAAMvM,EACN,cAAewN,CACvB,CAAO,CACP,CACG,EAAEO,CAAI,CAAC,CACV,EACA,SAASS,EAAeC,EAAM,CAC5B1B,GAAc9J,EAAe,CAC3B,YAAawK,EACb,QAASN,EACT,SAAUa,EACV,OAAQf,EACR,SAAU/N,GACV,kBAAmBoO,GACnB,SAAU1N,EACV,kBAAmB2N,EACpB,EAAEkB,CAAI,CAAC,CACV,CACA,IAAIT,EACFC,EACA5D,EACA4C,EACAiB,GACAC,GACAhB,EACAiB,GACAlP,GACAU,EACA0N,GACAC,GACAmB,GACAjB,EACAkB,GAAsB,GACtBC,GAAkB,GAClBC,GAAY,CAAE,EACdC,GACAC,EACAC,GACAC,GACAC,GACAC,GACAd,GACAe,GACAC,GACAC,GAAwB,GACxBC,GAAyB,GACzBC,GAEAC,EACAC,GAAmC,CAAE,EAGrCC,GAAU,GACVC,GAAoB,CAAE,EAGpBC,GAAiB,OAAO,SAAa,IACvCC,GAA0BxL,GAC1ByL,GAAmB5L,IAAQD,EAAa,WAAa,QAErD8L,GAAmBH,IAAkB,CAACtL,IAAoB,CAACD,IAAO,cAAe,SAAS,cAAc,KAAK,EAC7G2L,GAA0B,UAAY,CACpC,GAAKJ,GAEL,IAAI3L,EACF,MAAO,GAET,IAAIlG,EAAK,SAAS,cAAc,GAAG,EACnC,OAAAA,EAAG,MAAM,QAAU,sBACZA,EAAG,MAAM,gBAAkB,OACtC,EAAK,EACHkS,GAAmB,SAA0BlS,EAAIgK,EAAS,CACxD,IAAImI,EAAQ7K,EAAItH,CAAE,EAChBoS,EAAU,SAASD,EAAM,KAAK,EAAI,SAASA,EAAM,WAAW,EAAI,SAASA,EAAM,YAAY,EAAI,SAASA,EAAM,eAAe,EAAI,SAASA,EAAM,gBAAgB,EAChKE,EAASvI,GAAS9J,EAAI,EAAGgK,CAAO,EAChCsI,EAASxI,GAAS9J,EAAI,EAAGgK,CAAO,EAChCuI,EAAgBF,GAAU/K,EAAI+K,CAAM,EACpCG,EAAiBF,GAAUhL,EAAIgL,CAAM,EACrCG,EAAkBF,GAAiB,SAASA,EAAc,UAAU,EAAI,SAASA,EAAc,WAAW,EAAIjK,EAAQ+J,CAAM,EAAE,MAC9HK,EAAmBF,GAAkB,SAASA,EAAe,UAAU,EAAI,SAASA,EAAe,WAAW,EAAIlK,EAAQgK,CAAM,EAAE,MACpI,GAAIH,EAAM,UAAY,OACpB,OAAOA,EAAM,gBAAkB,UAAYA,EAAM,gBAAkB,iBAAmB,WAAa,aAErG,GAAIA,EAAM,UAAY,OACpB,OAAOA,EAAM,oBAAoB,MAAM,GAAG,EAAE,QAAU,EAAI,WAAa,aAEzE,GAAIE,GAAUE,EAAc,OAAYA,EAAc,QAAa,OAAQ,CACzE,IAAII,EAAqBJ,EAAc,QAAa,OAAS,OAAS,QACtE,OAAOD,IAAWE,EAAe,QAAU,QAAUA,EAAe,QAAUG,GAAsB,WAAa,YACvH,CACI,OAAON,IAAWE,EAAc,UAAY,SAAWA,EAAc,UAAY,QAAUA,EAAc,UAAY,SAAWA,EAAc,UAAY,QAAUE,GAAmBL,GAAWD,EAAMJ,EAAgB,IAAM,QAAUO,GAAUH,EAAMJ,EAAgB,IAAM,QAAUU,EAAkBC,EAAmBN,GAAW,WAAa,YACtV,EACDQ,GAAqB,SAA4BC,EAAUC,EAAYC,EAAU,CAC/E,IAAIC,EAAcD,EAAWF,EAAS,KAAOA,EAAS,IACpDI,EAAcF,EAAWF,EAAS,MAAQA,EAAS,OACnDK,EAAkBH,EAAWF,EAAS,MAAQA,EAAS,OACvDM,EAAcJ,EAAWD,EAAW,KAAOA,EAAW,IACtDM,EAAcL,EAAWD,EAAW,MAAQA,EAAW,OACvDO,EAAkBN,EAAWD,EAAW,MAAQA,EAAW,OAC7D,OAAOE,IAAgBG,GAAeF,IAAgBG,GAAeJ,EAAcE,EAAkB,IAAMC,EAAcE,EAAkB,CAC5I,EAODC,GAA8B,SAAqCvH,EAAGC,EAAG,CACvE,IAAIuH,EACJ,OAAA1C,GAAU,KAAK,SAAUtC,EAAU,CACjC,IAAIiF,EAAYjF,EAAS1B,CAAO,EAAE,QAAQ,qBAC1C,GAAI,GAAC2G,GAAanJ,GAAUkE,CAAQ,GACpC,KAAIjC,EAAOhE,EAAQiG,CAAQ,EACzBkF,EAAqB1H,GAAKO,EAAK,KAAOkH,GAAazH,GAAKO,EAAK,MAAQkH,EACrEE,EAAmB1H,GAAKM,EAAK,IAAMkH,GAAaxH,GAAKM,EAAK,OAASkH,EACrE,GAAIC,GAAsBC,EACxB,OAAOH,EAAMhF,EAErB,CAAK,EACMgF,CACR,EACDI,GAAgB,SAAuB3J,EAAS,CAC9C,SAAS4J,EAAK5S,EAAO6S,EAAM,CACzB,OAAO,SAAUC,EAAIC,EAAM/D,EAAQxB,EAAK,CACtC,IAAIwF,EAAYF,EAAG,QAAQ,MAAM,MAAQC,EAAK,QAAQ,MAAM,MAAQD,EAAG,QAAQ,MAAM,OAASC,EAAK,QAAQ,MAAM,KACjH,GAAI/S,GAAS,OAAS6S,GAAQG,GAG5B,MAAO,GACF,GAAIhT,GAAS,MAAQA,IAAU,GACpC,MAAO,GACF,GAAI6S,GAAQ7S,IAAU,QAC3B,OAAOA,EACF,GAAI,OAAOA,GAAU,WAC1B,OAAO4S,EAAK5S,EAAM8S,EAAIC,EAAM/D,EAAQxB,CAAG,EAAGqF,CAAI,EAAEC,EAAIC,EAAM/D,EAAQxB,CAAG,EAErE,IAAIyF,GAAcJ,EAAOC,EAAKC,GAAM,QAAQ,MAAM,KAClD,OAAO/S,IAAU,IAAQ,OAAOA,GAAU,UAAYA,IAAUiT,GAAcjT,EAAM,MAAQA,EAAM,QAAQiT,CAAU,EAAI,EAE3H,CACP,CACI,IAAIC,EAAQ,CAAE,EACVC,EAAgBnK,EAAQ,OACxB,CAACmK,GAAiB5O,GAAQ4O,CAAa,GAAK,YAC9CA,EAAgB,CACd,KAAMA,CACP,GAEHD,EAAM,KAAOC,EAAc,KAC3BD,EAAM,UAAYN,EAAKO,EAAc,KAAM,EAAI,EAC/CD,EAAM,SAAWN,EAAKO,EAAc,GAAG,EACvCD,EAAM,YAAcC,EAAc,YAClCnK,EAAQ,MAAQkK,CACjB,EACD5D,GAAsB,UAA+B,CAC/C,CAAC2B,IAA2B5F,GAC9B/E,EAAI+E,EAAS,UAAW,MAAM,CAEjC,EACDkE,GAAwB,UAAiC,CACnD,CAAC0B,IAA2B5F,GAC9B/E,EAAI+E,EAAS,UAAW,EAAE,CAE7B,EAGCwF,IAAkB,CAACtL,IACrB,SAAS,iBAAiB,QAAS,SAAUiI,EAAK,CAChD,GAAIoC,GACF,OAAApC,EAAI,eAAgB,EACpBA,EAAI,iBAAmBA,EAAI,gBAAiB,EAC5CA,EAAI,0BAA4BA,EAAI,yBAA0B,EAC9DoC,GAAkB,GACX,EAEV,EAAE,EAAI,EAET,IAAIwD,GAAgC,SAAuC5F,EAAK,CAC9E,GAAIwB,EAAQ,CACVxB,EAAMA,EAAI,QAAUA,EAAI,QAAQ,CAAC,EAAIA,EACrC,IAAI6F,EAAUf,GAA4B9E,EAAI,QAASA,EAAI,OAAO,EAClE,GAAI6F,EAAS,CAEX,IAAI9R,EAAQ,CAAE,EACd,QAAS4C,KAAKqJ,EACRA,EAAI,eAAerJ,CAAC,IACtB5C,EAAM4C,CAAC,EAAIqJ,EAAIrJ,CAAC,GAGpB5C,EAAM,OAASA,EAAM,OAAS8R,EAC9B9R,EAAM,eAAiB,OACvBA,EAAM,gBAAkB,OACxB8R,EAAQxH,CAAO,EAAE,YAAYtK,CAAK,CACxC,CACA,CACA,EACI+R,GAAwB,SAA+B9F,EAAK,CAC1DwB,GACFA,EAAO,WAAWnD,CAAO,EAAE,iBAAiB2B,EAAI,MAAM,CAE1D,EAOA,SAASpE,EAASpK,EAAIgK,EAAS,CAC7B,GAAI,EAAEhK,GAAMA,EAAG,UAAYA,EAAG,WAAa,GACzC,KAAM,8CAA8C,OAAO,CAAA,EAAG,SAAS,KAAKA,CAAE,CAAC,EAEjF,KAAK,GAAKA,EACV,KAAK,QAAUgK,EAAUvE,EAAS,CAAA,EAAIuE,CAAO,EAG7ChK,EAAG6M,CAAO,EAAI,KACd,IAAIqB,EAAW,CACb,MAAO,KACP,KAAM,GACN,SAAU,GACV,MAAO,KACP,OAAQ,KACR,UAAW,WAAW,KAAKlO,EAAG,QAAQ,EAAI,MAAQ,KAClD,cAAe,EAEf,WAAY,GAEZ,sBAAuB,KAEvB,kBAAmB,GACnB,UAAW,UAAqB,CAC9B,OAAOkS,GAAiBlS,EAAI,KAAK,OAAO,CACzC,EACD,WAAY,iBACZ,YAAa,kBACb,UAAW,gBACX,OAAQ,SACR,OAAQ,KACR,gBAAiB,GACjB,UAAW,EACX,OAAQ,KACR,QAAS,SAAiBuU,EAAcvE,EAAQ,CAC9CuE,EAAa,QAAQ,OAAQvE,EAAO,WAAW,CAChD,EACD,WAAY,GACZ,eAAgB,GAChB,WAAY,UACZ,MAAO,EACP,iBAAkB,GAClB,qBAAsB,OAAO,SAAW,OAAS,QAAQ,SAAS,OAAO,iBAAkB,EAAE,GAAK,EAClG,cAAe,GACf,cAAe,oBACf,eAAgB,GAChB,kBAAmB,EACnB,eAAgB,CACd,EAAG,EACH,EAAG,CACJ,EAED,eAAgB5F,EAAS,iBAAmB,IAAS,iBAAkB,SAAW,CAAC/D,IAAUC,IAC7F,qBAAsB,CACvB,EACD6H,GAAc,kBAAkB,KAAMnO,EAAIkO,CAAQ,EAGlD,QAASlM,KAAQkM,EACf,EAAElM,KAAQgI,KAAaA,EAAQhI,CAAI,EAAIkM,EAASlM,CAAI,GAEtD2R,GAAc3J,CAAO,EAGrB,QAAStD,KAAM,KACTA,EAAG,OAAO,CAAC,IAAM,KAAO,OAAO,KAAKA,CAAE,GAAM,aAC9C,KAAKA,CAAE,EAAI,KAAKA,CAAE,EAAE,KAAK,IAAI,GAKjC,KAAK,gBAAkBsD,EAAQ,cAAgB,GAAQgI,GACnD,KAAK,kBAEP,KAAK,QAAQ,oBAAsB,GAIjChI,EAAQ,eACVvD,EAAGzG,EAAI,cAAe,KAAK,WAAW,GAEtCyG,EAAGzG,EAAI,YAAa,KAAK,WAAW,EACpCyG,EAAGzG,EAAI,aAAc,KAAK,WAAW,GAEnC,KAAK,kBACPyG,EAAGzG,EAAI,WAAY,IAAI,EACvByG,EAAGzG,EAAI,YAAa,IAAI,GAE1B6Q,GAAU,KAAK,KAAK,EAAE,EAGtB7G,EAAQ,OAASA,EAAQ,MAAM,KAAO,KAAK,KAAKA,EAAQ,MAAM,IAAI,IAAI,GAAK,CAAA,CAAE,EAG7EvE,EAAS,KAAMqH,IAAuB,CACxC,CACA1C,EAAS,UAA4C,CACnD,YAAaA,EACb,iBAAkB,SAA0BlF,EAAQ,CAC9C,CAAC,KAAK,GAAG,SAASA,CAAM,GAAKA,IAAW,KAAK,KAC/CkM,GAAa,KAEhB,EACD,cAAe,SAAuB5C,EAAKtJ,EAAQ,CACjD,OAAO,OAAO,KAAK,QAAQ,WAAc,WAAa,KAAK,QAAQ,UAAU,KAAK,KAAMsJ,EAAKtJ,EAAQ8K,CAAM,EAAI,KAAK,QAAQ,SAC7H,EACD,YAAa,SAA6CxB,EAAK,CAC7D,GAAKA,EAAI,WACT,KAAI5C,EAAQ,KACV5L,EAAK,KAAK,GACVgK,EAAU,KAAK,QACfwK,EAAkBxK,EAAQ,gBAC1ByK,EAAOjG,EAAI,KACXkG,EAAQlG,EAAI,SAAWA,EAAI,QAAQ,CAAC,GAAKA,EAAI,aAAeA,EAAI,cAAgB,SAAWA,EAC3FtJ,GAAUwP,GAASlG,GAAK,OACxBmG,EAAiBnG,EAAI,OAAO,aAAeA,EAAI,MAAQA,EAAI,KAAK,CAAC,GAAKA,EAAI,cAAgBA,EAAI,aAAY,EAAG,CAAC,IAAMtJ,EACpH0P,EAAS5K,EAAQ,OAInB,GAHA6K,GAAuB7U,CAAE,EAGrB,CAAAgQ,GAGA,0BAAwB,KAAKyE,CAAI,GAAKjG,EAAI,SAAW,GAAKxE,EAAQ,WAKlE,CAAA2K,EAAe,mBAKf,GAAC,KAAK,iBAAmBtO,IAAUnB,GAAUA,EAAO,QAAQ,YAAa,IAAK,YAGlFA,EAAS6B,EAAQ7B,EAAQ8E,EAAQ,UAAWhK,EAAI,EAAK,EACjD,EAAAkF,GAAUA,EAAO,WAGjBiL,KAAejL,GAUnB,IAJAhE,GAAWD,EAAMiE,CAAM,EACvBoK,GAAoBrO,EAAMiE,EAAQ8E,EAAQ,SAAS,EAG/C,OAAO4K,GAAW,YACpB,GAAIA,EAAO,KAAK,KAAMpG,EAAKtJ,EAAQ,IAAI,EAAG,CACxCsL,EAAe,CACb,SAAU5E,EACV,OAAQ+I,EACR,KAAM,SACN,SAAUzP,EACV,KAAMlF,EACN,OAAQA,CAClB,CAAS,EACD8P,EAAY,SAAUlE,EAAO,CAC3B,IAAK4C,CACf,CAAS,EACDgG,GAAmBhG,EAAI,eAAgB,EACvC,MACR,UACeoG,IACTA,EAASA,EAAO,MAAM,GAAG,EAAE,KAAK,SAAUE,EAAU,CAElD,GADAA,EAAW/N,EAAQ4N,EAAgBG,EAAS,KAAM,EAAE9U,EAAI,EAAK,EACzD8U,EACF,OAAAtE,EAAe,CACb,SAAU5E,EACV,OAAQkJ,EACR,KAAM,SACN,SAAU5P,EACV,OAAQlF,EACR,KAAMA,CAClB,CAAW,EACD8P,EAAY,SAAUlE,EAAO,CAC3B,IAAK4C,CACjB,CAAW,EACM,EAEjB,CAAO,EACGoG,GAAQ,CACVJ,GAAmBhG,EAAI,eAAgB,EACvC,MACR,CAEQxE,EAAQ,QAAU,CAACjD,EAAQ4N,EAAgB3K,EAAQ,OAAQhK,EAAI,EAAK,GAKxE,KAAK,kBAAkBwO,EAAKkG,EAAOxP,CAAM,GAC1C,EACD,kBAAmB,SAAwCsJ,EAAiBkG,EAAyBxP,EAAQ,CAC3G,IAAI0G,EAAQ,KACV5L,EAAK4L,EAAM,GACX5B,EAAU4B,EAAM,QAChBmJ,EAAgB/U,EAAG,cACnBgV,EACF,GAAI9P,GAAU,CAAC8K,GAAU9K,EAAO,aAAelF,EAAI,CACjD,IAAI6S,EAAWvK,EAAQpD,CAAM,EA0E7B,GAzEA+J,EAASjP,EACTgQ,EAAS9K,EACT+K,EAAWD,EAAO,WAClBE,GAASF,EAAO,YAChBG,GAAajL,EACbwL,GAAc1G,EAAQ,MACtBI,EAAS,QAAU4F,EACnBc,GAAS,CACP,OAAQd,EACR,SAAU0E,GAASlG,GAAK,QACxB,SAAUkG,GAASlG,GAAK,OACzB,EACD0C,GAAkBJ,GAAO,QAAU+B,EAAS,KAC5C1B,GAAiBL,GAAO,QAAU+B,EAAS,IAC3C,KAAK,QAAU6B,GAASlG,GAAK,QAC7B,KAAK,QAAUkG,GAASlG,GAAK,QAC7BwB,EAAO,MAAM,aAAa,EAAI,MAC9BgF,EAAc,UAAuB,CAInC,GAHAlF,EAAY,aAAclE,EAAO,CAC/B,IAAK4C,CACf,CAAS,EACGpE,EAAS,cAAe,CAC1BwB,EAAM,QAAS,EACf,MACV,CAGQA,EAAM,0BAA2B,EAC7B,CAACxF,IAAWwF,EAAM,kBACpBoE,EAAO,UAAY,IAIrBpE,EAAM,kBAAkB4C,EAAKkG,CAAK,EAGlClE,EAAe,CACb,SAAU5E,EACV,KAAM,SACN,cAAe4C,CACzB,CAAS,EAGDrH,EAAY6I,EAAQhG,EAAQ,YAAa,EAAI,CAC9C,EAGDA,EAAQ,OAAO,MAAM,GAAG,EAAE,QAAQ,SAAU8K,EAAU,CACpD/M,GAAKiI,EAAQ8E,EAAS,KAAI,EAAIG,EAAiB,CACvD,CAAO,EACDxO,EAAGsO,EAAe,WAAYX,EAA6B,EAC3D3N,EAAGsO,EAAe,YAAaX,EAA6B,EAC5D3N,EAAGsO,EAAe,YAAaX,EAA6B,EACxDpK,EAAQ,gBACVvD,EAAGsO,EAAe,YAAanJ,EAAM,OAAO,EAE5C,CAAC,KAAK,iBAAmBnF,EAAGsO,EAAe,gBAAiBnJ,EAAM,OAAO,IAEzEnF,EAAGsO,EAAe,UAAWnJ,EAAM,OAAO,EAC1CnF,EAAGsO,EAAe,WAAYnJ,EAAM,OAAO,EAC3CnF,EAAGsO,EAAe,cAAenJ,EAAM,OAAO,GAI5CxF,IAAW,KAAK,kBAClB,KAAK,QAAQ,oBAAsB,EACnC4J,EAAO,UAAY,IAErBF,EAAY,aAAc,KAAM,CAC9B,IAAKtB,CACb,CAAO,EAGGxE,EAAQ,QAAU,CAACA,EAAQ,kBAAoB0K,KAAW,CAAC,KAAK,iBAAmB,EAAEvO,IAAQD,IAAc,CAC7G,GAAIkE,EAAS,cAAe,CAC1B,KAAK,QAAS,EACd,MACV,CAIYJ,EAAQ,gBACVvD,EAAGsO,EAAe,YAAanJ,EAAM,mBAAmB,EACxDnF,EAAGsO,EAAe,gBAAiBnJ,EAAM,mBAAmB,IAE5DnF,EAAGsO,EAAe,UAAWnJ,EAAM,mBAAmB,EACtDnF,EAAGsO,EAAe,WAAYnJ,EAAM,mBAAmB,EACvDnF,EAAGsO,EAAe,cAAenJ,EAAM,mBAAmB,GAE5DnF,EAAGsO,EAAe,YAAanJ,EAAM,4BAA4B,EACjEnF,EAAGsO,EAAe,YAAanJ,EAAM,4BAA4B,EACjE5B,EAAQ,gBAAkBvD,EAAGsO,EAAe,cAAenJ,EAAM,4BAA4B,EAC7FA,EAAM,gBAAkB,WAAWoJ,EAAahL,EAAQ,KAAK,CACrE,MACQgL,EAAa,CAErB,CACG,EACD,6BAA8B,SAAsEtQ,EAAG,CACrG,IAAIgQ,EAAQhQ,EAAE,QAAUA,EAAE,QAAQ,CAAC,EAAIA,EACnC,KAAK,IAAI,KAAK,IAAIgQ,EAAM,QAAU,KAAK,MAAM,EAAG,KAAK,IAAIA,EAAM,QAAU,KAAK,MAAM,CAAC,GAAK,KAAK,MAAM,KAAK,QAAQ,qBAAuB,KAAK,iBAAmB,OAAO,kBAAoB,EAAE,GAChM,KAAK,oBAAqB,CAE7B,EACD,oBAAqB,UAA+B,CAClD1E,GAAUiF,GAAkBjF,CAAM,EAClC,aAAa,KAAK,eAAe,EACjC,KAAK,0BAA2B,CACjC,EACD,0BAA2B,UAAqC,CAC9D,IAAI+E,EAAgB,KAAK,GAAG,cAC5BpO,EAAIoO,EAAe,UAAW,KAAK,mBAAmB,EACtDpO,EAAIoO,EAAe,WAAY,KAAK,mBAAmB,EACvDpO,EAAIoO,EAAe,cAAe,KAAK,mBAAmB,EAC1DpO,EAAIoO,EAAe,YAAa,KAAK,mBAAmB,EACxDpO,EAAIoO,EAAe,gBAAiB,KAAK,mBAAmB,EAC5DpO,EAAIoO,EAAe,YAAa,KAAK,4BAA4B,EACjEpO,EAAIoO,EAAe,YAAa,KAAK,4BAA4B,EACjEpO,EAAIoO,EAAe,cAAe,KAAK,4BAA4B,CACpE,EACD,kBAAmB,SAAwCvG,EAAiBkG,EAAO,CACjFA,EAAQA,GAASlG,EAAI,aAAe,SAAWA,EAC3C,CAAC,KAAK,iBAAmBkG,EACvB,KAAK,QAAQ,eACfjO,EAAG,SAAU,cAAe,KAAK,YAAY,EACpCiO,EACTjO,EAAG,SAAU,YAAa,KAAK,YAAY,EAE3CA,EAAG,SAAU,YAAa,KAAK,YAAY,GAG7CA,EAAGuJ,EAAQ,UAAW,IAAI,EAC1BvJ,EAAGwI,EAAQ,YAAa,KAAK,YAAY,GAE3C,GAAI,CACE,SAAS,UACXiG,GAAU,UAAY,CACpB,SAAS,UAAU,MAAO,CACpC,CAAS,EAED,OAAO,aAAc,EAAC,gBAAiB,CAE1C,MAAa,CAAA,CACf,EACD,aAAc,SAAsBC,EAAU3G,EAAK,CAEjD,GADAmC,GAAsB,GAClB1B,GAAUe,EAAQ,CACpBF,EAAY,cAAe,KAAM,CAC/B,IAAKtB,CACb,CAAO,EACG,KAAK,iBACP/H,EAAG,SAAU,WAAY6N,EAAqB,EAEhD,IAAItK,EAAU,KAAK,QAGnB,CAACmL,GAAYhO,EAAY6I,EAAQhG,EAAQ,UAAW,EAAK,EACzD7C,EAAY6I,EAAQhG,EAAQ,WAAY,EAAI,EAC5CI,EAAS,OAAS,KAClB+K,GAAY,KAAK,aAAc,EAG/B3E,EAAe,CACb,SAAU,KACV,KAAM,QACN,cAAehC,CACvB,CAAO,CACP,MACM,KAAK,SAAU,CAElB,EACD,iBAAkB,UAA4B,CAC5C,GAAIuC,EAAU,CACZ,KAAK,OAASA,EAAS,QACvB,KAAK,OAASA,EAAS,QACvBT,GAAqB,EAGrB,QAFIpL,EAAS,SAAS,iBAAiB6L,EAAS,QAASA,EAAS,OAAO,EACrEtH,EAASvE,EACNA,GAAUA,EAAO,aACtBA,EAASA,EAAO,WAAW,iBAAiB6L,EAAS,QAASA,EAAS,OAAO,EAC1E7L,IAAWuE,IACfA,EAASvE,EAGX,GADA8K,EAAO,WAAWnD,CAAO,EAAE,iBAAiB3H,CAAM,EAC9CuE,EACF,EAAG,CACD,GAAIA,EAAOoD,CAAO,EAAG,CACnB,IAAIuI,EAAW,OAOf,GANAA,EAAW3L,EAAOoD,CAAO,EAAE,YAAY,CACrC,QAASkE,EAAS,QAClB,QAASA,EAAS,QAClB,OAAQ7L,EACR,OAAQuE,CACtB,CAAa,EACG2L,GAAY,CAAC,KAAK,QAAQ,eAC5B,KAEd,CACUlQ,EAASuE,CACnB,OACsCA,EAAS3C,GAAgB2C,CAAM,GAE/D8G,GAAuB,CAC7B,CACG,EACD,aAAc,SAAsC/B,EAAK,CACvD,GAAIsC,GAAQ,CACV,IAAI9G,EAAU,KAAK,QACjBqL,EAAoBrL,EAAQ,kBAC5BsL,EAAiBtL,EAAQ,eACzB0K,EAAQlG,EAAI,QAAUA,EAAI,QAAQ,CAAC,EAAIA,EACvC+G,EAAclJ,GAAW3E,GAAO2E,EAAS,EAAI,EAC7CjD,EAASiD,GAAWkJ,GAAeA,EAAY,EAC/ClM,EAASgD,GAAWkJ,GAAeA,EAAY,EAC/CC,EAAuB1D,IAA2BL,GAAuBlH,GAAwBkH,CAAmB,EACpHgE,GAAMf,EAAM,QAAU5D,GAAO,QAAUwE,EAAe,IAAMlM,GAAU,IAAMoM,EAAuBA,EAAqB,CAAC,EAAI9D,GAAiC,CAAC,EAAI,IAAMtI,GAAU,GACnLsM,GAAMhB,EAAM,QAAU5D,GAAO,QAAUwE,EAAe,IAAMjM,GAAU,IAAMmM,EAAuBA,EAAqB,CAAC,EAAI9D,GAAiC,CAAC,EAAI,IAAMrI,GAAU,GAGrL,GAAI,CAACe,EAAS,QAAU,CAACuG,GAAqB,CAC5C,GAAI0E,GAAqB,KAAK,IAAI,KAAK,IAAIX,EAAM,QAAU,KAAK,MAAM,EAAG,KAAK,IAAIA,EAAM,QAAU,KAAK,MAAM,CAAC,EAAIW,EAChH,OAEF,KAAK,aAAa7G,EAAK,EAAI,CACnC,CACM,GAAInC,EAAS,CACPkJ,GACFA,EAAY,GAAKE,GAAMzE,IAAU,GACjCuE,EAAY,GAAKG,GAAMzE,IAAU,IAEjCsE,EAAc,CACZ,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAGE,EACH,EAAGC,CACJ,EAEH,IAAIC,EAAY,UAAU,OAAOJ,EAAY,EAAG,GAAG,EAAE,OAAOA,EAAY,EAAG,GAAG,EAAE,OAAOA,EAAY,EAAG,GAAG,EAAE,OAAOA,EAAY,EAAG,GAAG,EAAE,OAAOA,EAAY,EAAG,GAAG,EAAE,OAAOA,EAAY,EAAG,GAAG,EAC1LjO,EAAI+E,EAAS,kBAAmBsJ,CAAS,EACzCrO,EAAI+E,EAAS,eAAgBsJ,CAAS,EACtCrO,EAAI+E,EAAS,cAAesJ,CAAS,EACrCrO,EAAI+E,EAAS,YAAasJ,CAAS,EACnC3E,GAASyE,EACTxE,GAASyE,EACT3E,EAAW2D,CACnB,CACMlG,EAAI,YAAcA,EAAI,eAAgB,CAC5C,CACG,EACD,aAAc,UAAwB,CAGpC,GAAI,CAACnC,EAAS,CACZ,IAAI3D,EAAY,KAAK,QAAQ,eAAiB,SAAS,KAAOuG,EAC5D3C,EAAOhE,EAAQ0H,EAAQ,GAAM8B,GAAyB,GAAMpJ,CAAS,EACrEsB,EAAU,KAAK,QAGjB,GAAI8H,GAAyB,CAG3B,IADAL,EAAsB/I,EACfpB,EAAImK,EAAqB,UAAU,IAAM,UAAYnK,EAAImK,EAAqB,WAAW,IAAM,QAAUA,IAAwB,UACtIA,EAAsBA,EAAoB,WAExCA,IAAwB,SAAS,MAAQA,IAAwB,SAAS,iBACxEA,IAAwB,WAAUA,EAAsBrJ,EAA2B,GACvFkE,EAAK,KAAOmF,EAAoB,UAChCnF,EAAK,MAAQmF,EAAoB,YAEjCA,EAAsBrJ,EAA2B,EAEnDsJ,GAAmCnH,GAAwBkH,CAAmB,CACtF,CACMpF,EAAU2D,EAAO,UAAU,EAAI,EAC/B7I,EAAYkF,EAASrC,EAAQ,WAAY,EAAK,EAC9C7C,EAAYkF,EAASrC,EAAQ,cAAe,EAAI,EAChD7C,EAAYkF,EAASrC,EAAQ,UAAW,EAAI,EAC5C1C,EAAI+E,EAAS,aAAc,EAAE,EAC7B/E,EAAI+E,EAAS,YAAa,EAAE,EAC5B/E,EAAI+E,EAAS,aAAc,YAAY,EACvC/E,EAAI+E,EAAS,SAAU,CAAC,EACxB/E,EAAI+E,EAAS,MAAOC,EAAK,GAAG,EAC5BhF,EAAI+E,EAAS,OAAQC,EAAK,IAAI,EAC9BhF,EAAI+E,EAAS,QAASC,EAAK,KAAK,EAChChF,EAAI+E,EAAS,SAAUC,EAAK,MAAM,EAClChF,EAAI+E,EAAS,UAAW,KAAK,EAC7B/E,EAAI+E,EAAS,WAAYyF,GAA0B,WAAa,OAAO,EACvExK,EAAI+E,EAAS,SAAU,QAAQ,EAC/B/E,EAAI+E,EAAS,gBAAiB,MAAM,EACpCjC,EAAS,MAAQiC,EACjB3D,EAAU,YAAY2D,CAAO,EAG7B/E,EAAI+E,EAAS,mBAAoB6E,GAAkB,SAAS7E,EAAQ,MAAM,KAAK,EAAI,IAAM,KAAO8E,GAAiB,SAAS9E,EAAQ,MAAM,MAAM,EAAI,IAAM,GAAG,CACjK,CACG,EACD,aAAc,SAAiCmC,EAAiB2G,EAAU,CACxE,IAAIvJ,EAAQ,KACR2I,EAAe/F,EAAI,aACnBxE,EAAU4B,EAAM,QAIpB,GAHAkE,EAAY,YAAa,KAAM,CAC7B,IAAKtB,CACX,CAAK,EACGpE,EAAS,cAAe,CAC1B,KAAK,QAAS,EACd,MACN,CACI0F,EAAY,aAAc,IAAI,EACzB1F,EAAS,gBACZ+E,EAAUlD,GAAM+D,CAAM,EACtBb,EAAQ,gBAAgB,IAAI,EAC5BA,EAAQ,UAAY,GACpBA,EAAQ,MAAM,aAAa,EAAI,GAC/B,KAAK,WAAY,EACjBhI,EAAYgI,EAAS,KAAK,QAAQ,YAAa,EAAK,EACpD/E,EAAS,MAAQ+E,GAInBvD,EAAM,QAAUsJ,GAAU,UAAY,CACpCpF,EAAY,QAASlE,CAAK,EACtB,CAAAxB,EAAS,gBACRwB,EAAM,QAAQ,mBACjBqD,EAAO,aAAaE,EAASa,CAAM,EAErCpE,EAAM,WAAY,EAClB4E,EAAe,CACb,SAAU5E,EACV,KAAM,OACd,CAAO,EACP,CAAK,EACD,CAACuJ,GAAYhO,EAAY6I,EAAQhG,EAAQ,UAAW,EAAI,EAGpDmL,GACFvE,GAAkB,GAClBhF,EAAM,QAAU,YAAYA,EAAM,iBAAkB,EAAE,IAGtDjF,EAAI,SAAU,UAAWiF,EAAM,OAAO,EACtCjF,EAAI,SAAU,WAAYiF,EAAM,OAAO,EACvCjF,EAAI,SAAU,cAAeiF,EAAM,OAAO,EACtC2I,IACFA,EAAa,cAAgB,OAC7BvK,EAAQ,SAAWA,EAAQ,QAAQ,KAAK4B,EAAO2I,EAAcvE,CAAM,GAErEvJ,EAAG,SAAU,OAAQmF,CAAK,EAG1BtE,EAAI0I,EAAQ,YAAa,eAAe,GAE1CW,GAAsB,GACtB/E,EAAM,aAAesJ,GAAUtJ,EAAM,aAAa,KAAKA,EAAOuJ,EAAU3G,CAAG,CAAC,EAC5E/H,EAAG,SAAU,cAAemF,CAAK,EACjCyE,GAAQ,GACR,OAAO,aAAc,EAAC,gBAAiB,EACnChK,IACFiB,EAAI,SAAS,KAAM,cAAe,MAAM,CAE3C,EAED,YAAa,SAAgCkH,EAAK,CAChD,IAAIxO,EAAK,KAAK,GACZkF,EAASsJ,EAAI,OACbqE,EACAC,EACA8C,EACA5L,EAAU,KAAK,QACfkK,EAAQlK,EAAQ,MAChB6L,EAAiBzL,EAAS,OAC1B0L,EAAUpF,KAAgBwD,EAC1B6B,EAAU/L,EAAQ,KAClBgM,EAAevG,GAAeoG,EAC9B9C,EACAnH,EAAQ,KACRqK,EAAiB,GACnB,GAAItE,GAAS,OACb,SAASuE,EAAclU,GAAMmU,GAAO,CAClCrG,EAAY9N,GAAM4J,EAAO3G,EAAe,CACtC,IAAKuJ,EACL,QAASsH,EACT,KAAM/C,EAAW,WAAa,aAC9B,OAAQ6C,EACR,SAAU/C,EACV,WAAYC,EACZ,QAASiD,EACT,aAAcC,EACd,OAAQ9Q,EACR,UAAWkR,EACX,OAAQ,SAAgBlR,GAAQmR,GAAO,CACrC,OAAOC,GAAQrH,EAAQjP,EAAIgQ,EAAQ6C,EAAU3N,GAAQoD,EAAQpD,EAAM,EAAGsJ,EAAK6H,EAAK,CACjF,EACD,QAASE,CACV,EAAEJ,EAAK,CAAC,CACf,CAGI,SAASK,GAAU,CACjBN,EAAc,0BAA0B,EACxCtK,EAAM,sBAAuB,EACzBA,IAAUoK,GACZA,EAAa,sBAAuB,CAE5C,CAGI,SAASI,EAAUK,GAAW,CAC5B,OAAAP,EAAc,oBAAqB,CACjC,UAAWO,EACnB,CAAO,EACGA,KAEEX,EACFD,EAAe,WAAY,EAE3BA,EAAe,WAAWjK,CAAK,EAE7BA,IAAUoK,IAEZ7O,EAAY6I,EAAQP,EAAcA,EAAY,QAAQ,WAAaoG,EAAe,QAAQ,WAAY,EAAK,EAC3G1O,EAAY6I,EAAQhG,EAAQ,WAAY,EAAI,GAE1CyF,IAAgB7D,GAASA,IAAUxB,EAAS,OAC9CqF,EAAc7D,EACLA,IAAUxB,EAAS,QAAUqF,IACtCA,EAAc,MAIZuG,IAAiBpK,IACnBA,EAAM,sBAAwB1G,GAEhC0G,EAAM,WAAW,UAAY,CAC3BsK,EAAc,2BAA2B,EACzCtK,EAAM,sBAAwB,IACxC,CAAS,EACGA,IAAUoK,IACZA,EAAa,WAAY,EACzBA,EAAa,sBAAwB,QAKrC9Q,IAAW8K,GAAU,CAACA,EAAO,UAAY9K,IAAWlF,GAAM,CAACkF,EAAO,YACpEkM,GAAa,MAIX,CAACpH,EAAQ,gBAAkB,CAACwE,EAAI,QAAUtJ,IAAW,WACvD8K,EAAO,WAAWnD,CAAO,EAAE,iBAAiB2B,EAAI,MAAM,EAGtD,CAACiI,IAAarC,GAA8B5F,CAAG,GAEjD,CAACxE,EAAQ,gBAAkBwE,EAAI,iBAAmBA,EAAI,gBAAiB,EAChEyH,EAAiB,EAC9B,CAGI,SAASM,GAAU,CACjB3U,EAAWX,EAAM+O,CAAM,EACvBT,GAAoBtO,EAAM+O,EAAQhG,EAAQ,SAAS,EACnDwG,EAAe,CACb,SAAU5E,EACV,KAAM,SACN,KAAM5L,EACN,SAAU4B,EACV,kBAAmB2N,GACnB,cAAef,CACvB,CAAO,CACP,CAMI,GALIA,EAAI,iBAAmB,QACzBA,EAAI,YAAcA,EAAI,eAAgB,EAExCtJ,EAAS6B,EAAQ7B,EAAQ8E,EAAQ,UAAWhK,EAAI,EAAI,EACpDkW,EAAc,UAAU,EACpB9L,EAAS,cAAe,OAAO6L,EACnC,GAAIjG,EAAO,SAASxB,EAAI,MAAM,GAAKtJ,EAAO,UAAYA,EAAO,YAAcA,EAAO,YAAc0G,EAAM,wBAA0B1G,EAC9H,OAAOkR,EAAU,EAAK,EAGxB,GADAxF,GAAkB,GACdiF,GAAkB,CAAC7L,EAAQ,WAAa8L,EAAUC,IAAYH,EAAS3F,IAAahB,GACtFQ,IAAgB,OAAS,KAAK,YAAciB,GAAY,UAAU,KAAMmF,EAAgB7F,EAAQxB,CAAG,IAAM0F,EAAM,SAAS,KAAM2B,EAAgB7F,EAAQxB,CAAG,GAAI,CAI7J,GAHAuE,EAAW,KAAK,cAAcvE,EAAKtJ,CAAM,IAAM,WAC/C2N,EAAWvK,EAAQ0H,CAAM,EACzBkG,EAAc,eAAe,EACzB9L,EAAS,cAAe,OAAO6L,EACnC,GAAIL,EACF,OAAA3F,EAAWhB,EACXuH,EAAS,EACT,KAAK,WAAY,EACjBN,EAAc,QAAQ,EACjB9L,EAAS,gBACR8F,GACFjB,EAAO,aAAae,EAAQE,EAAM,EAElCjB,EAAO,YAAYe,CAAM,GAGtBoG,EAAU,EAAI,EAEvB,IAAIM,EAAcrM,GAAUrK,EAAIgK,EAAQ,SAAS,EACjD,GAAI,CAAC0M,GAAeC,GAAanI,EAAKuE,EAAU,IAAI,GAAK,CAAC2D,EAAY,SAAU,CAI9E,GAAIA,IAAgB1G,EAClB,OAAOoG,EAAU,EAAK,EAUxB,GANIM,GAAe1W,IAAOwO,EAAI,SAC5BtJ,EAASwR,GAEPxR,IACF4N,EAAaxK,EAAQpD,CAAM,GAEzBoR,GAAQrH,EAAQjP,EAAIgQ,EAAQ6C,EAAU3N,EAAQ4N,EAAYtE,EAAK,CAAC,CAACtJ,CAAM,IAAM,GAC/E,OAAAsR,EAAS,EACLE,GAAeA,EAAY,YAE7B1W,EAAG,aAAagQ,EAAQ0G,EAAY,WAAW,EAE/C1W,EAAG,YAAYgQ,CAAM,EAEvBC,EAAWjQ,EAEXuW,EAAS,EACFH,EAAU,EAAI,CAE/B,SAAiBM,GAAeE,GAAcpI,EAAKuE,EAAU,IAAI,EAAG,CAE5D,IAAI8D,GAAa/M,GAAS9J,EAAI,EAAGgK,EAAS,EAAI,EAC9C,GAAI6M,KAAe7G,EACjB,OAAOoG,EAAU,EAAK,EAIxB,GAFAlR,EAAS2R,GACT/D,EAAaxK,EAAQpD,CAAM,EACvBoR,GAAQrH,EAAQjP,EAAIgQ,EAAQ6C,EAAU3N,EAAQ4N,EAAYtE,EAAK,EAAK,IAAM,GAC5E,OAAAgI,EAAS,EACTxW,EAAG,aAAagQ,EAAQ6G,EAAU,EAClC5G,EAAWjQ,EAEXuW,EAAS,EACFH,EAAU,EAAI,CAE/B,SAAiBlR,EAAO,aAAelF,EAAI,CACnC8S,EAAaxK,EAAQpD,CAAM,EAC3B,IAAI4R,EAAY,EACdC,GACAC,GAAiBhH,EAAO,aAAehQ,EACvCiX,EAAkB,CAACrE,GAAmB5C,EAAO,UAAYA,EAAO,QAAU6C,EAAU3N,EAAO,UAAYA,EAAO,QAAU4N,EAAYC,CAAQ,EAC5ImE,GAAQnE,EAAW,MAAQ,OAC3BoE,EAAkB7N,GAAepE,EAAQ,MAAO,KAAK,GAAKoE,GAAe0G,EAAQ,MAAO,KAAK,EAC7FoH,GAAeD,EAAkBA,EAAgB,UAAY,OAC3D/F,KAAelM,IACjB6R,GAAwBjE,EAAWoE,EAAK,EACxC5F,GAAwB,GACxBC,GAAyB,CAAC0F,GAAmBjN,EAAQ,YAAcgN,IAErEF,EAAYO,GAAkB7I,EAAKtJ,EAAQ4N,EAAYC,EAAUkE,EAAkB,EAAIjN,EAAQ,cAAeA,EAAQ,uBAAyB,KAAOA,EAAQ,cAAgBA,EAAQ,sBAAuBuH,GAAwBH,KAAelM,CAAM,EAC1P,IAAIoS,EACJ,GAAIR,IAAc,EAAG,CAEnB,IAAIS,GAAYtW,EAAM+O,CAAM,EAC5B,GACEuH,IAAaT,EACbQ,EAAUrH,EAAS,SAASsH,EAAS,QAC9BD,IAAYhQ,EAAIgQ,EAAS,SAAS,IAAM,QAAUA,IAAYjL,GACjF,CAEQ,GAAIyK,IAAc,GAAKQ,IAAYpS,EACjC,OAAOkR,EAAU,EAAK,EAExBhF,GAAalM,EACbmM,GAAgByF,EAChB,IAAIU,GAActS,EAAO,mBACvBmR,GAAQ,GACVA,GAAQS,IAAc,EACtB,IAAIW,GAAanB,GAAQrH,EAAQjP,EAAIgQ,EAAQ6C,EAAU3N,EAAQ4N,EAAYtE,EAAK6H,EAAK,EACrF,GAAIoB,KAAe,GACjB,OAAIA,KAAe,GAAKA,KAAe,MACrCpB,GAAQoB,KAAe,GAEzB9F,GAAU,GACV,WAAW+F,GAAW,EAAE,EACxBlB,EAAS,EACLH,IAAS,CAACmB,GACZxX,EAAG,YAAYgQ,CAAM,EAErB9K,EAAO,WAAW,aAAa8K,EAAQqG,GAAQmB,GAActS,CAAM,EAIjEiS,GACFrL,GAASqL,EAAiB,EAAGC,GAAeD,EAAgB,SAAS,EAEvElH,EAAWD,EAAO,WAGd+G,KAA0B,QAAa,CAACxF,KAC1CC,GAAqB,KAAK,IAAIuF,GAAwBzO,EAAQpD,CAAM,EAAEgS,EAAK,CAAC,GAE9EX,EAAS,EACFH,EAAU,EAAI,CAE/B,CACM,GAAIpW,EAAG,SAASgQ,CAAM,EACpB,OAAOoG,EAAU,EAAK,CAE9B,CACI,MAAO,EACR,EACD,sBAAuB,KACvB,eAAgB,UAA0B,CACxCzP,EAAI,SAAU,YAAa,KAAK,YAAY,EAC5CA,EAAI,SAAU,YAAa,KAAK,YAAY,EAC5CA,EAAI,SAAU,cAAe,KAAK,YAAY,EAC9CA,EAAI,SAAU,WAAYyN,EAA6B,EACvDzN,EAAI,SAAU,YAAayN,EAA6B,EACxDzN,EAAI,SAAU,YAAayN,EAA6B,CACzD,EACD,aAAc,UAAwB,CACpC,IAAIW,EAAgB,KAAK,GAAG,cAC5BpO,EAAIoO,EAAe,UAAW,KAAK,OAAO,EAC1CpO,EAAIoO,EAAe,WAAY,KAAK,OAAO,EAC3CpO,EAAIoO,EAAe,YAAa,KAAK,OAAO,EAC5CpO,EAAIoO,EAAe,gBAAiB,KAAK,OAAO,EAChDpO,EAAIoO,EAAe,cAAe,KAAK,OAAO,EAC9CpO,EAAI,SAAU,cAAe,IAAI,CAClC,EACD,QAAS,SAA4B6H,EAAK,CACxC,IAAIxO,EAAK,KAAK,GACZgK,EAAU,KAAK,QAajB,GAVApI,EAAWX,EAAM+O,CAAM,EACvBT,GAAoBtO,EAAM+O,EAAQhG,EAAQ,SAAS,EACnD8F,EAAY,OAAQ,KAAM,CACxB,IAAKtB,CACX,CAAK,EACDyB,EAAWD,GAAUA,EAAO,WAG5BpO,EAAWX,EAAM+O,CAAM,EACvBT,GAAoBtO,EAAM+O,EAAQhG,EAAQ,SAAS,EAC/CI,EAAS,cAAe,CAC1B,KAAK,SAAU,EACf,MACN,CACIuG,GAAsB,GACtBY,GAAyB,GACzBD,GAAwB,GACxB,cAAc,KAAK,OAAO,EAC1B,aAAa,KAAK,eAAe,EACjCqG,GAAgB,KAAK,OAAO,EAC5BA,GAAgB,KAAK,YAAY,EAG7B,KAAK,kBACPhR,EAAI,SAAU,OAAQ,IAAI,EAC1BA,EAAI3G,EAAI,YAAa,KAAK,YAAY,GAExC,KAAK,eAAgB,EACrB,KAAK,aAAc,EACfqG,IACFiB,EAAI,SAAS,KAAM,cAAe,EAAE,EAEtCA,EAAI0I,EAAQ,YAAa,EAAE,EACvBxB,IACE6B,KACF7B,EAAI,YAAcA,EAAI,eAAgB,EACtC,CAACxE,EAAQ,YAAcwE,EAAI,gBAAiB,GAE9CnC,GAAWA,EAAQ,YAAcA,EAAQ,WAAW,YAAYA,CAAO,GACnE4C,IAAWgB,GAAYR,GAAeA,EAAY,cAAgB,UAEpEN,GAAWA,EAAQ,YAAcA,EAAQ,WAAW,YAAYA,CAAO,EAErEa,IACE,KAAK,iBACPrJ,EAAIqJ,EAAQ,UAAW,IAAI,EAE7BiF,GAAkBjF,CAAM,EACxBA,EAAO,MAAM,aAAa,EAAI,GAI1BK,IAAS,CAACM,IACZxJ,EAAY6I,EAAQP,EAAcA,EAAY,QAAQ,WAAa,KAAK,QAAQ,WAAY,EAAK,EAEnGtI,EAAY6I,EAAQ,KAAK,QAAQ,YAAa,EAAK,EAGnDQ,EAAe,CACb,SAAU,KACV,KAAM,WACN,KAAMP,EACN,SAAU,KACV,kBAAmB,KACnB,cAAezB,CACzB,CAAS,EACGS,IAAWgB,GACTrO,GAAY,IAEd4O,EAAe,CACb,OAAQP,EACR,KAAM,MACN,KAAMA,EACN,OAAQhB,EACR,cAAeT,CAC7B,CAAa,EAGDgC,EAAe,CACb,SAAU,KACV,KAAM,SACN,KAAMP,EACN,cAAezB,CAC7B,CAAa,EAGDgC,EAAe,CACb,OAAQP,EACR,KAAM,OACN,KAAMA,EACN,OAAQhB,EACR,cAAeT,CAC7B,CAAa,EACDgC,EAAe,CACb,SAAU,KACV,KAAM,OACN,KAAMP,EACN,cAAezB,CAC7B,CAAa,GAEHiB,GAAeA,EAAY,KAAM,GAE7B7N,IAAaV,IACXU,GAAY,IAEd4O,EAAe,CACb,SAAU,KACV,KAAM,SACN,KAAMP,EACN,cAAezB,CAC/B,CAAe,EACDgC,EAAe,CACb,SAAU,KACV,KAAM,OACN,KAAMP,EACN,cAAezB,CAC/B,CAAe,GAIHpE,EAAS,UAEPxI,GAAY,MAAQA,IAAa,MACnCA,EAAWV,GACXqO,GAAoBD,IAEtBkB,EAAe,CACb,SAAU,KACV,KAAM,MACN,KAAMP,EACN,cAAezB,CAC3B,CAAW,EAGD,KAAK,KAAM,KAIjB,KAAK,SAAU,CAChB,EACD,SAAU,UAAoB,CAC5BsB,EAAY,UAAW,IAAI,EAC3Bb,EAASe,EAASC,EAAW5D,EAAU6D,GAASf,EAAUgB,GAAaC,GAAcU,GAASC,EAAWV,GAAQzO,EAAW2N,GAAoBrO,GAAWoO,GAAoB8B,GAAaC,GAAgB5B,EAAciB,GAActG,EAAS,QAAUA,EAAS,MAAQA,EAAS,MAAQA,EAAS,OAAS,KAC/SwH,GAAkB,QAAQ,SAAU5R,EAAI,CACtCA,EAAG,QAAU,EACnB,CAAK,EACD4R,GAAkB,OAASZ,GAASC,GAAS,CAC9C,EACD,YAAa,SAAgCzC,EAAK,CAChD,OAAQA,EAAI,KAAI,CACd,IAAK,OACL,IAAK,UACH,KAAK,QAAQA,CAAG,EAChB,MACF,IAAK,YACL,IAAK,WACCwB,IACF,KAAK,YAAYxB,CAAG,EACpBoJ,GAAgBpJ,CAAG,GAErB,MACF,IAAK,cACHA,EAAI,eAAgB,EACpB,KACR,CACG,EAKD,QAAS,UAAmB,CAO1B,QANIqJ,EAAQ,CAAE,EACZ7X,EACAmK,EAAW,KAAK,GAAG,SACnBhF,EAAI,EACJgD,EAAIgC,EAAS,OACbH,EAAU,KAAK,QACV7E,EAAIgD,EAAGhD,IACZnF,EAAKmK,EAAShF,CAAC,EACX4B,EAAQ/G,EAAIgK,EAAQ,UAAW,KAAK,GAAI,EAAK,GAC/C6N,EAAM,KAAK7X,EAAG,aAAagK,EAAQ,UAAU,GAAK8N,GAAY9X,CAAE,CAAC,EAGrE,OAAO6X,CACR,EAKD,KAAM,SAAcA,EAAOE,EAAc,CACvC,IAAIC,EAAQ,CAAE,EACZ/I,EAAS,KAAK,GAChB,KAAK,QAAS,EAAC,QAAQ,SAAU/O,EAAIiF,EAAG,CACtC,IAAInF,EAAKiP,EAAO,SAAS9J,CAAC,EACtB4B,EAAQ/G,EAAI,KAAK,QAAQ,UAAWiP,EAAQ,EAAK,IACnD+I,EAAM9X,CAAE,EAAIF,EAEf,EAAE,IAAI,EACP+X,GAAgB,KAAK,sBAAuB,EAC5CF,EAAM,QAAQ,SAAU3X,EAAI,CACtB8X,EAAM9X,CAAE,IACV+O,EAAO,YAAY+I,EAAM9X,CAAE,CAAC,EAC5B+O,EAAO,YAAY+I,EAAM9X,CAAE,CAAC,EAEpC,CAAK,EACD6X,GAAgB,KAAK,WAAY,CAClC,EAID,KAAM,UAAgB,CACpB,IAAIE,EAAQ,KAAK,QAAQ,MACzBA,GAASA,EAAM,KAAOA,EAAM,IAAI,IAAI,CACrC,EAOD,QAAS,SAAmBjY,EAAI6G,EAAU,CACxC,OAAOE,EAAQ/G,EAAI6G,GAAY,KAAK,QAAQ,UAAW,KAAK,GAAI,EAAK,CACtE,EAOD,OAAQ,SAAgB7E,EAAMhB,EAAO,CACnC,IAAIgJ,EAAU,KAAK,QACnB,GAAIhJ,IAAU,OACZ,OAAOgJ,EAAQhI,CAAI,EAEnB,IAAI8M,EAAgBX,GAAc,aAAa,KAAMnM,EAAMhB,CAAK,EAC5D,OAAO8N,EAAkB,IAC3B9E,EAAQhI,CAAI,EAAI8M,EAEhB9E,EAAQhI,CAAI,EAAIhB,EAEdgB,IAAS,SACX2R,GAAc3J,CAAO,CAG1B,EAID,QAAS,UAAmB,CAC1B8F,EAAY,UAAW,IAAI,EAC3B,IAAI9P,EAAK,KAAK,GACdA,EAAG6M,CAAO,EAAI,KACdlG,EAAI3G,EAAI,YAAa,KAAK,WAAW,EACrC2G,EAAI3G,EAAI,aAAc,KAAK,WAAW,EACtC2G,EAAI3G,EAAI,cAAe,KAAK,WAAW,EACnC,KAAK,kBACP2G,EAAI3G,EAAI,WAAY,IAAI,EACxB2G,EAAI3G,EAAI,YAAa,IAAI,GAG3B,MAAM,UAAU,QAAQ,KAAKA,EAAG,iBAAiB,aAAa,EAAG,SAAUA,EAAI,CAC7EA,EAAG,gBAAgB,WAAW,CACpC,CAAK,EACD,KAAK,QAAS,EACd,KAAK,0BAA2B,EAChC6Q,GAAU,OAAOA,GAAU,QAAQ,KAAK,EAAE,EAAG,CAAC,EAC9C,KAAK,GAAK7Q,EAAK,IAChB,EACD,WAAY,UAAsB,CAChC,GAAI,CAACoQ,GAAa,CAEhB,GADAN,EAAY,YAAa,IAAI,EACzB1F,EAAS,cAAe,OAC5B9C,EAAI6H,EAAS,UAAW,MAAM,EAC1B,KAAK,QAAQ,mBAAqBA,EAAQ,YAC5CA,EAAQ,WAAW,YAAYA,CAAO,EAExCiB,GAAc,EACpB,CACG,EACD,WAAY,SAAoBX,EAAa,CAC3C,GAAIA,EAAY,cAAgB,QAAS,CACvC,KAAK,WAAY,EACjB,MACN,CACI,GAAIW,GAAa,CAEf,GADAN,EAAY,YAAa,IAAI,EACzB1F,EAAS,cAAe,OAGxB4F,EAAO,YAAcf,GAAU,CAAC,KAAK,QAAQ,MAAM,YACrDA,EAAO,aAAaE,EAASa,CAAM,EAC1BE,GACTjB,EAAO,aAAaE,EAASe,EAAM,EAEnCjB,EAAO,YAAYE,CAAO,EAExB,KAAK,QAAQ,MAAM,aACrB,KAAK,QAAQa,EAAQb,CAAO,EAE9B7H,EAAI6H,EAAS,UAAW,EAAE,EAC1BiB,GAAc,EACpB,CACA,CACA,EACA,SAASwH,GAA2BpJ,EAAK,CACnCA,EAAI,eACNA,EAAI,aAAa,WAAa,QAEhCA,EAAI,YAAcA,EAAI,eAAgB,CACxC,CACA,SAAS8H,GAAQjH,EAAQD,EAAMY,EAAQ6C,EAAU3D,EAAU4D,EAAYtD,EAAe0I,EAAiB,CACrG,IAAI1J,EACFD,EAAWc,EAAOxC,CAAO,EACzBsL,EAAW5J,EAAS,QAAQ,OAC5B6J,EAEF,OAAI,OAAO,aAAe,CAAClS,GAAc,CAACC,GACxCqI,EAAM,IAAI,YAAY,OAAQ,CAC5B,QAAS,GACT,WAAY,EAClB,CAAK,GAEDA,EAAM,SAAS,YAAY,OAAO,EAClCA,EAAI,UAAU,OAAQ,GAAM,EAAI,GAElCA,EAAI,GAAKY,EACTZ,EAAI,KAAOa,EACXb,EAAI,QAAUwB,EACdxB,EAAI,YAAcqE,EAClBrE,EAAI,QAAUU,GAAYE,EAC1BZ,EAAI,YAAcsE,GAAcxK,EAAQ8G,CAAI,EAC5CZ,EAAI,gBAAkB0J,EACtB1J,EAAI,cAAgBgB,EACpBH,EAAO,cAAcb,CAAG,EACpB2J,IACFC,EAASD,EAAS,KAAK5J,EAAUC,EAAKgB,CAAa,GAE9C4I,CACT,CACA,SAASnD,GAAkBjV,EAAI,CAC7BA,EAAG,UAAY,EACjB,CACA,SAAS0X,IAAY,CACnB/F,GAAU,EACZ,CACA,SAASiF,GAAcpI,EAAKuE,EAAUxE,EAAU,CAC9C,IAAI8J,EAAc/P,EAAQwB,GAASyE,EAAS,GAAI,EAAGA,EAAS,QAAS,EAAI,CAAC,EACtE+J,EAAsBlM,GAAkCmC,EAAS,GAAIA,EAAS,QAASlC,CAAO,EAC9FkM,EAAS,GACb,OAAOxF,EAAWvE,EAAI,QAAU8J,EAAoB,KAAOC,GAAU/J,EAAI,QAAU6J,EAAY,KAAO7J,EAAI,QAAU6J,EAAY,MAAQ7J,EAAI,QAAU8J,EAAoB,IAAMC,GAAU/J,EAAI,QAAU6J,EAAY,QAAU7J,EAAI,QAAU6J,EAAY,IAC1P,CACA,SAAS1B,GAAanI,EAAKuE,EAAUxE,EAAU,CAC7C,IAAIiK,EAAalQ,EAAQ+B,GAAUkE,EAAS,GAAIA,EAAS,QAAQ,SAAS,CAAC,EACvE+J,EAAsBlM,GAAkCmC,EAAS,GAAIA,EAAS,QAASlC,CAAO,EAC9FkM,EAAS,GACb,OAAOxF,EAAWvE,EAAI,QAAU8J,EAAoB,MAAQC,GAAU/J,EAAI,QAAUgK,EAAW,QAAUhK,EAAI,QAAUgK,EAAW,KAAOhK,EAAI,QAAU8J,EAAoB,OAASC,GAAU/J,EAAI,QAAUgK,EAAW,OAAShK,EAAI,QAAUgK,EAAW,GAC3P,CACA,SAASnB,GAAkB7I,EAAKtJ,EAAQ4N,EAAYC,EAAU0F,EAAeC,EAAuBC,EAAYC,EAAc,CAC5H,IAAIC,EAAc9F,EAAWvE,EAAI,QAAUA,EAAI,QAC7CsK,EAAe/F,EAAWD,EAAW,OAASA,EAAW,MACzDiG,EAAWhG,EAAWD,EAAW,IAAMA,EAAW,KAClDkG,EAAWjG,EAAWD,EAAW,OAASA,EAAW,MACrDmG,EAAS,GACX,GAAI,CAACN,GAEH,GAAIC,GAAgBpH,GAAqBsH,EAAeL,GAOtD,GAJI,CAACnH,KAA0BD,KAAkB,EAAIwH,EAAcE,EAAWD,EAAeJ,EAAwB,EAAIG,EAAcG,EAAWF,EAAeJ,EAAwB,KAEvLpH,GAAwB,IAErBA,GAOH2H,EAAS,WALL5H,KAAkB,EAAIwH,EAAcE,EAAWvH,GACjDqH,EAAcG,EAAWxH,GACzB,MAAO,CAACH,WAORwH,EAAcE,EAAWD,GAAgB,EAAIL,GAAiB,GAAKI,EAAcG,EAAWF,GAAgB,EAAIL,GAAiB,EACnI,OAAOS,GAAoBhU,CAAM,EAKvC,OADA+T,EAASA,GAAUN,EACfM,IAEEJ,EAAcE,EAAWD,EAAeJ,EAAwB,GAAKG,EAAcG,EAAWF,EAAeJ,EAAwB,GAChIG,EAAcE,EAAWD,EAAe,EAAI,EAAI,GAGpD,CACT,CAQA,SAASI,GAAoBhU,EAAQ,CACnC,OAAIjE,EAAM+O,CAAM,EAAI/O,EAAMiE,CAAM,EACvB,EAEA,EAEX,CAQA,SAAS4S,GAAY9X,EAAI,CAIvB,QAHImZ,EAAMnZ,EAAG,QAAUA,EAAG,UAAYA,EAAG,IAAMA,EAAG,KAAOA,EAAG,YAC1D,EAAImZ,EAAI,OACRC,EAAM,EACD,KACLA,GAAOD,EAAI,WAAW,CAAC,EAEzB,OAAOC,EAAI,SAAS,EAAE,CACxB,CACA,SAASvE,GAAuBwE,EAAM,CACpCzH,GAAkB,OAAS,EAG3B,QAFI0H,EAASD,EAAK,qBAAqB,OAAO,EAC1CE,EAAMD,EAAO,OACVC,KAAO,CACZ,IAAIvZ,EAAKsZ,EAAOC,CAAG,EACnBvZ,EAAG,SAAW4R,GAAkB,KAAK5R,CAAE,CAC3C,CACA,CACA,SAASkV,GAAUxO,EAAI,CACrB,OAAO,WAAWA,EAAI,CAAC,CACzB,CACA,SAASiR,GAAgBzX,EAAI,CAC3B,OAAO,aAAaA,CAAE,CACxB,CAGI2R,IACFpL,EAAG,SAAU,YAAa,SAAU+H,EAAK,EAClCpE,EAAS,QAAUuG,KAAwBnC,EAAI,YAClDA,EAAI,eAAgB,CAE1B,CAAG,EAIHpE,EAAS,MAAQ,CACf,GAAI3D,EACJ,IAAKE,EACL,IAAKW,EACL,KAAMS,GACN,GAAI,SAAY/H,EAAI6G,EAAU,CAC5B,MAAO,CAAC,CAACE,EAAQ/G,EAAI6G,EAAU7G,EAAI,EAAK,CACzC,EACD,OAAQiL,GACR,SAAUO,GACV,QAASzE,EACT,YAAaI,EACb,MAAO8E,GACP,MAAOhL,EACP,SAAUiU,GACV,eAAgByC,GAChB,gBAAiBzF,GACjB,SAAUpI,GACV,QAAS+C,CACX,EAOAzC,EAAS,IAAM,SAAU7J,EAAS,CAChC,OAAOA,EAAQsM,CAAO,CACxB,EAMAzC,EAAS,MAAQ,UAAY,CAC3B,QAASoP,EAAO,UAAU,OAAQvL,EAAU,IAAI,MAAMuL,CAAI,EAAGC,EAAO,EAAGA,EAAOD,EAAMC,IAClFxL,EAAQwL,CAAI,EAAI,UAAUA,CAAI,EAE5BxL,EAAQ,CAAC,EAAE,cAAgB,QAAOA,EAAUA,EAAQ,CAAC,GACzDA,EAAQ,QAAQ,SAAUG,EAAQ,CAChC,GAAI,CAACA,EAAO,WAAa,CAACA,EAAO,UAAU,YACzC,KAAM,gEAAgE,OAAO,CAAA,EAAG,SAAS,KAAKA,CAAM,CAAC,EAEnGA,EAAO,QAAOhE,EAAS,MAAQnF,EAAeA,EAAe,CAAA,EAAImF,EAAS,KAAK,EAAGgE,EAAO,KAAK,GAClGD,GAAc,MAAMC,CAAM,CAC9B,CAAG,CACH,EAOAhE,EAAS,OAAS,SAAUpK,EAAIgK,EAAS,CACvC,OAAO,IAAII,EAASpK,EAAIgK,CAAO,CACjC,EAGAI,EAAS,QAAUrE,GAEnB,IAAI2T,EAAc,CAAE,EAClBC,GACAC,GACAC,GAAY,GACZC,GACAC,GACAC,GACAC,GACF,SAASC,IAAmB,CAC1B,SAASC,GAAa,CACpB,KAAK,SAAW,CACd,OAAQ,GACR,wBAAyB,GACzB,kBAAmB,GACnB,YAAa,GACb,aAAc,EACf,EAGD,QAASzT,KAAM,KACTA,EAAG,OAAO,CAAC,IAAM,KAAO,OAAO,KAAKA,CAAE,GAAM,aAC9C,KAAKA,CAAE,EAAI,KAAKA,CAAE,EAAE,KAAK,IAAI,EAGrC,CACE,OAAAyT,EAAW,UAAY,CACrB,YAAa,SAAqBnL,EAAM,CACtC,IAAIQ,EAAgBR,EAAK,cACrB,KAAK,SAAS,gBAChBvI,EAAG,SAAU,WAAY,KAAK,iBAAiB,EAE3C,KAAK,QAAQ,eACfA,EAAG,SAAU,cAAe,KAAK,yBAAyB,EACjD+I,EAAc,QACvB/I,EAAG,SAAU,YAAa,KAAK,yBAAyB,EAExDA,EAAG,SAAU,YAAa,KAAK,yBAAyB,CAG7D,EACD,kBAAmB,SAA2B2T,EAAO,CACnD,IAAI5K,EAAgB4K,EAAM,cAEtB,CAAC,KAAK,QAAQ,gBAAkB,CAAC5K,EAAc,QACjD,KAAK,kBAAkBA,CAAa,CAEvC,EACD,KAAM,UAAgB,CAChB,KAAK,SAAS,gBAChB7I,EAAI,SAAU,WAAY,KAAK,iBAAiB,GAEhDA,EAAI,SAAU,cAAe,KAAK,yBAAyB,EAC3DA,EAAI,SAAU,YAAa,KAAK,yBAAyB,EACzDA,EAAI,SAAU,YAAa,KAAK,yBAAyB,GAE3D0T,GAAiC,EACjCC,GAAkB,EAClBzO,GAAgB,CACjB,EACD,QAAS,UAAmB,CAC1BmO,GAAaJ,GAAeD,GAAWE,GAAYI,GAA6BH,GAAkBC,GAAkB,KACpHL,EAAY,OAAS,CACtB,EACD,0BAA2B,SAAmClL,EAAK,CACjE,KAAK,kBAAkBA,EAAK,EAAI,CACjC,EACD,kBAAmB,SAA2BA,EAAK2G,EAAU,CAC3D,IAAIvJ,EAAQ,KACRG,GAAKyC,EAAI,QAAUA,EAAI,QAAQ,CAAC,EAAIA,GAAK,QAC3CxC,GAAKwC,EAAI,QAAUA,EAAI,QAAQ,CAAC,EAAIA,GAAK,QACzC1D,EAAO,SAAS,iBAAiBiB,EAAGC,CAAC,EAOvC,GANAgO,GAAaxL,EAMT2G,GAAY,KAAK,QAAQ,yBAA2BhP,IAAQD,GAAcG,GAAQ,CACpFkU,GAAW/L,EAAK,KAAK,QAAS1D,EAAMqK,CAAQ,EAG5C,IAAIqF,EAAiB9Q,GAA2BoB,EAAM,EAAI,EACtD+O,KAAc,CAACI,IAA8BlO,IAAM+N,IAAmB9N,IAAM+N,MAC9EE,IAA8BI,GAAiC,EAE/DJ,GAA6B,YAAY,UAAY,CACnD,IAAIQ,EAAU/Q,GAA2B,SAAS,iBAAiBqC,EAAGC,CAAC,EAAG,EAAI,EAC1EyO,IAAYD,IACdA,EAAiBC,EACjBH,GAAkB,GAEpBC,GAAW/L,EAAK5C,EAAM,QAAS6O,EAAStF,CAAQ,CACjD,EAAE,EAAE,EACL2E,GAAkB/N,EAClBgO,GAAkB/N,EAE5B,KAAa,CAEL,GAAI,CAAC,KAAK,QAAQ,cAAgBtC,GAA2BoB,EAAM,EAAI,IAAM1C,IAA6B,CACxGkS,GAAkB,EAClB,MACV,CACQC,GAAW/L,EAAK,KAAK,QAAS9E,GAA2BoB,EAAM,EAAK,EAAG,EAAK,CACpF,CACA,CACG,EACMrF,EAAS0U,EAAY,CAC1B,WAAY,SACZ,oBAAqB,EACzB,CAAG,CACH,CACA,SAASG,IAAmB,CAC1BZ,EAAY,QAAQ,SAAUa,EAAY,CACxC,cAAcA,EAAW,GAAG,CAChC,CAAG,EACDb,EAAc,CAAE,CAClB,CACA,SAASW,IAAkC,CACzC,cAAcJ,EAA0B,CAC1C,CACA,IAAIM,GAAa/O,GAAS,SAAUgD,EAAKxE,EAASiF,EAAQyL,EAAY,CAEpE,GAAK1Q,EAAQ,OACb,KAAI+B,GAAKyC,EAAI,QAAUA,EAAI,QAAQ,CAAC,EAAIA,GAAK,QAC3CxC,GAAKwC,EAAI,QAAUA,EAAI,QAAQ,CAAC,EAAIA,GAAK,QACzCmM,EAAO3Q,EAAQ,kBACf4Q,EAAQ5Q,EAAQ,YAChBU,EAActC,EAA2B,EACvCyS,EAAqB,GACvBC,EAGElB,KAAiB3K,IACnB2K,GAAe3K,EACfqL,GAAkB,EAClBX,GAAW3P,EAAQ,OACnB8Q,EAAiB9Q,EAAQ,SACrB2P,KAAa,KACfA,GAAWjQ,GAA2BuF,EAAQ,EAAI,IAGtD,IAAI8L,EAAY,EACZC,EAAgBrB,GACpB,EAAG,CACD,IAAI3Z,EAAKgb,EACP1O,EAAOhE,EAAQtI,CAAE,EACjB4I,EAAM0D,EAAK,IACXxD,EAASwD,EAAK,OACdzD,EAAOyD,EAAK,KACZvD,EAAQuD,EAAK,MACbrD,EAAQqD,EAAK,MACbtD,EAASsD,EAAK,OACd2O,GAAa,OACbC,EAAa,OACbC,GAAcnb,EAAG,YACjBob,GAAepb,EAAG,aAClBmS,EAAQ7K,EAAItH,CAAE,EACdqb,GAAarb,EAAG,WAChBsb,EAAatb,EAAG,UACdA,IAAO0K,GACTuQ,GAAahS,EAAQkS,KAAgBhJ,EAAM,YAAc,QAAUA,EAAM,YAAc,UAAYA,EAAM,YAAc,WACvH+I,EAAalS,EAASoS,KAAiBjJ,EAAM,YAAc,QAAUA,EAAM,YAAc,UAAYA,EAAM,YAAc,aAEzH8I,GAAahS,EAAQkS,KAAgBhJ,EAAM,YAAc,QAAUA,EAAM,YAAc,UACvF+I,EAAalS,EAASoS,KAAiBjJ,EAAM,YAAc,QAAUA,EAAM,YAAc,WAE3F,IAAIoJ,GAAKN,KAAe,KAAK,IAAIlS,EAAQgD,CAAC,GAAK4O,GAAQU,GAAapS,EAAQkS,KAAgB,KAAK,IAAItS,EAAOkD,CAAC,GAAK4O,GAAQ,CAAC,CAACU,IACxHG,EAAKN,IAAe,KAAK,IAAIpS,EAASkD,CAAC,GAAK2O,GAAQW,EAAatS,EAASoS,KAAiB,KAAK,IAAIxS,EAAMoD,CAAC,GAAK2O,GAAQ,CAAC,CAACW,GAC9H,GAAI,CAAC5B,EAAYqB,CAAS,EACxB,QAAS5V,GAAI,EAAGA,IAAK4V,EAAW5V,KACzBuU,EAAYvU,EAAC,IAChBuU,EAAYvU,EAAC,EAAI,CAAE,IAIrBuU,EAAYqB,CAAS,EAAE,IAAMQ,IAAM7B,EAAYqB,CAAS,EAAE,IAAMS,GAAM9B,EAAYqB,CAAS,EAAE,KAAO/a,KACtG0Z,EAAYqB,CAAS,EAAE,GAAK/a,EAC5B0Z,EAAYqB,CAAS,EAAE,GAAKQ,GAC5B7B,EAAYqB,CAAS,EAAE,GAAKS,EAC5B,cAAc9B,EAAYqB,CAAS,EAAE,GAAG,GACpCQ,IAAM,GAAKC,GAAM,KACnBX,EAAqB,GAErBnB,EAAYqB,CAAS,EAAE,IAAM,aAAY,UAAY,CAE/CL,GAAc,KAAK,QAAU,GAC/BtQ,EAAS,OAAO,aAAa4P,EAAU,EAEzC,IAAIyB,GAAgB/B,EAAY,KAAK,KAAK,EAAE,GAAKA,EAAY,KAAK,KAAK,EAAE,GAAKkB,EAAQ,EAClFc,GAAgBhC,EAAY,KAAK,KAAK,EAAE,GAAKA,EAAY,KAAK,KAAK,EAAE,GAAKkB,EAAQ,EAClF,OAAOE,GAAmB,YACxBA,EAAe,KAAK1Q,EAAS,QAAQ,WAAWyC,CAAO,EAAG6O,GAAeD,GAAejN,EAAKwL,GAAYN,EAAY,KAAK,KAAK,EAAE,EAAE,IAAM,YAI/I5N,GAAS4N,EAAY,KAAK,KAAK,EAAE,GAAIgC,GAAeD,EAAa,CAClE,GAAC,KAAK,CACL,MAAOV,CACR,CAAA,EAAG,EAAE,IAGVA,GACJ,OAAW/Q,EAAQ,cAAgBgR,IAAkBtQ,IAAgBsQ,EAAgBtR,GAA2BsR,EAAe,EAAK,IAClInB,GAAYgB,EACd,EAAG,EAAE,EAEDc,GAAO,SAAc3M,EAAM,CAC7B,IAAIQ,EAAgBR,EAAK,cACvBS,EAAcT,EAAK,YACnBgB,EAAShB,EAAK,OACd6G,EAAiB7G,EAAK,eACtB4M,EAAwB5M,EAAK,sBAC7B6M,EAAqB7M,EAAK,mBAC1B8M,EAAuB9M,EAAK,qBAC9B,GAAKQ,EACL,KAAIuM,EAAatM,GAAeoG,EAChCgG,EAAoB,EACpB,IAAInH,EAAQlF,EAAc,gBAAkBA,EAAc,eAAe,OAASA,EAAc,eAAe,CAAC,EAAIA,EAChHtK,EAAS,SAAS,iBAAiBwP,EAAM,QAASA,EAAM,OAAO,EACnEoH,EAAsB,EAClBC,GAAc,CAACA,EAAW,GAAG,SAAS7W,CAAM,IAC9C0W,EAAsB,OAAO,EAC7B,KAAK,QAAQ,CACX,OAAQ5L,EACR,YAAaP,CACnB,CAAK,GAEL,EACA,SAASuM,IAAS,CAAA,CAClBA,GAAO,UAAY,CACjB,WAAY,KACZ,UAAW,SAAmB5B,EAAO,CACnC,IAAI9K,EAAoB8K,EAAM,kBAC9B,KAAK,WAAa9K,CACnB,EACD,QAAS,SAAiB2M,EAAO,CAC/B,IAAIjM,EAASiM,EAAM,OACjBxM,EAAcwM,EAAM,YACtB,KAAK,SAAS,sBAAuB,EACjCxM,GACFA,EAAY,sBAAuB,EAErC,IAAI+H,EAAc1N,GAAS,KAAK,SAAS,GAAI,KAAK,WAAY,KAAK,OAAO,EACtE0N,EACF,KAAK,SAAS,GAAG,aAAaxH,EAAQwH,CAAW,EAEjD,KAAK,SAAS,GAAG,YAAYxH,CAAM,EAErC,KAAK,SAAS,WAAY,EACtBP,GACFA,EAAY,WAAY,CAE3B,EACD,KAAMkM,EACR,EACAlW,EAASuW,GAAQ,CACf,WAAY,eACd,CAAC,EACD,SAASE,IAAS,CAAA,CAClBA,GAAO,UAAY,CACjB,QAAS,SAAiBC,EAAO,CAC/B,IAAInM,EAASmM,EAAM,OACjB1M,EAAc0M,EAAM,YAClBC,EAAiB3M,GAAe,KAAK,SACzC2M,EAAe,sBAAuB,EACtCpM,EAAO,YAAcA,EAAO,WAAW,YAAYA,CAAM,EACzDoM,EAAe,WAAY,CAC5B,EACD,KAAMT,EACR,EACAlW,EAASyW,GAAQ,CACf,WAAY,eACd,CAAC,EAkqBD9R,EAAS,MAAM,IAAI8P,EAAkB,EACrC9P,EAAS,MAAM8R,GAAQF,EAAM,EC5yGd,SAASK,GAAYC,EAAcC,EAASC,EAAmB,CAC5E,MAAO,CACL,aAAcF,EACd,QAASC,EACT,kBAAmBC,EACnB,gBAAiB,GACjB,SAAU,KACV,SAAU,CAAE,EACZ,sBAAuB,GACvB,aAAc,GACd,UAAW,GACX,WAAY,GAEZ,MAAO,CAEL,SAAS,iBAAiB,8BAA8B,EAAE,QAASC,GAAc,CAC/E,MAAMC,EAAK,KAAK,MAAMD,EAAU,QAAQ,EAAE,EAC1C,KAAK,SAASC,EAAG,EAAE,EAAI,CAAE,MAAOA,EAAG,KAAO,EAEtCA,EAAG,UACL,KAAK,eAAeA,EAAG,GAAI,EAAI,EAG7BA,EAAG,SACL,KAAK,cAAcA,EAAG,GAAI,EAAI,CAExC,CAAO,EAGD,KAAK,SAAW,IAAItS,EAAS,cAAe,CAC1C,WAAY,aACZ,OAAQ,qBACR,OAAQ,wBACR,MAAO,kBACP,SAAU,IAAM,KAAK,eAAgB,CAC7C,CAAO,EAGD,MAAMuS,EAAiB,SAAS,cAAc,8BAA8B,EACxEA,IACF,KAAK,kBAAkBA,EAAe,QAAQ,IAAI,EAClD,KAAK,uBAAwB,GAI/B,KAAK,UAAU,IAAM,CACnB,SAAS,iBAAiB,wBAAwB,EAAE,QAASC,GAAY,CACvEA,EAAQ,UAAU,IAAI,QAAQ,CACxC,CAAS,CACT,CAAO,CACF,EAED,iBAAkB,CAEhB,MAAMC,EADS,SAAS,cAAc,qBAAqB,EACtC,cAAc,KAAK,EACxCA,EAAM,IACJ,KAAK,MAAM,UAAU,OACrB,uFACH,EAED,eAAgB,CACd,OAAO,OAAO,KAAK,KAAK,QAAQ,EAAE,OAAS,CAC5C,EAED,iBAAkB,CAChB,MAAO,CAAC,KAAK,cAAe,CAC7B,EAID,sBAAuB,CACrB,KAAK,qBAAsB,EAC3B,KAAK,sBAAsB,mBAAmB,CAC/C,EAQD,SAASpI,EAAM7P,EAAQ,CACrB,IAAI1E,EAAK,EACL,OAAO,KAAK,KAAK,QAAQ,EAAE,OAAS,IAGtCA,EAAK,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAI,GAGjD,KAAK,SAASA,CAAE,EAAI,CAAE,MAAO,EAAI,EAEjC,KAAK,qBAAsB,EAE3B,KAAK,gBAAgBA,EAAIuU,EAAM7P,CAAM,EACrC,KAAK,oBAAoB1E,EAAIuU,EAAM7P,CAAM,EAEzC,MAAMkY,EAAuB,SAAS,cAAc,gBAAgB,EACpE,KAAK,UAAU,IAAMA,GAAA,YAAAA,EAAsB,eAAe,CAAE,MAAO,MAAO,SAAU,QAAQ,EAAG,CAChG,EAED,gBAAgB5c,EAAIuU,EAAM7P,EAAQ,CAEhC,MAAMmY,EADoB,SAAS,eAAe,OAAOtI,CAAI,QAAQ,EAC9B,QAAQ,kBAAkB,UAAU,EAAI,EACzD,SAAS,eAAe,eAAe,EAC/C,YAAYsI,CAAY,EAEtC,KAAK,oBAAoBA,EAAc7c,EAAIuU,EAAM7P,CAAM,EAEvD,KAAK,kBAAkBmY,EAAa,QAAQ,IAAI,EAEhD,KAAK,eAAgB,CACtB,EAED,oBAAoB7c,EAAIuU,EAAM7P,EAAQ,CAEpC,MAAMoY,EADuB,SAAS,eAAe,gBAAgBvI,CAAI,QAAQ,EACnC,QAAQ,kBAAkB,UAAU,EAAI,EAC5D,SAAS,eAAe,uBAAuB,EACvD,YAAYuI,CAAgB,EAE9C,KAAK,wBAAwBA,EAAkB9c,EAAIuU,EAAM7P,CAAM,CAChE,EAED,oBAAoB6X,EAAWvc,EAAIuU,EAAM7P,EAAQ,CAC/C6X,EAAU,QAAQ,KAAOvc,EAEzB,MAAM+c,EAAkBR,EAAU,cAAc,YAAY,EAC5DQ,EAAgB,aAAa,eAAgB,wBAAwB/c,CAAE,8BAA8B,EAEvE+c,EAAgB,cAAc,2BAA2B,EACjE,aAAa,aAAc,oBAAoB/c,CAAE,IAAI,EAE3E,MAAMgd,EAAiBT,EAAU,cAAc,2BAA2B,EAC1ES,EAAe,aAAa,QAAS,aAAahd,CAAE,EAAE,EACtDgd,EAAe,aAAa,QAAShd,CAAE,EAEvCuc,EAAU,iBAAiB,iBAAiB,EAAE,QAASvY,GAAU,CAC/D,MAAMiZ,EAAQ,mBACdjZ,EAAM,KAAOA,EAAM,KAAK,QAAQiZ,EAAOjd,CAAE,EACzCgE,EAAM,GAAKA,EAAM,GAAG,QAAQiZ,EAAOjd,CAAE,CAC7C,CAAO,EAEG,CAAC,aAAc,QAAS,QAAQ,EAAE,SAASuU,CAAI,GACjD,KAAK,kBAAkBgI,EAAWvc,CAAE,EAGlC0E,GAAQ,KAAK,kBAAkB6X,EAAWvc,EAAI0E,CAAM,CACzD,EAED,kBAAkB6X,EAAWvc,EAAI0E,EAAQ,CACvC2X,EAAQ,QAAS9Y,GAAW,OAC1B,MAAM2Z,EAAqBX,EAAU,cAAc,yCAAyChZ,CAAM,KAAK,EACjGzB,EAAOob,EAAmB,cAAc,uBAAuB,EAErE,GADApb,EAAK,MAAQ4C,EAAO,KAAKnB,CAAM,EAC3B,CAAC,OAAQ,QAAQ,EAAE,SAASmB,EAAO,aAAa,EAAG,CACrD,MAAMyY,EAAcD,EAAmB,cAAc,iCAAiC,EACtFC,EAAY,UAAYzY,EAAO,YAAYnB,CAAM,CAC3D,SAAmB,CAAC,OAAQ,aAAc,KAAK,EAAE,SAASmB,EAAO,aAAa,EAAG,CACvE,MAAMyY,EAAcD,EAAmB,cACrC,IAAI,KAAK,iBAAiB,kCAAkCld,CAAE,gBAAgBuD,CAAM,EACrF,EACD4Z,EAAY,MAAQzY,EAAO,YAAYnB,CAAM,CACvD,SAAmB,CAAC,aAAc,QAAS,QAAQ,EAAE,SAASmB,EAAO,aAAa,EAAG,CAE3E,CAAC,EAAG,EAAG,CAAC,EAAE,QAAS3D,GAAU,CACHmc,EAAmB,cAAc,YAAYnc,CAAK,EAAE,EAC5D,OAAQ,CACpC,CAAW,EAGD,MAAMqc,EAAwBF,EAAmB,cAAc,iBAAiB3Z,CAAM,IAAIvD,CAAE,EAAE,EAC9Fod,EAAsB,OAAQnc,EAAAyD,EAAO,QAAQnB,CAAM,IAArB,YAAAtC,EAAwB,KAAK;AAAA,GAG3DyD,EAAO,QAAQnB,CAAM,EAAE,QAAQ,CAAClC,EAAQN,IAAU,CAEhD,MAAMK,EADiB8b,EAAmB,cAAc,cAAcld,CAAE,IAAIuD,CAAM,EAAE,EACnD,QAAQ,kBAAkB,UAAU,EAAI,EACzEnC,EAAU,UAAU,IAAI,UAAUpB,CAAE,IAAIe,CAAK,EAAE,EAC/CK,EAAU,cAAc,oBAAoB,EAAE,MAAQC,EACtDD,EAAU,cAAc,oBAAoB,EAAE,iBAAiB,SAAU,IAAM,KAAK,cAAcpB,CAAE,CAAC,EACrGoB,EACG,cAAc,2BAA2B,EACzC,iBAAiB,QAAS,IAAM,KAAK,aAAapB,EAAIe,CAAK,CAAC,EAC/Dmc,EAAmB,YAAY9b,CAAS,CACpD,CAAW,CACX,CACA,CAAO,CACF,EAED,kBAAkBmb,EAAWvc,EAAI,CAC/Buc,EAAU,cAAc,kBAAkB,EAAE,iBAAiB,QAAS,IAAM,KAAK,UAAUvc,CAAE,CAAC,EAE9Fuc,EAAU,cAAc,wBAAwB,EAAE,gBAAgB,QAAQ,EAC1EA,EACG,cAAc,wBAAwB,EACtC,aAAa,eAAgB,wBAAwBvc,CAAE,mBAAmB,EAE7E,KAAK,QAAQ,QAASuD,GAAW,CAC/B,MAAM6Z,EAAwBb,EAAU,cAAc,iBAAiBhZ,CAAM,GAAG,EAChF6Z,EAAsB,aAAa,KAAM,gBAAgB7Z,CAAM,IAAIvD,CAAE,EAAE,EAE5Cod,EAAsB,WAAW,cAAc,eAAe7Z,CAAM,EAAE,EAC9E,aAAa,KAAM,aAAavD,CAAE,IAAIuD,CAAM,EAAE,EAGjE,CAAC,EAAG,EAAG,CAAC,EAAE,QAASxC,GAAU,CAC3B,MAAMsc,EAAkBD,EAAsB,WAAW,cAAc,YAAYrc,CAAK,EAAE,EACtFsc,IACFA,EAAgB,UAAU,IAAI,UAAUrd,CAAE,IAAIe,CAAK,EAAE,EACrDsc,EACG,cAAc,oBAAoB,EAClC,iBAAiB,SAAU,IAAM,KAAK,cAAcrd,CAAE,CAAC,EAC1Dqd,EACG,cAAc,2BAA2B,EACzC,iBAAiB,QAAS,IAAM,KAAK,aAAard,EAAIe,CAAK,CAAC,EAE3E,CAAS,CACT,CAAO,CACF,EAED,wBAAwBuc,EAAetd,EAAIuU,EAAM7P,EAAQ,CACvD4Y,EAAc,QAAQ,KAAOtd,EAE7Bsd,EAAc,iBAAiB,OAAO,EAAE,QAAStZ,GAAU,CACzD,MAAMiZ,EAAQ,mBACdjZ,EAAM,KAAOA,EAAM,KAAK,QAAQiZ,EAAOjd,CAAE,EACzCgE,EAAM,GAAKA,EAAM,GAAG,QAAQiZ,EAAOjd,CAAE,CAC7C,CAAO,EAEDsd,EAAc,gBAAgB,QAAQ,EACtCA,EAAc,aAAa,eAAgB,wBAAwBtd,CAAE,mBAAmB,EAExF,MAAMud,EAAgBD,EACnB,cAAc,IAAI,KAAK,iBAAiB,mBAAmB,EAC3D,cAAc,wBAAwB,EACzCC,EAAc,iBAAiB,QAAS,IAAM,KAAK,eAAevd,EAAIud,EAAc,OAAO,CAAC,EAC5F,MAAMC,EAAeF,EAClB,cAAc,IAAI,KAAK,iBAAiB,kBAAkB,EAC1D,cAAc,wBAAwB,EAGzC,GAFAE,EAAa,iBAAiB,QAAS,IAAM,KAAK,cAAcxd,EAAIwd,EAAa,OAAO,CAAC,EAErF,CAAC,OAAQ,QAAQ,EAAE,SAASjJ,CAAI,EAAG,CACrC,MAAMkJ,EAAgBH,EACnB,cAAc,IAAI,KAAK,iBAAiB,oBAAoB,EAC5D,cAAc,sBAAsB,EACvCG,EAAc,iBAAiB,SAAU,IAAM,KAAK,eAAezd,EAAIyd,EAAc,KAAK,CAAC,CACnG,CAEU/Y,GAAQ,KAAK,oBAAoB4Y,EAAetd,EAAI0E,CAAM,CAC/D,EAED,oBAAoB4Y,EAAetd,EAAI0E,EAAQ,CAC7C,MAAMgZ,EAAgBJ,EAAc,cAClC,IAAI,KAAK,iBAAiB,kCAAkCtd,CAAE,gBAC/D,EACD0d,EAAc,MAAQhZ,EAAO,aAC7B,MAAMiZ,EAAmBL,EAAc,cACrC,IAAI,KAAK,iBAAiB,kCAAkCtd,CAAE,WAC/D,EACD2d,EAAiB,QAAUjZ,EAAO,SAClC,MAAMkZ,EAAkBN,EAAc,cACpC,IAAI,KAAK,iBAAiB,kCAAkCtd,CAAE,UAC/D,EAGD,GAFA4d,EAAgB,QAAUlZ,EAAO,QAE7B,CAAC,OAAQ,QAAQ,EAAE,SAASA,EAAO,aAAa,EAAG,CACrD,MAAMmZ,EAAWP,EAAc,cAC7B,IAAI,KAAK,iBAAiB,kCAAkCtd,CAAE,YAC/D,EACD6d,EAAS,MAAQnZ,EAAO,UACxB,KAAK,eAAe1E,EAAI0E,EAAO,SAAS,CAChD,SAAiBA,EAAO,gBAAkB,MAAO,CACzC,MAAMoZ,EAAkBR,EAAc,cACpC,IAAI,KAAK,iBAAiB,kCAAkCtd,CAAE,oBAC/D,EACD8d,EAAgB,MAAQpZ,EAAO,eACvC,CACK,EAID,gBAAiB,CACO,KAAK,SAAS,QAAS,EAC/B,QAAQ,CAAC1E,EAAIe,IAAU,CAC/B,KAAK,MAAM,aAAaf,CAAE,EAAE,IAC9B,KAAK,MAAM,aAAaA,CAAE,EAAE,EAAE,MAAQe,EAAQ,EAExD,CAAO,EAED,KAAK,uBAAwB,CAC9B,EAED,cAAc6V,EAAW,CACvB,MAAMmH,EAAmB,KAAK,IAAI,QAAQ,8BAA8B,EAClEC,EAAiB,KAAK,mBAAmBD,EAAkBnH,CAAS,EAE1E,GAAIoH,IAAmB,KAEvB,QAAQpH,EAAS,CACf,IAAK,KACHmH,EAAiB,WAAW,aAAaA,EAAkBC,CAAc,EACzE,MACF,IAAK,OACHD,EAAiB,WAAW,aAAaC,EAAgBD,CAAgB,EACzE,KACV,CAEM,KAAK,eAAgB,EACtB,EAED,wBAAyB,QACvB9c,EAAA,SAAS,iBAAiB,gCAAgC,IAA1D,MAAAA,EAA6D,QAASgd,GAAU,CAC9EA,EAAM,UAAU,OAAO,+BAA+B,CAC9D,GAEM,MAAMC,EAAQ,SAAS,iBAAiB,8BAA8B,EAElEA,EAAM,OAAS,IACCA,EAAM,CAAC,EACI,cAAc,yBAAyB,EACzD,UAAU,IAAI,+BAA+B,EAEvCA,EAAMA,EAAM,OAAS,CAAC,EACZ,cAAc,2BAA2B,EAC1D,UAAU,IAAI,+BAA+B,EAE1D,EAGD,mBAAmBH,EAAkBnH,EAAW,CAC9C,MAAMoH,EACJpH,IAAc,OAASmH,EAAiB,mBAAqBA,EAAiB,uBAEhF,OAAIC,IAAmB,MAAQA,EAAe,UAAU,SAAS,6BAA6B,EACrFA,EAEA,KAAK,mBAAmBA,EAAgBpH,CAAS,CAE3D,EAID,yBAAyB5W,EAAI,CACvBA,GAAM,KAAK,SAASA,CAAE,EAAE,MAAQ,GAClC,KAAK,UAAYA,EACjB,KAAK,sBAAwB,IAE7B,KAAK,gBAAgBA,CAAE,CAE1B,EAED,gBAAgBA,EAAIme,EAAkB,GAAO,CAEvCA,IACF,KAAK,UAAY,GACjB,KAAK,sBAAwB,IAK3B,KAAK,oBAAoBne,CAAE,GAC7B,KAAK,MAAM,WAAWA,CAAE,EAAE,EAAE,MAAQ,GAGlB,SAAS,cAAc,4CAA4CA,CAAE,IAAI,EACjF,UAAU,IAAI,QAAQ,EAGN,SAAS,cACjC,6DAA6DA,CAAE,KAChE,EACiB,UAAU,IAAI,QAAQ,IAExCA,MAAO,KAAK,IAAI,QAAQ,8BAA8B,EAAE,QAAQ,MAChE,SAAS,cAAc,4CAA4CA,CAAE,IAAI,EAAE,OAAQ,EACnF,SAAS,cAAc,4CAA4CA,CAAE,IAAI,EAAE,OAAQ,GAGrF,OAAO,KAAK,SAASA,CAAE,EACvB,KAAK,uBAAwB,CAC9B,EAED,oBAAoBA,EAAI,CACtB,OAAO,KAAK,SAASA,CAAE,EAAE,OAAS,CACnC,EAID,kBAAkBA,EAAI,CACpB,KAAK,gBAAkBA,EAAG,SAAU,EACpC,KAAK,aAAc,CACpB,EAED,sBAAuB,CACrB,KAAK,gBAAkB,EACxB,EAED,sBAAsBA,EAAI,CACxB,KAAK,gBAAkBA,EAAG,SAAU,CACrC,EAED,cAAe,CACb,SAAS,cAAc,iCAAiC,EAAE,gBAAgB,MAAM,CACjF,EAED,eAAeA,EAAIoe,EAAS,CAC1B,MAAM7B,EAAY,SAAS,cAAc,4CAA4Cvc,CAAE,IAAI,EACvFoe,EACF7B,EAAU,iBAAiB,sBAAsB,EAAE,QAASA,GAAc,CACxEA,EAAU,UAAU,OAAO,QAAQ,CAC7C,CAAS,EAEDA,EAAU,iBAAiB,sBAAsB,EAAE,QAASA,GAAc,CACxEA,EAAU,UAAU,IAAI,QAAQ,CAC1C,CAAS,CAEJ,EAED,cAAcvc,EAAIoe,EAAS,CACzB,MAAM7B,EAAY,SAAS,cAAc,4CAA4Cvc,CAAE,IAAI,EACvFoe,EACF7B,EAAU,iBAAiB,kBAAkB,EAAE,QAASA,GAAc,CACpEA,EAAU,UAAU,OAAO,QAAQ,CAC7C,CAAS,EAEDA,EAAU,iBAAiB,kBAAkB,EAAE,QAASA,GAAc,CACpEA,EAAU,UAAU,IAAI,QAAQ,CAC1C,CAAS,CAEJ,EAED,eAAevc,EAAIc,EAAO,CACxB,MAAMyb,EAAY,SAAS,cAAc,4CAA4Cvc,CAAE,IAAI,EACvFc,IAAU,IAAMA,IAAU,IAC5Byb,EAAU,cAAc,uBAAuB,EAAE,YAAc,GAE/DA,EAAU,cAAc,uBAAuB,EAAE,YAAc,KAAKzb,CAAK,EAE5E,EAID,UAAUd,EAAI,CACZ,KAAK,QAAQ,QAASuD,GAAW,CAC/B,MAAMgZ,EAAY,SAAS,cAAc,iBAAiBhZ,CAAM,IAAIvD,CAAE,EAAE,EAClE0B,EAAW6a,EAAU,WAAW,iBAAiB,oBAAoB,EAAE,OACvE8B,EAAiB,SAAS,cAAc,cAAcre,CAAE,IAAIuD,CAAM,EAAE,EACpEnC,EAAYid,EAAe,QAAQ,kBAAkB,UAAU,EAAI,EAEzEjd,EAAU,UAAU,IAAI,UAAUpB,CAAE,IAAI0B,CAAQ,EAAE,EAClDN,EAAU,cAAc,oBAAoB,EAAE,iBAAiB,SAAU,IAAM,KAAK,cAAcpB,CAAE,CAAC,EACrGoB,EACG,cAAc,2BAA2B,EACzC,iBAAiB,QAAS,IAAM,KAAK,aAAapB,EAAI0B,CAAQ,CAAC,EAElE6a,EAAU,WAAW,aAAanb,EAAWid,CAAc,EAC3D,KAAK,cAAcre,CAAE,CAC7B,CAAO,CACF,EAED,aAAaA,EAAIe,EAAO,CACtB,MAAM,KAAK,SAAS,iBAAiB,WAAWf,CAAE,IAAIe,CAAK,EAAE,CAAC,EAAE,QAASud,GAAU,CACjFA,EAAM,OAAQ,CACtB,CAAO,EACD,KAAK,cAActe,CAAE,CACtB,EAED,cAAcA,EAAI,CAChB,KAAK,QAAQ,QAASuD,GAAW,CAC/B,MAAMgb,EAAwB,SAAS,cAAc,iBAAiBhb,CAAM,IAAIvD,CAAE,EAAE,EAC9Ewe,EAAmBD,EAAsB,WAAW,iBAAiB,oBAAoB,EAC/F,IAAIzU,EAAU,CAAE,EAChB0U,EAAiB,QAASF,GAAU,CAClCxU,EAAQ,KAAKwU,EAAM,KAAK,CAClC,CAAS,EACDC,EAAsB,MAAQzU,EAAQ,KAAK;AAAA,CAAM,CACzD,CAAO,CACF,EAID,MAAM,cAAe,CACnB,MAAM/H,EAAM,OAAO,SAAS,KAAK,QAAQ,YAAa,yBAAyB,EACzEG,EAAU,IAAI,QAAQH,CAAG,EAEzB8N,EAAO,MADI,MAAM,MAAM3N,CAAO,GACR,KAAM,EAC5Bsa,EAAK,KAAK,UAAU3M,EAAK,KAAK,kBAAmB,KAAM,GAAI,EACjE,OAAO,UAAU,UAAU,UAAU2M,CAAE,EACvC,KAAK,YAAY,cAAc,EAC/B,KAAK,aAAe,EACrB,EAED,gBAAiB,CACf,GAAI,CAEF,OAAO,OAAO,KAAK,QAAQ,EAAE,MAAO1Z,GAAM,CACxC,GAAIA,EAAE,MAAQ,EACZ,KAAM,eAElB,CAAS,EAGD,MAAM2b,EAAO,KAAK,MAAM,KAAK,UAAU,EAGvC,OAAO,KAAK,KAAK,QAAQ,EAAE,QAAStZ,GAAQ,CAC1C,KAAK,gBAAgBA,CAAG,CAClC,CAAS,EAGDsZ,EAAK,QAASH,GAAU,CACtB,KAAK,SAASA,EAAM,cAAeA,CAAK,CAClD,CAAS,EAED,KAAK,YAAY,mBAAmB,CACrC,OAAQ,EAAG,CACN,aAAa,YACf,KAAK,YAAY,4BAA4B,EACpC,IAAM,iBACf,KAAK,YAAY,eAAe,CAE1C,QAAgB,CACR,KAAK,aAAe,EAC5B,CACK,EAED,YAAY/J,EAAM,CAEhB,MAAMmK,EADkB,SAAS,eAAenK,CAAI,EACjB,QAAQ,kBAAkB,UAAU,EAAI,EAC3E,SAAS,KAAK,QAAQmK,CAAU,CACjC,EAED,aAAc,CACX,SAAUrc,EAAO,CAEhB,MAAMka,EAAYla,EAAM,OAAO,QAAQ,8BAA8B,EACjEka,IACF,KAAK,qBAAsB,EAC3B,KAAK,kBAAkBA,EAAU,QAAQ,IAAI,EAC7CA,EAAU,eAAe,CAAE,MAAO,SAAU,SAAU,SAAU,EAEnE,CACF,EAED,UAAW,CACR,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,qBACR,EACA,0BAA4B,CAC3B,MAAO,uBACR,EACA,sBAAwB,CACvB,MAAO,gCACR,EACA,4BAA8B,CAC7B,MAAO,uBACR,EACA,0BAA4B,CAC3B,MAAO,qBACR,CACF,CACF,CACH,CCljBe,SAASoC,GACtBC,EACAC,EACA7e,EACA8e,EAAwB,GACxBC,EAAgB,GAChB,CACA,MAAMC,EAAcH,EAAU,YACxBI,EAAaJ,EAAU,WAE7B,MAAO,CACL,UAAWD,EAAa,UACxB,UAAWA,EAAa,UACxB,UAAWI,EAAY,UACvB,UACEH,EAAU,WAAa,wFACzB,WAAYI,EAAW,mBACvB,QAASJ,EAAU,QACnB,YAAaI,EAAW,kBACxB,QAASD,EAAY,SAAW,UAChC,eAAgB,GAChB,iBAAkB,GAClB,cAAe,CACb,MAAOC,EAAW,kBAClB,MAAOA,EAAW,kBAClB,KAAMA,EAAW,iBACjB,KAAMA,EAAW,gBAClB,EACD,cAAe,KACf,KAAM,GACN,SAAU,KAAK,MAAM,SACrB,SAAU,KAAK,MAAM,SACrB,IAAK,KAEL,MAAO,CAKL,GAHA,KAAK,QAAS,EAGVF,EAAe,OAGnB,KAAK,OAAO,cAAe,IAAM,CAC/B,KAAK,eAAe,KAAK,GAAG,CACpC,CAAO,EACD,KAAK,OAAO,gBAAiB,IAAM,CAC7B,KAAK,aACP,KAAK,mBAAoB,EACzB,KAAK,mBAAmB,KAAK,GAAG,EAE1C,CAAO,EAID,MAAMG,EAAa,KAAK,IAAI,cAAc,aAAa,EACnDA,GACFA,EAAW,iBAAiB,4BAA8B1a,GAAM,CAC1D,KAAK,YACP,KAAK,mBAAoB,CAErC,CAAS,CAEJ,EAED,MAAM,SAAU,SAEd,KAAM,CAAE,IAAA2a,CAAG,EAAK,MAAM,OAAO,KAAK,cAAc,MAAM,EAChD,CAAE,sBAAAC,CAAqB,EAAK,MAAM,OAAO,KAAK,cAAc,QAAQ,EACpE,CAAE,aAAAC,CAAY,EAAK,MAAM,OAAO,KAAK,cAAc,QAAQ,EAG3DC,IAAMre,EAAA,KAAK,WAAL,YAAAA,EAAe,QAAS,KAAK,UACnCse,IAAMre,EAAA,KAAK,WAAL,YAAAA,EAAe,QAAS,KAAK,UACnCse,EAAa,CACjB,KAAM,KAAK,WAAa,GACxB,OAAQ,CAAE,IAAK,WAAWF,CAAG,EAAG,IAAK,WAAWC,CAAG,CAAG,EACtD,UAAW,KAAK,QAChB,iBAAkBR,EAClB,eAAgB,CAACA,EACjB,sBAAuB,CACrB,MAAO,OAAO,KAAK,oBAAoB,aACxC,EACD,gBAAiB,cACjB,MAAO/e,CACR,EAGD,IAAIyf,EAAM,IAAIN,EAAI,KAAK,MAAM,IAAKK,CAAU,EAqB5C,GApBA,KAAK,IAAMC,EAGP,KAAK,MAAM,WACa,IAAIJ,EAAa,KAAK,MAAM,SAAS,EAE7C,YAAY,gBAAiB,MAAOK,GAAO,CAC3D,IAAI5e,EAAQ,KAAK,MAAM,UAAU,MACjC,MAAM,KAAK,WAAWA,EAAO2e,EAAKL,CAAqB,CACjE,CAAS,EAIEL,GACH,OAAO,KAAK,MAAM,YAAYU,EAAK,eAAgB,IAAM,CACnD,KAAK,MAAM,UAAS,KAAK,MAAM,QAAQ,MAAQA,EAAI,KACjE,CAAS,EAICV,EAAe,CACjB,MAAMY,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,IAAM,KAAK,UAEhB,MAAMC,EAAe,IAAI,OAAO,KAAK,OAAON,EAAKC,CAAG,EAErC,IAAIH,EAAsB,CACvC,IAAKK,EACL,SAAUG,EACV,QAASD,EACT,aAAc,EACf,CAAA,EAEDF,EAAI,UAAUG,CAAY,CAClC,CAKM,GAAI,KAAK,UAAY,KAAK,SAAU,CAClC,MAAMD,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,IAAM,KAAK,UAEhB,MAAMC,EAAe,IAAI,OAAO,KAAK,OAAON,EAAKC,CAAG,EAE9CM,EAAS,IAAIT,EAAsB,CACvC,IAAKK,EACL,SAAUG,EACV,QAASD,EACT,aAAc,EACxB,CAAS,EAEDF,EAAI,UAAUG,CAAY,EAErBb,IACHU,EAAI,YAAY,QAAUK,GAAmB,CAC3C,MAAMC,EAAcD,EAAe,OACnC,KAAK,SAAS,aAAa,QAASC,EAAY,IAAG,CAAE,EACrD,KAAK,SAAS,aAAa,QAASA,EAAY,IAAG,CAAE,EACrDF,EAAO,SAAWE,CAC9B,CAAW,EAEDF,EAAO,YAAY,UAAYvR,GAAQ,CACrC,MAAM0R,EAAiBH,EAAO,SAC9B,KAAK,SAAS,aAAa,QAASG,EAAe,GAAG,EACtD,KAAK,SAAS,aAAa,QAASA,EAAe,GAAG,CAClE,CAAW,EAEX,CAGM,KAAK,eAAeP,CAAG,CACxB,EAED,eAAeA,EAAK,CACd,SAAYX,GAAyB,KAAK,aAAgB,CAACA,IACzD,KAAK,YAAY,KAAK,mBAAmBW,CAAG,EAC5C,KAAK,SAAS,KAAK,cAAcA,CAAG,IAExC,KAAK,mBAAoB,EACzB,KAAK,cAAe,EAEvB,EAID,mBAAmB1d,EAAK,CAClBA,EACF,KAAK,WAAaA,EAElB,KAAK,WAAa,KAAK,IAAI,MAAM,CAAC,EAAI,IAAI,gBAAgB,KAAK,IAAI,MAAM,CAAC,CAAC,EAAI,EAElF,EAED,mBAAmB0d,EAAK,CAEtB,MAAMQ,UAAmB,OAAO,KAAK,WAAY,CAC/C,YAAYC,EAAQvD,EAAO,CACzB,MAAO,EACP,KAAK,OAASuD,EACd,KAAK,MAAQvD,CACvB,CAEQ,OAAQ,CACN,KAAK,IAAM,SAAS,cAAc,KAAK,EACvC,KAAK,IAAI,MAAM,YAAc,OAC7B,KAAK,IAAI,MAAM,YAAc,MAC7B,KAAK,IAAI,MAAM,SAAW,WAE1B,MAAMxY,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,IAAM,KAAK,MACfA,EAAI,MAAM,MAAQ,OAClBA,EAAI,MAAM,OAAS,OACnBA,EAAI,MAAM,SAAW,WACrB,KAAK,IAAI,YAAYA,CAAG,EAEV,KAAK,SAAU,EACvB,aAAa,YAAY,KAAK,GAAG,CACjD,CACQ,MAAO,CAGL,MAAMgc,EAAoB,KAAK,cAAe,EAGxCC,EAAKD,EAAkB,qBAAqB,KAAK,OAAO,cAAc,EACtEE,EAAKF,EAAkB,qBAAqB,KAAK,OAAO,cAAc,EAGxE,KAAK,MACP,KAAK,IAAI,MAAM,KAAOC,EAAG,EAAI,KAC7B,KAAK,IAAI,MAAM,IAAMC,EAAG,EAAI,KAC5B,KAAK,IAAI,MAAM,MAAQA,EAAG,EAAID,EAAG,EAAI,KACrC,KAAK,IAAI,MAAM,OAASA,EAAG,EAAIC,EAAG,EAAI,KAElD,CAEQ,UAAW,CACL,KAAK,MACP,KAAK,IAAI,WAAW,YAAY,KAAK,GAAG,EACxC,OAAO,KAAK,IAExB,CACA,CACM,GAAIC,GAAqB,KAAK,cAAe,EAAE,KAAK,UAAU,EAAG,CAE/D,GADA,KAAK,eAAiB,GAClB,CAAC,QAAU,CAAC,KAAK,MAAM,IAAK,OAEhC,KAAK,cAAgB,IAAIL,EAAW,KAAK,cAAe,EAAE,KAAK,UAAU,EACzE,KAAK,cAAc,OAAOR,CAAG,CACrC,MACQ,KAAK,eAAiB,EAEzB,EAED,eAAgB,CACd,MAAMc,EAAe,WAAW,KAAK,cAAc,KAAK,EAClDC,EAAe,WAAW,KAAK,cAAc,KAAK,EAClDC,EAAc,WAAW,KAAK,cAAc,IAAI,EAChDC,EAAc,WAAW,KAAK,cAAc,IAAI,EAMtD,OAJe,IAAI,OAAO,KAAK,aAC7B,IAAI,OAAO,KAAK,OAAOF,EAAcE,CAAW,EAChD,IAAI,OAAO,KAAK,OAAOH,EAAcE,CAAW,CACjD,CAEF,EAED,oBAAoB1e,EAAM,KAAM,CAC9B,KAAK,mBAAoB,EACzB,KAAK,mBAAmBA,CAAG,EACvB,KAAK,YAAY,KAAK,mBAAmB,KAAK,GAAG,CACtD,EAED,oBAAqB,CACnB,KAAK,eAAiB,KAAK,cAAc,OAAO,IAAI,CACrD,EAID,YAAa,CACX,MAAMkC,EAAO,KAAK,IAAI,MAAM,CAAC,EAC7B,GAAIA,EAAM,CACR,MAAMG,EAAS,IAAI,WACnBA,EAAO,WAAWH,CAAI,EACtBG,EAAO,OAAS,IAAM,CACpB,KAAK,QAAUA,EAAO,OACtB,KAAK,cAAc,KAAK,GAAG,CAC5B,CACT,CACK,EAED,eAAgB,CACd,KAAK,IAAI,KAAK,QAASuc,GAAY,KAAK,IAAI,KAAK,OAAOA,CAAO,CAAC,CACjE,EAED,cAAclB,EAAK,CACjB,GAAImB,GAAqB,KAAK,OAAO,EAAG,CAEtC,GADA,KAAK,iBAAmB,GACpB,CAAC,QAAU,CAAC,KAAK,MAAM,IAAK,OAEhCnB,EAAI,KAAK,WAAW,KAAK,MAAM,KAAK,OAAO,CAAC,EAC5CA,EAAI,KAAK,SAAUkB,IACV,CACL,UAAWA,EAAQ,YAAY,MAAM,EACrC,YAAaA,EAAQ,YAAY,cAAc,EAC/C,YAAaA,EAAQ,YAAY,QAAQ,EACzC,cAAeA,EAAQ,YAAY,gBAAgB,EACnD,aAAcA,EAAQ,YAAY,cAAc,EAChD,MAAOA,EAAQ,YAAY,OAAO,EAClC,UAAW,EACZ,EACF,CACT,MACQ,KAAK,iBAAmB,EAE3B,EAED,gBAAiB,CACf,KAAK,cAAe,EACpB,KAAK,WAAY,CAClB,EAED,MAAM,WAAW1d,EAAYwc,EAAK,CAChC,KAAM,CAAE,MAAAoB,CAAK,EAAK,MAAM,OAAO,KAAK,cAAc,QAAQ,EACpD3e,EAAU,CACd,UAAWe,EACX,OAAQ,CAAC,cAAe,UAAU,CACnC,EAEK,CAAE,OAAA6d,CAAQ,EAAG,MAAMD,EAAM,aAAa3e,CAAO,EAEnD,GAAI4e,EAAO,OAAQ,CACjB,KAAM,CAAE,aAAAC,CAAY,EAAK,MAAM,OAAO,KAAK,cAAc,MAAM,EACzDb,EAAS,IAAIa,EAGnBD,EAAO,QAASE,GAAU,CACxBd,EAAO,OAAOc,EAAM,QAAQ,CACtC,CAAS,EAGGF,EAAO,OAAS,EAClBrB,EAAI,UAAUS,CAAM,GAEpBT,EAAI,UAAUS,EAAO,WAAW,EAChCT,EAAI,QAAQ,KAAK,WAAa,EAAE,EAE1C,MACQ,QAAQ,IAAI,YAAY,CAE3B,EAED,YAAa,CACV,0BAA4B,CAE5B,CACF,CACF,CACH,CAEA,MAAMa,GAAuB,CAACJ,EAAQe,IAAe,CACnD,GAAIf,IAAW,GAAO,MAAO,GAE7B,MAAMgB,EAAgBhB,EAAO,OAAQ,EAC/BiB,EAAsB,OAAO,OAAOD,CAAa,EAAE,MAAOE,GAAUA,EAAQ,CAAC,EAC7EC,GAAkBJ,GAAA,YAAAA,EAAY,QAAS,EAE7C,OAAOE,GAAuBE,CAChC,EAEMT,GAAwBU,GAAY,CACxC,GAAIA,IAAY,GAAI,MAAO,GAE3B,MAAMC,EAAa,KAAK,MAAMD,CAAO,EAcrC,MAZiB,CACf,UACA,oBACA,QACA,aACA,aACA,kBACA,UACA,eACA,oBACD,EAEe,SAASC,EAAW,IAAI,CAC1C,EC7XO,SAASC,GAAUnhB,EAASohB,EAAc,CAC/C,IAAIC,EAAmBD,EAAa,CAAC,EACjCE,EAAkBF,EAAaA,EAAa,OAAS,CAAC,EAE1DphB,EAAQ,iBAAiB,UAAW,SAAUmE,EAAG,CAC/C,IAAIod,EAAgBpd,EAAE,MAAQ,OAASA,EAAE,UAAY,EAEhDod,IAIDpd,EAAE,SACA,SAAS,gBAAkBkd,IAC7BC,EAAgB,MAAO,EACvBnd,EAAE,eAAgB,GAGhB,SAAS,gBAAkBmd,IAC7BD,EAAiB,MAAO,EACxBld,EAAE,eAAgB,GAG1B,CAAG,CACH,CCrBe,SAASvE,GAAM4hB,EAAqBC,EAAsB,GAAM,CAC7E,MAAO,CACL,KAAM,GACN,aAAc,KACd,oBAAqBD,GAAuB,GAC5C,oBAAqBC,EAErB,MAAO,CAID,KAAK,oBACP,KAAK,OAAO,eAAgB,IAAM,CAChCN,GAAU,KAAK,MAAM,MAAO,KAAK,YAAY,CACvD,CAAS,GAED,KAAK,aAAe,KAAK,MAAM,MAAM,iBACnC,oNACD,EAED,KAAK,OAAO,OAAQ,IAAM,CACxBA,GAAU,KAAK,MAAM,MAAO,KAAK,YAAY,CACvD,CAAS,EAEJ,EAED,QAAS,CACN,UAAY,CACX,OAAO,KAAK,IACb,EACA,sBAAwB,CACvB,KAAK,MAAM,MAAM,MAAO,CACzB,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,WACR,EACA,0BAA4B,CAC3B,MAAO,aACR,EACA,sBAAwB,CACvB,MAAO,sBACR,EACA,4BAA8B,CAC7B,MAAO,aACR,EACA,0BAA4B,CAC3B,MAAO,WACR,CACF,EAED,MAAO,CACJ,8BAAgC,CAC/B,MAAO,EACR,CACF,EAED,MAAO,CACJ,cAAgB,CACX,KAAK,qBACP,KAAK,UAAU,YAAY,EACtB,KAAK,iBAAgB,KAAK,KAAO,KAEtC,KAAK,KAAO,EAEf,CACF,EAED,MAAO,CACJ,UAAY,CACX,OAAO,KAAK,IACb,EACA,cAAgB,CACf,KAAK,UAAU,YAAY,EACtB,KAAK,iBAAgB,KAAK,KAAO,GACvC,EACA,sBAAwB,CACvB,KAAK,MAAM,MAAM,MAAO,CACzB,EACA,sBAAwB,CACvB,KAAK,MAAM,MAAM,MAAO,CACzB,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,gEACR,EACA,0BAA4B,CAC3B,MAAO,wCACR,EACA,sBAAwB,CACvB,MAAO,sBACR,EACA,4BAA8B,CAC7B,MAAO,wCACR,EACA,0BAA4B,CAC3B,MAAO,sDACR,CACF,CACF,CACH,CC1Ge,SAASO,GAAkBC,EAAO,GAAI,CACnD,IAAIC,EAEJ,MAAMC,EAAW,CAAC1b,EAAIgF,IAAO,CAC3B,aAAayW,CAAO,EACpBA,EAAU,WAAWzb,EAAIgF,CAAE,CAC5B,EAED,MAAO,CACL,YAAa,GACb,WAAY,GACZ,SAAU,GACV,YAAa,GACb,cAAewW,EAAK,cACpB,iBAAkBA,EAAK,iBACvB,gBAAiBA,EAAK,OACtB,eAAgB,CAAE,EAClB,cAAeA,EAAK,KACpB,aAAc,CAAE,EAChB,cAAe,CACb,cAAe,GACf,iBAAkB,GAClB,MAAO,GACP,OAAQ,GACR,KAAM,EACP,EACD,kBAAmB,EACnB,OAAQA,EAAK,OAEb,MAAO,CACL,KAAK,uBAAuB,KAAK,cAAe,EAAI,EACpD,KAAK,0BAA0B,KAAK,iBAAkB,EAAI,EAC1D,KAAK,gBAAgB,EAAI,EACzB,KAAK,cAAc,EAAI,EACvB,KAAK,OAAO,cAAe,IAAM,KAAK,cAAa,CAAE,CACtD,EAED,uBAAuBG,EAAQC,EAAa,GAAO,CACjD,KAAK,cAAgBD,EACrB,KAAK,MAAM,cAAc,MAAQA,EACjC,KAAK,iBAAkB,EAClBC,GAAY,KAAK,cAAe,CACtC,EAED,0BAA0BD,EAAQC,EAAa,GAAO,CACpD,KAAK,iBAAmBD,EACxB,KAAK,MAAM,iBAAiB,MAAQA,EACpC,KAAK,iBAAkB,EAClBC,GAAY,KAAK,cAAe,CACtC,EAED,gBAAgBA,EAAa,GAAO,CAClC,IAAIC,EAAM,CAAE,EACZ,KAAK,MAAM,aAAa,iBAAiB,0BAA0B,EAAE,QAASre,GAAU,CAClFA,EAAM,SAASqe,EAAI,KAAK,SAASre,EAAM,QAAQ,WAAW,CAAC,CACvE,CAAO,EACD,KAAK,eAAiBqe,EACtB,KAAK,MAAM,eAAe,QAAU,KAAK,kBAAmB,EAC5D,KAAK,iBAAkB,EAClBD,GAAY,KAAK,cAAe,CACtC,EAED,iBAAkB,CACZ,KAAK,qBACP,KAAK,eAAiB,CAAE,EACxB,KAAK,iBAAkB,IAEvB,KAAK,eAAiB,CAAC,GAAG,KAAK,eAAe,EAC9C,KAAK,eAAgB,EAExB,EAED,mBAAoB,CAClB,OAAO,KAAK,gBAAgB,MAAOpiB,GAAO,KAAK,eAAe,SAASA,CAAE,CAAC,CAC3E,EAED,cAAcoiB,EAAa,GAAO,CAChC,IAAIC,EAAM,CAAE,EACZ,KAAK,MAAM,WAAW,iBAAiB,wBAAwB,EAAE,QAASre,GAAU,CAC9EA,EAAM,SAASqe,EAAI,KAAK,SAASre,EAAM,QAAQ,SAAS,CAAC,CACrE,CAAO,EACD,KAAK,aAAeqe,EACpB,KAAK,MAAM,aAAa,QAAU,KAAK,gBAAiB,EACxD,KAAK,iBAAkB,EAClBD,GAAY,KAAK,cAAe,CACtC,EAED,eAAgB,CACV,KAAK,mBACP,KAAK,aAAe,CAAE,EACtB,KAAK,eAAgB,IAErB,KAAK,aAAe,CAAC,GAAG,KAAK,aAAa,EAC1C,KAAK,aAAc,EAEtB,EAED,iBAAkB,CAChB,OAAO,KAAK,cAAc,MAAOpiB,GAAO,KAAK,aAAa,SAASA,CAAE,CAAC,CACvE,EAED,eAAgB,CACdkiB,EAAS,IAAM,CACb,KAAK,iBAAkB,EACvB,KAAK,MAAM,cAAe,CAC3B,EAAE,GAAG,CACP,EAED,eAAeE,EAAa,GAAO,CACjC,KAAK,MAAM,aAAa,iBAAiB,OAAO,EAAE,QAASpe,GAAU,CACnEA,EAAM,QAAU,EACxB,CAAO,EACIoe,GAAY,KAAK,cAAe,CACtC,EAED,iBAAiBA,EAAa,GAAO,CACnC,KAAK,MAAM,aAAa,iBAAiB,OAAO,EAAE,QAASpe,GAAU,CACnEA,EAAM,QAAU,EACxB,CAAO,EACIoe,GAAY,KAAK,cAAe,CACtC,EAED,aAAaA,EAAa,GAAO,CAC/B,KAAK,MAAM,WAAW,iBAAiB,OAAO,EAAE,QAASpe,GAAU,CACjEA,EAAM,QAAU,EACxB,CAAO,EACIoe,GAAY,KAAK,cAAe,CACtC,EAED,eAAeA,EAAa,GAAO,CACjC,KAAK,MAAM,WAAW,iBAAiB,OAAO,EAAE,QAASpe,GAAU,CACjEA,EAAM,QAAU,EACxB,CAAO,EACIoe,GAAY,KAAK,cAAe,CACtC,EAED,kBAAmB,CACjB,KAAK,cAAgB,CACnB,cAAe,KAAK,gBAAkB,MACtC,iBAAkB,KAAK,mBAAqB,MAC5C,MAAO,KAAK,cAAgB,GAC5B,OAAQ,KAAK,eAAe,OAAS,GAAK,KAAK,eAAe,SAAW,KAAK,gBAAgB,OAC9F,KAAM,KAAK,aAAa,OAAS,CAClC,EACD,KAAK,kBAAoB,OAAO,OAAO,KAAK,aAAa,EAAE,OAAQE,GAAWA,CAAM,EAAE,MACvF,EAED,cAAe,CACb,KAAK,uBAAuB,MAAO,EAAI,EACvC,KAAK,0BAA0B,MAAO,EAAI,EAC1C,KAAK,eAAe,EAAI,EACxB,KAAK,cAAc,EAAI,EACvB,KAAK,iBAAiB,EAAI,EAC1B,KAAK,gBAAgB,EAAI,EACzB,KAAK,cAAe,EACpB,KAAK,YAAc,GACnB,KAAK,WAAa,EACnB,EAED,YAAYC,EAAe,CACzB,KAAK,MAAM,aAAa,cAAc,4BAA4BA,CAAa,IAAI,EAAE,QAAU,GAC/F,KAAK,gBAAiB,CACvB,EAED,UAAUC,EAAa,CACrB,KAAK,MAAM,WAAW,cAAc,0BAA0BA,CAAW,IAAI,EAAE,QAAU,GACzF,KAAK,cAAe,CACrB,EAED,aAAc,CACZ,KAAK,MAAM,OAAO,MAAQ,GAC1B,KAAK,YAAc,GACnB,KAAK,cAAe,CACrB,EAED,MAAO,CACJ,2BAA6B,CAC5B,KAAK,aAAc,CACpB,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,8BACR,EACA,0BAA4B,CAC3B,MAAO,iCACR,EACA,sBAAwB,CACvB,MAAO,gCACR,EACA,4BAA8B,CAC7B,MAAO,iCACR,EACA,0BAA4B,CAC3B,MAAO,8BACR,CACF,EAED,QAAS,CACN,UAAY,CACX,OAAO,KAAK,WACb,EACA,sBAAwB,CACvB,MAAO,kCACR,EACA,4BAA8B,CAC7B,MAAO,8BACR,EACA,0BAA4B,CAC3B,MAAO,iCACR,EACA,sBAAwB,CACvB,MAAO,gCACR,EACA,4BAA8B,CAC7B,MAAO,iCACR,EACA,0BAA4B,CAC3B,MAAO,8BACR,CACF,CACF,CACH,CC/Ne,SAASC,GAAwBC,EAAmB,GAAI,CACrE,MAAO,CACL,iBAAkB,KAElB,uBAAuBpU,EAAK,CAC1B,MAAMqU,EAAqBrU,EAAI,OAAO,MACtC,KAAK,iBAAmB,SAAS,cAAc,sBAAsBqU,CAAkB,IAAI,EAE3F,KAAK,iBAAkB,EACvB,KAAK,cAAe,EACpB,KAAK,WAAY,CAClB,EAED,kBAAmB,OACjB,MAAM9iB,IAAUoB,EAAA,KAAK,mBAAL,YAAAA,EAAuB,YAAa,GACpD,KAAK,MAAM,QAAU,QAAQ,IAAI,KAAK,MAAM,OAAO,EAAE,EAAE,WAAWpB,CAAO,CAC1E,EAED,eAAgB,SACd,MAAM+iB,IAAa1hB,GAAAD,EAAA,KAAK,mBAAL,YAAAA,EAAuB,UAAvB,YAAAC,EAAgC,aAAcwhB,EACjE,KAAK,MAAM,WAAW,MAAQE,CAC/B,EAED,YAAa,SACX,MAAMC,IAAU3hB,GAAAD,EAAA,KAAK,mBAAL,YAAAA,EAAuB,UAAvB,YAAAC,EAAgC,UAAW,GAC3D,KAAK,MAAM,QAAQ,MAAQ2hB,CAC5B,CACF,CACH,CC5Be,SAASC,IAAuB,CAC7C,MAAO,CACL,gBAAiB,GACjB,cAAe,GACf,YAAa,GACb,UAAW,GACX,YAAa,GACb,aAAc,GACd,iBAAkB,GAClB,cAAe,GACf,WAAY,GACZ,WAAY,GACZ,YAAa,GACb,WAAY,GAEZ,MAAO,CACD,KAAK,2BACH,aAAa,QAAQ,mCAAmC,IAC1D,KAAK,cAAgB,aAAa,QAAQ,mCAAmC,IAAM,QAEjF,aAAa,QAAQ,qCAAqC,IAC5D,KAAK,gBAAkB,aAAa,QAAQ,qCAAqC,IAAM,SAG3F,KAAK,gBAAiB,EACtB,KAAK,eAAgB,CACtB,EAED,mBAAoB,CAClB,KAAK,gBAAkB,CAAC,KAAK,gBAC7B,aAAa,QAAQ,sCAAuC,KAAK,eAAe,EAEhF,KAAK,eAAgB,CACtB,EAED,kBAAmB,CACjB,KAAK,cAAgB,CAAC,KAAK,cAC3B,aAAa,QAAQ,oCAAqC,KAAK,aAAa,EAE5E,KAAK,gBAAiB,CACvB,EAED,gBAAiB,CAEf,KAAK,YAAc,KAAK,gBACxB,KAAK,UAAY,KAAK,gBACtB,KAAK,YAAc,KAAK,gBACxB,KAAK,aAAe,KAAK,gBACzB,KAAK,iBAAmB,KAAK,gBAC7B,KAAK,cAAgB,KAAK,gBAC1B,KAAK,WAAa,KAAK,gBACvB,KAAK,WAAa,KAAK,gBACvB,KAAK,YAAc,KAAK,gBACxB,KAAK,WAAa,KAAK,gBAGP,CACd,UACA,QACA,UACA,WACA,eACA,YACA,SACA,SACA,UACA,QACD,EAEO,QAASC,GAAW,CACtB,SAAS,eAAeA,CAAM,IAChC,SAAS,eAAeA,CAAM,EAAE,KAAO,KAAK,gBAEtD,CAAO,CACF,EAED,iBAAkB,CACZ,KAAK,cACP,SAAS,eAAe,iBAAiB,EAAE,UAAU,IAAI,UAAW,WAAY,cAAc,EAE9F,SAAS,eAAe,iBAAiB,EAAE,UAAU,OAAO,UAAW,WAAY,cAAc,CAEpG,EAED,wBAAyB,CACvB,GAAI,CACF,MAAO,iBAAkB,QAAU,OAAO,eAAoB,IAC/D,MAAW,CACV,MAAO,EACf,CACK,CACF,CACH,CC1FA,MAAMxf,GAAS,SAAS,cAAc,MAAM,EAAE,aAAa,MAAM,EAElD,SAASyf,GAAY,CAAE,iBAAAC,EAAkB,gBAAAC,EAAiB,YAAAC,EAAa,cAAAC,CAAa,EAAI,CACrG,MAAO,CACL,iBAAkB,KAAK,MAAMH,CAAgB,EAC7C,gBAAAC,EACA,YAAAC,EACA,cAAe,KAAK,MAAMC,CAAa,EACvC,UAAW,GACX,YAAa,KACb,QAAS,KAET,MAAO,CACL,KAAK,YAAc,OAAO,KAAK,KAAK,gBAAgB,EAAE,CAAC,EACvD,KAAK,OAAO,UAAW,IAAM,CAC3B,KAAK,YAAa,CAC1B,CAAO,EACD,KAAK,OAAO,cAAe,IAAM,CAC/B,KAAK,YAAa,CAC1B,CAAO,EACD,KAAK,YAAa,EAClB,KAAK,aAAc,CACpB,EAED,aAAc,CACZ,KAAK,UAAY,KAAK,WAAU,GAAM,KAAK,gBAAe,GAAM,KAAK,gBAAiB,CACvF,EAED,YAAa,CACX,MAAMC,EAAS,KAAK,YAChB,KAAK,iBAAiB,KAAK,WAAW,EACtC,KAAK,iBAAiB,KAAK,eAAe,EACxCC,EAAO,KAAK,UAAY,KAAO,KAAK,QAAU,KAAK,YACnDvhB,EAAM,CAACshB,EAAQC,CAAI,EAAE,KAAK,GAAG,EAAE,QAAQ,MAAO,EAAE,EACtD,MAAO,CAAC,OAAO,OAAO,KAAK,aAAa,EAAE,SAASvhB,CAAG,CACvD,EAED,iBAAkB,CAChB,OAAK,KAAK,QAEH,mBAAmB,KAAK,KAAK,OAAO,EAFjB,EAG3B,EAED,iBAAkB,CAChB,OAAK,KAAK,QAEH,KAAK,QAAQ,QAAU,GAAK,KAAK,QAAQ,QAAU,GAFhC,EAG3B,EAED,cAAe,CACR,KAAK,WAGE,KAAK,kBAGL,KAAK,mBAIf,KAAK,MAAM,iBAAiB,UAAY,GACxC,KAAK,MAAM,UAAU,UAAU,OAAO,gBAAgB,IAJtD,KAAK,MAAM,iBAAiB,UAAYQ,EAAU,sBAAuB,eAAgBgB,EAAM,EAC/F,KAAK,MAAM,UAAU,UAAU,IAAI,gBAAgB,IAJnD,KAAK,MAAM,iBAAiB,UAAYhB,EAAU,sBAAuB,eAAgBgB,EAAM,EAC/F,KAAK,MAAM,UAAU,UAAU,IAAI,gBAAgB,IAJnD,KAAK,MAAM,iBAAiB,UAAYhB,EAAU,sBAAuB,gBAAiBgB,EAAM,EAChG,KAAK,MAAM,UAAU,UAAU,OAAO,gBAAgB,EAWzD,CACF,CACH,CCnEe,SAASggB,IAAkB,CACxC,MAAO,CACL,gBAAiB,GACjB,cAAe,GACf,YAAa,GACb,WAAY,GACZ,aAAc,GACd,aAAc,GACd,WAAY,GACZ,YAAa,GACb,mBAAoB,GACpB,WAAY,GACZ,cAAe,GACf,aAAc,GACd,aAAc,GACd,WAAY,GACZ,gBAAiB,GACjB,WAAY,GACZ,QAAS,GAET,MAAO,CACD,KAAK,2BACH,aAAa,QAAQ,8BAA8B,IACrD,KAAK,cAAgB,aAAa,QAAQ,8BAA8B,IAAM,QAE5E,aAAa,QAAQ,gCAAgC,IACvD,KAAK,gBAAkB,aAAa,QAAQ,gCAAgC,IAAM,SAGtF,KAAK,gBAAiB,EACtB,KAAK,eAAgB,CACtB,EAED,mBAAoB,CAClB,KAAK,gBAAkB,CAAC,KAAK,gBAC7B,aAAa,QAAQ,iCAAkC,KAAK,eAAe,EAE3E,KAAK,eAAgB,CACtB,EAED,kBAAmB,CACjB,KAAK,cAAgB,CAAC,KAAK,cAC3B,aAAa,QAAQ,+BAAgC,KAAK,aAAa,EAEvE,KAAK,gBAAiB,CACvB,EAED,gBAAiB,CAEf,KAAK,YAAc,KAAK,gBACxB,KAAK,WAAa,KAAK,gBACvB,KAAK,aAAe,KAAK,gBACzB,KAAK,aAAe,KAAK,gBACzB,KAAK,WAAa,KAAK,gBACvB,KAAK,YAAc,KAAK,gBACxB,KAAK,mBAAqB,KAAK,gBAC/B,KAAK,WAAa,KAAK,gBACvB,KAAK,cAAgB,KAAK,gBAC1B,KAAK,aAAe,KAAK,gBACzB,KAAK,aAAe,KAAK,gBACzB,KAAK,WAAa,KAAK,gBACvB,KAAK,gBAAkB,KAAK,gBAC5B,KAAK,WAAa,KAAK,gBACvB,KAAK,QAAU,KAAK,gBAGJ,CACd,UACA,SACA,WACA,WACA,SACA,UACA,iBACA,SACA,YACA,WACA,WACA,SACA,WACA,UACA,SACA,KACD,EAEO,QAASR,GAAW,CACtB,SAAS,eAAeA,CAAM,IAChC,SAAS,eAAeA,CAAM,EAAE,KAAO,KAAK,gBAEtD,CAAO,CACF,EAED,iBAAkB,CACZ,KAAK,cACP,SAAS,eAAe,iBAAiB,EAAE,UAAU,IAAI,UAAW,WAAY,cAAc,EAE9F,SAAS,eAAe,iBAAiB,EAAE,UAAU,OAAO,UAAW,WAAY,cAAc,CAEpG,EAED,wBAAyB,CACvB,GAAI,CACF,MAAO,iBAAkB,QAAU,OAAO,eAAoB,IAC/D,MAAW,CACV,MAAO,EACf,CACK,CACF,CACH,CC5Ge,SAASS,IAAU,CAChC,MAAO,CACL,SAAU,GACV,UAAW,GAEX,MAAO,CACW,SAAS,eAAe,0BAA0B,EAC1D,iBAAiB,QAAS,IAAM,CACtC,KAAK,SAAW,CAAC,KAAK,QAC9B,CAAO,EAEc,KAAK,MAAM,iBAAiB,yBAAyB,EAE7D,QAASxP,GAAU,CACpBA,EAAM,cAAc,oBAAoB,IAAG,KAAK,UAAYA,EAAM,GACvE,CAAA,CACF,EACD,YAAYhU,EAAI,CACd,KAAK,UAAY,KAAK,YAAcA,EAAK,GAAKA,CAC/C,EAED,aAAc,CACX,sBAAwB,CACvB,MAAO,qDACR,EACA,4BAA8B,CAC7B,MAAO,KACR,EACA,0BAA4B,CAC3B,MAAO,QACR,EACA,sBAAwB,CACvB,MAAO,oDACR,EACA,4BAA8B,CAC7B,MAAO,QACR,EACA,0BAA4B,CAC3B,MAAO,KACR,CACP,CACA,CACA,CCrCe,SAASyjB,GAAa,CAAE,SAAAC,EAAU,OAAA1e,EAAS,IAAI,EAAI,CAChE,MAAO,CACL,SAAU,KACV,SAAU0e,EAEV,MAAO,CACL,MAAMC,EAAiB,KAAK,IAAI,cAAc3e,CAAM,EACpD,KAAK,SAAW,IAAIkF,EAASyZ,GAAkB,KAAK,IAAK,CACvD,OAAQ,2BACR,WAAY,mBACZ,SAAU,IAAM,KAAK,OAAQ,CACrC,CAAO,CAEF,EAED,QAAS,OACP,MAAM3hB,EAAO,CAAA,EACbA,EAAK,KAAK,QAAQ,EAAI,KAAK,SAAS,QAAS,EAC7C,MAAMC,GAAQhB,EAAA,SAAS,cAAc,uBAAuB,IAA9C,YAAAA,EAAiD,aAAa,WACtEiB,EAAU,IAAI,QAAQ,KAAK,MAAM,aAAa,0BAA0B,EAAG,CAC/E,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,eAAgBD,CACjB,EACD,KAAM,KAAK,UAAUD,CAAI,CACjC,CAAO,EACD,MAAME,CAAO,CACd,CAEF,CACH,CC/Be,SAAS0hB,GAAiB,CAAE,SAAAF,EAAU,OAAA1e,EAAS,IAAI,EAAI,CACpE,MAAO,CACL,SAAU,KACV,SAAU0e,EAEV,MAAO,CACL,MAAMC,EAAiB,KAAK,IAAI,cAAc3e,CAAM,EACpD,KAAK,SAAW,IAAIkF,EAASyZ,GAAkB,KAAK,IAAK,CACvD,OAAQ,2BACR,WAAY,mBACZ,SAAU,IAAM,KAAK,OAAQ,CACrC,CAAO,CAEF,EAED,QAAS,CACW,KAAK,SAAS,QAAS,EAC/B,QAAQ,CAACtjB,EAASU,IAAU,CACpC,MAAM8iB,EAAW,SAAS,eAAe,WAAWxjB,CAAO,qBAAqB,EAChFwjB,EAAS,MAAQ9iB,EAAQ,CACjC,CAAO,CACF,CAEF,CACH,CC7Be,SAAS+iB,IAAiB,CACvC,MAAO,CACL,SAAU,EAEV,MAAO,CACL,KAAK,OAAO,OAAQ,IAAM,CAAE,KAAK,aAAe,KAAK,qBAAoB,EAAI,EAC7E,KAAK,OAAO,WAAY,IAAM,CAAE,KAAK,aAAe,KAAK,qBAAoB,EAAI,CAClF,EAED,sBAAuB,CACrB,MAAMC,EAAsB,SAAS,cAAc,+CAA+C,KAAK,QAAQ,IAAI,EAC7GC,EAAY,qNACZC,EAAa,SAAS,cAAc,eAAe,EACzD,IAAIC,EAAoBH,EAAoB,iBAAiBC,CAAS,EAEtE,OAAAE,EAAoB,MAAM,KAAKA,CAAiB,EAEhDA,EAAkB,QAAQD,CAAU,EAE7BC,CACb,CACA,CACA,CCSA,OAAO,OAASC,EAChBA,EAAO,KAAK,eAAgBxjB,EAAY,EACxCwjB,EAAO,KAAK,WAAYtiB,EAAQ,EAChCsiB,EAAO,KAAK,aAAchiB,EAAU,EACpCgiB,EAAO,KAAK,eAAgB/hB,EAAY,EACxC+hB,EAAO,KAAK,YAAa3hB,EAAS,EAClC2hB,EAAO,KAAK,WAAY1hB,EAAQ,EAChC0hB,EAAO,KAAK,WAAYphB,EAAQ,EAChCohB,EAAO,KAAK,aAAc3gB,EAAU,EACpC2gB,EAAO,KAAK,cAAehI,EAAW,EACtCgI,EAAO,KAAK,kBAAmBxF,EAAe,EAC9CwF,EAAO,KAAK,QAASlkB,EAAK,EAC1BkkB,EAAO,KAAK,oBAAqBpC,EAAiB,EAClDoC,EAAO,KAAK,0BAA2B1B,EAAuB,EAC9D0B,EAAO,KAAK,uBAAwBrB,EAAoB,EACxDqB,EAAO,KAAK,cAAenB,EAAW,EACtCmB,EAAO,KAAK,kBAAmBZ,EAAe,EAC9CY,EAAO,KAAK,UAAWX,EAAO,EAC9BW,EAAO,KAAK,eAAgBV,EAAY,EACxCU,EAAO,KAAK,mBAAoBP,EAAgB,EAChDO,EAAO,KAAK,iBAAkBL,EAAc,EAE5C,SAAS,iBAAiB,mBAAoB,IAAM,CAClDK,EAAO,MAAO,EACd5jB,GAAiB,CACnB,CAAC","x_google_ignoreList":[10]}