{"version":3,"file":"tom-select.complete-5d20063c.js","sources":["../../../node_modules/tom-select/dist/esm/tom-select.complete.js"],"sourcesContent":["/**\n* Tom Select v2.2.2\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n*/\n\n/**\n * MicroEvent - to make any js object an event emitter\n *\n * - pure javascript - server compatible, browser compatible\n * - dont rely on the browser doms\n * - super simple - you get it immediatly, no mistery, no magic involved\n *\n * @author Jerome Etienne (https://github.com/jeromeetienne)\n */\n\n/**\n * Execute callback for each event in space separated list of event names\n *\n */\nfunction forEvents(events, callback) {\n  events.split(/\\s+/).forEach(event => {\n    callback(event);\n  });\n}\n\nclass MicroEvent {\n  constructor() {\n    this._events = void 0;\n    this._events = {};\n  }\n\n  on(events, fct) {\n    forEvents(events, event => {\n      const event_array = this._events[event] || [];\n      event_array.push(fct);\n      this._events[event] = event_array;\n    });\n  }\n\n  off(events, fct) {\n    var n = arguments.length;\n\n    if (n === 0) {\n      this._events = {};\n      return;\n    }\n\n    forEvents(events, event => {\n      if (n === 1) {\n        delete this._events[event];\n        return;\n      }\n\n      const event_array = this._events[event];\n      if (event_array === undefined) return;\n      event_array.splice(event_array.indexOf(fct), 1);\n      this._events[event] = event_array;\n    });\n  }\n\n  trigger(events, ...args) {\n    var self = this;\n    forEvents(events, event => {\n      const event_array = self._events[event];\n      if (event_array === undefined) return;\n      event_array.forEach(fct => {\n        fct.apply(self, args);\n      });\n    });\n  }\n\n}\n\n/**\n * microplugin.js\n * Copyright (c) 2013 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\nfunction MicroPlugin(Interface) {\n  Interface.plugins = {};\n  return class extends Interface {\n    constructor(...args) {\n      super(...args);\n      this.plugins = {\n        names: [],\n        settings: {},\n        requested: {},\n        loaded: {}\n      };\n    }\n\n    /**\n     * Registers a plugin.\n     *\n     * @param {function} fn\n     */\n    static define(name, fn) {\n      Interface.plugins[name] = {\n        'name': name,\n        'fn': fn\n      };\n    }\n    /**\n     * Initializes the listed plugins (with options).\n     * Acceptable formats:\n     *\n     * List (without options):\n     *   ['a', 'b', 'c']\n     *\n     * List (with options):\n     *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n     *\n     * Hash (with options):\n     *   {'a': { ... }, 'b': { ... }, 'c': { ... }}\n     *\n     * @param {array|object} plugins\n     */\n\n\n    initializePlugins(plugins) {\n      var key, name;\n      const self = this;\n      const queue = [];\n\n      if (Array.isArray(plugins)) {\n        plugins.forEach(plugin => {\n          if (typeof plugin === 'string') {\n            queue.push(plugin);\n          } else {\n            self.plugins.settings[plugin.name] = plugin.options;\n            queue.push(plugin.name);\n          }\n        });\n      } else if (plugins) {\n        for (key in plugins) {\n          if (plugins.hasOwnProperty(key)) {\n            self.plugins.settings[key] = plugins[key];\n            queue.push(key);\n          }\n        }\n      }\n\n      while (name = queue.shift()) {\n        self.require(name);\n      }\n    }\n\n    loadPlugin(name) {\n      var self = this;\n      var plugins = self.plugins;\n      var plugin = Interface.plugins[name];\n\n      if (!Interface.plugins.hasOwnProperty(name)) {\n        throw new Error('Unable to find \"' + name + '\" plugin');\n      }\n\n      plugins.requested[name] = true;\n      plugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n      plugins.names.push(name);\n    }\n    /**\n     * Initializes a plugin.\n     *\n     */\n\n\n    require(name) {\n      var self = this;\n      var plugins = self.plugins;\n\n      if (!self.plugins.loaded.hasOwnProperty(name)) {\n        if (plugins.requested[name]) {\n          throw new Error('Plugin has circular dependency (\"' + name + '\")');\n        }\n\n        self.loadPlugin(name);\n      }\n\n      return plugins.loaded[name];\n    }\n\n  };\n}\n\n/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n * @param {string[]} chars\n * @return {string}\n */\nconst arrayToPattern = chars => {\n  chars = chars.filter(Boolean);\n\n  if (chars.length < 2) {\n    return chars[0] || '';\n  }\n\n  return maxValueLength(chars) == 1 ? '[' + chars.join('') + ']' : '(?:' + chars.join('|') + ')';\n};\n/**\n * @param {string[]} array\n * @return {string}\n */\n\nconst sequencePattern = array => {\n  if (!hasDuplicates(array)) {\n    return array.join('');\n  }\n\n  let pattern = '';\n  let prev_char_count = 0;\n\n  const prev_pattern = () => {\n    if (prev_char_count > 1) {\n      pattern += '{' + prev_char_count + '}';\n    }\n  };\n\n  array.forEach((char, i) => {\n    if (char === array[i - 1]) {\n      prev_char_count++;\n      return;\n    }\n\n    prev_pattern();\n    pattern += char;\n    prev_char_count = 1;\n  });\n  prev_pattern();\n  return pattern;\n};\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n * @param {Set<string>} chars\n * @return {string}\n */\n\nconst setToPattern = chars => {\n  let array = toArray(chars);\n  return arrayToPattern(array);\n};\n/**\n *\n * https://stackoverflow.com/questions/7376598/in-javascript-how-do-i-check-if-an-array-has-duplicate-values\n * @param {any[]} array\n */\n\nconst hasDuplicates = array => {\n  return new Set(array).size !== array.length;\n};\n/**\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n * @param {string} str\n * @return {string}\n */\n\nconst escape_regex = str => {\n  return (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n/**\n * Return the max length of array values\n * @param {string[]} array\n *\n */\n\nconst maxValueLength = array => {\n  return array.reduce((longest, value) => Math.max(longest, unicodeLength(value)), 0);\n};\n/**\n * @param {string} str\n */\n\nconst unicodeLength = str => {\n  return toArray(str).length;\n};\n/**\n * @param {any} p\n * @return {any[]}\n */\n\nconst toArray = p => Array.from(p);\n\n/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\n/**\n * Get all possible combinations of substrings that add up to the given string\n * https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string\n * @param {string} input\n * @return {string[][]}\n */\nconst allSubstrings = input => {\n  if (input.length === 1) return [[input]];\n  /** @type {string[][]} */\n\n  let result = [];\n  const start = input.substring(1);\n  const suba = allSubstrings(start);\n  suba.forEach(function (subresult) {\n    let tmp = subresult.slice(0);\n    tmp[0] = input.charAt(0) + tmp[0];\n    result.push(tmp);\n    tmp = subresult.slice(0);\n    tmp.unshift(input.charAt(0));\n    result.push(tmp);\n  });\n  return result;\n};\n\n/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\n\n/**\n * @typedef {{[key:string]:string}} TUnicodeMap\n * @typedef {{[key:string]:Set<string>}} TUnicodeSets\n * @typedef {[[number,number]]} TCodePoints\n * @typedef {{folded:string,composed:string,code_point:number}} TCodePointObj\n * @typedef {{start:number,end:number,length:number,substr:string}} TSequencePart\n */\n/** @type {TCodePoints} */\n\nconst code_points = [[0, 65535]];\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}\\u{2bc}]';\n/** @type {TUnicodeMap} */\n\nlet unicode_map;\n/** @type {RegExp} */\n\nlet multi_char_reg;\nconst max_char_length = 3;\n/** @type {TUnicodeMap} */\n\nconst latin_convert = {};\n/** @type {TUnicodeMap} */\n\nconst latin_condensed = {\n  '/': '⁄∕',\n  '0': '߀',\n  \"a\": \"ⱥɐɑ\",\n  \"aa\": \"ꜳ\",\n  \"ae\": \"æǽǣ\",\n  \"ao\": \"ꜵ\",\n  \"au\": \"ꜷ\",\n  \"av\": \"ꜹꜻ\",\n  \"ay\": \"ꜽ\",\n  \"b\": \"ƀɓƃ\",\n  \"c\": \"ꜿƈȼↄ\",\n  \"d\": \"đɗɖᴅƌꮷԁɦ\",\n  \"e\": \"ɛǝᴇɇ\",\n  \"f\": \"ꝼƒ\",\n  \"g\": \"ǥɠꞡᵹꝿɢ\",\n  \"h\": \"ħⱨⱶɥ\",\n  \"i\": \"ɨı\",\n  \"j\": \"ɉȷ\",\n  \"k\": \"ƙⱪꝁꝃꝅꞣ\",\n  \"l\": \"łƚɫⱡꝉꝇꞁɭ\",\n  \"m\": \"ɱɯϻ\",\n  \"n\": \"ꞥƞɲꞑᴎлԉ\",\n  \"o\": \"øǿɔɵꝋꝍᴑ\",\n  \"oe\": \"œ\",\n  \"oi\": \"ƣ\",\n  \"oo\": \"ꝏ\",\n  \"ou\": \"ȣ\",\n  \"p\": \"ƥᵽꝑꝓꝕρ\",\n  \"q\": \"ꝗꝙɋ\",\n  \"r\": \"ɍɽꝛꞧꞃ\",\n  \"s\": \"ßȿꞩꞅʂ\",\n  \"t\": \"ŧƭʈⱦꞇ\",\n  \"th\": \"þ\",\n  \"tz\": \"ꜩ\",\n  \"u\": \"ʉ\",\n  \"v\": \"ʋꝟʌ\",\n  \"vy\": \"ꝡ\",\n  \"w\": \"ⱳ\",\n  \"y\": \"ƴɏỿ\",\n  \"z\": \"ƶȥɀⱬꝣ\",\n  \"hv\": \"ƕ\"\n};\n\nfor (let latin in latin_condensed) {\n  let unicode = latin_condensed[latin] || '';\n\n  for (let i = 0; i < unicode.length; i++) {\n    let char = unicode.substring(i, i + 1);\n    latin_convert[char] = latin;\n  }\n}\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|') + '|' + accent_pat, 'gu');\n/**\n * Initialize the unicode_map from the give code point ranges\n *\n * @param {TCodePoints=} _code_points\n */\n\nconst initialize = _code_points => {\n  if (unicode_map !== undefined) return;\n  unicode_map = generateMap(_code_points || code_points);\n};\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n * @param {string} str\n * @param {string} form\n */\n\nconst normalize = (str, form = 'NFKD') => str.normalize(form);\n/**\n * Remove accents without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n * @param {string} str\n * @return {string}\n */\n\nconst asciifold = str => {\n  return toArray(str).reduce(\n  /**\n   * @param {string} result\n   * @param {string} char\n   */\n  (result, char) => {\n    return result + _asciifold(char);\n  }, '');\n};\n/**\n * @param {string} str\n * @return {string}\n */\n\nconst _asciifold = str => {\n  str = normalize(str).toLowerCase().replace(convert_pat, (\n  /** @type {string} */\n  char) => {\n    return latin_convert[char] || '';\n  }); //return str;\n\n  return normalize(str, 'NFC');\n};\n/**\n * Generate a list of unicode variants from the list of code points\n * @param {TCodePoints} code_points\n * @yield {TCodePointObj}\n */\n\nfunction* generator(code_points) {\n  for (const [code_point_min, code_point_max] of code_points) {\n    for (let i = code_point_min; i <= code_point_max; i++) {\n      let composed = String.fromCharCode(i);\n      let folded = asciifold(composed);\n\n      if (folded == composed.toLowerCase()) {\n        continue;\n      } // skip when folded is a string longer than 3 characters long\n      // bc the resulting regex patterns will be long\n      // eg:\n      // folded صلى الله عليه وسلم length 18 code point 65018\n      // folded جل جلاله length 8 code point 65019\n\n\n      if (folded.length > max_char_length) {\n        continue;\n      }\n\n      if (folded.length == 0) {\n        continue;\n      }\n\n      yield {\n        folded: folded,\n        composed: composed,\n        code_point: i\n      };\n    }\n  }\n}\n/**\n * Generate a unicode map from the list of code points\n * @param {TCodePoints} code_points\n * @return {TUnicodeSets}\n */\n\nconst generateSets = code_points => {\n  /** @type {{[key:string]:Set<string>}} */\n  const unicode_sets = {};\n  /**\n   * @param {string} folded\n   * @param {string} to_add\n   */\n\n  const addMatching = (folded, to_add) => {\n    /** @type {Set<string>} */\n    const folded_set = unicode_sets[folded] || new Set();\n    const patt = new RegExp('^' + setToPattern(folded_set) + '$', 'iu');\n\n    if (to_add.match(patt)) {\n      return;\n    }\n\n    folded_set.add(escape_regex(to_add));\n    unicode_sets[folded] = folded_set;\n  };\n\n  for (let value of generator(code_points)) {\n    addMatching(value.folded, value.folded);\n    addMatching(value.folded, value.composed);\n  }\n\n  return unicode_sets;\n};\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n *\n * @param {TCodePoints} code_points\n * @return {TUnicodeMap}\n */\n\nconst generateMap = code_points => {\n  /** @type {TUnicodeSets} */\n  const unicode_sets = generateSets(code_points);\n  /** @type {TUnicodeMap} */\n\n  const unicode_map = {};\n  /** @type {string[]} */\n\n  let multi_char = [];\n\n  for (let folded in unicode_sets) {\n    let set = unicode_sets[folded];\n\n    if (set) {\n      unicode_map[folded] = setToPattern(set);\n    }\n\n    if (folded.length > 1) {\n      multi_char.push(escape_regex(folded));\n    }\n  }\n\n  multi_char.sort((a, b) => b.length - a.length);\n  const multi_char_patt = arrayToPattern(multi_char);\n  multi_char_reg = new RegExp('^' + multi_char_patt, 'u');\n  return unicode_map;\n};\n/**\n * Map each element of an array from it's folded value to all possible unicode matches\n * @param {string[]} strings\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst mapSequence = (strings, min_replacement = 1) => {\n  let chars_replaced = 0;\n  strings = strings.map(str => {\n    if (unicode_map[str]) {\n      chars_replaced += str.length;\n    }\n\n    return unicode_map[str] || str;\n  });\n\n  if (chars_replaced >= min_replacement) {\n    return sequencePattern(strings);\n  }\n\n  return '';\n};\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n *\n *\n * @param {string} str\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst substringsToPattern = (str, min_replacement = 1) => {\n  min_replacement = Math.max(min_replacement, str.length - 1);\n  return arrayToPattern(allSubstrings(str).map(sub_pat => {\n    return mapSequence(sub_pat, min_replacement);\n  }));\n};\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n *\n * @param {Sequence[]} sequences\n * @param {boolean} all\n */\n\nconst sequencesToPattern = (sequences, all = true) => {\n  let min_replacement = sequences.length > 1 ? 1 : 0;\n  return arrayToPattern(sequences.map(sequence => {\n    let seq = [];\n    const len = all ? sequence.length() : sequence.length() - 1;\n\n    for (let j = 0; j < len; j++) {\n      seq.push(substringsToPattern(sequence.substrs[j] || '', min_replacement));\n    }\n\n    return sequencePattern(seq);\n  }));\n};\n/**\n * Return true if the sequence is already in the sequences\n * @param {Sequence} needle_seq\n * @param {Sequence[]} sequences\n */\n\n\nconst inSequences = (needle_seq, sequences) => {\n  for (const seq of sequences) {\n    if (seq.start != needle_seq.start || seq.end != needle_seq.end) {\n      continue;\n    }\n\n    if (seq.substrs.join('') !== needle_seq.substrs.join('')) {\n      continue;\n    }\n\n    let needle_parts = needle_seq.parts;\n    /**\n     * @param {TSequencePart} part\n     */\n\n    const filter = part => {\n      for (const needle_part of needle_parts) {\n        if (needle_part.start === part.start && needle_part.substr === part.substr) {\n          return false;\n        }\n\n        if (part.length == 1 || needle_part.length == 1) {\n          continue;\n        } // check for overlapping parts\n        // a = ['::=','==']\n        // b = ['::','===']\n        // a = ['r','sm']\n        // b = ['rs','m']\n\n\n        if (part.start < needle_part.start && part.end > needle_part.start) {\n          return true;\n        }\n\n        if (needle_part.start < part.start && needle_part.end > part.start) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    let filtered = seq.parts.filter(filter);\n\n    if (filtered.length > 0) {\n      continue;\n    }\n\n    return true;\n  }\n\n  return false;\n};\n\nclass Sequence {\n  constructor() {\n    /** @type {TSequencePart[]} */\n    this.parts = [];\n    /** @type {string[]} */\n\n    this.substrs = [];\n    this.start = 0;\n    this.end = 0;\n  }\n  /**\n   * @param {TSequencePart|undefined} part\n   */\n\n\n  add(part) {\n    if (part) {\n      this.parts.push(part);\n      this.substrs.push(part.substr);\n      this.start = Math.min(part.start, this.start);\n      this.end = Math.max(part.end, this.end);\n    }\n  }\n\n  last() {\n    return this.parts[this.parts.length - 1];\n  }\n\n  length() {\n    return this.parts.length;\n  }\n  /**\n   * @param {number} position\n   * @param {TSequencePart} last_piece\n   */\n\n\n  clone(position, last_piece) {\n    let clone = new Sequence();\n    let parts = JSON.parse(JSON.stringify(this.parts));\n    let last_part = parts.pop();\n\n    for (const part of parts) {\n      clone.add(part);\n    }\n\n    let last_substr = last_piece.substr.substring(0, position - last_part.start);\n    let clone_last_len = last_substr.length;\n    clone.add({\n      start: last_part.start,\n      end: last_part.start + clone_last_len,\n      length: clone_last_len,\n      substr: last_substr\n    });\n    return clone;\n  }\n\n}\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * Issue:\n *  ﺊﺋ [ 'ﺊ = \\\\u{fe8a}', 'ﺋ = \\\\u{fe8b}' ]\n *\tbecomes:\tئئ [ 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}', 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}' ]\n *\n *\tİIJ = IIJ = ⅡJ\n *\n * \t1/2/4\n *\n * @param {string} str\n * @return {string|undefined}\n */\n\n\nconst getPattern = str => {\n  initialize();\n  str = asciifold(str);\n  let pattern = '';\n  let sequences = [new Sequence()];\n\n  for (let i = 0; i < str.length; i++) {\n    let substr = str.substring(i);\n    let match = substr.match(multi_char_reg);\n    const char = str.substring(i, i + 1);\n    const match_str = match ? match[0] : null; // loop through sequences\n    // add either the char or multi_match\n\n    let overlapping = [];\n    let added_types = new Set();\n\n    for (const sequence of sequences) {\n      const last_piece = sequence.last();\n\n      if (!last_piece || last_piece.length == 1 || last_piece.end <= i) {\n        // if we have a multi match\n        if (match_str) {\n          const len = match_str.length;\n          sequence.add({\n            start: i,\n            end: i + len,\n            length: len,\n            substr: match_str\n          });\n          added_types.add('1');\n        } else {\n          sequence.add({\n            start: i,\n            end: i + 1,\n            length: 1,\n            substr: char\n          });\n          added_types.add('2');\n        }\n      } else if (match_str) {\n        let clone = sequence.clone(i, last_piece);\n        const len = match_str.length;\n        clone.add({\n          start: i,\n          end: i + len,\n          length: len,\n          substr: match_str\n        });\n        overlapping.push(clone);\n      } else {\n        // don't add char\n        // adding would create invalid patterns: 234 => [2,34,4]\n        added_types.add('3');\n      }\n    } // if we have overlapping\n\n\n    if (overlapping.length > 0) {\n      // ['ii','iii'] before ['i','i','iii']\n      overlapping = overlapping.sort((a, b) => {\n        return a.length() - b.length();\n      });\n\n      for (let clone of overlapping) {\n        // don't add if we already have an equivalent sequence\n        if (inSequences(clone, sequences)) {\n          continue;\n        }\n\n        sequences.push(clone);\n      }\n\n      continue;\n    } // if we haven't done anything unique\n    // clean up the patterns\n    // helps keep patterns smaller\n    // if str = 'r₨㎧aarss', pattern will be 446 instead of 655\n\n\n    if (i > 0 && added_types.size == 1 && !added_types.has('3')) {\n      pattern += sequencesToPattern(sequences, false);\n      let new_seq = new Sequence();\n      const old_seq = sequences[0];\n\n      if (old_seq) {\n        new_seq.add(old_seq.last());\n      }\n\n      sequences = [new_seq];\n    }\n  }\n\n  pattern += sequencesToPattern(sequences, true);\n  return pattern;\n};\n\n/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */\n\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\nconst getAttr = (obj, name) => {\n  if (!obj) return;\n  return obj[name];\n};\n/**\n * A property getter resolving dot-notation\n * @param  {Object}  obj     The root object to fetch property on\n * @param  {String}  name    The optionally dotted property name to fetch\n * @return {Object}          The resolved property value\n */\n\nconst getAttrNesting = (obj, name) => {\n  if (!obj) return;\n  var part,\n      names = name.split(\".\");\n\n  while ((part = names.shift()) && (obj = obj[part]));\n\n  return obj;\n};\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\n\nconst scoreValue = (value, token, weight) => {\n  var score, pos;\n  if (!value) return 0;\n  value = value + '';\n  if (token.regex == null) return 0;\n  pos = value.search(token.regex);\n  if (pos === -1) return 0;\n  score = token.string.length / value.length;\n  if (pos === 0) score += 0.5;\n  return score * weight;\n};\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\n\nconst propToArray = (obj, key) => {\n  var value = obj[key];\n  if (typeof value == 'function') return value;\n\n  if (value && !Array.isArray(value)) {\n    obj[key] = [value];\n  }\n};\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\n\nconst iterate$1 = (object, callback) => {\n  if (Array.isArray(object)) {\n    object.forEach(callback);\n  } else {\n    for (var key in object) {\n      if (object.hasOwnProperty(key)) {\n        callback(object[key], key);\n      }\n    }\n  }\n};\nconst cmp = (a, b) => {\n  if (typeof a === 'number' && typeof b === 'number') {\n    return a > b ? 1 : a < b ? -1 : 0;\n  }\n\n  a = asciifold(a + '').toLowerCase();\n  b = asciifold(b + '').toLowerCase();\n  if (a > b) return 1;\n  if (b > a) return -1;\n  return 0;\n};\n\n/*! sifter.js | https://github.com/orchidjs/sifter.js | Apache License (v2) */\n\n/**\n * sifter.js\n * Copyright (c) 2013–2020 Brian Reavis & contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n * @author Brian Reavis <brian@thirdroute.com>\n */\n\nclass Sifter {\n  // []|{};\n\n  /**\n   * Textually searches arrays and hashes of objects\n   * by property (or multiple properties). Designed\n   * specifically for autocomplete.\n   *\n   */\n  constructor(items, settings) {\n    this.items = void 0;\n    this.settings = void 0;\n    this.items = items;\n    this.settings = settings || {\n      diacritics: true\n    };\n  }\n\n  /**\n   * Splits a search string into an array of individual\n   * regexps to be used to match results.\n   *\n   */\n  tokenize(query, respect_word_boundaries, weights) {\n    if (!query || !query.length) return [];\n    const tokens = [];\n    const words = query.split(/\\s+/);\n    var field_regex;\n\n    if (weights) {\n      field_regex = new RegExp('^(' + Object.keys(weights).map(escape_regex).join('|') + ')\\:(.*)$');\n    }\n\n    words.forEach(word => {\n      let field_match;\n      let field = null;\n      let regex = null; // look for \"field:query\" tokens\n\n      if (field_regex && (field_match = word.match(field_regex))) {\n        field = field_match[1];\n        word = field_match[2];\n      }\n\n      if (word.length > 0) {\n        if (this.settings.diacritics) {\n          regex = getPattern(word) || null;\n        } else {\n          regex = escape_regex(word);\n        }\n\n        if (regex && respect_word_boundaries) regex = \"\\\\b\" + regex;\n      }\n\n      tokens.push({\n        string: word,\n        regex: regex ? new RegExp(regex, 'iu') : null,\n        field: field\n      });\n    });\n    return tokens;\n  }\n\n  /**\n   * Returns a function to be used to score individual results.\n   *\n   * Good matches will have a higher score than poor matches.\n   * If an item is not a match, 0 will be returned by the function.\n   *\n   * @returns {T.ScoreFn}\n   */\n  getScoreFunction(query, options) {\n    var search = this.prepareSearch(query, options);\n    return this._getScoreFunction(search);\n  }\n  /**\n   * @returns {T.ScoreFn}\n   *\n   */\n\n\n  _getScoreFunction(search) {\n    const tokens = search.tokens,\n          token_count = tokens.length;\n\n    if (!token_count) {\n      return function () {\n        return 0;\n      };\n    }\n\n    const fields = search.options.fields,\n          weights = search.weights,\n          field_count = fields.length,\n          getAttrFn = search.getAttrFn;\n\n    if (!field_count) {\n      return function () {\n        return 1;\n      };\n    }\n    /**\n     * Calculates the score of an object\n     * against the search query.\n     *\n     */\n\n\n    const scoreObject = function () {\n      if (field_count === 1) {\n        return function (token, data) {\n          const field = fields[0].field;\n          return scoreValue(getAttrFn(data, field), token, weights[field] || 1);\n        };\n      }\n\n      return function (token, data) {\n        var sum = 0; // is the token specific to a field?\n\n        if (token.field) {\n          const value = getAttrFn(data, token.field);\n\n          if (!token.regex && value) {\n            sum += 1 / field_count;\n          } else {\n            sum += scoreValue(value, token, 1);\n          }\n        } else {\n          iterate$1(weights, (weight, field) => {\n            sum += scoreValue(getAttrFn(data, field), token, weight);\n          });\n        }\n\n        return sum / field_count;\n      };\n    }();\n\n    if (token_count === 1) {\n      return function (data) {\n        return scoreObject(tokens[0], data);\n      };\n    }\n\n    if (search.options.conjunction === 'and') {\n      return function (data) {\n        var score,\n            sum = 0;\n\n        for (let token of tokens) {\n          score = scoreObject(token, data);\n          if (score <= 0) return 0;\n          sum += score;\n        }\n\n        return sum / token_count;\n      };\n    } else {\n      return function (data) {\n        var sum = 0;\n        iterate$1(tokens, token => {\n          sum += scoreObject(token, data);\n        });\n        return sum / token_count;\n      };\n    }\n  }\n\n  /**\n   * Returns a function that can be used to compare two\n   * results, for sorting purposes. If no sorting should\n   * be performed, `null` will be returned.\n   *\n   * @return function(a,b)\n   */\n  getSortFunction(query, options) {\n    var search = this.prepareSearch(query, options);\n    return this._getSortFunction(search);\n  }\n\n  _getSortFunction(search) {\n    var implicit_score,\n        sort_flds = [];\n    const self = this,\n          options = search.options,\n          sort = !search.query && options.sort_empty ? options.sort_empty : options.sort;\n\n    if (typeof sort == 'function') {\n      return sort.bind(this);\n    }\n    /**\n     * Fetches the specified sort field value\n     * from a search result item.\n     *\n     */\n\n\n    const get_field = function get_field(name, result) {\n      if (name === '$score') return result.score;\n      return search.getAttrFn(self.items[result.id], name);\n    }; // parse options\n\n\n    if (sort) {\n      for (let s of sort) {\n        if (search.query || s.field !== '$score') {\n          sort_flds.push(s);\n        }\n      }\n    } // the \"$score\" field is implied to be the primary\n    // sort field, unless it's manually specified\n\n\n    if (search.query) {\n      implicit_score = true;\n\n      for (let fld of sort_flds) {\n        if (fld.field === '$score') {\n          implicit_score = false;\n          break;\n        }\n      }\n\n      if (implicit_score) {\n        sort_flds.unshift({\n          field: '$score',\n          direction: 'desc'\n        });\n      } // without a search.query, all items will have the same score\n\n    } else {\n      sort_flds = sort_flds.filter(fld => fld.field !== '$score');\n    } // build function\n\n\n    const sort_flds_count = sort_flds.length;\n\n    if (!sort_flds_count) {\n      return null;\n    }\n\n    return function (a, b) {\n      var result, field;\n\n      for (let sort_fld of sort_flds) {\n        field = sort_fld.field;\n        let multiplier = sort_fld.direction === 'desc' ? -1 : 1;\n        result = multiplier * cmp(get_field(field, a), get_field(field, b));\n        if (result) return result;\n      }\n\n      return 0;\n    };\n  }\n\n  /**\n   * Parses a search query and returns an object\n   * with tokens and fields ready to be populated\n   * with results.\n   *\n   */\n  prepareSearch(query, optsUser) {\n    const weights = {};\n    var options = Object.assign({}, optsUser);\n    propToArray(options, 'sort');\n    propToArray(options, 'sort_empty'); // convert fields to new format\n\n    if (options.fields) {\n      propToArray(options, 'fields');\n      const fields = [];\n      options.fields.forEach(field => {\n        if (typeof field == 'string') {\n          field = {\n            field: field,\n            weight: 1\n          };\n        }\n\n        fields.push(field);\n        weights[field.field] = 'weight' in field ? field.weight : 1;\n      });\n      options.fields = fields;\n    }\n\n    return {\n      options: options,\n      query: query.toLowerCase().trim(),\n      tokens: this.tokenize(query, options.respect_word_boundaries, weights),\n      total: 0,\n      items: [],\n      weights: weights,\n      getAttrFn: options.nesting ? getAttrNesting : getAttr\n    };\n  }\n\n  /**\n   * Searches through all items and returns a sorted array of matches.\n   *\n   */\n  search(query, options) {\n    var self = this,\n        score,\n        search;\n    search = this.prepareSearch(query, options);\n    options = search.options;\n    query = search.query; // generate result scoring function\n\n    const fn_score = options.score || self._getScoreFunction(search); // perform search and sort\n\n\n    if (query.length) {\n      iterate$1(self.items, (item, id) => {\n        score = fn_score(item);\n\n        if (options.filter === false || score > 0) {\n          search.items.push({\n            'score': score,\n            'id': id\n          });\n        }\n      });\n    } else {\n      iterate$1(self.items, (_, id) => {\n        search.items.push({\n          'score': 1,\n          'id': id\n        });\n      });\n    }\n\n    const fn_sort = self._getSortFunction(search);\n\n    if (fn_sort) search.items.sort(fn_sort); // apply limits\n\n    search.total = search.items.length;\n\n    if (typeof options.limit === 'number') {\n      search.items = search.items.slice(0, options.limit);\n    }\n\n    return search;\n  }\n\n}\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n *    // invoked for each item\n * });\n * ```\n *\n */\n\nconst iterate = (object, callback) => {\n  if (Array.isArray(object)) {\n    object.forEach(callback);\n  } else {\n    for (var key in object) {\n      if (object.hasOwnProperty(key)) {\n        callback(object[key], key);\n      }\n    }\n  }\n};\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\n\nconst getDom = query => {\n  if (query.jquery) {\n    return query[0];\n  }\n\n  if (query instanceof HTMLElement) {\n    return query;\n  }\n\n  if (isHtmlString(query)) {\n    var tpl = document.createElement('template');\n    tpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\n    return tpl.content.firstChild;\n  }\n\n  return document.querySelector(query);\n};\nconst isHtmlString = arg => {\n  if (typeof arg === 'string' && arg.indexOf('<') > -1) {\n    return true;\n  }\n\n  return false;\n};\nconst escapeQuery = query => {\n  return query.replace(/['\"\\\\]/g, '\\\\$&');\n};\n/**\n * Dispatch an event\n *\n */\n\nconst triggerEvent = (dom_el, event_name) => {\n  var event = document.createEvent('HTMLEvents');\n  event.initEvent(event_name, true, false);\n  dom_el.dispatchEvent(event);\n};\n/**\n * Apply CSS rules to a dom element\n *\n */\n\nconst applyCSS = (dom_el, css) => {\n  Object.assign(dom_el.style, css);\n};\n/**\n * Add css classes\n *\n */\n\nconst addClasses = (elmts, ...classes) => {\n  var norm_classes = classesArray(classes);\n  elmts = castAsArray(elmts);\n  elmts.map(el => {\n    norm_classes.map(cls => {\n      el.classList.add(cls);\n    });\n  });\n};\n/**\n * Remove css classes\n *\n */\n\nconst removeClasses = (elmts, ...classes) => {\n  var norm_classes = classesArray(classes);\n  elmts = castAsArray(elmts);\n  elmts.map(el => {\n    norm_classes.map(cls => {\n      el.classList.remove(cls);\n    });\n  });\n};\n/**\n * Return arguments\n *\n */\n\nconst classesArray = args => {\n  var classes = [];\n  iterate(args, _classes => {\n    if (typeof _classes === 'string') {\n      _classes = _classes.trim().split(/[\\11\\12\\14\\15\\40]/);\n    }\n\n    if (Array.isArray(_classes)) {\n      classes = classes.concat(_classes);\n    }\n  });\n  return classes.filter(Boolean);\n};\n/**\n * Create an array from arg if it's not already an array\n *\n */\n\nconst castAsArray = arg => {\n  if (!Array.isArray(arg)) {\n    arg = [arg];\n  }\n\n  return arg;\n};\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\n\nconst parentMatch = (target, selector, wrapper) => {\n  if (wrapper && !wrapper.contains(target)) {\n    return;\n  }\n\n  while (target && target.matches) {\n    if (target.matches(selector)) {\n      return target;\n    }\n\n    target = target.parentNode;\n  }\n};\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\n\nconst getTail = (list, direction = 0) => {\n  if (direction > 0) {\n    return list[list.length - 1];\n  }\n\n  return list[0];\n};\n/**\n * Return true if an object is empty\n *\n */\n\nconst isEmptyObject = obj => {\n  return Object.keys(obj).length === 0;\n};\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\n\nconst nodeIndex = (el, amongst) => {\n  if (!el) return -1;\n  amongst = amongst || el.nodeName;\n  var i = 0;\n\n  while (el = el.previousElementSibling) {\n    if (el.matches(amongst)) {\n      i++;\n    }\n  }\n\n  return i;\n};\n/**\n * Set attributes of an element\n *\n */\n\nconst setAttr = (el, attrs) => {\n  iterate(attrs, (val, attr) => {\n    if (val == null) {\n      el.removeAttribute(attr);\n    } else {\n      el.setAttribute(attr, '' + val);\n    }\n  });\n};\n/**\n * Replace a node\n */\n\nconst replaceNode = (existing, replacement) => {\n  if (existing.parentNode) existing.parentNode.replaceChild(replacement, existing);\n};\n\n/**\n * highlight v3 | MIT license | Johann Burkard <jb@eaio.com>\n * Highlights arbitrary terms in a node.\n *\n * - Modified by Marshal <beatgates@gmail.com> 2011-6-24 (added regex)\n * - Modified by Brian Reavis <brian@thirdroute.com> 2012-8-27 (cleanup)\n */\nconst highlight = (element, regex) => {\n  if (regex === null) return; // convet string to regex\n\n  if (typeof regex === 'string') {\n    if (!regex.length) return;\n    regex = new RegExp(regex, 'i');\n  } // Wrap matching part of text node with highlighting <span>, e.g.\n  // Soccer  ->  <span class=\"highlight\">Soc</span>cer  for regex = /soc/i\n\n\n  const highlightText = node => {\n    var match = node.data.match(regex);\n\n    if (match && node.data.length > 0) {\n      var spannode = document.createElement('span');\n      spannode.className = 'highlight';\n      var middlebit = node.splitText(match.index);\n      middlebit.splitText(match[0].length);\n      var middleclone = middlebit.cloneNode(true);\n      spannode.appendChild(middleclone);\n      replaceNode(middlebit, spannode);\n      return 1;\n    }\n\n    return 0;\n  }; // Recurse element node, looking for child text nodes to highlight, unless element\n  // is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\n\n  const highlightChildren = node => {\n    if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && (node.className !== 'highlight' || node.tagName !== 'SPAN')) {\n      Array.from(node.childNodes).forEach(element => {\n        highlightRecursive(element);\n      });\n    }\n  };\n\n  const highlightRecursive = node => {\n    if (node.nodeType === 3) {\n      return highlightText(node);\n    }\n\n    highlightChildren(node);\n    return 0;\n  };\n\n  highlightRecursive(element);\n};\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with(), pass js strict mode, and use without jquery\n */\n\nconst removeHighlight = el => {\n  var elements = el.querySelectorAll(\"span.highlight\");\n  Array.prototype.forEach.call(elements, function (el) {\n    var parent = el.parentNode;\n    parent.replaceChild(el.firstChild, el);\n    parent.normalize();\n  });\n};\n\nconst KEY_A = 65;\nconst KEY_RETURN = 13;\nconst KEY_ESC = 27;\nconst KEY_LEFT = 37;\nconst KEY_UP = 38;\nconst KEY_RIGHT = 39;\nconst KEY_DOWN = 40;\nconst KEY_BACKSPACE = 8;\nconst KEY_DELETE = 46;\nconst KEY_TAB = 9;\nconst IS_MAC = typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nconst KEY_SHORTCUT = IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n\nvar defaults = {\n  options: [],\n  optgroups: [],\n  plugins: [],\n  delimiter: ',',\n  splitOn: null,\n  // regexp or string for splitting up values from a paste command\n  persist: true,\n  diacritics: true,\n  create: null,\n  createOnBlur: false,\n  createFilter: null,\n  highlight: true,\n  openOnFocus: true,\n  shouldOpen: null,\n  maxOptions: 50,\n  maxItems: null,\n  hideSelected: null,\n  duplicates: false,\n  addPrecedence: false,\n  selectOnTab: false,\n  preload: null,\n  allowEmptyOption: false,\n  //closeAfterSelect: false,\n  loadThrottle: 300,\n  loadingClass: 'loading',\n  dataAttr: null,\n  //'data-data',\n  optgroupField: 'optgroup',\n  valueField: 'value',\n  labelField: 'text',\n  disabledField: 'disabled',\n  optgroupLabelField: 'label',\n  optgroupValueField: 'value',\n  lockOptgroupOrder: false,\n  sortField: '$order',\n  searchField: ['text'],\n  searchConjunction: 'and',\n  mode: null,\n  wrapperClass: 'ts-wrapper',\n  controlClass: 'ts-control',\n  dropdownClass: 'ts-dropdown',\n  dropdownContentClass: 'ts-dropdown-content',\n  itemClass: 'item',\n  optionClass: 'option',\n  dropdownParent: null,\n  controlInput: '<input type=\"text\" autocomplete=\"off\" size=\"1\" />',\n  copyClassesToDropdown: false,\n  placeholder: null,\n  hidePlaceholder: null,\n  shouldLoad: function (query) {\n    return query.length > 0;\n  },\n\n  /*\n  load                 : null, // function(query, callback) { ... }\n  score                : null, // function(search) { ... }\n  onInitialize         : null, // function() { ... }\n  onChange             : null, // function(value) { ... }\n  onItemAdd            : null, // function(value, $item) { ... }\n  onItemRemove         : null, // function(value) { ... }\n  onClear              : null, // function() { ... }\n  onOptionAdd          : null, // function(value, data) { ... }\n  onOptionRemove       : null, // function(value) { ... }\n  onOptionClear        : null, // function() { ... }\n  onOptionGroupAdd     : null, // function(id, data) { ... }\n  onOptionGroupRemove  : null, // function(id) { ... }\n  onOptionGroupClear   : null, // function() { ... }\n  onDropdownOpen       : null, // function(dropdown) { ... }\n  onDropdownClose      : null, // function(dropdown) { ... }\n  onType               : null, // function(str) { ... }\n  onDelete             : null, // function(values) { ... }\n  */\n  render: {\n    /*\n    item: null,\n    optgroup: null,\n    optgroup_header: null,\n    option: null,\n    option_create: null\n    */\n  }\n};\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n *   'str'     -> 'str'\n *   null      -> ''\n *   undefined -> ''\n *   true      -> '1'\n *   false     -> '0'\n *   0         -> '0'\n *   1         -> '1'\n *\n */\nconst hash_key = value => {\n  if (typeof value === 'undefined' || value === null) return null;\n  return get_hash(value);\n};\nconst get_hash = value => {\n  if (typeof value === 'boolean') return value ? '1' : '0';\n  return value + '';\n};\n/**\n * Escapes a string for use within HTML.\n *\n */\n\nconst escape_html = str => {\n  return (str + '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n};\n/**\n * Debounce the user provided load function\n *\n */\n\nconst loadDebounce = (fn, delay) => {\n  var timeout;\n  return function (value, callback) {\n    var self = this;\n\n    if (timeout) {\n      self.loading = Math.max(self.loading - 1, 0);\n      clearTimeout(timeout);\n    }\n\n    timeout = setTimeout(function () {\n      timeout = null;\n      self.loadedSearches[value] = true;\n      fn.call(self, value, callback);\n    }, delay);\n  };\n};\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\n\nconst debounce_events = (self, types, fn) => {\n  var type;\n  var trigger = self.trigger;\n  var event_args = {}; // override trigger method\n\n  self.trigger = function () {\n    var type = arguments[0];\n\n    if (types.indexOf(type) !== -1) {\n      event_args[type] = arguments;\n    } else {\n      return trigger.apply(self, arguments);\n    }\n  }; // invoke provided function\n\n\n  fn.apply(self, []);\n  self.trigger = trigger; // trigger queued events\n\n  for (type of types) {\n    if (type in event_args) {\n      trigger.apply(self, event_args[type]);\n    }\n  }\n};\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n *   - start\n *   - length\n *\n */\n\nconst getSelection = input => {\n  return {\n    start: input.selectionStart || 0,\n    length: (input.selectionEnd || 0) - (input.selectionStart || 0)\n  };\n};\n/**\n * Prevent default\n *\n */\n\nconst preventDefault = (evt, stop = false) => {\n  if (evt) {\n    evt.preventDefault();\n\n    if (stop) {\n      evt.stopPropagation();\n    }\n  }\n};\n/**\n * Add event helper\n *\n */\n\nconst addEvent = (target, type, callback, options) => {\n  target.addEventListener(type, callback, options);\n};\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\n\nconst isKeyDown = (key_name, evt) => {\n  if (!evt) {\n    return false;\n  }\n\n  if (!evt[key_name]) {\n    return false;\n  }\n\n  var count = (evt.altKey ? 1 : 0) + (evt.ctrlKey ? 1 : 0) + (evt.shiftKey ? 1 : 0) + (evt.metaKey ? 1 : 0);\n\n  if (count === 1) {\n    return true;\n  }\n\n  return false;\n};\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\n\nconst getId = (el, id) => {\n  const existing_id = el.getAttribute('id');\n\n  if (existing_id) {\n    return existing_id;\n  }\n\n  el.setAttribute('id', id);\n  return id;\n};\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\n\nconst addSlashes = str => {\n  return str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n/**\n *\n */\n\nconst append = (parent, node) => {\n  if (node) parent.append(node);\n};\n\nfunction getSettings(input, settings_user) {\n  var settings = Object.assign({}, defaults, settings_user);\n  var attr_data = settings.dataAttr;\n  var field_label = settings.labelField;\n  var field_value = settings.valueField;\n  var field_disabled = settings.disabledField;\n  var field_optgroup = settings.optgroupField;\n  var field_optgroup_label = settings.optgroupLabelField;\n  var field_optgroup_value = settings.optgroupValueField;\n  var tag_name = input.tagName.toLowerCase();\n  var placeholder = input.getAttribute('placeholder') || input.getAttribute('data-placeholder');\n\n  if (!placeholder && !settings.allowEmptyOption) {\n    let option = input.querySelector('option[value=\"\"]');\n\n    if (option) {\n      placeholder = option.textContent;\n    }\n  }\n\n  var settings_element = {\n    placeholder: placeholder,\n    options: [],\n    optgroups: [],\n    items: [],\n    maxItems: null\n  };\n  /**\n   * Initialize from a <select> element.\n   *\n   */\n\n  var init_select = () => {\n    var tagName;\n    var options = settings_element.options;\n    var optionsMap = {};\n    var group_count = 1;\n\n    var readData = el => {\n      var data = Object.assign({}, el.dataset); // get plain object from DOMStringMap\n\n      var json = attr_data && data[attr_data];\n\n      if (typeof json === 'string' && json.length) {\n        data = Object.assign(data, JSON.parse(json));\n      }\n\n      return data;\n    };\n\n    var addOption = (option, group) => {\n      var value = hash_key(option.value);\n      if (value == null) return;\n      if (!value && !settings.allowEmptyOption) return; // if the option already exists, it's probably been\n      // duplicated in another optgroup. in this case, push\n      // the current group to the \"optgroup\" property on the\n      // existing option so that it's rendered in both places.\n\n      if (optionsMap.hasOwnProperty(value)) {\n        if (group) {\n          var arr = optionsMap[value][field_optgroup];\n\n          if (!arr) {\n            optionsMap[value][field_optgroup] = group;\n          } else if (!Array.isArray(arr)) {\n            optionsMap[value][field_optgroup] = [arr, group];\n          } else {\n            arr.push(group);\n          }\n        }\n      } else {\n        var option_data = readData(option);\n        option_data[field_label] = option_data[field_label] || option.textContent;\n        option_data[field_value] = option_data[field_value] || value;\n        option_data[field_disabled] = option_data[field_disabled] || option.disabled;\n        option_data[field_optgroup] = option_data[field_optgroup] || group;\n        option_data.$option = option;\n        optionsMap[value] = option_data;\n        options.push(option_data);\n      }\n\n      if (option.selected) {\n        settings_element.items.push(value);\n      }\n    };\n\n    var addGroup = optgroup => {\n      var id, optgroup_data;\n      optgroup_data = readData(optgroup);\n      optgroup_data[field_optgroup_label] = optgroup_data[field_optgroup_label] || optgroup.getAttribute('label') || '';\n      optgroup_data[field_optgroup_value] = optgroup_data[field_optgroup_value] || group_count++;\n      optgroup_data[field_disabled] = optgroup_data[field_disabled] || optgroup.disabled;\n      settings_element.optgroups.push(optgroup_data);\n      id = optgroup_data[field_optgroup_value];\n      iterate(optgroup.children, option => {\n        addOption(option, id);\n      });\n    };\n\n    settings_element.maxItems = input.hasAttribute('multiple') ? null : 1;\n    iterate(input.children, child => {\n      tagName = child.tagName.toLowerCase();\n\n      if (tagName === 'optgroup') {\n        addGroup(child);\n      } else if (tagName === 'option') {\n        addOption(child);\n      }\n    });\n  };\n  /**\n   * Initialize from a <input type=\"text\"> element.\n   *\n   */\n\n\n  var init_textbox = () => {\n    const data_raw = input.getAttribute(attr_data);\n\n    if (!data_raw) {\n      var value = input.value.trim() || '';\n      if (!settings.allowEmptyOption && !value.length) return;\n      const values = value.split(settings.delimiter);\n      iterate(values, value => {\n        const option = {};\n        option[field_label] = value;\n        option[field_value] = value;\n        settings_element.options.push(option);\n      });\n      settings_element.items = values;\n    } else {\n      settings_element.options = JSON.parse(data_raw);\n      iterate(settings_element.options, opt => {\n        settings_element.items.push(opt[field_value]);\n      });\n    }\n  };\n\n  if (tag_name === 'select') {\n    init_select();\n  } else {\n    init_textbox();\n  }\n\n  return Object.assign({}, defaults, settings_element, settings_user);\n}\n\nvar instance_i = 0;\nclass TomSelect extends MicroPlugin(MicroEvent) {\n  // @deprecated 1.8\n  constructor(input_arg, user_settings) {\n    super();\n    this.control_input = void 0;\n    this.wrapper = void 0;\n    this.dropdown = void 0;\n    this.control = void 0;\n    this.dropdown_content = void 0;\n    this.focus_node = void 0;\n    this.order = 0;\n    this.settings = void 0;\n    this.input = void 0;\n    this.tabIndex = void 0;\n    this.is_select_tag = void 0;\n    this.rtl = void 0;\n    this.inputId = void 0;\n    this._destroy = void 0;\n    this.sifter = void 0;\n    this.isOpen = false;\n    this.isDisabled = false;\n    this.isRequired = void 0;\n    this.isInvalid = false;\n    this.isValid = true;\n    this.isLocked = false;\n    this.isFocused = false;\n    this.isInputHidden = false;\n    this.isSetup = false;\n    this.ignoreFocus = false;\n    this.ignoreHover = false;\n    this.hasOptions = false;\n    this.currentResults = void 0;\n    this.lastValue = '';\n    this.caretPos = 0;\n    this.loading = 0;\n    this.loadedSearches = {};\n    this.activeOption = null;\n    this.activeItems = [];\n    this.optgroups = {};\n    this.options = {};\n    this.userOptions = {};\n    this.items = [];\n    instance_i++;\n    var dir;\n    var input = getDom(input_arg);\n\n    if (input.tomselect) {\n      throw new Error('Tom Select already initialized on this element');\n    }\n\n    input.tomselect = this; // detect rtl environment\n\n    var computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);\n    dir = computedStyle.getPropertyValue('direction'); // setup default state\n\n    const settings = getSettings(input, user_settings);\n    this.settings = settings;\n    this.input = input;\n    this.tabIndex = input.tabIndex || 0;\n    this.is_select_tag = input.tagName.toLowerCase() === 'select';\n    this.rtl = /rtl/i.test(dir);\n    this.inputId = getId(input, 'tomselect-' + instance_i);\n    this.isRequired = input.required; // search system\n\n    this.sifter = new Sifter(this.options, {\n      diacritics: settings.diacritics\n    }); // option-dependent defaults\n\n    settings.mode = settings.mode || (settings.maxItems === 1 ? 'single' : 'multi');\n\n    if (typeof settings.hideSelected !== 'boolean') {\n      settings.hideSelected = settings.mode === 'multi';\n    }\n\n    if (typeof settings.hidePlaceholder !== 'boolean') {\n      settings.hidePlaceholder = settings.mode !== 'multi';\n    } // set up createFilter callback\n\n\n    var filter = settings.createFilter;\n\n    if (typeof filter !== 'function') {\n      if (typeof filter === 'string') {\n        filter = new RegExp(filter);\n      }\n\n      if (filter instanceof RegExp) {\n        settings.createFilter = input => filter.test(input);\n      } else {\n        settings.createFilter = value => {\n          return this.settings.duplicates || !this.options[value];\n        };\n      }\n    }\n\n    this.initializePlugins(settings.plugins);\n    this.setupCallbacks();\n    this.setupTemplates(); // Create all elements\n\n    const wrapper = getDom('<div>');\n    const control = getDom('<div>');\n\n    const dropdown = this._render('dropdown');\n\n    const dropdown_content = getDom(`<div role=\"listbox\" tabindex=\"-1\">`);\n    const classes = this.input.getAttribute('class') || '';\n    const inputMode = settings.mode;\n    var control_input;\n    addClasses(wrapper, settings.wrapperClass, classes, inputMode);\n    addClasses(control, settings.controlClass);\n    append(wrapper, control);\n    addClasses(dropdown, settings.dropdownClass, inputMode);\n\n    if (settings.copyClassesToDropdown) {\n      addClasses(dropdown, classes);\n    }\n\n    addClasses(dropdown_content, settings.dropdownContentClass);\n    append(dropdown, dropdown_content);\n    getDom(settings.dropdownParent || wrapper).appendChild(dropdown); // default controlInput\n\n    if (isHtmlString(settings.controlInput)) {\n      control_input = getDom(settings.controlInput); // set attributes\n\n      var attrs = ['autocorrect', 'autocapitalize', 'autocomplete'];\n      iterate$1(attrs, attr => {\n        if (input.getAttribute(attr)) {\n          setAttr(control_input, {\n            [attr]: input.getAttribute(attr)\n          });\n        }\n      });\n      control_input.tabIndex = -1;\n      control.appendChild(control_input);\n      this.focus_node = control_input; // dom element\n    } else if (settings.controlInput) {\n      control_input = getDom(settings.controlInput);\n      this.focus_node = control_input;\n    } else {\n      control_input = getDom('<input/>');\n      this.focus_node = control;\n    }\n\n    this.wrapper = wrapper;\n    this.dropdown = dropdown;\n    this.dropdown_content = dropdown_content;\n    this.control = control;\n    this.control_input = control_input;\n    this.setup();\n  }\n  /**\n   * set up event bindings.\n   *\n   */\n\n\n  setup() {\n    const self = this;\n    const settings = self.settings;\n    const control_input = self.control_input;\n    const dropdown = self.dropdown;\n    const dropdown_content = self.dropdown_content;\n    const wrapper = self.wrapper;\n    const control = self.control;\n    const input = self.input;\n    const focus_node = self.focus_node;\n    const passive_event = {\n      passive: true\n    };\n    const listboxId = self.inputId + '-ts-dropdown';\n    setAttr(dropdown_content, {\n      id: listboxId\n    });\n    setAttr(focus_node, {\n      role: 'combobox',\n      'aria-haspopup': 'listbox',\n      'aria-expanded': 'false',\n      'aria-controls': listboxId\n    });\n    const control_id = getId(focus_node, self.inputId + '-ts-control');\n    const query = \"label[for='\" + escapeQuery(self.inputId) + \"']\";\n    const label = document.querySelector(query);\n    const label_click = self.focus.bind(self);\n\n    if (label) {\n      addEvent(label, 'click', label_click);\n      setAttr(label, {\n        for: control_id\n      });\n      const label_id = getId(label, self.inputId + '-ts-label');\n      setAttr(focus_node, {\n        'aria-labelledby': label_id\n      });\n      setAttr(dropdown_content, {\n        'aria-labelledby': label_id\n      });\n    }\n\n    wrapper.style.width = input.style.width;\n\n    if (self.plugins.names.length) {\n      const classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n      addClasses([wrapper, dropdown], classes_plugins);\n    }\n\n    if ((settings.maxItems === null || settings.maxItems > 1) && self.is_select_tag) {\n      setAttr(input, {\n        multiple: 'multiple'\n      });\n    }\n\n    if (settings.placeholder) {\n      setAttr(control_input, {\n        placeholder: settings.placeholder\n      });\n    } // if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\n\n    if (!settings.splitOn && settings.delimiter) {\n      settings.splitOn = new RegExp('\\\\s*' + escape_regex(settings.delimiter) + '+\\\\s*');\n    } // debounce user defined load() if loadThrottle > 0\n    // after initializePlugins() so plugins can create/modify user defined loaders\n\n\n    if (settings.load && settings.loadThrottle) {\n      settings.load = loadDebounce(settings.load, settings.loadThrottle);\n    }\n\n    self.control_input.type = input.type;\n    addEvent(dropdown, 'mousemove', () => {\n      self.ignoreHover = false;\n    });\n    addEvent(dropdown, 'mouseenter', e => {\n      var target_match = parentMatch(e.target, '[data-selectable]', dropdown);\n      if (target_match) self.onOptionHover(e, target_match);\n    }, {\n      capture: true\n    }); // clicking on an option should select it\n\n    addEvent(dropdown, 'click', evt => {\n      const option = parentMatch(evt.target, '[data-selectable]');\n\n      if (option) {\n        self.onOptionSelect(evt, option);\n        preventDefault(evt, true);\n      }\n    });\n    addEvent(control, 'click', evt => {\n      var target_match = parentMatch(evt.target, '[data-ts-item]', control);\n\n      if (target_match && self.onItemSelect(evt, target_match)) {\n        preventDefault(evt, true);\n        return;\n      } // retain focus (see control_input mousedown)\n\n\n      if (control_input.value != '') {\n        return;\n      }\n\n      self.onClick();\n      preventDefault(evt, true);\n    }); // keydown on focus_node for arrow_down/arrow_up\n\n    addEvent(focus_node, 'keydown', e => self.onKeyDown(e)); // keypress and input/keyup\n\n    addEvent(control_input, 'keypress', e => self.onKeyPress(e));\n    addEvent(control_input, 'input', e => self.onInput(e));\n    addEvent(focus_node, 'blur', e => self.onBlur(e));\n    addEvent(focus_node, 'focus', e => self.onFocus(e));\n    addEvent(control_input, 'paste', e => self.onPaste(e));\n\n    const doc_mousedown = evt => {\n      // blur if target is outside of this instance\n      // dropdown is not always inside wrapper\n      const target = evt.composedPath()[0];\n\n      if (!wrapper.contains(target) && !dropdown.contains(target)) {\n        if (self.isFocused) {\n          self.blur();\n        }\n\n        self.inputState();\n        return;\n      } // retain focus by preventing native handling. if the\n      // event target is the input it should not be modified.\n      // otherwise, text selection within the input won't work.\n      // Fixes bug #212 which is no covered by tests\n\n\n      if (target == control_input && self.isOpen) {\n        evt.stopPropagation(); // clicking anywhere in the control should not blur the control_input (which would close the dropdown)\n      } else {\n        preventDefault(evt, true);\n      }\n    };\n\n    const win_scroll = () => {\n      if (self.isOpen) {\n        self.positionDropdown();\n      }\n    };\n\n    addEvent(document, 'mousedown', doc_mousedown);\n    addEvent(window, 'scroll', win_scroll, passive_event);\n    addEvent(window, 'resize', win_scroll, passive_event);\n\n    this._destroy = () => {\n      document.removeEventListener('mousedown', doc_mousedown);\n      window.removeEventListener('scroll', win_scroll);\n      window.removeEventListener('resize', win_scroll);\n      if (label) label.removeEventListener('click', label_click);\n    }; // store original html and tab index so that they can be\n    // restored when the destroy() method is called.\n\n\n    this.revertSettings = {\n      innerHTML: input.innerHTML,\n      tabIndex: input.tabIndex\n    };\n    input.tabIndex = -1;\n    input.insertAdjacentElement('afterend', self.wrapper);\n    self.sync(false);\n    settings.items = [];\n    delete settings.optgroups;\n    delete settings.options;\n    addEvent(input, 'invalid', () => {\n      if (self.isValid) {\n        self.isValid = false;\n        self.isInvalid = true;\n        self.refreshState();\n      }\n    });\n    self.updateOriginalInput();\n    self.refreshItems();\n    self.close(false);\n    self.inputState();\n    self.isSetup = true;\n\n    if (input.disabled) {\n      self.disable();\n    } else {\n      self.enable(); //sets tabIndex\n    }\n\n    self.on('change', this.onChange);\n    addClasses(input, 'tomselected', 'ts-hidden-accessible');\n    self.trigger('initialize'); // preload options\n\n    if (settings.preload === true) {\n      self.preload();\n    }\n  }\n  /**\n   * Register options and optgroups\n   *\n   */\n\n\n  setupOptions(options = [], optgroups = []) {\n    // build options table\n    this.addOptions(options); // build optgroup table\n\n    iterate$1(optgroups, optgroup => {\n      this.registerOptionGroup(optgroup);\n    });\n  }\n  /**\n   * Sets up default rendering functions.\n   */\n\n\n  setupTemplates() {\n    var self = this;\n    var field_label = self.settings.labelField;\n    var field_optgroup = self.settings.optgroupLabelField;\n    var templates = {\n      'optgroup': data => {\n        let optgroup = document.createElement('div');\n        optgroup.className = 'optgroup';\n        optgroup.appendChild(data.options);\n        return optgroup;\n      },\n      'optgroup_header': (data, escape) => {\n        return '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n      },\n      'option': (data, escape) => {\n        return '<div>' + escape(data[field_label]) + '</div>';\n      },\n      'item': (data, escape) => {\n        return '<div>' + escape(data[field_label]) + '</div>';\n      },\n      'option_create': (data, escape) => {\n        return '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n      },\n      'no_results': () => {\n        return '<div class=\"no-results\">No results found</div>';\n      },\n      'loading': () => {\n        return '<div class=\"spinner\"></div>';\n      },\n      'not_loading': () => {},\n      'dropdown': () => {\n        return '<div></div>';\n      }\n    };\n    self.settings.render = Object.assign({}, templates, self.settings.render);\n  }\n  /**\n   * Maps fired events to callbacks provided\n   * in the settings used when creating the control.\n   */\n\n\n  setupCallbacks() {\n    var key, fn;\n    var callbacks = {\n      'initialize': 'onInitialize',\n      'change': 'onChange',\n      'item_add': 'onItemAdd',\n      'item_remove': 'onItemRemove',\n      'item_select': 'onItemSelect',\n      'clear': 'onClear',\n      'option_add': 'onOptionAdd',\n      'option_remove': 'onOptionRemove',\n      'option_clear': 'onOptionClear',\n      'optgroup_add': 'onOptionGroupAdd',\n      'optgroup_remove': 'onOptionGroupRemove',\n      'optgroup_clear': 'onOptionGroupClear',\n      'dropdown_open': 'onDropdownOpen',\n      'dropdown_close': 'onDropdownClose',\n      'type': 'onType',\n      'load': 'onLoad',\n      'focus': 'onFocus',\n      'blur': 'onBlur'\n    };\n\n    for (key in callbacks) {\n      fn = this.settings[callbacks[key]];\n      if (fn) this.on(key, fn);\n    }\n  }\n  /**\n   * Sync the Tom Select instance with the original input or select\n   *\n   */\n\n\n  sync(get_settings = true) {\n    const self = this;\n    const settings = get_settings ? getSettings(self.input, {\n      delimiter: self.settings.delimiter\n    }) : self.settings;\n    self.setupOptions(settings.options, settings.optgroups);\n    self.setValue(settings.items || [], true); // silent prevents recursion\n\n    self.lastQuery = null; // so updated options will be displayed in dropdown\n  }\n  /**\n   * Triggered when the main control element\n   * has a click event.\n   *\n   */\n\n\n  onClick() {\n    var self = this;\n\n    if (self.activeItems.length > 0) {\n      self.clearActiveItems();\n      self.focus();\n      return;\n    }\n\n    if (self.isFocused && self.isOpen) {\n      self.blur();\n    } else {\n      self.focus();\n    }\n  }\n  /**\n   * @deprecated v1.7\n   *\n   */\n\n\n  onMouseDown() {}\n  /**\n   * Triggered when the value of the control has been changed.\n   * This should propagate the event to the original DOM\n   * input / select element.\n   */\n\n\n  onChange() {\n    triggerEvent(this.input, 'input');\n    triggerEvent(this.input, 'change');\n  }\n  /**\n   * Triggered on <input> paste.\n   *\n   */\n\n\n  onPaste(e) {\n    var self = this;\n\n    if (self.isInputHidden || self.isLocked) {\n      preventDefault(e);\n      return;\n    } // If a regex or string is included, this will split the pasted\n    // input and create Items for each separate value\n\n\n    if (!self.settings.splitOn) {\n      return;\n    } // Wait for pasted text to be recognized in value\n\n\n    setTimeout(() => {\n      var pastedText = self.inputValue();\n\n      if (!pastedText.match(self.settings.splitOn)) {\n        return;\n      }\n\n      var splitInput = pastedText.trim().split(self.settings.splitOn);\n      iterate$1(splitInput, piece => {\n        const hash = hash_key(piece);\n\n        if (hash) {\n          if (this.options[piece]) {\n            self.addItem(piece);\n          } else {\n            self.createItem(piece);\n          }\n        }\n      });\n    }, 0);\n  }\n  /**\n   * Triggered on <input> keypress.\n   *\n   */\n\n\n  onKeyPress(e) {\n    var self = this;\n\n    if (self.isLocked) {\n      preventDefault(e);\n      return;\n    }\n\n    var character = String.fromCharCode(e.keyCode || e.which);\n\n    if (self.settings.create && self.settings.mode === 'multi' && character === self.settings.delimiter) {\n      self.createItem();\n      preventDefault(e);\n      return;\n    }\n  }\n  /**\n   * Triggered on <input> keydown.\n   *\n   */\n\n\n  onKeyDown(e) {\n    var self = this;\n    self.ignoreHover = true;\n\n    if (self.isLocked) {\n      if (e.keyCode !== KEY_TAB) {\n        preventDefault(e);\n      }\n\n      return;\n    }\n\n    switch (e.keyCode) {\n      // ctrl+A: select all\n      case KEY_A:\n        if (isKeyDown(KEY_SHORTCUT, e)) {\n          if (self.control_input.value == '') {\n            preventDefault(e);\n            self.selectAll();\n            return;\n          }\n        }\n\n        break;\n      // esc: close dropdown\n\n      case KEY_ESC:\n        if (self.isOpen) {\n          preventDefault(e, true);\n          self.close();\n        }\n\n        self.clearActiveItems();\n        return;\n      // down: open dropdown or move selection down\n\n      case KEY_DOWN:\n        if (!self.isOpen && self.hasOptions) {\n          self.open();\n        } else if (self.activeOption) {\n          let next = self.getAdjacent(self.activeOption, 1);\n          if (next) self.setActiveOption(next);\n        }\n\n        preventDefault(e);\n        return;\n      // up: move selection up\n\n      case KEY_UP:\n        if (self.activeOption) {\n          let prev = self.getAdjacent(self.activeOption, -1);\n          if (prev) self.setActiveOption(prev);\n        }\n\n        preventDefault(e);\n        return;\n      // return: select active option\n\n      case KEY_RETURN:\n        if (self.canSelect(self.activeOption)) {\n          self.onOptionSelect(e, self.activeOption);\n          preventDefault(e); // if the option_create=null, the dropdown might be closed\n        } else if (self.settings.create && self.createItem()) {\n          preventDefault(e); // don't submit form when searching for a value\n        } else if (document.activeElement == self.control_input && self.isOpen) {\n          preventDefault(e);\n        }\n\n        return;\n      // left: modifiy item selection to the left\n\n      case KEY_LEFT:\n        self.advanceSelection(-1, e);\n        return;\n      // right: modifiy item selection to the right\n\n      case KEY_RIGHT:\n        self.advanceSelection(1, e);\n        return;\n      // tab: select active option and/or create item\n\n      case KEY_TAB:\n        if (self.settings.selectOnTab) {\n          if (self.canSelect(self.activeOption)) {\n            self.onOptionSelect(e, self.activeOption); // prevent default [tab] behaviour of jump to the next field\n            // if select isFull, then the dropdown won't be open and [tab] will work normally\n\n            preventDefault(e);\n          }\n\n          if (self.settings.create && self.createItem()) {\n            preventDefault(e);\n          }\n        }\n\n        return;\n      // delete|backspace: delete items\n\n      case KEY_BACKSPACE:\n      case KEY_DELETE:\n        self.deleteSelection(e);\n        return;\n    } // don't enter text in the control_input when active items are selected\n\n\n    if (self.isInputHidden && !isKeyDown(KEY_SHORTCUT, e)) {\n      preventDefault(e);\n    }\n  }\n  /**\n   * Triggered on <input> keyup.\n   *\n   */\n\n\n  onInput(e) {\n    var self = this;\n\n    if (self.isLocked) {\n      return;\n    }\n\n    var value = self.inputValue();\n\n    if (self.lastValue !== value) {\n      self.lastValue = value;\n\n      if (self.settings.shouldLoad.call(self, value)) {\n        self.load(value);\n      }\n\n      self.refreshOptions();\n      self.trigger('type', value);\n    }\n  }\n  /**\n   * Triggered when the user rolls over\n   * an option in the autocomplete dropdown menu.\n   *\n   */\n\n\n  onOptionHover(evt, option) {\n    if (this.ignoreHover) return;\n    this.setActiveOption(option, false);\n  }\n  /**\n   * Triggered on <input> focus.\n   *\n   */\n\n\n  onFocus(e) {\n    var self = this;\n    var wasFocused = self.isFocused;\n\n    if (self.isDisabled) {\n      self.blur();\n      preventDefault(e);\n      return;\n    }\n\n    if (self.ignoreFocus) return;\n    self.isFocused = true;\n    if (self.settings.preload === 'focus') self.preload();\n    if (!wasFocused) self.trigger('focus');\n\n    if (!self.activeItems.length) {\n      self.showInput();\n      self.refreshOptions(!!self.settings.openOnFocus);\n    }\n\n    self.refreshState();\n  }\n  /**\n   * Triggered on <input> blur.\n   *\n   */\n\n\n  onBlur(e) {\n    if (document.hasFocus() === false) return;\n    var self = this;\n    if (!self.isFocused) return;\n    self.isFocused = false;\n    self.ignoreFocus = false;\n\n    var deactivate = () => {\n      self.close();\n      self.setActiveItem();\n      self.setCaret(self.items.length);\n      self.trigger('blur');\n    };\n\n    if (self.settings.create && self.settings.createOnBlur) {\n      self.createItem(null, deactivate);\n    } else {\n      deactivate();\n    }\n  }\n  /**\n   * Triggered when the user clicks on an option\n   * in the autocomplete dropdown menu.\n   *\n   */\n\n\n  onOptionSelect(evt, option) {\n    var value,\n        self = this; // should not be possible to trigger a option under a disabled optgroup\n\n    if (option.parentElement && option.parentElement.matches('[data-disabled]')) {\n      return;\n    }\n\n    if (option.classList.contains('create')) {\n      self.createItem(null, () => {\n        if (self.settings.closeAfterSelect) {\n          self.close();\n        }\n      });\n    } else {\n      value = option.dataset.value;\n\n      if (typeof value !== 'undefined') {\n        self.lastQuery = null;\n        self.addItem(value);\n\n        if (self.settings.closeAfterSelect) {\n          self.close();\n        }\n\n        if (!self.settings.hideSelected && evt.type && /click/.test(evt.type)) {\n          self.setActiveOption(option);\n        }\n      }\n    }\n  }\n  /**\n   * Return true if the given option can be selected\n   *\n   */\n\n\n  canSelect(option) {\n    if (this.isOpen && option && this.dropdown_content.contains(option)) {\n      return true;\n    }\n\n    return false;\n  }\n  /**\n   * Triggered when the user clicks on an item\n   * that has been selected.\n   *\n   */\n\n\n  onItemSelect(evt, item) {\n    var self = this;\n\n    if (!self.isLocked && self.settings.mode === 'multi') {\n      preventDefault(evt);\n      self.setActiveItem(item, evt);\n      return true;\n    }\n\n    return false;\n  }\n  /**\n   * Determines whether or not to invoke\n   * the user-provided option provider / loader\n   *\n   * Note, there is a subtle difference between\n   * this.canLoad() and this.settings.shouldLoad();\n   *\n   *\t- settings.shouldLoad() is a user-input validator.\n   *\tWhen false is returned, the not_loading template\n   *\twill be added to the dropdown\n   *\n   *\t- canLoad() is lower level validator that checks\n   * \tthe Tom Select instance. There is no inherent user\n   *\tfeedback when canLoad returns false\n   *\n   */\n\n\n  canLoad(value) {\n    if (!this.settings.load) return false;\n    if (this.loadedSearches.hasOwnProperty(value)) return false;\n    return true;\n  }\n  /**\n   * Invokes the user-provided option provider / loader.\n   *\n   */\n\n\n  load(value) {\n    const self = this;\n    if (!self.canLoad(value)) return;\n    addClasses(self.wrapper, self.settings.loadingClass);\n    self.loading++;\n    const callback = self.loadCallback.bind(self);\n    self.settings.load.call(self, value, callback);\n  }\n  /**\n   * Invoked by the user-provided option provider\n   *\n   */\n\n\n  loadCallback(options, optgroups) {\n    const self = this;\n    self.loading = Math.max(self.loading - 1, 0);\n    self.lastQuery = null;\n    self.clearActiveOption(); // when new results load, focus should be on first option\n\n    self.setupOptions(options, optgroups);\n    self.refreshOptions(self.isFocused && !self.isInputHidden);\n\n    if (!self.loading) {\n      removeClasses(self.wrapper, self.settings.loadingClass);\n    }\n\n    self.trigger('load', options, optgroups);\n  }\n\n  preload() {\n    var classList = this.wrapper.classList;\n    if (classList.contains('preloaded')) return;\n    classList.add('preloaded');\n    this.load('');\n  }\n  /**\n   * Sets the input field of the control to the specified value.\n   *\n   */\n\n\n  setTextboxValue(value = '') {\n    var input = this.control_input;\n    var changed = input.value !== value;\n\n    if (changed) {\n      input.value = value;\n      triggerEvent(input, 'update');\n      this.lastValue = value;\n    }\n  }\n  /**\n   * Returns the value of the control. If multiple items\n   * can be selected (e.g. <select multiple>), this returns\n   * an array. If only one item can be selected, this\n   * returns a string.\n   *\n   */\n\n\n  getValue() {\n    if (this.is_select_tag && this.input.hasAttribute('multiple')) {\n      return this.items;\n    }\n\n    return this.items.join(this.settings.delimiter);\n  }\n  /**\n   * Resets the selected items to the given value.\n   *\n   */\n\n\n  setValue(value, silent) {\n    var events = silent ? [] : ['change'];\n    debounce_events(this, events, () => {\n      this.clear(silent);\n      this.addItems(value, silent);\n    });\n  }\n  /**\n   * Resets the number of max items to the given value\n   *\n   */\n\n\n  setMaxItems(value) {\n    if (value === 0) value = null; //reset to unlimited items.\n\n    this.settings.maxItems = value;\n    this.refreshState();\n  }\n  /**\n   * Sets the selected item.\n   *\n   */\n\n\n  setActiveItem(item, e) {\n    var self = this;\n    var eventName;\n    var i, begin, end, swap;\n    var last;\n    if (self.settings.mode === 'single') return; // clear the active selection\n\n    if (!item) {\n      self.clearActiveItems();\n\n      if (self.isFocused) {\n        self.showInput();\n      }\n\n      return;\n    } // modify selection\n\n\n    eventName = e && e.type.toLowerCase();\n\n    if (eventName === 'click' && isKeyDown('shiftKey', e) && self.activeItems.length) {\n      last = self.getLastActive();\n      begin = Array.prototype.indexOf.call(self.control.children, last);\n      end = Array.prototype.indexOf.call(self.control.children, item);\n\n      if (begin > end) {\n        swap = begin;\n        begin = end;\n        end = swap;\n      }\n\n      for (i = begin; i <= end; i++) {\n        item = self.control.children[i];\n\n        if (self.activeItems.indexOf(item) === -1) {\n          self.setActiveItemClass(item);\n        }\n      }\n\n      preventDefault(e);\n    } else if (eventName === 'click' && isKeyDown(KEY_SHORTCUT, e) || eventName === 'keydown' && isKeyDown('shiftKey', e)) {\n      if (item.classList.contains('active')) {\n        self.removeActiveItem(item);\n      } else {\n        self.setActiveItemClass(item);\n      }\n    } else {\n      self.clearActiveItems();\n      self.setActiveItemClass(item);\n    } // ensure control has focus\n\n\n    self.hideInput();\n\n    if (!self.isFocused) {\n      self.focus();\n    }\n  }\n  /**\n   * Set the active and last-active classes\n   *\n   */\n\n\n  setActiveItemClass(item) {\n    const self = this;\n    const last_active = self.control.querySelector('.last-active');\n    if (last_active) removeClasses(last_active, 'last-active');\n    addClasses(item, 'active last-active');\n    self.trigger('item_select', item);\n\n    if (self.activeItems.indexOf(item) == -1) {\n      self.activeItems.push(item);\n    }\n  }\n  /**\n   * Remove active item\n   *\n   */\n\n\n  removeActiveItem(item) {\n    var idx = this.activeItems.indexOf(item);\n    this.activeItems.splice(idx, 1);\n    removeClasses(item, 'active');\n  }\n  /**\n   * Clears all the active items\n   *\n   */\n\n\n  clearActiveItems() {\n    removeClasses(this.activeItems, 'active');\n    this.activeItems = [];\n  }\n  /**\n   * Sets the selected item in the dropdown menu\n   * of available options.\n   *\n   */\n\n\n  setActiveOption(option, scroll = true) {\n    if (option === this.activeOption) {\n      return;\n    }\n\n    this.clearActiveOption();\n    if (!option) return;\n    this.activeOption = option;\n    setAttr(this.focus_node, {\n      'aria-activedescendant': option.getAttribute('id')\n    });\n    setAttr(option, {\n      'aria-selected': 'true'\n    });\n    addClasses(option, 'active');\n    if (scroll) this.scrollToOption(option);\n  }\n  /**\n   * Sets the dropdown_content scrollTop to display the option\n   *\n   */\n\n\n  scrollToOption(option, behavior) {\n    if (!option) return;\n    const content = this.dropdown_content;\n    const height_menu = content.clientHeight;\n    const scrollTop = content.scrollTop || 0;\n    const height_item = option.offsetHeight;\n    const y = option.getBoundingClientRect().top - content.getBoundingClientRect().top + scrollTop;\n\n    if (y + height_item > height_menu + scrollTop) {\n      this.scroll(y - height_menu + height_item, behavior);\n    } else if (y < scrollTop) {\n      this.scroll(y, behavior);\n    }\n  }\n  /**\n   * Scroll the dropdown to the given position\n   *\n   */\n\n\n  scroll(scrollTop, behavior) {\n    const content = this.dropdown_content;\n\n    if (behavior) {\n      content.style.scrollBehavior = behavior;\n    }\n\n    content.scrollTop = scrollTop;\n    content.style.scrollBehavior = '';\n  }\n  /**\n   * Clears the active option\n   *\n   */\n\n\n  clearActiveOption() {\n    if (this.activeOption) {\n      removeClasses(this.activeOption, 'active');\n      setAttr(this.activeOption, {\n        'aria-selected': null\n      });\n    }\n\n    this.activeOption = null;\n    setAttr(this.focus_node, {\n      'aria-activedescendant': null\n    });\n  }\n  /**\n   * Selects all items (CTRL + A).\n   */\n\n\n  selectAll() {\n    const self = this;\n    if (self.settings.mode === 'single') return;\n    const activeItems = self.controlChildren();\n    if (!activeItems.length) return;\n    self.hideInput();\n    self.close();\n    self.activeItems = activeItems;\n    iterate$1(activeItems, item => {\n      self.setActiveItemClass(item);\n    });\n  }\n  /**\n   * Determines if the control_input should be in a hidden or visible state\n   *\n   */\n\n\n  inputState() {\n    var self = this;\n    if (!self.control.contains(self.control_input)) return;\n    setAttr(self.control_input, {\n      placeholder: self.settings.placeholder\n    });\n\n    if (self.activeItems.length > 0 || !self.isFocused && self.settings.hidePlaceholder && self.items.length > 0) {\n      self.setTextboxValue();\n      self.isInputHidden = true;\n    } else {\n      if (self.settings.hidePlaceholder && self.items.length > 0) {\n        setAttr(self.control_input, {\n          placeholder: ''\n        });\n      }\n\n      self.isInputHidden = false;\n    }\n\n    self.wrapper.classList.toggle('input-hidden', self.isInputHidden);\n  }\n  /**\n   * Hides the input element out of view, while\n   * retaining its focus.\n   * @deprecated 1.3\n   */\n\n\n  hideInput() {\n    this.inputState();\n  }\n  /**\n   * Restores input visibility.\n   * @deprecated 1.3\n   */\n\n\n  showInput() {\n    this.inputState();\n  }\n  /**\n   * Get the input value\n   */\n\n\n  inputValue() {\n    return this.control_input.value.trim();\n  }\n  /**\n   * Gives the control focus.\n   */\n\n\n  focus() {\n    var self = this;\n    if (self.isDisabled) return;\n    self.ignoreFocus = true;\n\n    if (self.control_input.offsetWidth) {\n      self.control_input.focus();\n    } else {\n      self.focus_node.focus();\n    }\n\n    setTimeout(() => {\n      self.ignoreFocus = false;\n      self.onFocus();\n    }, 0);\n  }\n  /**\n   * Forces the control out of focus.\n   *\n   */\n\n\n  blur() {\n    this.focus_node.blur();\n    this.onBlur();\n  }\n  /**\n   * Returns a function that scores an object\n   * to show how good of a match it is to the\n   * provided query.\n   *\n   * @return {function}\n   */\n\n\n  getScoreFunction(query) {\n    return this.sifter.getScoreFunction(query, this.getSearchOptions());\n  }\n  /**\n   * Returns search options for sifter (the system\n   * for scoring and sorting results).\n   *\n   * @see https://github.com/orchidjs/sifter.js\n   * @return {object}\n   */\n\n\n  getSearchOptions() {\n    var settings = this.settings;\n    var sort = settings.sortField;\n\n    if (typeof settings.sortField === 'string') {\n      sort = [{\n        field: settings.sortField\n      }];\n    }\n\n    return {\n      fields: settings.searchField,\n      conjunction: settings.searchConjunction,\n      sort: sort,\n      nesting: settings.nesting\n    };\n  }\n  /**\n   * Searches through available options and returns\n   * a sorted array of matches.\n   *\n   */\n\n\n  search(query) {\n    var result, calculateScore;\n    var self = this;\n    var options = this.getSearchOptions(); // validate user-provided result scoring function\n\n    if (self.settings.score) {\n      calculateScore = self.settings.score.call(self, query);\n\n      if (typeof calculateScore !== 'function') {\n        throw new Error('Tom Select \"score\" setting must be a function that returns a function');\n      }\n    } // perform search\n\n\n    if (query !== self.lastQuery) {\n      self.lastQuery = query;\n      result = self.sifter.search(query, Object.assign(options, {\n        score: calculateScore\n      }));\n      self.currentResults = result;\n    } else {\n      result = Object.assign({}, self.currentResults);\n    } // filter out selected items\n\n\n    if (self.settings.hideSelected) {\n      result.items = result.items.filter(item => {\n        let hashed = hash_key(item.id);\n        return !(hashed && self.items.indexOf(hashed) !== -1);\n      });\n    }\n\n    return result;\n  }\n  /**\n   * Refreshes the list of available options shown\n   * in the autocomplete dropdown menu.\n   *\n   */\n\n\n  refreshOptions(triggerDropdown = true) {\n    var i, j, k, n, optgroup, optgroups, html, has_create_option, active_group;\n    var create;\n    const groups = {};\n    const groups_order = [];\n    var self = this;\n    var query = self.inputValue();\n    const same_query = query === self.lastQuery || query == '' && self.lastQuery == null;\n    var results = self.search(query);\n    var active_option = null;\n    var show_dropdown = self.settings.shouldOpen || false;\n    var dropdown_content = self.dropdown_content;\n\n    if (same_query) {\n      active_option = self.activeOption;\n\n      if (active_option) {\n        active_group = active_option.closest('[data-group]');\n      }\n    } // build markup\n\n\n    n = results.items.length;\n\n    if (typeof self.settings.maxOptions === 'number') {\n      n = Math.min(n, self.settings.maxOptions);\n    }\n\n    if (n > 0) {\n      show_dropdown = true;\n    } // render and group available options individually\n\n\n    for (i = 0; i < n; i++) {\n      // get option dom element\n      let item = results.items[i];\n      if (!item) continue;\n      let opt_value = item.id;\n      let option = self.options[opt_value];\n      if (option === undefined) continue;\n      let opt_hash = get_hash(opt_value);\n      let option_el = self.getOption(opt_hash, true); // toggle 'selected' class\n\n      if (!self.settings.hideSelected) {\n        option_el.classList.toggle('selected', self.items.includes(opt_hash));\n      }\n\n      optgroup = option[self.settings.optgroupField] || '';\n      optgroups = Array.isArray(optgroup) ? optgroup : [optgroup];\n\n      for (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n        optgroup = optgroups[j];\n\n        if (!self.optgroups.hasOwnProperty(optgroup)) {\n          optgroup = '';\n        }\n\n        let group_fragment = groups[optgroup];\n\n        if (group_fragment === undefined) {\n          group_fragment = document.createDocumentFragment();\n          groups_order.push(optgroup);\n        } // nodes can only have one parent, so if the option is in mutple groups, we need a clone\n\n\n        if (j > 0) {\n          option_el = option_el.cloneNode(true);\n          setAttr(option_el, {\n            id: option.$id + '-clone-' + j,\n            'aria-selected': null\n          });\n          option_el.classList.add('ts-cloned');\n          removeClasses(option_el, 'active'); // make sure we keep the activeOption in the same group\n\n          if (self.activeOption && self.activeOption.dataset.value == opt_value) {\n            if (active_group && active_group.dataset.group === optgroup.toString()) {\n              active_option = option_el;\n            }\n          }\n        }\n\n        group_fragment.appendChild(option_el);\n        groups[optgroup] = group_fragment;\n      }\n    } // sort optgroups\n\n\n    if (self.settings.lockOptgroupOrder) {\n      groups_order.sort((a, b) => {\n        const grp_a = self.optgroups[a];\n        const grp_b = self.optgroups[b];\n        const a_order = grp_a && grp_a.$order || 0;\n        const b_order = grp_b && grp_b.$order || 0;\n        return a_order - b_order;\n      });\n    } // render optgroup headers & join groups\n\n\n    html = document.createDocumentFragment();\n    iterate$1(groups_order, optgroup => {\n      let group_fragment = groups[optgroup];\n      if (!group_fragment || !group_fragment.children.length) return;\n      let group_heading = self.optgroups[optgroup];\n\n      if (group_heading !== undefined) {\n        let group_options = document.createDocumentFragment();\n        let header = self.render('optgroup_header', group_heading);\n        append(group_options, header);\n        append(group_options, group_fragment);\n        let group_html = self.render('optgroup', {\n          group: group_heading,\n          options: group_options\n        });\n        append(html, group_html);\n      } else {\n        append(html, group_fragment);\n      }\n    });\n    dropdown_content.innerHTML = '';\n    append(dropdown_content, html); // highlight matching terms inline\n\n    if (self.settings.highlight) {\n      removeHighlight(dropdown_content);\n\n      if (results.query.length && results.tokens.length) {\n        iterate$1(results.tokens, tok => {\n          highlight(dropdown_content, tok.regex);\n        });\n      }\n    } // helper method for adding templates to dropdown\n\n\n    var add_template = template => {\n      let content = self.render(template, {\n        input: query\n      });\n\n      if (content) {\n        show_dropdown = true;\n        dropdown_content.insertBefore(content, dropdown_content.firstChild);\n      }\n\n      return content;\n    }; // add loading message\n\n\n    if (self.loading) {\n      add_template('loading'); // invalid query\n    } else if (!self.settings.shouldLoad.call(self, query)) {\n      add_template('not_loading'); // add no_results message\n    } else if (results.items.length === 0) {\n      add_template('no_results');\n    } // add create option\n\n\n    has_create_option = self.canCreate(query);\n\n    if (has_create_option) {\n      create = add_template('option_create');\n    } // activate\n\n\n    self.hasOptions = results.items.length > 0 || has_create_option;\n\n    if (show_dropdown) {\n      if (results.items.length > 0) {\n        if (!active_option && self.settings.mode === 'single' && self.items[0] != undefined) {\n          active_option = self.getOption(self.items[0]);\n        }\n\n        if (!dropdown_content.contains(active_option)) {\n          let active_index = 0;\n\n          if (create && !self.settings.addPrecedence) {\n            active_index = 1;\n          }\n\n          active_option = self.selectable()[active_index];\n        }\n      } else if (create) {\n        active_option = create;\n      }\n\n      if (triggerDropdown && !self.isOpen) {\n        self.open();\n        self.scrollToOption(active_option, 'auto');\n      }\n\n      self.setActiveOption(active_option);\n    } else {\n      self.clearActiveOption();\n\n      if (triggerDropdown && self.isOpen) {\n        self.close(false); // if create_option=null, we want the dropdown to close but not reset the textbox value\n      }\n    }\n  }\n  /**\n   * Return list of selectable options\n   *\n   */\n\n\n  selectable() {\n    return this.dropdown_content.querySelectorAll('[data-selectable]');\n  }\n  /**\n   * Adds an available option. If it already exists,\n   * nothing will happen. Note: this does not refresh\n   * the options list dropdown (use `refreshOptions`\n   * for that).\n   *\n   * Usage:\n   *\n   *   this.addOption(data)\n   *\n   */\n\n\n  addOption(data, user_created = false) {\n    const self = this; // @deprecated 1.7.7\n    // use addOptions( array, user_created ) for adding multiple options\n\n    if (Array.isArray(data)) {\n      self.addOptions(data, user_created);\n      return false;\n    }\n\n    const key = hash_key(data[self.settings.valueField]);\n\n    if (key === null || self.options.hasOwnProperty(key)) {\n      return false;\n    }\n\n    data.$order = data.$order || ++self.order;\n    data.$id = self.inputId + '-opt-' + data.$order;\n    self.options[key] = data;\n    self.lastQuery = null;\n\n    if (user_created) {\n      self.userOptions[key] = user_created;\n      self.trigger('option_add', key, data);\n    }\n\n    return key;\n  }\n  /**\n   * Add multiple options\n   *\n   */\n\n\n  addOptions(data, user_created = false) {\n    iterate$1(data, dat => {\n      this.addOption(dat, user_created);\n    });\n  }\n  /**\n   * @deprecated 1.7.7\n   */\n\n\n  registerOption(data) {\n    return this.addOption(data);\n  }\n  /**\n   * Registers an option group to the pool of option groups.\n   *\n   * @return {boolean|string}\n   */\n\n\n  registerOptionGroup(data) {\n    var key = hash_key(data[this.settings.optgroupValueField]);\n    if (key === null) return false;\n    data.$order = data.$order || ++this.order;\n    this.optgroups[key] = data;\n    return key;\n  }\n  /**\n   * Registers a new optgroup for options\n   * to be bucketed into.\n   *\n   */\n\n\n  addOptionGroup(id, data) {\n    var hashed_id;\n    data[this.settings.optgroupValueField] = id;\n\n    if (hashed_id = this.registerOptionGroup(data)) {\n      this.trigger('optgroup_add', hashed_id, data);\n    }\n  }\n  /**\n   * Removes an existing option group.\n   *\n   */\n\n\n  removeOptionGroup(id) {\n    if (this.optgroups.hasOwnProperty(id)) {\n      delete this.optgroups[id];\n      this.clearCache();\n      this.trigger('optgroup_remove', id);\n    }\n  }\n  /**\n   * Clears all existing option groups.\n   */\n\n\n  clearOptionGroups() {\n    this.optgroups = {};\n    this.clearCache();\n    this.trigger('optgroup_clear');\n  }\n  /**\n   * Updates an option available for selection. If\n   * it is visible in the selected items or options\n   * dropdown, it will be re-rendered automatically.\n   *\n   */\n\n\n  updateOption(value, data) {\n    const self = this;\n    var item_new;\n    var index_item;\n    const value_old = hash_key(value);\n    const value_new = hash_key(data[self.settings.valueField]); // sanity checks\n\n    if (value_old === null) return;\n    const data_old = self.options[value_old];\n    if (data_old == undefined) return;\n    if (typeof value_new !== 'string') throw new Error('Value must be set in option data');\n    const option = self.getOption(value_old);\n    const item = self.getItem(value_old);\n    data.$order = data.$order || data_old.$order;\n    delete self.options[value_old]; // invalidate render cache\n    // don't remove existing node yet, we'll remove it after replacing it\n\n    self.uncacheValue(value_new);\n    self.options[value_new] = data; // update the option if it's in the dropdown\n\n    if (option) {\n      if (self.dropdown_content.contains(option)) {\n        const option_new = self._render('option', data);\n\n        replaceNode(option, option_new);\n\n        if (self.activeOption === option) {\n          self.setActiveOption(option_new);\n        }\n      }\n\n      option.remove();\n    } // update the item if we have one\n\n\n    if (item) {\n      index_item = self.items.indexOf(value_old);\n\n      if (index_item !== -1) {\n        self.items.splice(index_item, 1, value_new);\n      }\n\n      item_new = self._render('item', data);\n      if (item.classList.contains('active')) addClasses(item_new, 'active');\n      replaceNode(item, item_new);\n    } // invalidate last query because we might have updated the sortField\n\n\n    self.lastQuery = null;\n  }\n  /**\n   * Removes a single option.\n   *\n   */\n\n\n  removeOption(value, silent) {\n    const self = this;\n    value = get_hash(value);\n    self.uncacheValue(value);\n    delete self.userOptions[value];\n    delete self.options[value];\n    self.lastQuery = null;\n    self.trigger('option_remove', value);\n    self.removeItem(value, silent);\n  }\n  /**\n   * Clears all options.\n   */\n\n\n  clearOptions(filter) {\n    const boundFilter = (filter || this.clearFilter).bind(this);\n    this.loadedSearches = {};\n    this.userOptions = {};\n    this.clearCache();\n    const selected = {};\n    iterate$1(this.options, (option, key) => {\n      if (boundFilter(option, key)) {\n        selected[key] = option;\n      }\n    });\n    this.options = this.sifter.items = selected;\n    this.lastQuery = null;\n    this.trigger('option_clear');\n  }\n  /**\n   * Used by clearOptions() to decide whether or not an option should be removed\n   * Return true to keep an option, false to remove\n   *\n   */\n\n\n  clearFilter(option, value) {\n    if (this.items.indexOf(value) >= 0) {\n      return true;\n    }\n\n    return false;\n  }\n  /**\n   * Returns the dom element of the option\n   * matching the given value.\n   *\n   */\n\n\n  getOption(value, create = false) {\n    const hashed = hash_key(value);\n    if (hashed === null) return null;\n    const option = this.options[hashed];\n\n    if (option != undefined) {\n      if (option.$div) {\n        return option.$div;\n      }\n\n      if (create) {\n        return this._render('option', option);\n      }\n    }\n\n    return null;\n  }\n  /**\n   * Returns the dom element of the next or previous dom element of the same type\n   * Note: adjacent options may not be adjacent DOM elements (optgroups)\n   *\n   */\n\n\n  getAdjacent(option, direction, type = 'option') {\n    var self = this,\n        all;\n\n    if (!option) {\n      return null;\n    }\n\n    if (type == 'item') {\n      all = self.controlChildren();\n    } else {\n      all = self.dropdown_content.querySelectorAll('[data-selectable]');\n    }\n\n    for (let i = 0; i < all.length; i++) {\n      if (all[i] != option) {\n        continue;\n      }\n\n      if (direction > 0) {\n        return all[i + 1];\n      }\n\n      return all[i - 1];\n    }\n\n    return null;\n  }\n  /**\n   * Returns the dom element of the item\n   * matching the given value.\n   *\n   */\n\n\n  getItem(item) {\n    if (typeof item == 'object') {\n      return item;\n    }\n\n    var value = hash_key(item);\n    return value !== null ? this.control.querySelector(`[data-value=\"${addSlashes(value)}\"]`) : null;\n  }\n  /**\n   * \"Selects\" multiple items at once. Adds them to the list\n   * at the current caret position.\n   *\n   */\n\n\n  addItems(values, silent) {\n    var self = this;\n    var items = Array.isArray(values) ? values : [values];\n    items = items.filter(x => self.items.indexOf(x) === -1);\n    const last_item = items[items.length - 1];\n    items.forEach(item => {\n      self.isPending = item !== last_item;\n      self.addItem(item, silent);\n    });\n  }\n  /**\n   * \"Selects\" an item. Adds it to the list\n   * at the current caret position.\n   *\n   */\n\n\n  addItem(value, silent) {\n    var events = silent ? [] : ['change', 'dropdown_close'];\n    debounce_events(this, events, () => {\n      var item, wasFull;\n      const self = this;\n      const inputMode = self.settings.mode;\n      const hashed = hash_key(value);\n\n      if (hashed && self.items.indexOf(hashed) !== -1) {\n        if (inputMode === 'single') {\n          self.close();\n        }\n\n        if (inputMode === 'single' || !self.settings.duplicates) {\n          return;\n        }\n      }\n\n      if (hashed === null || !self.options.hasOwnProperty(hashed)) return;\n      if (inputMode === 'single') self.clear(silent);\n      if (inputMode === 'multi' && self.isFull()) return;\n      item = self._render('item', self.options[hashed]);\n\n      if (self.control.contains(item)) {\n        // duplicates\n        item = item.cloneNode(true);\n      }\n\n      wasFull = self.isFull();\n      self.items.splice(self.caretPos, 0, hashed);\n      self.insertAtCaret(item);\n\n      if (self.isSetup) {\n        // update menu / remove the option (if this is not one item being added as part of series)\n        if (!self.isPending && self.settings.hideSelected) {\n          let option = self.getOption(hashed);\n          let next = self.getAdjacent(option, 1);\n\n          if (next) {\n            self.setActiveOption(next);\n          }\n        } // refreshOptions after setActiveOption(),\n        // otherwise setActiveOption() will be called by refreshOptions() with the wrong value\n\n\n        if (!self.isPending && !self.settings.closeAfterSelect) {\n          self.refreshOptions(self.isFocused && inputMode !== 'single');\n        } // hide the menu if the maximum number of items have been selected or no options are left\n\n\n        if (self.settings.closeAfterSelect != false && self.isFull()) {\n          self.close();\n        } else if (!self.isPending) {\n          self.positionDropdown();\n        }\n\n        self.trigger('item_add', hashed, item);\n\n        if (!self.isPending) {\n          self.updateOriginalInput({\n            silent: silent\n          });\n        }\n      }\n\n      if (!self.isPending || !wasFull && self.isFull()) {\n        self.inputState();\n        self.refreshState();\n      }\n    });\n  }\n  /**\n   * Removes the selected item matching\n   * the provided value.\n   *\n   */\n\n\n  removeItem(item = null, silent) {\n    const self = this;\n    item = self.getItem(item);\n    if (!item) return;\n    var i, idx;\n    const value = item.dataset.value;\n    i = nodeIndex(item);\n    item.remove();\n\n    if (item.classList.contains('active')) {\n      idx = self.activeItems.indexOf(item);\n      self.activeItems.splice(idx, 1);\n      removeClasses(item, 'active');\n    }\n\n    self.items.splice(i, 1);\n    self.lastQuery = null;\n\n    if (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n      self.removeOption(value, silent);\n    }\n\n    if (i < self.caretPos) {\n      self.setCaret(self.caretPos - 1);\n    }\n\n    self.updateOriginalInput({\n      silent: silent\n    });\n    self.refreshState();\n    self.positionDropdown();\n    self.trigger('item_remove', value, item);\n  }\n  /**\n   * Invokes the `create` method provided in the\n   * TomSelect options that should provide the data\n   * for the new item, given the user input.\n   *\n   * Once this completes, it will be added\n   * to the item list.\n   *\n   */\n\n\n  createItem(input = null, callback = () => {}) {\n    // triggerDropdown parameter @deprecated 2.1.1\n    if (arguments.length === 3) {\n      callback = arguments[2];\n    }\n\n    if (typeof callback != 'function') {\n      callback = () => {};\n    }\n\n    var self = this;\n    var caret = self.caretPos;\n    var output;\n    input = input || self.inputValue();\n\n    if (!self.canCreate(input)) {\n      callback();\n      return false;\n    }\n\n    self.lock();\n    var created = false;\n\n    var create = data => {\n      self.unlock();\n      if (!data || typeof data !== 'object') return callback();\n      var value = hash_key(data[self.settings.valueField]);\n\n      if (typeof value !== 'string') {\n        return callback();\n      }\n\n      self.setTextboxValue();\n      self.addOption(data, true);\n      self.setCaret(caret);\n      self.addItem(value);\n      callback(data);\n      created = true;\n    };\n\n    if (typeof self.settings.create === 'function') {\n      output = self.settings.create.call(this, input, create);\n    } else {\n      output = {\n        [self.settings.labelField]: input,\n        [self.settings.valueField]: input\n      };\n    }\n\n    if (!created) {\n      create(output);\n    }\n\n    return true;\n  }\n  /**\n   * Re-renders the selected item lists.\n   */\n\n\n  refreshItems() {\n    var self = this;\n    self.lastQuery = null;\n\n    if (self.isSetup) {\n      self.addItems(self.items);\n    }\n\n    self.updateOriginalInput();\n    self.refreshState();\n  }\n  /**\n   * Updates all state-dependent attributes\n   * and CSS classes.\n   */\n\n\n  refreshState() {\n    const self = this;\n    self.refreshValidityState();\n    const isFull = self.isFull();\n    const isLocked = self.isLocked;\n    self.wrapper.classList.toggle('rtl', self.rtl);\n    const wrap_classList = self.wrapper.classList;\n    wrap_classList.toggle('focus', self.isFocused);\n    wrap_classList.toggle('disabled', self.isDisabled);\n    wrap_classList.toggle('required', self.isRequired);\n    wrap_classList.toggle('invalid', !self.isValid);\n    wrap_classList.toggle('locked', isLocked);\n    wrap_classList.toggle('full', isFull);\n    wrap_classList.toggle('input-active', self.isFocused && !self.isInputHidden);\n    wrap_classList.toggle('dropdown-active', self.isOpen);\n    wrap_classList.toggle('has-options', isEmptyObject(self.options));\n    wrap_classList.toggle('has-items', self.items.length > 0);\n  }\n  /**\n   * Update the `required` attribute of both input and control input.\n   *\n   * The `required` property needs to be activated on the control input\n   * for the error to be displayed at the right place. `required` also\n   * needs to be temporarily deactivated on the input since the input is\n   * hidden and can't show errors.\n   */\n\n\n  refreshValidityState() {\n    var self = this;\n\n    if (!self.input.validity) {\n      return;\n    }\n\n    self.isValid = self.input.validity.valid;\n    self.isInvalid = !self.isValid;\n  }\n  /**\n   * Determines whether or not more items can be added\n   * to the control without exceeding the user-defined maximum.\n   *\n   * @returns {boolean}\n   */\n\n\n  isFull() {\n    return this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n  }\n  /**\n   * Refreshes the original <select> or <input>\n   * element to reflect the current state.\n   *\n   */\n\n\n  updateOriginalInput(opts = {}) {\n    const self = this;\n    var option, label;\n    const empty_option = self.input.querySelector('option[value=\"\"]');\n\n    if (self.is_select_tag) {\n      const selected = [];\n      const has_selected = self.input.querySelectorAll('option:checked').length;\n\n      function AddSelected(option_el, value, label) {\n        if (!option_el) {\n          option_el = getDom('<option value=\"' + escape_html(value) + '\">' + escape_html(label) + '</option>');\n        } // don't move empty option from top of list\n        // fixes bug in firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1725293\n\n\n        if (option_el != empty_option) {\n          self.input.append(option_el);\n        }\n\n        selected.push(option_el); // marking empty option as selected can break validation\n        // fixes https://github.com/orchidjs/tom-select/issues/303\n\n        if (option_el != empty_option || has_selected > 0) {\n          option_el.selected = true;\n        }\n\n        return option_el;\n      } // unselect all selected options\n\n\n      self.input.querySelectorAll('option:checked').forEach(option_el => {\n        option_el.selected = false;\n      }); // nothing selected?\n\n      if (self.items.length == 0 && self.settings.mode == 'single') {\n        AddSelected(empty_option, \"\", \"\"); // order selected <option> tags for values in self.items\n      } else {\n        self.items.forEach(value => {\n          option = self.options[value];\n          label = option[self.settings.labelField] || '';\n\n          if (selected.includes(option.$option)) {\n            const reuse_opt = self.input.querySelector(`option[value=\"${addSlashes(value)}\"]:not(:checked)`);\n            AddSelected(reuse_opt, value, label);\n          } else {\n            option.$option = AddSelected(option.$option, value, label);\n          }\n        });\n      }\n    } else {\n      self.input.value = self.getValue();\n    }\n\n    if (self.isSetup) {\n      if (!opts.silent) {\n        self.trigger('change', self.getValue());\n      }\n    }\n  }\n  /**\n   * Shows the autocomplete dropdown containing\n   * the available options.\n   */\n\n\n  open() {\n    var self = this;\n    if (self.isLocked || self.isOpen || self.settings.mode === 'multi' && self.isFull()) return;\n    self.isOpen = true;\n    setAttr(self.focus_node, {\n      'aria-expanded': 'true'\n    });\n    self.refreshState();\n    applyCSS(self.dropdown, {\n      visibility: 'hidden',\n      display: 'block'\n    });\n    self.positionDropdown();\n    applyCSS(self.dropdown, {\n      visibility: 'visible',\n      display: 'block'\n    });\n    self.focus();\n    self.trigger('dropdown_open', self.dropdown);\n  }\n  /**\n   * Closes the autocomplete dropdown menu.\n   */\n\n\n  close(setTextboxValue = true) {\n    var self = this;\n    var trigger = self.isOpen;\n\n    if (setTextboxValue) {\n      // before blur() to prevent form onchange event\n      self.setTextboxValue();\n\n      if (self.settings.mode === 'single' && self.items.length) {\n        self.hideInput();\n      }\n    }\n\n    self.isOpen = false;\n    setAttr(self.focus_node, {\n      'aria-expanded': 'false'\n    });\n    applyCSS(self.dropdown, {\n      display: 'none'\n    });\n\n    if (self.settings.hideSelected) {\n      self.clearActiveOption();\n    }\n\n    self.refreshState();\n    if (trigger) self.trigger('dropdown_close', self.dropdown);\n  }\n  /**\n   * Calculates and applies the appropriate\n   * position of the dropdown if dropdownParent = 'body'.\n   * Otherwise, position is determined by css\n   */\n\n\n  positionDropdown() {\n    if (this.settings.dropdownParent !== 'body') {\n      return;\n    }\n\n    var context = this.control;\n    var rect = context.getBoundingClientRect();\n    var top = context.offsetHeight + rect.top + window.scrollY;\n    var left = rect.left + window.scrollX;\n    applyCSS(this.dropdown, {\n      width: rect.width + 'px',\n      top: top + 'px',\n      left: left + 'px'\n    });\n  }\n  /**\n   * Resets / clears all selected items\n   * from the control.\n   *\n   */\n\n\n  clear(silent) {\n    var self = this;\n    if (!self.items.length) return;\n    var items = self.controlChildren();\n    iterate$1(items, item => {\n      self.removeItem(item, true);\n    });\n    self.showInput();\n    if (!silent) self.updateOriginalInput();\n    self.trigger('clear');\n  }\n  /**\n   * A helper method for inserting an element\n   * at the current caret position.\n   *\n   */\n\n\n  insertAtCaret(el) {\n    const self = this;\n    const caret = self.caretPos;\n    const target = self.control;\n    target.insertBefore(el, target.children[caret] || null);\n    self.setCaret(caret + 1);\n  }\n  /**\n   * Removes the current selected item(s).\n   *\n   */\n\n\n  deleteSelection(e) {\n    var direction, selection, caret, tail;\n    var self = this;\n    direction = e && e.keyCode === KEY_BACKSPACE ? -1 : 1;\n    selection = getSelection(self.control_input); // determine items that will be removed\n\n    const rm_items = [];\n\n    if (self.activeItems.length) {\n      tail = getTail(self.activeItems, direction);\n      caret = nodeIndex(tail);\n\n      if (direction > 0) {\n        caret++;\n      }\n\n      iterate$1(self.activeItems, item => rm_items.push(item));\n    } else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n      const items = self.controlChildren();\n      let rm_item;\n\n      if (direction < 0 && selection.start === 0 && selection.length === 0) {\n        rm_item = items[self.caretPos - 1];\n      } else if (direction > 0 && selection.start === self.inputValue().length) {\n        rm_item = items[self.caretPos];\n      }\n\n      if (rm_item !== undefined) {\n        rm_items.push(rm_item);\n      }\n    }\n\n    if (!self.shouldDelete(rm_items, e)) {\n      return false;\n    }\n\n    preventDefault(e, true); // perform removal\n\n    if (typeof caret !== 'undefined') {\n      self.setCaret(caret);\n    }\n\n    while (rm_items.length) {\n      self.removeItem(rm_items.pop());\n    }\n\n    self.showInput();\n    self.positionDropdown();\n    self.refreshOptions(false);\n    return true;\n  }\n  /**\n   * Return true if the items should be deleted\n   */\n\n\n  shouldDelete(items, evt) {\n    const values = items.map(item => item.dataset.value); // allow the callback to abort\n\n    if (!values.length || typeof this.settings.onDelete === 'function' && this.settings.onDelete(values, evt) === false) {\n      return false;\n    }\n\n    return true;\n  }\n  /**\n   * Selects the previous / next item (depending on the `direction` argument).\n   *\n   * > 0 - right\n   * < 0 - left\n   *\n   */\n\n\n  advanceSelection(direction, e) {\n    var last_active,\n        adjacent,\n        self = this;\n    if (self.rtl) direction *= -1;\n    if (self.inputValue().length) return; // add or remove to active items\n\n    if (isKeyDown(KEY_SHORTCUT, e) || isKeyDown('shiftKey', e)) {\n      last_active = self.getLastActive(direction);\n\n      if (last_active) {\n        if (!last_active.classList.contains('active')) {\n          adjacent = last_active;\n        } else {\n          adjacent = self.getAdjacent(last_active, direction, 'item');\n        } // if no active item, get items adjacent to the control input\n\n      } else if (direction > 0) {\n        adjacent = self.control_input.nextElementSibling;\n      } else {\n        adjacent = self.control_input.previousElementSibling;\n      }\n\n      if (adjacent) {\n        if (adjacent.classList.contains('active')) {\n          self.removeActiveItem(last_active);\n        }\n\n        self.setActiveItemClass(adjacent); // mark as last_active !! after removeActiveItem() on last_active\n      } // move caret to the left or right\n\n    } else {\n      self.moveCaret(direction);\n    }\n  }\n\n  moveCaret(direction) {}\n  /**\n   * Get the last active item\n   *\n   */\n\n\n  getLastActive(direction) {\n    let last_active = this.control.querySelector('.last-active');\n\n    if (last_active) {\n      return last_active;\n    }\n\n    var result = this.control.querySelectorAll('.active');\n\n    if (result) {\n      return getTail(result, direction);\n    }\n  }\n  /**\n   * Moves the caret to the specified index.\n   *\n   * The input must be moved by leaving it in place and moving the\n   * siblings, due to the fact that focus cannot be restored once lost\n   * on mobile webkit devices\n   *\n   */\n\n\n  setCaret(new_pos) {\n    this.caretPos = this.items.length;\n  }\n  /**\n   * Return list of item dom elements\n   *\n   */\n\n\n  controlChildren() {\n    return Array.from(this.control.querySelectorAll('[data-ts-item]'));\n  }\n  /**\n   * Disables user input on the control. Used while\n   * items are being asynchronously created.\n   */\n\n\n  lock() {\n    this.isLocked = true;\n    this.refreshState();\n  }\n  /**\n   * Re-enables user input on the control.\n   */\n\n\n  unlock() {\n    this.isLocked = false;\n    this.refreshState();\n  }\n  /**\n   * Disables user input on the control completely.\n   * While disabled, it cannot receive focus.\n   */\n\n\n  disable() {\n    var self = this;\n    self.input.disabled = true;\n    self.control_input.disabled = true;\n    self.focus_node.tabIndex = -1;\n    self.isDisabled = true;\n    this.close();\n    self.lock();\n  }\n  /**\n   * Enables the control so that it can respond\n   * to focus and user input.\n   */\n\n\n  enable() {\n    var self = this;\n    self.input.disabled = false;\n    self.control_input.disabled = false;\n    self.focus_node.tabIndex = self.tabIndex;\n    self.isDisabled = false;\n    self.unlock();\n  }\n  /**\n   * Completely destroys the control and\n   * unbinds all event listeners so that it can\n   * be garbage collected.\n   */\n\n\n  destroy() {\n    var self = this;\n    var revertSettings = self.revertSettings;\n    self.trigger('destroy');\n    self.off();\n    self.wrapper.remove();\n    self.dropdown.remove();\n    self.input.innerHTML = revertSettings.innerHTML;\n    self.input.tabIndex = revertSettings.tabIndex;\n    removeClasses(self.input, 'tomselected', 'ts-hidden-accessible');\n\n    self._destroy();\n\n    delete self.input.tomselect;\n  }\n  /**\n   * A helper method for rendering \"item\" and\n   * \"option\" templates, given the data.\n   *\n   */\n\n\n  render(templateName, data) {\n    var id, html;\n    const self = this;\n\n    if (typeof this.settings.render[templateName] !== 'function') {\n      return null;\n    } // render markup\n\n\n    html = self.settings.render[templateName].call(this, data, escape_html);\n\n    if (!html) {\n      return null;\n    }\n\n    html = getDom(html); // add mandatory attributes\n\n    if (templateName === 'option' || templateName === 'option_create') {\n      if (data[self.settings.disabledField]) {\n        setAttr(html, {\n          'aria-disabled': 'true'\n        });\n      } else {\n        setAttr(html, {\n          'data-selectable': ''\n        });\n      }\n    } else if (templateName === 'optgroup') {\n      id = data.group[self.settings.optgroupValueField];\n      setAttr(html, {\n        'data-group': id\n      });\n\n      if (data.group[self.settings.disabledField]) {\n        setAttr(html, {\n          'data-disabled': ''\n        });\n      }\n    }\n\n    if (templateName === 'option' || templateName === 'item') {\n      const value = get_hash(data[self.settings.valueField]);\n      setAttr(html, {\n        'data-value': value\n      }); // make sure we have some classes if a template is overwritten\n\n      if (templateName === 'item') {\n        addClasses(html, self.settings.itemClass);\n        setAttr(html, {\n          'data-ts-item': ''\n        });\n      } else {\n        addClasses(html, self.settings.optionClass);\n        setAttr(html, {\n          role: 'option',\n          id: data.$id\n        }); // update cache\n\n        data.$div = html;\n        self.options[value] = data;\n      }\n    }\n\n    return html;\n  }\n  /**\n   * Type guarded rendering\n   *\n   */\n\n\n  _render(templateName, data) {\n    const html = this.render(templateName, data);\n\n    if (html == null) {\n      throw 'HTMLElement expected';\n    }\n\n    return html;\n  }\n  /**\n   * Clears the render cache for a template. If\n   * no template is given, clears all render\n   * caches.\n   *\n   */\n\n\n  clearCache() {\n    iterate$1(this.options, option => {\n      if (option.$div) {\n        option.$div.remove();\n        delete option.$div;\n      }\n    });\n  }\n  /**\n   * Removes a value from item and option caches\n   *\n   */\n\n\n  uncacheValue(value) {\n    const option_el = this.getOption(value);\n    if (option_el) option_el.remove();\n  }\n  /**\n   * Determines whether or not to display the\n   * create item prompt, given a user input.\n   *\n   */\n\n\n  canCreate(input) {\n    return this.settings.create && input.length > 0 && this.settings.createFilter.call(this, input);\n  }\n  /**\n   * Wraps this.`method` so that `new_fn` can be invoked 'before', 'after', or 'instead' of the original method\n   *\n   * this.hook('instead','onKeyDown',function( arg1, arg2 ...){\n   *\n   * });\n   */\n\n\n  hook(when, method, new_fn) {\n    var self = this;\n    var orig_method = self[method];\n\n    self[method] = function () {\n      var result, result_new;\n\n      if (when === 'after') {\n        result = orig_method.apply(self, arguments);\n      }\n\n      result_new = new_fn.apply(self, arguments);\n\n      if (when === 'instead') {\n        return result_new;\n      }\n\n      if (when === 'before') {\n        result = orig_method.apply(self, arguments);\n      }\n\n      return result;\n    };\n  }\n\n}\n\n/**\n * Plugin: \"change_listener\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction change_listener () {\n  addEvent(this.input, 'change', () => {\n    this.sync();\n  });\n}\n\n/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction checkbox_options () {\n  var self = this;\n  var orig_onOptionSelect = self.onOptionSelect;\n  self.settings.hideSelected = false; // update the checkbox for an option\n\n  var UpdateCheckbox = function UpdateCheckbox(option) {\n    setTimeout(() => {\n      var checkbox = option.querySelector('input');\n\n      if (checkbox instanceof HTMLInputElement) {\n        if (option.classList.contains('selected')) {\n          checkbox.checked = true;\n        } else {\n          checkbox.checked = false;\n        }\n      }\n    }, 1);\n  }; // add checkbox to option template\n\n\n  self.hook('after', 'setupTemplates', () => {\n    var orig_render_option = self.settings.render.option;\n\n    self.settings.render.option = (data, escape_html) => {\n      var rendered = getDom(orig_render_option.call(self, data, escape_html));\n      var checkbox = document.createElement('input');\n      checkbox.addEventListener('click', function (evt) {\n        preventDefault(evt);\n      });\n      checkbox.type = 'checkbox';\n      const hashed = hash_key(data[self.settings.valueField]);\n\n      if (hashed && self.items.indexOf(hashed) > -1) {\n        checkbox.checked = true;\n      }\n\n      rendered.prepend(checkbox);\n      return rendered;\n    };\n  }); // uncheck when item removed\n\n  self.on('item_remove', value => {\n    var option = self.getOption(value);\n\n    if (option) {\n      // if dropdown hasn't been opened yet, the option won't exist\n      option.classList.remove('selected'); // selected class won't be removed yet\n\n      UpdateCheckbox(option);\n    }\n  }); // check when item added\n\n  self.on('item_add', value => {\n    var option = self.getOption(value);\n\n    if (option) {\n      // if dropdown hasn't been opened yet, the option won't exist\n      UpdateCheckbox(option);\n    }\n  }); // remove items when selected option is clicked\n\n  self.hook('instead', 'onOptionSelect', (evt, option) => {\n    if (option.classList.contains('selected')) {\n      option.classList.remove('selected');\n      self.removeItem(option.dataset.value);\n      self.refreshOptions();\n      preventDefault(evt, true);\n      return;\n    }\n\n    orig_onOptionSelect.call(self, evt, option);\n    UpdateCheckbox(option);\n  });\n}\n\n/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction clear_button (userOptions) {\n  const self = this;\n  const options = Object.assign({\n    className: 'clear-button',\n    title: 'Clear All',\n    html: data => {\n      return `<div class=\"${data.className}\" title=\"${data.title}\">&#10799;</div>`;\n    }\n  }, userOptions);\n  self.on('initialize', () => {\n    var button = getDom(options.html(options));\n    button.addEventListener('click', evt => {\n      if (self.isDisabled) {\n        return;\n      }\n\n      self.clear();\n\n      if (self.settings.mode === 'single' && self.settings.allowEmptyOption) {\n        self.addItem('');\n      }\n\n      evt.preventDefault();\n      evt.stopPropagation();\n    });\n    self.control.appendChild(button);\n  });\n}\n\n/**\n * Plugin: \"drag_drop\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction drag_drop () {\n  var self = this;\n  if (!$.fn.sortable) throw new Error('The \"drag_drop\" plugin requires jQuery UI \"sortable\".');\n  if (self.settings.mode !== 'multi') return;\n  var orig_lock = self.lock;\n  var orig_unlock = self.unlock;\n  self.hook('instead', 'lock', () => {\n    var sortable = $(self.control).data('sortable');\n    if (sortable) sortable.disable();\n    return orig_lock.call(self);\n  });\n  self.hook('instead', 'unlock', () => {\n    var sortable = $(self.control).data('sortable');\n    if (sortable) sortable.enable();\n    return orig_unlock.call(self);\n  });\n  self.on('initialize', () => {\n    var $control = $(self.control).sortable({\n      items: '[data-value]',\n      forcePlaceholderSize: true,\n      disabled: self.isLocked,\n      start: (e, ui) => {\n        ui.placeholder.css('width', ui.helper.css('width'));\n        $control.css({\n          overflow: 'visible'\n        });\n      },\n      stop: () => {\n        $control.css({\n          overflow: 'hidden'\n        });\n        var values = [];\n        $control.children('[data-value]').each(function () {\n          if (this.dataset.value) values.push(this.dataset.value);\n        });\n        self.setValue(values);\n      }\n    });\n  });\n}\n\n/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction dropdown_header (userOptions) {\n  const self = this;\n  const options = Object.assign({\n    title: 'Untitled',\n    headerClass: 'dropdown-header',\n    titleRowClass: 'dropdown-header-title',\n    labelClass: 'dropdown-header-label',\n    closeClass: 'dropdown-header-close',\n    html: data => {\n      return '<div class=\"' + data.headerClass + '\">' + '<div class=\"' + data.titleRowClass + '\">' + '<span class=\"' + data.labelClass + '\">' + data.title + '</span>' + '<a class=\"' + data.closeClass + '\">&times;</a>' + '</div>' + '</div>';\n    }\n  }, userOptions);\n  self.on('initialize', () => {\n    var header = getDom(options.html(options));\n    var close_link = header.querySelector('.' + options.closeClass);\n\n    if (close_link) {\n      close_link.addEventListener('click', evt => {\n        preventDefault(evt, true);\n        self.close();\n      });\n    }\n\n    self.dropdown.insertBefore(header, self.dropdown.firstChild);\n  });\n}\n\n/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction caret_position () {\n  var self = this;\n  /**\n   * Moves the caret to the specified index.\n   *\n   * The input must be moved by leaving it in place and moving the\n   * siblings, due to the fact that focus cannot be restored once lost\n   * on mobile webkit devices\n   *\n   */\n\n  self.hook('instead', 'setCaret', new_pos => {\n    if (self.settings.mode === 'single' || !self.control.contains(self.control_input)) {\n      new_pos = self.items.length;\n    } else {\n      new_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n      if (new_pos != self.caretPos && !self.isPending) {\n        self.controlChildren().forEach((child, j) => {\n          if (j < new_pos) {\n            self.control_input.insertAdjacentElement('beforebegin', child);\n          } else {\n            self.control.appendChild(child);\n          }\n        });\n      }\n    }\n\n    self.caretPos = new_pos;\n  });\n  self.hook('instead', 'moveCaret', direction => {\n    if (!self.isFocused) return; // move caret before or after selected items\n\n    const last_active = self.getLastActive(direction);\n\n    if (last_active) {\n      const idx = nodeIndex(last_active);\n      self.setCaret(direction > 0 ? idx + 1 : idx);\n      self.setActiveItem();\n      removeClasses(last_active, 'last-active'); // move caret left or right of current position\n    } else {\n      self.setCaret(self.caretPos + direction);\n    }\n  });\n}\n\n/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction dropdown_input () {\n  const self = this;\n  self.settings.shouldOpen = true; // make sure the input is shown even if there are no options to display in the dropdown\n\n  self.hook('before', 'setup', () => {\n    self.focus_node = self.control;\n    addClasses(self.control_input, 'dropdown-input');\n    const div = getDom('<div class=\"dropdown-input-wrap\">');\n    div.append(self.control_input);\n    self.dropdown.insertBefore(div, self.dropdown.firstChild); // set a placeholder in the select control\n\n    const placeholder = getDom('<input class=\"items-placeholder\" tabindex=\"-1\" />');\n    placeholder.placeholder = self.settings.placeholder || '';\n    self.control.append(placeholder);\n  });\n  self.on('initialize', () => {\n    // set tabIndex on control to -1, otherwise [shift+tab] will put focus right back on control_input\n    self.control_input.addEventListener('keydown', evt => {\n      //addEvent(self.control_input,'keydown' as const,(evt:KeyboardEvent) =>{\n      switch (evt.keyCode) {\n        case KEY_ESC:\n          if (self.isOpen) {\n            preventDefault(evt, true);\n            self.close();\n          }\n\n          self.clearActiveItems();\n          return;\n\n        case KEY_TAB:\n          self.focus_node.tabIndex = -1;\n          break;\n      }\n\n      return self.onKeyDown.call(self, evt);\n    });\n    self.on('blur', () => {\n      self.focus_node.tabIndex = self.isDisabled ? -1 : self.tabIndex;\n    }); // give the control_input focus when the dropdown is open\n\n    self.on('dropdown_open', () => {\n      self.control_input.focus();\n    }); // prevent onBlur from closing when focus is on the control_input\n\n    const orig_onBlur = self.onBlur;\n    self.hook('instead', 'onBlur', evt => {\n      if (evt && evt.relatedTarget == self.control_input) return;\n      return orig_onBlur.call(self);\n    });\n    addEvent(self.control_input, 'blur', () => self.onBlur()); // return focus to control to allow further keyboard input\n\n    self.hook('before', 'close', () => {\n      if (!self.isOpen) return;\n      self.focus_node.focus({\n        preventScroll: true\n      });\n    });\n  });\n}\n\n/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction input_autogrow () {\n  var self = this;\n  self.on('initialize', () => {\n    var test_input = document.createElement('span');\n    var control = self.control_input;\n    test_input.style.cssText = 'position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ';\n    self.wrapper.appendChild(test_input);\n    var transfer_styles = ['letterSpacing', 'fontSize', 'fontFamily', 'fontWeight', 'textTransform'];\n\n    for (const style_name of transfer_styles) {\n      // @ts-ignore TS7015 https://stackoverflow.com/a/50506154/697576\n      test_input.style[style_name] = control.style[style_name];\n    }\n    /**\n     * Set the control width\n     *\n     */\n\n\n    var resize = () => {\n      test_input.textContent = control.value;\n      control.style.width = test_input.clientWidth + 'px';\n    };\n\n    resize();\n    self.on('update item_add item_remove', resize);\n    addEvent(control, 'input', resize);\n    addEvent(control, 'keyup', resize);\n    addEvent(control, 'blur', resize);\n    addEvent(control, 'update', resize);\n  });\n}\n\n/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction no_backspace_delete () {\n  var self = this;\n  var orig_deleteSelection = self.deleteSelection;\n  this.hook('instead', 'deleteSelection', evt => {\n    if (self.activeItems.length) {\n      return orig_deleteSelection.call(self, evt);\n    }\n\n    return false;\n  });\n}\n\n/**\n * Plugin: \"no_active_items\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction no_active_items () {\n  this.hook('instead', 'setActiveItem', () => {});\n  this.hook('instead', 'selectAll', () => {});\n}\n\n/**\n * Plugin: \"optgroup_columns\" (Tom Select.js)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction optgroup_columns () {\n  var self = this;\n  var orig_keydown = self.onKeyDown;\n  self.hook('instead', 'onKeyDown', evt => {\n    var index, option, options, optgroup;\n\n    if (!self.isOpen || !(evt.keyCode === KEY_LEFT || evt.keyCode === KEY_RIGHT)) {\n      return orig_keydown.call(self, evt);\n    }\n\n    self.ignoreHover = true;\n    optgroup = parentMatch(self.activeOption, '[data-group]');\n    index = nodeIndex(self.activeOption, '[data-selectable]');\n\n    if (!optgroup) {\n      return;\n    }\n\n    if (evt.keyCode === KEY_LEFT) {\n      optgroup = optgroup.previousSibling;\n    } else {\n      optgroup = optgroup.nextSibling;\n    }\n\n    if (!optgroup) {\n      return;\n    }\n\n    options = optgroup.querySelectorAll('[data-selectable]');\n    option = options[Math.min(options.length - 1, index)];\n\n    if (option) {\n      self.setActiveOption(option);\n    }\n  });\n}\n\n/**\n * Plugin: \"remove_button\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction remove_button (userOptions) {\n  const options = Object.assign({\n    label: '&times;',\n    title: 'Remove',\n    className: 'remove',\n    append: true\n  }, userOptions); //options.className = 'remove-single';\n\n  var self = this; // override the render method to add remove button to each item\n\n  if (!options.append) {\n    return;\n  }\n\n  var html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n  self.hook('after', 'setupTemplates', () => {\n    var orig_render_item = self.settings.render.item;\n\n    self.settings.render.item = (data, escape) => {\n      var item = getDom(orig_render_item.call(self, data, escape));\n      var close_button = getDom(html);\n      item.appendChild(close_button);\n      addEvent(close_button, 'mousedown', evt => {\n        preventDefault(evt, true);\n      });\n      addEvent(close_button, 'click', evt => {\n        // propagating will trigger the dropdown to show for single mode\n        preventDefault(evt, true);\n        if (self.isLocked) return;\n        if (!self.shouldDelete([item], evt)) return;\n        self.removeItem(item);\n        self.refreshOptions(false);\n        self.inputState();\n      });\n      return item;\n    };\n  });\n}\n\n/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction restore_on_backspace (userOptions) {\n  const self = this;\n  const options = Object.assign({\n    text: option => {\n      return option[self.settings.labelField];\n    }\n  }, userOptions);\n  self.on('item_remove', function (value) {\n    if (!self.isFocused) {\n      return;\n    }\n\n    if (self.control_input.value.trim() === '') {\n      var option = self.options[value];\n\n      if (option) {\n        self.setTextboxValue(options.text.call(self, option));\n      }\n    }\n  });\n}\n\n/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\nfunction virtual_scroll () {\n  const self = this;\n  const orig_canLoad = self.canLoad;\n  const orig_clearActiveOption = self.clearActiveOption;\n  const orig_loadCallback = self.loadCallback;\n  var pagination = {};\n  var dropdown_content;\n  var loading_more = false;\n  var load_more_opt;\n  var default_values = [];\n\n  if (!self.settings.shouldLoadMore) {\n    // return true if additional results should be loaded\n    self.settings.shouldLoadMore = () => {\n      const scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);\n\n      if (scroll_percent > 0.9) {\n        return true;\n      }\n\n      if (self.activeOption) {\n        var selectable = self.selectable();\n        var index = Array.from(selectable).indexOf(self.activeOption);\n\n        if (index >= selectable.length - 2) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n  }\n\n  if (!self.settings.firstUrl) {\n    throw 'virtual_scroll plugin requires a firstUrl() method';\n  } // in order for virtual scrolling to work,\n  // options need to be ordered the same way they're returned from the remote data source\n\n\n  self.settings.sortField = [{\n    field: '$order'\n  }, {\n    field: '$score'\n  }]; // can we load more results for given query?\n\n  const canLoadMore = query => {\n    if (typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions) {\n      return false;\n    }\n\n    if (query in pagination && pagination[query]) {\n      return true;\n    }\n\n    return false;\n  };\n\n  const clearFilter = (option, value) => {\n    if (self.items.indexOf(value) >= 0 || default_values.indexOf(value) >= 0) {\n      return true;\n    }\n\n    return false;\n  }; // set the next url that will be\n\n\n  self.setNextUrl = (value, next_url) => {\n    pagination[value] = next_url;\n  }; // getUrl() to be used in settings.load()\n\n\n  self.getUrl = query => {\n    if (query in pagination) {\n      const next_url = pagination[query];\n      pagination[query] = false;\n      return next_url;\n    } // if the user goes back to a previous query\n    // we need to load the first page again\n\n\n    pagination = {};\n    return self.settings.firstUrl.call(self, query);\n  }; // don't clear the active option (and cause unwanted dropdown scroll)\n  // while loading more results\n\n\n  self.hook('instead', 'clearActiveOption', () => {\n    if (loading_more) {\n      return;\n    }\n\n    return orig_clearActiveOption.call(self);\n  }); // override the canLoad method\n\n  self.hook('instead', 'canLoad', query => {\n    // first time the query has been seen\n    if (!(query in pagination)) {\n      return orig_canLoad.call(self, query);\n    }\n\n    return canLoadMore(query);\n  }); // wrap the load\n\n  self.hook('instead', 'loadCallback', (options, optgroups) => {\n    if (!loading_more) {\n      self.clearOptions(clearFilter);\n    } else if (load_more_opt) {\n      const first_option = options[0];\n\n      if (first_option !== undefined) {\n        load_more_opt.dataset.value = first_option[self.settings.valueField];\n      }\n    }\n\n    orig_loadCallback.call(self, options, optgroups);\n    loading_more = false;\n  }); // add templates to dropdown\n  //\tloading_more if we have another url in the queue\n  //\tno_more_results if we don't have another url in the queue\n\n  self.hook('after', 'refreshOptions', () => {\n    const query = self.lastValue;\n    var option;\n\n    if (canLoadMore(query)) {\n      option = self.render('loading_more', {\n        query: query\n      });\n\n      if (option) {\n        option.setAttribute('data-selectable', ''); // so that navigating dropdown with [down] keypresses can navigate to this node\n\n        load_more_opt = option;\n      }\n    } else if (query in pagination && !dropdown_content.querySelector('.no-results')) {\n      option = self.render('no_more_results', {\n        query: query\n      });\n    }\n\n    if (option) {\n      addClasses(option, self.settings.optionClass);\n      dropdown_content.append(option);\n    }\n  }); // add scroll listener and default templates\n\n  self.on('initialize', () => {\n    default_values = Object.keys(self.options);\n    dropdown_content = self.dropdown_content; // default templates\n\n    self.settings.render = Object.assign({}, {\n      loading_more: () => {\n        return `<div class=\"loading-more-results\">Loading more results ... </div>`;\n      },\n      no_more_results: () => {\n        return `<div class=\"no-more-results\">No more results</div>`;\n      }\n    }, self.settings.render); // watch dropdown content scroll position\n\n    dropdown_content.addEventListener('scroll', () => {\n      if (!self.settings.shouldLoadMore.call(self)) {\n        return;\n      } // !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true\n\n\n      if (!canLoadMore(self.lastValue)) {\n        return;\n      } // don't call load() too much\n\n\n      if (loading_more) return;\n      loading_more = true;\n      self.load.call(self, self.lastValue);\n    });\n  });\n}\n\nTomSelect.define('change_listener', change_listener);\nTomSelect.define('checkbox_options', checkbox_options);\nTomSelect.define('clear_button', clear_button);\nTomSelect.define('drag_drop', drag_drop);\nTomSelect.define('dropdown_header', dropdown_header);\nTomSelect.define('caret_position', caret_position);\nTomSelect.define('dropdown_input', dropdown_input);\nTomSelect.define('input_autogrow', input_autogrow);\nTomSelect.define('no_backspace_delete', no_backspace_delete);\nTomSelect.define('no_active_items', no_active_items);\nTomSelect.define('optgroup_columns', optgroup_columns);\nTomSelect.define('remove_button', remove_button);\nTomSelect.define('restore_on_backspace', restore_on_backspace);\nTomSelect.define('virtual_scroll', virtual_scroll);\n\nexport { TomSelect as default };\n//# sourceMappingURL=tom-select.complete.js.map\n"],"names":["forEvents","events","callback","event","MicroEvent","fct","event_array","n","args","self","MicroPlugin","Interface","name","fn","plugins","key","queue","plugin","arrayToPattern","chars","maxValueLength","sequencePattern","array","hasDuplicates","pattern","prev_char_count","prev_pattern","char","i","setToPattern","toArray","escape_regex","str","longest","value","unicodeLength","p","allSubstrings","input","result","start","subresult","tmp","code_points","accent_pat","unicode_map","multi_char_reg","max_char_length","latin_convert","latin_condensed","latin","unicode","convert_pat","initialize","_code_points","generateMap","normalize","form","asciifold","_asciifold","generator","code_point_min","code_point_max","composed","folded","generateSets","unicode_sets","addMatching","to_add","folded_set","patt","multi_char","set","a","b","multi_char_patt","mapSequence","strings","min_replacement","chars_replaced","substringsToPattern","sub_pat","sequencesToPattern","sequences","all","sequence","seq","len","j","inSequences","needle_seq","needle_parts","filter","part","needle_part","Sequence","position","last_piece","clone","parts","last_part","last_substr","clone_last_len","getPattern","match","match_str","overlapping","added_types","new_seq","old_seq","getAttr","obj","getAttrNesting","names","scoreValue","token","weight","score","pos","propToArray","iterate$1","object","cmp","Sifter","items","settings","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","regex","options","search","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","implicit_score","sort_flds","sort","get_field","s","fld","sort_fld","optsUser","fn_score","item","id","_","fn_sort","iterate","getDom","isHtmlString","tpl","arg","escapeQuery","triggerEvent","dom_el","event_name","applyCSS","css","addClasses","elmts","classes","norm_classes","classesArray","castAsArray","el","cls","removeClasses","_classes","parentMatch","target","selector","wrapper","getTail","list","direction","isEmptyObject","nodeIndex","amongst","setAttr","attrs","val","attr","replaceNode","existing","replacement","highlight","element","highlightText","node","spannode","middlebit","middleclone","highlightChildren","highlightRecursive","removeHighlight","elements","parent","KEY_A","KEY_RETURN","KEY_ESC","KEY_LEFT","KEY_UP","KEY_RIGHT","KEY_DOWN","KEY_BACKSPACE","KEY_DELETE","KEY_TAB","IS_MAC","KEY_SHORTCUT","defaults","hash_key","get_hash","escape_html","loadDebounce","delay","timeout","debounce_events","types","type","trigger","event_args","getSelection","preventDefault","evt","stop","addEvent","isKeyDown","key_name","count","getId","existing_id","addSlashes","append","getSettings","settings_user","attr_data","field_label","field_value","field_disabled","field_optgroup","field_optgroup_label","field_optgroup_value","tag_name","placeholder","option","settings_element","init_select","tagName","optionsMap","group_count","readData","json","addOption","group","arr","option_data","addGroup","optgroup","optgroup_data","child","init_textbox","data_raw","opt","values","instance_i","TomSelect","input_arg","user_settings","dir","computedStyle","control","dropdown","dropdown_content","inputMode","control_input","focus_node","passive_event","listboxId","control_id","label","label_click","label_id","classes_plugins","e","target_match","doc_mousedown","win_scroll","optgroups","templates","escape","callbacks","get_settings","pastedText","splitInput","piece","character","next","prev","wasFocused","deactivate","classList","changed","silent","eventName","begin","end","swap","last","last_active","idx","scroll","behavior","content","height_menu","scrollTop","height_item","y","activeItems","calculateScore","hashed","triggerDropdown","k","html","has_create_option","active_group","create","groups","groups_order","same_query","results","active_option","show_dropdown","opt_value","opt_hash","option_el","group_fragment","grp_a","grp_b","a_order","b_order","group_heading","group_options","header","group_html","tok","add_template","template","active_index","user_created","dat","hashed_id","item_new","index_item","value_old","value_new","data_old","option_new","boundFilter","selected","x","last_item","wasFull","caret","output","created","isFull","isLocked","wrap_classList","opts","empty_option","AddSelected","has_selected","reuse_opt","setTextboxValue","context","rect","top","left","selection","tail","rm_items","rm_item","adjacent","new_pos","revertSettings","templateName","when","method","new_fn","orig_method","result_new","change_listener","checkbox_options","orig_onOptionSelect","UpdateCheckbox","checkbox","orig_render_option","rendered","clear_button","userOptions","button","drag_drop","orig_lock","orig_unlock","sortable","$control","ui","dropdown_header","close_link","caret_position","dropdown_input","div","orig_onBlur","input_autogrow","test_input","transfer_styles","style_name","resize","no_backspace_delete","orig_deleteSelection","no_active_items","optgroup_columns","orig_keydown","index","remove_button","orig_render_item","close_button","restore_on_backspace","virtual_scroll","orig_canLoad","orig_clearActiveOption","orig_loadCallback","pagination","loading_more","load_more_opt","default_values","selectable","canLoadMore","clearFilter","next_url","first_option"],"mappings":"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","x_google_ignoreList":[0]}