tom-select-rails 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tom-select-rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.js +168 -84
  4. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.js.map +1 -1
  5. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.js +132 -59
  6. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.js.map +1 -1
  7. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.js +140 -65
  8. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.js.map +1 -1
  9. data/vendor/assets/javascripts/tom-select-rails/cjs/utils.js +1 -1
  10. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js +3 -3
  11. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js.map +1 -1
  12. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/change_listener/plugin.js +1 -1
  13. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js +9 -7
  14. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js.map +1 -1
  15. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.js +3 -3
  16. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.js.map +1 -1
  17. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/drag_drop/plugin.js +1 -1
  18. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js +3 -3
  19. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js.map +1 -1
  20. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.js +6 -4
  21. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.js.map +1 -1
  22. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.js +3 -7
  23. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.js.map +1 -1
  24. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_active_items/plugin.js +1 -1
  25. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_backspace_delete/plugin.js +1 -1
  26. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js +4 -3
  27. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js.map +1 -1
  28. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.js +8 -8
  29. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.js.map +1 -1
  30. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/restore_on_backspace/plugin.js +1 -1
  31. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js +22 -12
  32. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js.map +1 -1
  33. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.js +168 -84
  34. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.js.map +1 -1
  35. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.js +132 -59
  36. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.js.map +1 -1
  37. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.js +140 -65
  38. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.js.map +1 -1
  39. data/vendor/assets/javascripts/tom-select-rails/esm/utils.js +1 -1
  40. data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js +3 -3
  41. data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js.map +1 -1
  42. data/vendor/assets/javascripts/tom-select-rails/js/plugins/change_listener.js +1 -1
  43. data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js +9 -7
  44. data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js.map +1 -1
  45. data/vendor/assets/javascripts/tom-select-rails/js/plugins/clear_button.js +3 -3
  46. data/vendor/assets/javascripts/tom-select-rails/js/plugins/clear_button.js.map +1 -1
  47. data/vendor/assets/javascripts/tom-select-rails/js/plugins/drag_drop.js +1 -1
  48. data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js +3 -3
  49. data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js.map +1 -1
  50. data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_input.js +6 -4
  51. data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_input.js.map +1 -1
  52. data/vendor/assets/javascripts/tom-select-rails/js/plugins/input_autogrow.js +3 -7
  53. data/vendor/assets/javascripts/tom-select-rails/js/plugins/input_autogrow.js.map +1 -1
  54. data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_active_items.js +1 -1
  55. data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_backspace_delete.js +1 -1
  56. data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js +4 -3
  57. data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js.map +1 -1
  58. data/vendor/assets/javascripts/tom-select-rails/js/plugins/remove_button.js +8 -8
  59. data/vendor/assets/javascripts/tom-select-rails/js/plugins/remove_button.js.map +1 -1
  60. data/vendor/assets/javascripts/tom-select-rails/js/plugins/restore_on_backspace.js +1 -1
  61. data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js +22 -12
  62. data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js.map +1 -1
  63. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.js +132 -59
  64. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.js.map +1 -1
  65. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.min.js +142 -142
  66. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.min.js.map +1 -1
  67. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.js +168 -84
  68. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.js.map +1 -1
  69. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.min.js +157 -156
  70. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.min.js.map +1 -1
  71. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.js +140 -65
  72. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.js.map +1 -1
  73. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js +142 -143
  74. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js.map +1 -1
  75. data/vendor/assets/javascripts/tom-select-rails/types/tom-select.d.ts +20 -3
  76. data/vendor/assets/javascripts/tom-select-rails/types/types/core.d.ts +2 -1
  77. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css +3 -7
  78. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css.map +1 -1
  79. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.min.css +1 -1
  80. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.min.css.map +1 -1
  81. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.css +3 -7
  82. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.css.map +1 -1
  83. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.min.css +1 -1
  84. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.min.css.map +1 -1
  85. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.css +7 -11
  86. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.css.map +1 -1
  87. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.css +3 -7
  88. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.css.map +1 -1
  89. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.min.css +1 -1
  90. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.min.css.map +1 -1
  91. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.min.css +1 -1
  92. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.min.css.map +1 -1
  93. data/vendor/assets/stylesheets/tom-select-rails/scss/_dropdown.scss +0 -2
  94. data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.scss +4 -4
  95. metadata +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"tom-select.complete.min.js","sources":["../../src/contrib/microevent.ts","../../node_modules/@orchidjs/sifter/lib/diacritics.ts","../../node_modules/@orchidjs/sifter/lib/utils.ts","../../node_modules/@orchidjs/sifter/lib/sifter.ts","../../src/vanilla.ts","../../src/contrib/highlight.ts","../../src/constants.ts","../../src/defaults.ts","../../src/utils.ts","../../src/getSettings.ts","../../src/tom-select.ts","../../src/contrib/microplugin.ts","../../src/tom-select.complete.ts","../../src/plugins/change_listener/plugin.ts","../../src/plugins/checkbox_options/plugin.ts","../../src/plugins/clear_button/plugin.ts","../../src/plugins/drag_drop/plugin.ts","../../src/plugins/dropdown_header/plugin.ts","../../src/plugins/caret_position/plugin.ts","../../src/plugins/dropdown_input/plugin.ts","../../src/plugins/input_autogrow/plugin.ts","../../src/plugins/no_backspace_delete/plugin.ts","../../src/plugins/no_active_items/plugin.ts","../../src/plugins/optgroup_columns/plugin.ts","../../src/plugins/remove_button/plugin.ts","../../src/plugins/restore_on_backspace/plugin.ts","../../src/plugins/virtual_scroll/plugin.ts"],"sourcesContent":["/**\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\ntype TCallback = (...args:any) => any;\n\n/**\n * Execute callback for each event in space separated list of event names\n *\n */\nfunction forEvents(events:string,callback:(event:string)=>any){\n\tevents.split(/\\s+/).forEach((event) =>{\n\t\tcallback(event);\n\t});\n}\n\nexport default class MicroEvent{\n\n\tpublic _events: {[key:string]:TCallback[]};\n\n\tconstructor(){\n\t\tthis._events = {};\n\t}\n\n\ton(events:string, fct:TCallback){\n\t\tforEvents(events,(event) => {\n\t\t\tthis._events[event] = this._events[event] || [];\n\t\t\tthis._events[event].push(fct);\n\t\t});\n\t}\n\n\toff(events:string, fct:TCallback){\n\t\tvar n = arguments.length;\n\t\tif( n === 0 ){\n\t\t\tthis._events = {};\n\t\t\treturn;\n\t\t}\n\n\t\tforEvents(events,(event) => {\n\n\t\t\tif (n === 1) return delete this._events[event];\n\n\t\t\tif (event in this._events === false) return;\n\t\t\tthis._events[event].splice(this._events[event].indexOf(fct), 1);\n\t\t});\n\t}\n\n\ttrigger(events:string, ...args:any){\n\t\tvar self = this;\n\n\t\tforEvents(events,(event) => {\n\t\t\tif(event in self._events === false) return;\n\t\t\tfor( let fct of self._events[event] ){\n\t\t\t\tfct.apply(self, args );\n\t\t\t}\n\t\t});\n\t}\n};\n","\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'g');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'g');\n\n\nexport const DIACRITICS:TDiacraticList = {\n\t\" \":\" \",\n\t0:\"߀\",\n\tA:\"ⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ\",\n\tAA:\"Ꜳ\",\n\tAE:\"ÆǼǢ\",\n\tAO:\"Ꜵ\",\n\tAU:\"Ꜷ\",\n\tAV:\"ꜸꜺ\",\n\tAY:\"Ꜽ\",\n\tB:\"ⒷBḂḄḆɃƁ\",\n\tC:\"ⒸCꜾḈĆCĈĊČÇƇȻ\",\n\tD:\"ⒹDḊĎḌḐḒḎĐƊƉᴅꝹ\",\n\tDh:\"Ð\",\n\tDZ:\"DZDŽ\",\n\tDz:\"DzDž\",\n\tE:\"ɛⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎᴇ\",\n\tF:\"ꝼⒻFḞƑꝻ\",\n\tG:\"ⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾɢ\",\n\tH:\"ⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ\",\n\tI:\"ⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ\",\n\tJ:\"ⒿJĴɈȷ\",\n\tK:\"ⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ\",\n\tL:\"ⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ\",\n\tLJ:\"LJ\",\n\tLj:\"Lj\",\n\tM:\"ⓂMḾṀṂⱮƜϻ\",\n\tN:\"ꞤȠⓃNǸŃÑṄŇṆŅṊṈƝꞐᴎ\",\n\tNJ:\"NJ\",\n\tNj:\"Nj\",\n\tO:\"ⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ\",\n\tOE:\"Œ\",\n\tOI:\"Ƣ\",\n\tOO:\"Ꝏ\",\n\tOU:\"Ȣ\",\n\tP:\"ⓅPṔṖƤⱣꝐꝒꝔ\",\n\tQ:\"ⓆQꝖꝘɊ\",\n\tR:\"ⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ\",\n\tS:\"ⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ\",\n\tT:\"ⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ\",\n\tTh:\"Þ\",\n\tTZ:\"Ꜩ\",\n\tU:\"ⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ\",\n\tV:\"ⓋVṼṾƲꝞɅ\",\n\tVY:\"Ꝡ\",\n\tW:\"ⓌWẀẂŴẆẄẈⱲ\",\n\tX:\"ⓍXẊẌ\",\n\tY:\"ⓎYỲÝŶỸȲẎŸỶỴƳɎỾ\",\n\tZ:\"ⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ\",\n\ta:\"ⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑ\",\n\taa:\"ꜳ\",\n\tae:\"æǽǣ\",\n\tao:\"ꜵ\",\n\tau:\"ꜷ\",\n\tav:\"ꜹꜻ\",\n\tay:\"ꜽ\",\n\tb:\"ⓑbḃḅḇƀƃɓƂ\",\n\tc:\"cⓒćĉċčçḉƈȼꜿↄ\",\n\td:\"ⓓdḋďḍḑḓḏđƌɖɗƋᏧԁꞪ\",\n\tdh:\"ð\",\n\tdz:\"dzdž\",\n\te:\"ⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇǝ\",\n\tf:\"ⓕfḟƒ\",\n\tff:\"ff\",\n\tfi:\"fi\",\n\tfl:\"fl\",\n\tffi:\"ffi\",\n\tffl:\"ffl\",\n\tg:\"ⓖgǵĝḡğġǧģǥɠꞡꝿᵹ\",\n\th:\"ⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ\",\n\thv:\"ƕ\",\n\ti:\"ⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı\",\n\tj:\"ⓙjĵǰɉ\",\n\tk:\"ⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ\",\n\tl:\"ⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇɭ\",\n\tlj:\"lj\",\n\tm:\"ⓜmḿṁṃɱɯ\",\n\tn:\"ⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥлԉ\",\n\tnj:\"nj\",\n\to:\"ⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿꝋꝍɵɔᴑ\",\n\toe:\"œ\",\n\toi:\"ƣ\",\n\too:\"ꝏ\",\n\tou:\"ȣ\",\n\tp:\"ⓟpṕṗƥᵽꝑꝓꝕρ\",\n\tq:\"ⓠqɋꝗꝙ\",\n\tr:\"ⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ\",\n\ts:\"ⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛʂ\",\n\tss:\"ß\",\n\tt:\"ⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ\",\n\tth:\"þ\",\n\ttz:\"ꜩ\",\n\tu:\"ⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ\",\n\tv:\"ⓥvṽṿʋꝟʌ\",\n\tvy:\"ꝡ\",\n\tw:\"ⓦwẁẃŵẇẅẘẉⱳ\",\n\tx:\"ⓧxẋẍ\",\n\ty:\"ⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ\",\n\tz:\"ⓩzźẑżžẓẕƶȥɀⱬꝣ\"\n}\n\n/**\n * code points generated from toCodePoints();\n * removed 65339 to 65345\n */\nexport const code_points = [\n\t[ 67, 67 ],\n\t[ 160, 160 ],\n\t[ 192, 438 ],\n\t[ 452, 652 ],\n\t[ 961, 961 ],\n\t[ 1019, 1019 ],\n\t[ 1083, 1083 ],\n\t[ 1281, 1289 ],\n\t[ 1984, 1984 ],\n\t[ 5095, 5095 ],\n\t[ 7429, 7441 ],\n\t[ 7545, 7549 ],\n\t[ 7680, 7935 ],\n\t[ 8580, 8580 ],\n\t[ 9398, 9449 ],\n\t[ 11360, 11391 ],\n\t[ 42792, 42793 ],\n\t[ 42802, 42851 ],\n\t[ 42873, 42897 ],\n\t[ 42912, 42922 ],\n\t[ 64256, 64260 ],\n\t[ 65313, 65338 ],\n\t[ 65345, 65370 ]\n];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n\n/**\n * Convert list of diacritics to array of code points\n *\n */\n// @ts-ignore\nfunction toCodePoints(tolerance=8){\n\tvar char_codes:number[] = [];\n\n\tfor( let letter in DIACRITICS ){\n\t\tlet _diacritics = DIACRITICS[letter];\n\t\tfor( let n = 0; n < _diacritics.length; n++ ){\n\t\t\tvar code_point = _diacritics.codePointAt(n);\n\t\t\tif( code_point ) char_codes.push( code_point );\n\t\t}\n\t}\n\n\t//https://stackoverflow.com/questions/40431572/is-there-a-simple-way-to-group-js-array-values-by-range\n\tchar_codes.sort((a, b) => a - b);\n\tvar accumulator: number[][] = [];\n\tchar_codes.reduce(function (accumulator, currentValue, index, source) {\n\n\t\tif( !index ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else if( currentValue - source[index - 1] > tolerance ){\n\t\t\taccumulator.push( [currentValue,currentValue] );\n\n\t\t}else{\n\n\t\t\tlet range = accumulator.pop();\n\t\t\tif( range ){\n\t\t\t\taccumulator.push( [range[0],currentValue]);\n\t\t\t}\n\t\t}\n\n\t\treturn accumulator;\n\t}, accumulator);\n\n}\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\t\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\t\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\t\n};\n\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 *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n \n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = ():TDiacraticList => {\t\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\t\t\t\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\t\t\t\n\t\t\tvar patt = new RegExp( arrayToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\t\t\n\tvar latin_chars = Object.keys(diacritics);\n\t\n\t\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= latin_chars.sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ arrayToPattern(latin_chars) + accent_pat + '*)','g');\n\t\n\t\n\t// build diacritic patterns\n\t// ae needs: \n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\t\t\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\t\t\t\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn arrayToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\t\t\t\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\t\t\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\t\t\n\t});\n\t\t\t\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics();\n\t}\n\t\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\t\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\t\t\n\t\tif( part == '' ){\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\t\t\t\t\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\t\t\n\t\t// 'أهلا' (\\u{623}\\u{647}\\u{644}\\u{627}) or 'أهلا' (\\u{627}\\u{654}\\u{647}\\u{644}\\u{627})\n\t\tconst composed_part = part.normalize('NFC');\n\t\tif( composed_part != part ){\n\t\t\treturn arrayToPattern([part,composed_part]);\n\t\t}\n\t\t\t\t\n\t\treturn part;\n\t}).join('');\n\t\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\t\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\t\n\tif( typeof value == 'function' ) return value;\n\t\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\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 */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\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\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tregex = escape_regex(word);\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(regex);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\tif( typeof sort == 'function' ){\n\t\t\treturn sort.bind(this);\n\t\t}\t\t\t\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:Partial<T.Options>):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (_:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n","\nimport { iterate } from '@orchidjs/sifter/lib/utils';\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 */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tlet div = document.createElement('div');\n\t\tdiv.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn div.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\11\\12\\14\\15\\40]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\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 */\n\nimport {replaceNode} from '../vanilla';\n\n\nexport const highlight = (element:HTMLElement, regex:string|RegExp) => {\n\n\tif( regex === null ) return;\n\n\t// convet string to regex\n\tif( typeof regex === 'string' ){\n\n\t\tif( !regex.length ) return;\n\t\tregex = new RegExp(regex, 'i');\n\t}\n\n\n\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t// Soccer -> <span class=\"highlight\">Soc</span>cer for regex = /soc/i\n\tconst highlightText = ( node:Text ):number => {\n\n\t\tvar match = node.data.match(regex);\n\t\tif( match && node.data.length > 0 ){\n\t\t\tvar spannode\t\t= document.createElement('span');\n\t\t\tspannode.className\t= 'highlight';\n\t\t\tvar middlebit\t\t= node.splitText(match.index as number);\n\n\t\t\tmiddlebit.splitText(match[0].length);\n\t\t\tvar middleclone\t\t= middlebit.cloneNode(true);\n\n\t\t\tspannode.appendChild(middleclone);\n\t\t\treplaceNode(middlebit, spannode);\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t// Recurse element node, looking for child text nodes to highlight, unless element\n\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\tconst highlightChildren = ( node:Element ):void => {\n\t\tif( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' ) ){\n\t\t\tfor (var i = 0; i < node.childNodes.length; ++i) {\n\t\t\t\ti += highlightRecursive(node.childNodes[i]);\n\t\t\t}\n\t\t}\n\t};\n\n\n\tconst highlightRecursive = ( node:Node|Element ):number => {\n\n\t\tif( node.nodeType === 3 ){\n\t\t\treturn highlightText(node as Text);\n\t\t}\n\n\t\thighlightChildren(node as Element);\n\n\t\treturn 0;\n\t};\n\n\thighlightRecursive( element );\n};\n\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with(), pass js strict mode, and use without jquery\n */\nexport const removeHighlight = (el:HTMLElement) => {\n\tvar elements = el.querySelectorAll(\"span.highlight\");\n\tArray.prototype.forEach.call(elements, function(el:HTMLElement){\n\t\tvar parent = el.parentNode as Node;\n\t\tparent.replaceChild(el.firstChild as Node, el);\n\t\tparent.normalize();\n\t});\n};\n","export const KEY_A\t\t\t\t= 65;\nexport const KEY_RETURN\t\t\t= 13;\nexport const KEY_ESC\t\t\t= 27;\nexport const KEY_LEFT\t\t\t= 37;\nexport const KEY_UP\t\t\t\t= 38;\nexport const KEY_RIGHT\t\t\t= 39;\nexport const KEY_DOWN\t\t\t= 40;\nexport const KEY_BACKSPACE\t\t= 8;\nexport const KEY_DELETE\t\t\t= 46;\nexport const KEY_TAB\t\t\t= 9;\n\nexport const IS_MAC \t\t= typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT\t\t= IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n","\nexport default {\n\toptions: [],\n\toptgroups: [],\n\n\tplugins: [],\n\tdelimiter: ',',\n\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\tpersist: true,\n\tdiacritics: true,\n\tcreate: null,\n\tcreateOnBlur: false,\n\tcreateFilter: null,\n\thighlight: true,\n\topenOnFocus: true,\n\tshouldOpen: null,\n\tmaxOptions: 50,\n\tmaxItems: null,\n\thideSelected: null,\n\tduplicates: false,\n\taddPrecedence: false,\n\tselectOnTab: false,\n\tpreload: null,\n\tallowEmptyOption: false,\n\t//closeAfterSelect: false,\n\n\tloadThrottle: 300,\n\tloadingClass: 'loading',\n\n\tdataAttr: null, //'data-data',\n\toptgroupField: 'optgroup',\n\tvalueField: 'value',\n\tlabelField: 'text',\n\tdisabledField: 'disabled',\n\toptgroupLabelField: 'label',\n\toptgroupValueField: 'value',\n\tlockOptgroupOrder: false,\n\n\tsortField: '$order',\n\tsearchField: ['text'],\n\tsearchConjunction: 'and',\n\n\tmode: null,\n\twrapperClass: 'ts-wrapper',\n\tcontrolClass: 'ts-control',\n\tdropdownClass: 'ts-dropdown',\n\tdropdownContentClass: 'ts-dropdown-content',\n\titemClass: 'item',\n\toptionClass: 'option',\n\n\tdropdownParent: null,\n\tcontrolInput: '<input type=\"text\" autocomplete=\"off\" size=\"1\" />',\n\n\tcopyClassesToDropdown: false,\n\n\tplaceholder: null,\n\thidePlaceholder: null,\n\n\tshouldLoad: function(query:string):boolean{\n\t\treturn query.length > 0;\n\t},\n\n\t/*\n\tload : null, // function(query, callback) { ... }\n\tscore : null, // function(search) { ... }\n\tonInitialize : null, // function() { ... }\n\tonChange : null, // function(value) { ... }\n\tonItemAdd : null, // function(value, $item) { ... }\n\tonItemRemove : null, // function(value) { ... }\n\tonClear : null, // function() { ... }\n\tonOptionAdd : null, // function(value, data) { ... }\n\tonOptionRemove : null, // function(value) { ... }\n\tonOptionClear : null, // function() { ... }\n\tonOptionGroupAdd : null, // function(id, data) { ... }\n\tonOptionGroupRemove : null, // function(id) { ... }\n\tonOptionGroupClear : null, // function() { ... }\n\tonDropdownOpen : null, // function(dropdown) { ... }\n\tonDropdownClose : null, // function(dropdown) { ... }\n\tonType : null, // function(str) { ... }\n\tonDelete : null, // function(values) { ... }\n\t*/\n\n\trender: {\n\t\t/*\n\t\titem: null,\n\t\toptgroup: null,\n\t\toptgroup_header: null,\n\t\toption: null,\n\t\toption_create: null\n\t\t*/\n\t}\n};\n","\nimport TomSelect from './tom-select';\nimport { TomLoadCallback } from './types/index';\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 */\nexport const hash_key = (value:undefined|null|boolean|string):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\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 */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Prevent default\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n","import defaults from './defaults';\nimport { hash_key } from './utils';\nimport { TomOption, TomSettings } from './types/index';\nimport { iterate } from '@orchidjs/sifter/lib/utils';\nimport { TomInput } from './types/index';\n\n\nexport default function getSettings( input:TomInput, settings_user:Partial<TomSettings>):TomSettings{\n\tvar settings:TomSettings\t= Object.assign({}, defaults, settings_user);\n\n\tvar attr_data\t\t\t\t= settings.dataAttr;\n\tvar field_label\t\t\t\t= settings.labelField;\n\tvar field_value\t\t\t\t= settings.valueField;\n\tvar field_disabled\t\t\t= settings.disabledField;\n\tvar field_optgroup\t\t\t= settings.optgroupField;\n\tvar field_optgroup_label\t= settings.optgroupLabelField;\n\tvar field_optgroup_value\t= settings.optgroupValueField;\n\n\tvar tag_name\t\t\t\t= input.tagName.toLowerCase();\n\tvar placeholder\t\t\t\t= input.getAttribute('placeholder') || input.getAttribute('data-placeholder');\n\n\tif (!placeholder && !settings.allowEmptyOption) {\n\t\tlet option\t\t= input.querySelector('option[value=\"\"]');\n\t\tif( option ){\n\t\t\tplaceholder = option.textContent;\n\t\t}\n\n\t}\n\n\tvar settings_element:{\n\t\tplaceholder\t: null|string,\n\t\toptions\t\t: TomOption[],\n\t\toptgroups\t: TomOption[],\n\t\titems\t\t: string[],\n\t\tmaxItems\t: null|number,\n\t} = {\n\t\tplaceholder\t: placeholder,\n\t\toptions\t\t: [],\n\t\toptgroups\t: [],\n\t\titems\t\t: [],\n\t\tmaxItems\t: null,\n\t};\n\n\n\t/**\n\t * Initialize from a <select> element.\n\t *\n\t */\n\tvar init_select = () => {\n\t\tvar tagName;\n\t\tvar options = settings_element.options;\n\t\tvar optionsMap:{[key:string]:any} = {};\n\t\tvar group_count = 1;\n\n\t\tvar readData = (el:HTMLElement):TomOption => {\n\n\t\t\tvar data\t= Object.assign({},el.dataset); // get plain object from DOMStringMap\n\t\t\tvar json\t= attr_data && data[attr_data];\n\n\t\t\tif( typeof json === 'string' && json.length ){\n\t\t\t\tdata = Object.assign(data,JSON.parse(json));\n\t\t\t}\n\n\t\t\treturn data;\n\t\t};\n\n\t\tvar addOption = (option:HTMLOptionElement, group?:string) => {\n\n\t\t\tvar value = hash_key(option.value);\n\t\t\tif ( value == null ) return;\n\t\t\tif ( !value && !settings.allowEmptyOption) return;\n\n\t\t\t// if the option already exists, it's probably been\n\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t// existing option so that it's rendered in both places.\n\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\tif (group) {\n\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t} else if (!Array.isArray(arr)) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\tvar option_data = readData(option);\n\t\t\t\toption_data[field_label] = option_data[field_label] || option.textContent;\n\t\t\t\toption_data[field_value] = option_data[field_value] || value;\n\t\t\t\toption_data[field_disabled] = option_data[field_disabled] || option.disabled;\n\t\t\t\toption_data[field_optgroup] = option_data[field_optgroup] || group;\n\t\t\t\toption_data.$option\t\t\t= option;\n\n\t\t\t\toptionsMap[value] = option_data;\n\t\t\t\toptions.push(option_data);\n\t\t\t}\n\n\t\t\tif( option.selected ){\n\t\t\t\tsettings_element.items.push(value);\n\t\t\t}\n\t\t};\n\n\t\tvar addGroup = ( optgroup:HTMLOptGroupElement ) => {\n\t\t\tvar id:string, optgroup_data\n\n\t\t\toptgroup_data\t\t\t\t\t\t\t= readData(optgroup);\n\t\t\toptgroup_data[field_optgroup_label]\t\t= optgroup_data[field_optgroup_label] || optgroup.getAttribute('label') || '';\n\t\t\toptgroup_data[field_optgroup_value]\t\t= optgroup_data[field_optgroup_value] || group_count++;\n\t\t\toptgroup_data[field_disabled]\t\t\t= optgroup_data[field_disabled] || optgroup.disabled;\n\t\t\tsettings_element.optgroups.push(optgroup_data);\n\n\t\t\tid = optgroup_data[field_optgroup_value];\n\n\t\t\titerate(optgroup.children, (option)=>{\n\t\t\t\taddOption(option as HTMLOptionElement, id);\n\t\t\t});\n\n\t\t};\n\n\t\tsettings_element.maxItems = input.hasAttribute('multiple') ? null : 1;\n\n\t\titerate(input.children,(child)=>{\n\t\t\ttagName = child.tagName.toLowerCase();\n\t\t\tif (tagName === 'optgroup') {\n\t\t\t\taddGroup(child as HTMLOptGroupElement);\n\t\t\t} else if (tagName === 'option') {\n\t\t\t\taddOption(child as HTMLOptionElement);\n\t\t\t}\n\t\t});\n\n\t};\n\n\n\t/**\n\t * Initialize from a <input type=\"text\"> element.\n\t *\n\t */\n\tvar init_textbox = () => {\n\t\tconst data_raw = input.getAttribute(attr_data);\n\n\t\tif (!data_raw) {\n\t\t\tvar value = input.value.trim() || '';\n\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\tconst values = value.split(settings.delimiter);\n\n\t\t\titerate( values, (value) => {\n\t\t\t\tconst option:TomOption = {};\n\t\t\t\toption[field_label] = value;\n\t\t\t\toption[field_value] = value;\n\t\t\t\tsettings_element.options.push(option);\n\t\t\t});\n\t\t\tsettings_element.items = values;\n\t\t} else {\n\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\titerate( settings_element.options, (opt) => {\n\t\t\t\tsettings_element.items.push(opt[field_value]);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tif (tag_name === 'select') {\n\t\tinit_select();\n\t} else {\n\t\tinit_textbox();\n\t}\n\n\treturn Object.assign( {}, defaults, settings_element, settings_user) as TomSettings;\n};\n","\nimport MicroEvent from './contrib/microevent';\nimport MicroPlugin from './contrib/microplugin';\nimport Sifter from '@orchidjs/sifter/lib/sifter';\nimport { escape_regex, iterate } from '@orchidjs/sifter/lib/utils';\nimport { TomInput, TomArgObject, TomOption, TomOptions, TomCreateFilter, TomCreateCallback, TomItem, TomSettings, TomTemplateNames } from './types/index';\nimport {highlight, removeHighlight} from './contrib/highlight';\nimport * as constants from './constants';\nimport getSettings from './getSettings';\nimport {\n\thash_key,\n\tget_hash,\n\tescape_html,\n\tdebounce_events,\n\tgetSelection,\n\tpreventDefault,\n\taddEvent,\n\tloadDebounce,\n\tisKeyDown,\n\tgetId,\n\taddSlashes,\n\tappend\n} from './utils';\n\nimport {\n\tgetDom,\n\tisHtmlString,\n\tescapeQuery,\n\ttriggerEvent,\n\tapplyCSS,\n\taddClasses,\n\tremoveClasses,\n\tparentMatch,\n\tgetTail,\n\tisEmptyObject,\n\tnodeIndex,\n\tsetAttr,\n\treplaceNode\n} from './vanilla';\n\nvar instance_i = 0;\n\nexport default class TomSelect extends MicroPlugin(MicroEvent){\n\n\tpublic control_input\t\t\t: HTMLInputElement;\n\tpublic wrapper\t\t\t\t\t: HTMLElement;\n\tpublic dropdown\t\t\t\t\t: HTMLElement;\n\tpublic control\t\t\t\t\t: HTMLElement;\n\tpublic dropdown_content\t\t\t: HTMLElement;\n\tpublic focus_node\t\t\t\t: HTMLElement;\n\n\tpublic order\t\t\t\t\t: number = 0;\n\tpublic settings\t\t\t\t\t: TomSettings;\n\tpublic input\t\t\t\t\t: TomInput;\n\tpublic tabIndex\t\t\t\t\t: number;\n\tpublic is_select_tag\t\t\t: boolean;\n\tpublic rtl\t\t\t\t\t\t: boolean;\n\tprivate inputId\t\t\t\t\t: string;\n\n\tprivate _destroy\t\t\t\t!: () => void;\n\tpublic sifter\t\t\t\t\t: Sifter;\n\n\n\tpublic isOpen\t\t\t\t\t: boolean = false;\n\tpublic isDisabled\t\t\t\t: boolean = false;\n\tpublic isRequired\t\t\t\t: boolean;\n\tpublic isInvalid\t\t\t\t: boolean = false; // @deprecated 1.8\n\tpublic isValid\t\t\t\t\t: boolean = true;\n\tpublic isLocked\t\t\t\t\t: boolean = false;\n\tpublic isFocused\t\t\t\t: boolean = false;\n\tpublic isInputHidden\t\t\t: boolean = false;\n\tpublic isSetup\t\t\t\t\t: boolean = false;\n\tpublic ignoreFocus\t\t\t\t: boolean = false;\n\tpublic hasOptions\t\t\t\t: boolean = false;\n\tpublic currentResults\t\t\t?: ReturnType<Sifter['search']>;\n\tpublic lastValue\t\t\t\t: string = '';\n\tpublic caretPos\t\t\t\t\t: number = 0;\n\tpublic loading\t\t\t\t\t: number = 0;\n\tpublic loadedSearches\t\t\t: { [key: string]: boolean } = {};\n\n\tpublic activeOption\t\t\t\t: null|HTMLElement = null;\n\tpublic activeItems\t\t\t\t: TomItem[] = [];\n\n\tpublic optgroups\t\t\t\t: TomOptions = {};\n\tpublic options\t\t\t\t\t: TomOptions = {};\n\tpublic userOptions\t\t\t\t: {[key:string]:boolean} = {};\n\tpublic items\t\t\t\t\t: string[] = [];\n\n\n\n\tconstructor( input_arg: string|TomInput, user_settings:Partial<TomSettings> ){\n\t\tsuper();\n\n\t\tinstance_i++;\n\n\t\tvar dir;\n\t\tvar input\t\t\t\t= getDom( input_arg ) as TomInput;\n\n\t\tif( input.tomselect ){\n\t\t\tthrow new Error('Tom Select already initialized on this element');\n\t\t}\n\n\n\t\tinput.tomselect\t\t\t= this;\n\n\n\t\t// detect rtl environment\n\t\tvar computedStyle\t\t= window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir\t\t\t\t\t\t= computedStyle.getPropertyValue('direction');\n\n\t\t// setup default state\n\t\tconst settings\t\t\t= getSettings( input, user_settings );\n\t\tthis.settings\t\t\t= settings;\n\t\tthis.input\t\t\t\t= input;\n\t\tthis.tabIndex\t\t\t= input.tabIndex || 0;\n\t\tthis.is_select_tag\t\t= input.tagName.toLowerCase() === 'select';\n\t\tthis.rtl\t\t\t\t= /rtl/i.test(dir);\n\t\tthis.inputId\t\t\t= getId(input, 'tomselect-'+instance_i);\n\t\tthis.isRequired\t\t\t= input.required;\n\n\n\t\t// search system\n\t\tthis.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\n\t\t// option-dependent defaults\n\t\tsettings.mode = settings.mode || (settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof settings.hideSelected !== 'boolean') {\n\t\t\tsettings.hideSelected = settings.mode === 'multi';\n\t\t}\n\n\t\tif( typeof settings.hidePlaceholder !== 'boolean' ){\n\t\t\tsettings.hidePlaceholder = settings.mode !== 'multi';\n\t\t}\n\n\t\t// set up createFilter callback\n\t\tvar filter = settings.createFilter;\n\t\tif( typeof filter !== 'function' ){\n\n\t\t\tif( typeof filter === 'string' ){\n\t\t\t\tfilter = new RegExp(filter);\n\t\t\t}\n\n\t\t\tif( filter instanceof RegExp ){\n\t\t\t\tsettings.createFilter = (input) => (filter as RegExp).test(input);\n\t\t\t}else{\n\t\t\t\tsettings.createFilter = (value) => {\n\t\t\t\t\treturn this.settings.duplicates || !this.options[value];\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\n\t\tthis.initializePlugins(settings.plugins);\n\t\tthis.setupCallbacks();\n\t\tthis.setupTemplates();\n\n\n\t\t// Create all elements\n\t\tconst wrapper\t\t\t= getDom('<div>');\n\t\tconst control\t\t\t= getDom('<div>');\n\t\tconst dropdown\t\t\t= this._render('dropdown');\n\t\tconst dropdown_content\t= getDom(`<div role=\"listbox\" tabindex=\"-1\">`);\n\n\t\tconst classes\t\t\t= this.input.getAttribute('class') || '';\n\t\tconst inputMode\t\t\t= settings.mode;\n\n\t\tvar control_input: HTMLInputElement;\n\n\n\t\taddClasses( wrapper, settings.wrapperClass, classes, inputMode);\n\n\n\t\taddClasses(control,settings.controlClass);\n\t\tappend( wrapper, control );\n\n\n\t\taddClasses(dropdown, settings.dropdownClass, inputMode);\n\t\tif( settings.copyClassesToDropdown ){\n\t\t\taddClasses( dropdown, classes);\n\t\t}\n\n\n\t\taddClasses(dropdown_content, settings.dropdownContentClass);\n\t\tappend( dropdown, dropdown_content );\n\n\t\tgetDom( settings.dropdownParent || wrapper ).appendChild( dropdown );\n\n\n\t\t// default controlInput\n\t\tif( isHtmlString(settings.controlInput) ){\n\t\t\tcontrol_input\t\t= getDom(settings.controlInput ) as HTMLInputElement;\n\n\t\t\t// set attributes\n\t\t\tvar attrs = ['autocorrect','autocapitalize','autocomplete'];\n\t\t\titerate(attrs,(attr) => {\n\t\t\t\tif( input.getAttribute(attr) ){\n\t\t\t\t\tsetAttr(control_input,{[attr]:input.getAttribute(attr)});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontrol_input.tabIndex = -1;\n\t\t\tcontrol.appendChild( control_input );\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t// dom element\n\t\t}else if( settings.controlInput ){\n\t\t\tcontrol_input\t\t= getDom( settings.controlInput ) as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t}else{\n\t\t\tcontrol_input\t\t= getDom('<input/>') as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control;\n\t\t}\n\n\t\tthis.wrapper\t\t\t= wrapper;\n\t\tthis.dropdown\t\t\t= dropdown;\n\t\tthis.dropdown_content\t= dropdown_content;\n\t\tthis.control \t\t\t= control;\n\t\tthis.control_input\t\t= control_input;\n\n\t\tthis.setup();\n\t}\n\n\t/**\n\t * set up event bindings.\n\t *\n\t */\n\tsetup(){\n\n\t\tconst self = this;\n\t\tconst settings\t\t\t\t= self.settings;\n\t\tconst control_input\t\t\t= self.control_input;\n\t\tconst dropdown\t\t\t\t= self.dropdown;\n\t\tconst dropdown_content\t\t= self.dropdown_content;\n\t\tconst wrapper\t\t\t\t= self.wrapper;\n\t\tconst control\t\t\t\t= self.control;\n\t\tconst input\t\t\t\t\t= self.input;\n\t\tconst focus_node\t\t\t= self.focus_node;\n\t\tconst passive_event\t\t\t= { passive: true };\n\t\tconst listboxId\t\t\t\t= self.inputId +'-ts-dropdown';\n\n\n\t\tsetAttr(dropdown_content,{\n\t\t\tid: listboxId\n\t\t});\n\n\t\tsetAttr(focus_node,{\n\t\t\trole:'combobox',\n\t\t\t'aria-haspopup':'listbox',\n\t\t\t'aria-expanded':'false',\n\t\t\t'aria-controls':listboxId\n\t\t});\n\n\t\tconst control_id\t= getId(focus_node,self.inputId + '-ts-control');\n\t\tconst query\t\t\t= \"label[for='\"+escapeQuery(self.inputId)+\"']\";\n\t\tconst label\t\t\t= document.querySelector(query);\n\t\tconst label_click\t= self.focus.bind(self);\n\t\tif( label ){\n\t\t\taddEvent(label,'click', label_click );\n\t\t\tsetAttr(label,{for:control_id});\n\t\t\tconst label_id = getId(label,self.inputId+'-ts-label');\n\t\t\tsetAttr(focus_node,{'aria-labelledby':label_id});\n\t\t\tsetAttr(dropdown_content,{'aria-labelledby':label_id});\n\t\t}\n\n\t\twrapper.style.width = input.style.width;\n\n\t\tif (self.plugins.names.length) {\n\t\t\tconst classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\taddClasses( [wrapper,dropdown], classes_plugins);\n\t\t}\n\n\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.is_select_tag ){\n\t\t\tsetAttr(input,{multiple:'multiple'});\n\t\t}\n\n\t\tif (settings.placeholder) {\n\t\t\tsetAttr(control_input,{placeholder:settings.placeholder});\n\t\t}\n\n\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\tif (!settings.splitOn && settings.delimiter) {\n\t\t\tsettings.splitOn = new RegExp('\\\\s*' + escape_regex(settings.delimiter) + '+\\\\s*');\n\t\t}\n\n\t\t// debounce user defined load() if loadThrottle > 0\n\t\t// after initializePlugins() so plugins can create/modify user defined loaders\n\t\tif( settings.load && settings.loadThrottle ){\n\t\t\tsettings.load = loadDebounce(settings.load,settings.loadThrottle)\n\t\t}\n\n\t\tself.control_input.type\t= input.type;\n\n\n\t\t// clicking on an option should select it\n\t\taddEvent(dropdown,'click',(evt) => {\n\t\t\tconst option = parentMatch(evt.target as HTMLElement, '[data-selectable]');\n\t\t\tif( option ){\n\t\t\t\tself.onOptionSelect( evt as MouseEvent, option );\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\t\t});\n\n\t\taddEvent(control,'click', (evt) => {\n\n\t\t\tvar target_match = parentMatch( evt.target as HTMLElement, '[data-ts-item]', control);\n\t\t\tif( target_match && self.onItemSelect(evt as MouseEvent, target_match as TomItem) ){\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// retain focus (see control_input mousedown)\n\t\t\tif( control_input.value != '' ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.onClick();\n\t\t\tpreventDefault(evt,true);\n\t\t});\n\n\n\t\t// keydown on focus_node for arrow_down/arrow_up\n\t\taddEvent(focus_node,'keydown',\t\t(e) => self.onKeyDown(e as KeyboardEvent) );\n\n\t\t// keypress and input/keyup\n\t\taddEvent(control_input,'keypress',\t(e) => self.onKeyPress(e as KeyboardEvent) );\n\t\taddEvent(control_input,'input',\t\t(e) => self.onInput(e as KeyboardEvent) );\n\n\t\taddEvent(focus_node,'resize',\t\t() => self.positionDropdown(), passive_event);\n\t\taddEvent(focus_node,'blur', \t\t(e) => self.onBlur(e as FocusEvent) );\n\t\taddEvent(focus_node,'focus',\t\t(e) => self.onFocus(e as MouseEvent) );\n\t\taddEvent(focus_node,'paste',\t\t(e) => self.onPaste(e as MouseEvent) );\n\n\n\t\tconst doc_mousedown = (evt:Event) => {\n\n\t\t\t// blur if target is outside of this instance\n\t\t\t// dropdown is not always inside wrapper\n\t\t\tconst target = evt.composedPath()[0];\n\t\t\tif( !wrapper.contains(target as HTMLElement) && !dropdown.contains(target as HTMLElement) ){\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.blur();\n\t\t\t\t}\n\t\t\t\tself.inputState();\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t// retain focus by preventing native handling. if the\n\t\t\t// event target is the input it should not be modified.\n\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t// Fixes bug #212 which is no covered by tests\n\t\t\tif( target == control_input && self.isOpen ){\n\t\t\t\tevt.stopPropagation();\n\n\t\t\t// clicking anywhere in the control should not blur the control_input (which would close the dropdown)\n\t\t\t}else{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\n\t\t};\n\n\t\tvar win_scroll = () => {\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.positionDropdown();\n\t\t\t}\n\t\t};\n\n\n\t\taddEvent(document,'mousedown', doc_mousedown);\n\t\taddEvent(window,'scroll', win_scroll, passive_event);\n\t\taddEvent(window,'resize', win_scroll, passive_event);\n\n\t\tthis._destroy = () => {\n\t\t\tdocument.removeEventListener('mousedown',doc_mousedown);\n\t\t\twindow.removeEventListener('scroll',win_scroll);\n\t\t\twindow.removeEventListener('resize',win_scroll);\n\t\t\tif( label ) label.removeEventListener('click',label_click);\n\t\t};\n\n\t\t// store original html and tab index so that they can be\n\t\t// restored when the destroy() method is called.\n\t\tthis.revertSettings = {\n\t\t\tinnerHTML : input.innerHTML,\n\t\t\ttabIndex : input.tabIndex\n\t\t};\n\n\n\t\tinput.tabIndex = -1;\n\t\tinput.insertAdjacentElement('afterend', self.wrapper);\n\n\t\tself.sync(false);\n\t\tsettings.items = [];\n\t\tdelete settings.optgroups;\n\t\tdelete settings.options;\n\n\t\taddEvent(input,'invalid', (e) => {\n\t\t\tif( self.isValid ){\n\t\t\t\tself.isValid = false;\n\t\t\t\tself.isInvalid = true;\n\t\t\t\tself.refreshState();\n\t\t\t}\n\t\t});\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshItems();\n\t\tself.close(false);\n\t\tself.inputState();\n\t\tself.isSetup = true;\n\n\t\tif( input.disabled ){\n\t\t\tself.disable();\n\t\t}else{\n\t\t\tself.enable(); //sets tabIndex\n\t\t}\n\n\t\tself.on('change', this.onChange);\n\n\t\taddClasses(input,'tomselected','ts-hidden-accessible');\n\t\tself.trigger('initialize');\n\n\t\t// preload options\n\t\tif (settings.preload === true) {\n\t\t\tself.preload();\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Register options and optgroups\n\t *\n\t */\n\tsetupOptions(options:TomOption[] = [], optgroups:TomOption[] = []){\n\n\t\t// build options table\n\t\tthis.addOptions(options);\n\n\n\t\t// build optgroup table\n\t\titerate( optgroups, (optgroup) => {\n\t\t\tthis.registerOptionGroup(optgroup);\n\t\t});\n\t}\n\n\t/**\n\t * Sets up default rendering functions.\n\t */\n\tsetupTemplates() {\n\t\tvar self = this;\n\t\tvar field_label = self.settings.labelField;\n\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\n\t\tvar templates = {\n\t\t\t'optgroup': (data:TomOption) => {\n\t\t\t\tlet optgroup = document.createElement('div');\n\t\t\t\toptgroup.className = 'optgroup';\n\t\t\t\toptgroup.appendChild(data.options);\n\t\t\t\treturn optgroup;\n\n\t\t\t},\n\t\t\t'optgroup_header': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t},\n\t\t\t'option': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'item': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'option_create': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n\t\t\t},\n\t\t\t'no_results':() => {\n\t\t\t\treturn '<div class=\"no-results\">No results found</div>';\n\t\t\t},\n\t\t\t'loading':() => {\n\t\t\t\treturn '<div class=\"spinner\"></div>';\n\t\t\t},\n\t\t\t'not_loading':() => {},\n\t\t\t'dropdown':() => {\n\t\t\t\treturn '<div></div>';\n\t\t\t}\n\t\t};\n\n\n\t\tself.settings.render = Object.assign({}, templates, self.settings.render);\n\t}\n\n\t/**\n\t * Maps fired events to callbacks provided\n\t * in the settings used when creating the control.\n\t */\n\tsetupCallbacks() {\n\t\tvar key, fn;\n\t\tvar callbacks:{[key:string]:string} = {\n\t\t\t'initialize' : 'onInitialize',\n\t\t\t'change' : 'onChange',\n\t\t\t'item_add' : 'onItemAdd',\n\t\t\t'item_remove' : 'onItemRemove',\n\t\t\t'item_select' : 'onItemSelect',\n\t\t\t'clear' : 'onClear',\n\t\t\t'option_add' : 'onOptionAdd',\n\t\t\t'option_remove' : 'onOptionRemove',\n\t\t\t'option_clear' : 'onOptionClear',\n\t\t\t'optgroup_add' : 'onOptionGroupAdd',\n\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t'optgroup_clear' : 'onOptionGroupClear',\n\t\t\t'dropdown_open' : 'onDropdownOpen',\n\t\t\t'dropdown_close' : 'onDropdownClose',\n\t\t\t'type' : 'onType',\n\t\t\t'load' : 'onLoad',\n\t\t\t'focus' : 'onFocus',\n\t\t\t'blur' : 'onBlur'\n\t\t};\n\n\t\tfor (key in callbacks) {\n\n\t\t\tfn = this.settings[callbacks[key] as (keyof TomSettings)];\n\t\t\tif (fn) this.on(key, fn);\n\n\t\t}\n\t}\n\n\t/**\n\t * Sync the Tom Select instance with the original input or select\n\t *\n\t */\n\tsync(get_settings:boolean=true):void{\n\t\tconst self\t\t= this;\n\t\tconst settings\t= get_settings ? getSettings( self.input, {delimiter:self.settings.delimiter} as TomSettings ) : self.settings;\n\n\t\tself.setupOptions(settings.options,settings.optgroups);\n\n\t\tself.setValue(settings.items||[],true); // silent prevents recursion\n\n\t\tself.lastQuery = null; // so updated options will be displayed in dropdown\n\t}\n\n\t/**\n\t * Triggered when the main control element\n\t * has a click event.\n\t *\n\t */\n\tonClick():void {\n\t\tvar self = this;\n\n\t\tif( self.activeItems.length > 0 ){\n\t\t\tself.clearActiveItems();\n\t\t\tself.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.isFocused && self.isOpen ){\n\t\t\tself.blur();\n\t\t} else {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * @deprecated v1.7\n\t *\n\t */\n\tonMouseDown():void {}\n\n\t/**\n\t * Triggered when the value of the control has been changed.\n\t * This should propagate the event to the original DOM\n\t * input / select element.\n\t */\n\tonChange() {\n\t\ttriggerEvent(this.input, 'input');\n\t\ttriggerEvent(this.input, 'change');\n\t}\n\n\t/**\n\t * Triggered on <input> paste.\n\t *\n\t */\n\tonPaste(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isInputHidden || self.isLocked ){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a regex or string is included, this will split the pasted\n\t\t// input and create Items for each separate value\n\t\tif (self.settings.splitOn) {\n\n\t\t\t// Wait for pasted text to be recognized in value\n\t\t\tsetTimeout(() => {\n\t\t\t\tvar pastedText = self.inputValue();\n\t\t\t\tif( !pastedText.match(self.settings.splitOn)){\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tvar splitInput = pastedText.trim().split(self.settings.splitOn);\n\t\t\t\titerate( splitInput, (piece) => {\n\t\t\t\t\tself.createItem(piece);\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keypress.\n\t *\n\t */\n\tonKeyPress(e:KeyboardEvent):void {\n\t\tvar self = this;\n\t\tif(self.isLocked){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\tif (self.settings.create && self.settings.mode === 'multi' && character === self.settings.delimiter) {\n\t\t\tself.createItem();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keydown.\n\t *\n\t */\n\tonKeyDown(e:KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif (self.isLocked) {\n\t\t\tif (e.keyCode !== constants.KEY_TAB) {\n\t\t\t\tpreventDefault(e);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (e.keyCode) {\n\n\t\t\t// ctrl+A: select all\n\t\t\tcase constants.KEY_A:\n\t\t\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\t\t\tif( self.control_input.value == '' ){\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t// esc: close dropdown\n\t\t\tcase constants.KEY_ESC:\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tpreventDefault(e,true);\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\n\t\t\t// down: open dropdown or move selection down\n\t\t\tcase constants.KEY_DOWN:\n\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\tself.open();\n\t\t\t\t} else if (self.activeOption) {\n\t\t\t\t\tlet next = self.getAdjacent(self.activeOption, 1);\n\t\t\t\t\tif (next) self.setActiveOption(next);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// up: move selection up\n\t\t\tcase constants.KEY_UP:\n\t\t\t\tif (self.activeOption) {\n\t\t\t\t\tlet prev = self.getAdjacent(self.activeOption, -1);\n\t\t\t\t\tif (prev) self.setActiveOption(prev);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// return: select active option\n\t\t\tcase constants.KEY_RETURN:\n\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// if the option_create=null, the dropdown might be closed\n\t\t\t\t}else if (self.settings.create && self.createItem()) {\n\t\t\t\t\tpreventDefault(e);\n\t\t\t\t}\n\t\t\t\treturn;\n\n\t\t\t// left: modifiy item selection to the left\n\t\t\tcase constants.KEY_LEFT:\n\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\treturn;\n\n\t\t\t// right: modifiy item selection to the right\n\t\t\tcase constants.KEY_RIGHT:\n\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\treturn;\n\n\t\t\t// tab: select active option and/or create item\n\t\t\tcase constants.KEY_TAB:\n\n\t\t\t\tif( self.settings.selectOnTab ){\n\t\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\n\t\t\t\t\t\t// prevent default [tab] behaviour of jump to the next field\n\t\t\t\t\t\t// if select isFull, then the dropdown won't be open and [tab] will work normally\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\n\t\t\t// delete|backspace: delete items\n\t\t\tcase constants.KEY_BACKSPACE:\n\t\t\tcase constants.KEY_DELETE:\n\t\t\t\tself.deleteSelection(e);\n\t\t\t\treturn;\n\t\t}\n\n\t\t// don't enter text in the control_input when active items are selected\n\t\tif( self.isInputHidden && !isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\tpreventDefault(e);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keyup.\n\t *\n\t */\n\tonInput(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isLocked ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar value = self.inputValue();\n\t\tif (self.lastValue !== value) {\n\t\t\tself.lastValue = value;\n\n\t\t\tif( self.settings.shouldLoad.call(self,value) ){\n\t\t\t\tself.load(value);\n\t\t\t}\n\n\t\t\tself.refreshOptions();\n\t\t\tself.trigger('type', value);\n\t\t}\n\t}\n\n\n\t/**\n\t * Triggered on <input> focus.\n\t *\n\t */\n\tonFocus(e?:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\t\tvar wasFocused = self.isFocused;\n\n\t\tif (self.isDisabled) {\n\t\t\tself.blur();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (self.ignoreFocus) return;\n\t\tself.isFocused = true;\n\t\tif( self.settings.preload === 'focus' ) self.preload();\n\n\t\tif (!wasFocused) self.trigger('focus');\n\n\t\tif (!self.activeItems.length) {\n\t\t\tself.showInput();\n\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t}\n\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Triggered on <input> blur.\n\t *\n\t */\n\tonBlur(e?:FocusEvent):void {\n\n\t\tif( document.hasFocus() === false ) return;\n\n\t\tvar self = this;\n\t\tif (!self.isFocused) return;\n\t\tself.isFocused = false;\n\t\tself.ignoreFocus = false;\n\n\t\tvar deactivate = () => {\n\t\t\tself.close();\n\t\t\tself.setActiveItem();\n\t\t\tself.setCaret(self.items.length);\n\t\t\tself.trigger('blur');\n\t\t};\n\n\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\tself.createItem(null, false, deactivate);\n\t\t} else {\n\t\t\tdeactivate();\n\t\t}\n\t}\n\n\n\t/**\n\t * Triggered when the user clicks on an option\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionSelect( evt:MouseEvent|KeyboardEvent, option:HTMLElement ){\n\t\tvar value, self = this;\n\n\n\t\t// should not be possible to trigger a option under a disabled optgroup\n\t\tif( option.parentElement && option.parentElement.matches('[data-disabled]') ){\n\t\t\treturn;\n\t\t}\n\n\n\t\tif( option.classList.contains('create') ){\n\t\t\tself.createItem(null, true, () => {\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = option.dataset.value;\n\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.addItem(value);\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( !self.settings.hideSelected && evt.type && /click/.test(evt.type) ){\n\t\t\t\t\tself.setActiveOption(option);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return true if the given option can be selected\n\t *\n\t */\n\tcanSelect(option:HTMLElement|null):boolean{\n\n\t\tif( this.isOpen && option && this.dropdown_content.contains(option) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Triggered when the user clicks on an item\n\t * that has been selected.\n\t *\n\t */\n\tonItemSelect( evt?:MouseEvent, item?:TomItem ):boolean{\n\t\tvar self = this;\n\n\t\tif( !self.isLocked && self.settings.mode === 'multi' ){\n\t\t\tpreventDefault(evt);\n\t\t\tself.setActiveItem(item, evt);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determines whether or not to invoke\n\t * the user-provided option provider / loader\n\t *\n\t * Note, there is a subtle difference between\n\t * this.canLoad() and this.settings.shouldLoad();\n\t *\n\t *\t- settings.shouldLoad() is a user-input validator.\n\t *\tWhen false is returned, the not_loading template\n\t *\twill be added to the dropdown\n\t *\n\t *\t- canLoad() is lower level validator that checks\n\t * \tthe Tom Select instance. There is no inherent user\n\t *\tfeedback when canLoad returns false\n\t *\n\t */\n\tcanLoad(value:string):boolean{\n\n\t\tif( !this.settings.load ) return false;\n\t\tif( this.loadedSearches.hasOwnProperty(value) ) return false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Invokes the user-provided option provider / loader.\n\t *\n\t */\n\tload(value:string):void {\n\t\tconst self = this;\n\n\t\tif( !self.canLoad(value) ) return;\n\n\t\taddClasses(self.wrapper,self.settings.loadingClass);\n\t\tself.loading++;\n\n\t\tconst callback = self.loadCallback.bind(self);\n\t\tself.settings.load.call(self, value, callback);\n\t}\n\n\t/**\n\t * Invoked by the user-provided option provider\n\t *\n\t */\n\tloadCallback( options:TomOption[], optgroups:TomOption[] ):void{\n\t\tconst self = this;\n\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\tself.lastQuery = null;\n\n\t\tself.clearActiveOption(); // when new results load, focus should be on first option\n\t\tself.setupOptions(options,optgroups);\n\n\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\n\t\tif (!self.loading) {\n\t\t\tremoveClasses(self.wrapper,self.settings.loadingClass);\n\t\t}\n\n\t\tself.trigger('load', options, optgroups);\n\t}\n\n\tpreload():void{\n\t\tvar classList = this.wrapper.classList;\n\t\tif( classList.contains('preloaded') ) return;\n\t\tclassList.add('preloaded');\n\t\tthis.load('');\n\t}\n\n\n\t/**\n\t * Sets the input field of the control to the specified value.\n\t *\n\t */\n\tsetTextboxValue(value:string = '') {\n\t\tvar input = this.control_input;\n\t\tvar changed = input.value !== value;\n\t\tif (changed) {\n\t\t\tinput.value = value;\n\t\t\ttriggerEvent(input,'update');\n\t\t\tthis.lastValue = value;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the value of the control. If multiple items\n\t * can be selected (e.g. <select multiple>), this returns\n\t * an array. If only one item can be selected, this\n\t * returns a string.\n\t *\n\t */\n\tgetValue():string|string[] {\n\n\t\tif( this.is_select_tag && this.input.hasAttribute('multiple')) {\n\t\t\treturn this.items;\n\t\t}\n\n\t\treturn this.items.join(this.settings.delimiter);\n\t}\n\n\t/**\n\t * Resets the selected items to the given value.\n\t *\n\t */\n\tsetValue( value:string|string[], silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change'];\n\n\t\tdebounce_events(this, events,() => {\n\t\t\tthis.clear(silent);\n\t\t\tthis.addItems(value, silent);\n\t\t});\n\t}\n\n\n\t/**\n\t * Resets the number of max items to the given value\n\t *\n\t */\n\tsetMaxItems(value:null|number){\n\t\tif(value === 0) value = null; //reset to unlimited items.\n\t\tthis.settings.maxItems = value;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Sets the selected item.\n\t *\n\t */\n\tsetActiveItem( item?:TomItem, e?:MouseEvent|KeyboardEvent ){\n\t\tvar self = this;\n\t\tvar eventName;\n\t\tvar i, begin, end, swap;\n\t\tvar last;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\t// clear the active selection\n\t\tif( !item ){\n\t\t\tself.clearActiveItems();\n\t\t\tif (self.isFocused) {\n\t\t\t\tself.showInput();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// modify selection\n\t\teventName = e && e.type.toLowerCase();\n\n\t\tif (eventName === 'click' && isKeyDown('shiftKey',e) && self.activeItems.length) {\n\t\t\tlast\t= self.getLastActive();\n\t\t\tbegin\t= Array.prototype.indexOf.call(self.control.children, last);\n\t\t\tend\t\t= Array.prototype.indexOf.call(self.control.children, item);\n\n\t\t\tif (begin > end) {\n\t\t\t\tswap = begin;\n\t\t\t\tbegin = end;\n\t\t\t\tend = swap;\n\t\t\t}\n\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\titem = self.control.children[i] as TomItem;\n\t\t\t\tif (self.activeItems.indexOf(item) === -1) {\n\t\t\t\t\tself.setActiveItemClass(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpreventDefault(e);\n\t\t} else if ((eventName === 'click' && isKeyDown(constants.KEY_SHORTCUT,e) ) || (eventName === 'keydown' && isKeyDown('shiftKey',e))) {\n\t\t\tif( item.classList.contains('active') ){\n\t\t\t\tself.removeActiveItem( item );\n\t\t\t} else {\n\t\t\t\tself.setActiveItemClass(item);\n\t\t\t}\n\t\t} else {\n\t\t\tself.clearActiveItems();\n\t\t\tself.setActiveItemClass(item);\n\t\t}\n\n\t\t// ensure control has focus\n\t\tself.hideInput();\n\t\tif (!self.isFocused) {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Set the active and last-active classes\n\t *\n\t */\n\tsetActiveItemClass( item:TomItem ){\n\t\tconst self = this;\n\t\tconst last_active = self.control.querySelector('.last-active');\n\t\tif( last_active ) removeClasses(last_active as HTMLElement,'last-active');\n\n\t\taddClasses(item,'active last-active');\n\t\tself.trigger('item_select', item);\n\t\tif( self.activeItems.indexOf(item) == -1 ){\n\t\t\tself.activeItems.push( item );\n\t\t}\n\t}\n\n\t/**\n\t * Remove active item\n\t *\n\t */\n\tremoveActiveItem( item:TomItem ){\n\t\tvar idx = this.activeItems.indexOf(item);\n\t\tthis.activeItems.splice(idx, 1);\n\t\tremoveClasses(item,'active');\n\t}\n\n\t/**\n\t * Clears all the active items\n\t *\n\t */\n\tclearActiveItems(){\n\t\tremoveClasses(this.activeItems,'active');\n\t\tthis.activeItems = [];\n\t}\n\n\t/**\n\t * Sets the selected item in the dropdown menu\n\t * of available options.\n\t *\n\t */\n\tsetActiveOption( option:null|HTMLElement ):void{\n\n\t\tif( option === this.activeOption ){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearActiveOption();\n\t\tif( !option ) return;\n\n\t\tthis.activeOption = option;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':option.getAttribute('id')});\n\t\tsetAttr(option,{'aria-selected':'true'});\n\t\taddClasses(option,'active');\n\t\tthis.scrollToOption(option);\n\t}\n\n\t/**\n\t * Sets the dropdown_content scrollTop to display the option\n\t *\n\t */\n\tscrollToOption( option:null|HTMLElement, behavior?:string ):void{\n\n\t\tif( !option ) return;\n\n\t\tconst content\t\t= this.dropdown_content;\n\t\tconst height_menu\t= content.clientHeight;\n\t\tconst scrollTop\t\t= content.scrollTop || 0;\n\t\tconst height_item\t= option.offsetHeight;\n\t\tconst y\t\t\t\t= option.getBoundingClientRect().top - content.getBoundingClientRect().top + scrollTop;\n\n\t\tif (y + height_item > height_menu + scrollTop) {\n\t\t\tthis.scroll(y - height_menu + height_item, behavior);\n\n\t\t} else if (y < scrollTop) {\n\t\t\tthis.scroll(y, behavior);\n\t\t}\n\t}\n\n\t/**\n\t * Scroll the dropdown to the given position\n\t *\n\t */\n\tscroll( scrollTop:number, behavior?:string ):void{\n\t\tconst content = this.dropdown_content;\n\t\tif( behavior ){\n\t\t\tcontent.style.scrollBehavior = behavior;\n\t\t}\n\t\tcontent.scrollTop = scrollTop;\n\t\tcontent.style.scrollBehavior = '';\n\t}\n\n\t/**\n\t * Clears the active option\n\t *\n\t */\n\tclearActiveOption(){\n\t\tif( this.activeOption ){\n\t\t\tremoveClasses(this.activeOption,'active');\n\t\t\tsetAttr(this.activeOption,{'aria-selected':null});\n\t\t}\n\t\tthis.activeOption = null;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':null});\n\t}\n\n\n\t/**\n\t * Selects all items (CTRL + A).\n\t */\n\tselectAll() {\n\t\tconst self = this;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\tconst activeItems = self.controlChildren();\n\n\t\tif( !activeItems.length ) return;\n\n\t\tself.hideInput();\n\t\tself.close();\n\n\t\tself.activeItems = activeItems;\n\t\titerate( activeItems, (item) => {\n\t\t\tself.setActiveItemClass(item);\n\t\t});\n\n\t}\n\n\t/**\n\t * Determines if the control_input should be in a hidden or visible state\n\t *\n\t */\n\tinputState(){\n\t\tvar self = this;\n\n\t\tif( !self.control.contains(self.control_input) ) return;\n\n\t\tsetAttr(self.control_input,{placeholder:self.settings.placeholder});\n\n\t\tif( self.activeItems.length > 0 || (!self.isFocused && self.settings.hidePlaceholder && self.items.length > 0) ){\n\t\t\tself.setTextboxValue();\n\t\t\tself.isInputHidden = true;\n\n\t\t}else{\n\n\t\t\tif( self.settings.hidePlaceholder && self.items.length > 0 ){\n\t\t\t\tsetAttr(self.control_input,{placeholder:''});\n\t\t\t}\n\t\t\tself.isInputHidden = false;\n\t\t}\n\n\t\tself.wrapper.classList.toggle('input-hidden', self.isInputHidden );\n\t}\n\n\t/**\n\t * Hides the input element out of view, while\n\t * retaining its focus.\n\t * @deprecated 1.3\n\t */\n\thideInput() {\n\t\tthis.inputState();\n\t}\n\n\t/**\n\t * Restores input visibility.\n\t * @deprecated 1.3\n\t */\n\tshowInput() {\n\t\tthis.inputState();\n\t}\n\n\t/**\n\t * Get the input value\n\t */\n\tinputValue(){\n\t\treturn this.control_input.value.trim();\n\t}\n\n\t/**\n\t * Gives the control focus.\n\t */\n\tfocus() {\n\t\tvar self = this;\n\t\tif (self.isDisabled) return;\n\n\t\tself.ignoreFocus = true;\n\n\t\tif( self.control_input.offsetWidth ){\n\t\t\tself.control_input.focus();\n\t\t}else{\n\t\t\tself.focus_node.focus();\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tself.ignoreFocus = false;\n\t\t\tself.onFocus();\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Forces the control out of focus.\n\t *\n\t */\n\tblur():void {\n\t\tthis.focus_node.blur();\n\t\tthis.onBlur();\n\t}\n\n\t/**\n\t * Returns a function that scores an object\n\t * to show how good of a match it is to the\n\t * provided query.\n\t *\n\t * @return {function}\n\t */\n\tgetScoreFunction(query:string) {\n\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t}\n\n\t/**\n\t * Returns search options for sifter (the system\n\t * for scoring and sorting results).\n\t *\n\t * @see https://github.com/orchidjs/sifter.js\n\t * @return {object}\n\t */\n\tgetSearchOptions() {\n\t\tvar settings = this.settings;\n\t\tvar sort = settings.sortField;\n\t\tif (typeof settings.sortField === 'string') {\n\t\t\tsort = [{field: settings.sortField}];\n\t\t}\n\n\t\treturn {\n\t\t\tfields : settings.searchField,\n\t\t\tconjunction : settings.searchConjunction,\n\t\t\tsort : sort,\n\t\t\tnesting : settings.nesting\n\t\t};\n\t}\n\n\t/**\n\t * Searches through available options and returns\n\t * a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string) : ReturnType<Sifter['search']>{\n\t\tvar i, result, calculateScore;\n\t\tvar self = this;\n\t\tvar options = this.getSearchOptions();\n\n\t\t// validate user-provided result scoring function\n\t\tif ( self.settings.score ){\n\t\t\tcalculateScore = self.settings.score.call(self,query);\n\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\tthrow new Error('Tom Select \"score\" setting must be a function that returns a function');\n\t\t\t}\n\t\t}\n\n\t\t// perform search\n\t\tif (query !== self.lastQuery) {\n\t\t\tself.lastQuery\t\t\t= query;\n\t\t\tresult\t\t\t\t\t= self.sifter.search(query, Object.assign(options, {score: calculateScore}));\n\t\t\tself.currentResults\t\t= result;\n\t\t} else {\n\t\t\tresult\t\t\t\t\t= Object.assign( {}, self.currentResults);\n\t\t}\n\n\t\t// filter out selected items\n\t\tif( self.settings.hideSelected ){\n\t\t\tfor (i = result.items.length - 1; i >= 0; i--) {\n\t\t\t\tlet hashed = hash_key(result.items[i].id);\n\t\t\t\tif( hashed && self.items.indexOf(hashed) !== -1 ){\n\t\t\t\t\tresult.items.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Refreshes the list of available options shown\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\trefreshOptions( triggerDropdown:boolean = true ){\n\t\tvar i, j, k, n, optgroup, optgroups, html:DocumentFragment, has_create_option, active_value, active_group;\n\t\tvar create;\n\t\tconst groups: {[key:string]:DocumentFragment} = {};\n\n\t\tconst groups_order:string[]\t= [];\n\t\tvar self\t\t\t\t\t= this;\n\t\tvar query\t\t\t\t\t= self.inputValue();\n\t\tvar results\t\t\t\t\t= self.search(query);\n\t\tvar active_option\t\t\t= null; //self.activeOption;\n\t\tvar show_dropdown\t\t\t= self.settings.shouldOpen || false;\n\t\tvar dropdown_content\t\t= self.dropdown_content;\n\n\t\tif( self.activeOption ){\n\t\t\tactive_value = self.activeOption.dataset.value;\n\t\t\tactive_group = self.activeOption.closest('[data-group]') as HTMLElement;\n\t\t}\n\n\t\t// build markup\n\t\tn = results.items.length;\n\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t}\n\n\t\tif( n > 0 ){\n\t\t\tshow_dropdown = true;\n\t\t}\n\n\t\t// render and group available options individually\n\t\tfor (i = 0; i < n; i++) {\n\n\t\t\t// get option dom element\n\t\t\tlet opt_value\t\t= results.items[i].id;\n\t\t\tlet option\t\t\t= self.options[opt_value];\n\t\t\tlet option_el\t\t= self.getOption(opt_value,true) as HTMLElement;\n\n\n\t\t\t// toggle 'selected' class\n\t\t\tif( !self.settings.hideSelected ){\n\t\t\t\toption_el.classList.toggle('selected', self.items.includes(opt_value) );\n\t\t\t}\n\n\t\t\toptgroup = option[self.settings.optgroupField] || '';\n\t\t\toptgroups = Array.isArray(optgroup) ? optgroup : [optgroup];\n\n\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\toptgroup = optgroups[j];\n\t\t\t\tif (!self.optgroups.hasOwnProperty(optgroup)) {\n\t\t\t\t\toptgroup = '';\n\t\t\t\t}\n\t\t\t\tif (!groups.hasOwnProperty(optgroup)) {\n\t\t\t\t\tgroups[optgroup] = document.createDocumentFragment();\n\t\t\t\t\tgroups_order.push(optgroup);\n\t\t\t\t}\n\n\t\t\t\t// nodes can only have one parent, so if the option is in mutple groups, we need a clone\n\t\t\t\tif( j > 0 ){\n\t\t\t\t\toption_el = option_el.cloneNode(true) as HTMLElement;\n\t\t\t\t\tsetAttr(option_el,{id: option.$id+'-clone-'+j,'aria-selected':null});\n\t\t\t\t\toption_el.classList.add('ts-cloned');\n\t\t\t\t\tremoveClasses(option_el,'active');\n\t\t\t\t}\n\n\t\t\t\t// make sure we keep the activeOption in the same group\n\t\t\t\tif( !active_option && active_value == opt_value ){\n\t\t\t\t\tif( active_group ){\n\t\t\t\t\t\tif( active_group.dataset.group === optgroup ){\n\t\t\t\t\t\t\tactive_option = option_el;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\tactive_option = option_el;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgroups[optgroup].appendChild(option_el);\n\t\t\t}\n\t\t}\n\n\t\t// sort optgroups\n\t\tif (this.settings.lockOptgroupOrder) {\n\t\t\tgroups_order.sort((a, b) => {\n\t\t\t\tvar a_order = self.optgroups[a] && self.optgroups[a].$order || 0;\n\t\t\t\tvar b_order = self.optgroups[b] && self.optgroups[b].$order || 0;\n\t\t\t\treturn a_order - b_order;\n\t\t\t});\n\t\t}\n\n\t\t// render optgroup headers & join groups\n\t\thtml = document.createDocumentFragment();\n\t\titerate( groups_order, (optgroup) => {\n\t\t\tif (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].children.length) {\n\n\t\t\t\tlet group_options = document.createDocumentFragment();\n\t\t\t\tlet header = self.render('optgroup_header', self.optgroups[optgroup]);\n\t\t\t\tappend( group_options, header );\n\t\t\t\tappend( group_options, groups[optgroup] );\n\n\t\t\t\tlet group_html = self.render('optgroup', {group:self.optgroups[optgroup],options:group_options} );\n\n\t\t\t\tappend( html, group_html );\n\n\t\t\t} else {\n\t\t\t\tappend( html, groups[optgroup] );\n\t\t\t}\n\t\t});\n\n\t\tdropdown_content.innerHTML = '';\n\t\tappend( dropdown_content, html );\n\n\t\t// highlight matching terms inline\n\t\tif (self.settings.highlight) {\n\t\t\tremoveHighlight( dropdown_content );\n\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\titerate( results.tokens, (tok) => {\n\t\t\t\t\thighlight( dropdown_content, tok.regex);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// helper method for adding templates to dropdown\n\t\tvar add_template = (template:TomTemplateNames) => {\n\t\t\tlet content = self.render(template,{input:query});\n\t\t\tif( content ){\n\t\t\t\tshow_dropdown = true;\n\t\t\t\tdropdown_content.insertBefore(content, dropdown_content.firstChild);\n\t\t\t}\n\t\t\treturn content;\n\t\t};\n\n\n\t\t// add loading message\n\t\tif( self.loading ){\n\t\t\tadd_template('loading');\n\n\t\t// invalid query\n\t\t}else if( !self.settings.shouldLoad.call(self,query) ){\n\t\t\tadd_template('not_loading');\n\n\t\t// add no_results message\n\t\t}else if( results.items.length === 0 ){\n\t\t\tadd_template('no_results');\n\n\t\t}\n\n\n\n\t\t// add create option\n\t\thas_create_option = self.canCreate(query);\n\t\tif (has_create_option) {\n\t\t\tcreate = add_template('option_create');\n\t\t}\n\n\n\t\t// activate\n\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\tif( show_dropdown ){\n\n\t\t\tif (results.items.length > 0) {\n\n\t\t\t\tif( !active_option && self.settings.mode === 'single' && self.items.length ){\n\t\t\t\t\tactive_option = self.getOption(self.items[0]);\n\t\t\t\t}\n\n\t\t\t\tif( !dropdown_content.contains(active_option) ){\n\n\t\t\t\t\tlet active_index = 0;\n\t\t\t\t\tif( create && !self.settings.addPrecedence ){\n\t\t\t\t\t\tactive_index = 1;\n\t\t\t\t\t}\n\t\t\t\t\tactive_option = self.selectable()[active_index] as HTMLElement;\n\t\t\t\t}\n\n\t\t\t}else if( create ){\n\t\t\t\tactive_option = create;\n\t\t\t}\n\n\t\t\tif( triggerDropdown && !self.isOpen ){\n\t\t\t\tself.open();\n\t\t\t\tself.scrollToOption(active_option,'auto');\n\t\t\t}\n\t\t\tself.setActiveOption(active_option);\n\n\t\t}else{\n\t\t\tself.clearActiveOption();\n\t\t\tif( triggerDropdown && self.isOpen ){\n\t\t\t\tself.close(false); // if create_option=null, we want the dropdown to close but not reset the textbox value\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return list of selectable options\n\t *\n\t */\n\tselectable():NodeList{\n\t\treturn this.dropdown_content.querySelectorAll('[data-selectable]');\n\t}\n\n\n\n\t/**\n\t * Adds an available option. If it already exists,\n\t * nothing will happen. Note: this does not refresh\n\t * the options list dropdown (use `refreshOptions`\n\t * for that).\n\t *\n\t * Usage:\n\t *\n\t * this.addOption(data)\n\t *\n\t */\n\taddOption( data:TomOption, user_created = false ):false|string {\n\t\tconst self = this;\n\n\t\t// @deprecated 1.7.7\n\t\t// use addOptions( array, user_created ) for adding multiple options\n\t\tif( Array.isArray(data) ){\n\t\t\tself.addOptions( data, user_created);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst key = hash_key(data[self.settings.valueField]);\n\t\tif( key === null || self.options.hasOwnProperty(key) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tdata.$order\t\t\t= data.$order || ++self.order;\n\t\tdata.$id\t\t\t= self.inputId + '-opt-' + data.$order;\n\t\tself.options[key]\t= data;\n\t\tself.lastQuery\t\t= null;\n\n\t\tif( user_created ){\n\t\t\tself.userOptions[key] = user_created;\n\t\t\tself.trigger('option_add', key, data);\n\t\t}\n\n\t\treturn key;\n\t}\n\n\t/**\n\t * Add multiple options\n\t *\n\t */\n\taddOptions( data:TomOption[], user_created = false ):void{\n\t\titerate( data, (dat) => {\n\t\t\tthis.addOption(dat, user_created);\n\t\t});\n\t}\n\n\t/**\n\t * @deprecated 1.7.7\n\t */\n\tregisterOption( data:TomOption ):false|string {\n\t\treturn this.addOption(data);\n\t}\n\n\t/**\n\t * Registers an option group to the pool of option groups.\n\t *\n\t * @return {boolean|string}\n\t */\n\tregisterOptionGroup(data:TomOption) {\n\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\n\t\tif ( key === null ) return false;\n\n\t\tdata.$order = data.$order || ++this.order;\n\t\tthis.optgroups[key] = data;\n\t\treturn key;\n\t}\n\n\t/**\n\t * Registers a new optgroup for options\n\t * to be bucketed into.\n\t *\n\t */\n\taddOptionGroup(id:string, data:TomOption) {\n\t\tvar hashed_id;\n\t\tdata[this.settings.optgroupValueField] = id;\n\n\t\tif( hashed_id = this.registerOptionGroup(data) ){\n\t\t\tthis.trigger('optgroup_add', hashed_id, data);\n\t\t}\n\t}\n\n\t/**\n\t * Removes an existing option group.\n\t *\n\t */\n\tremoveOptionGroup(id:string) {\n\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\tdelete this.optgroups[id];\n\t\t\tthis.clearCache();\n\t\t\tthis.trigger('optgroup_remove', id);\n\t\t}\n\t}\n\n\t/**\n\t * Clears all existing option groups.\n\t */\n\tclearOptionGroups() {\n\t\tthis.optgroups = {};\n\t\tthis.clearCache();\n\t\tthis.trigger('optgroup_clear');\n\t}\n\n\t/**\n\t * Updates an option available for selection. If\n\t * it is visible in the selected items or options\n\t * dropdown, it will be re-rendered automatically.\n\t *\n\t */\n\tupdateOption(value:string, data:TomOption) {\n\t\tconst self = this;\n\t\tvar item_new;\n\t\tvar index_item;\n\n\t\tconst value_old\t\t= hash_key(value);\n\t\tconst value_new\t\t= hash_key(data[self.settings.valueField]);\n\n\t\t// sanity checks\n\t\tif( value_old === null ) return;\n\t\tif( !self.options.hasOwnProperty(value_old) ) return;\n\t\tif( typeof value_new !== 'string' ) throw new Error('Value must be set in option data');\n\n\n\t\tconst option\t\t= self.getOption(value_old);\n\t\tconst item\t\t\t= self.getItem(value_old);\n\n\n\t\tdata.$order = data.$order || self.options[value_old].$order;\n\t\tdelete self.options[value_old];\n\n\t\t// invalidate render cache\n\t\t// don't remove existing node yet, we'll remove it after replacing it\n\t\tself.uncacheValue(value_new);\n\n\t\tself.options[value_new] = data;\n\n\t\t// update the option if it's in the dropdown\n\t\tif( option ){\n\t\t\tif( self.dropdown_content.contains(option) ){\n\n\t\t\t\tconst option_new\t= self._render('option', data);\n\t\t\t\treplaceNode(option, option_new);\n\n\t\t\t\tif( self.activeOption === option ){\n\t\t\t\t\tself.setActiveOption(option_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\toption.remove();\n\t\t}\n\n\t\t// update the item if we have one\n\t\tif( item ){\n\t\t\tindex_item = self.items.indexOf(value_old);\n\t\t\tif (index_item !== -1) {\n\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t}\n\n\t\t\titem_new\t= self._render('item', data);\n\n\t\t\tif( item.classList.contains('active') ) addClasses(item_new,'active');\n\n\t\t\treplaceNode( item, item_new);\n\t\t}\n\n\t\t// invalidate last query because we might have updated the sortField\n\t\tself.lastQuery = null;\n\t}\n\n\t/**\n\t * Removes a single option.\n\t *\n\t */\n\tremoveOption(value:string, silent?:boolean):void {\n\t\tconst self = this;\n\t\tvalue = get_hash(value);\n\n\t\tself.uncacheValue(value);\n\n\t\tdelete self.userOptions[value];\n\t\tdelete self.options[value];\n\t\tself.lastQuery = null;\n\t\tself.trigger('option_remove', value);\n\t\tself.removeItem(value, silent);\n\t}\n\n\t/**\n\t * Clears all options.\n\t */\n\tclearOptions() {\n\n\t\tthis.loadedSearches\t\t= {};\n\t\tthis.userOptions\t\t= {};\n\t\tthis.clearCache();\n\t\tvar selected:TomOptions\t= {};\n\t\titerate(this.options,(option,key)=>{\n \t\tif( this.items.indexOf(key as string) >= 0 ){\n\t\t\t\tselected[key] = this.options[key];\n\t\t\t}\n\t\t});\n\n\t\tthis.options = this.sifter.items = selected;\n\t\tthis.lastQuery = null;\n\t\tthis.trigger('option_clear');\n\t}\n\n\n\t/**\n\t * Returns the dom element of the option\n\t * matching the given value.\n\t *\n\t */\n\tgetOption(value:null|string, create:boolean=false):null|HTMLElement {\n\t\tconst hashed = hash_key(value);\n\n\t\tif( hashed !== null && this.options.hasOwnProperty(hashed) ){\n\t\t\tconst option = this.options[hashed];\n\n\t\t\tif( option.$div ){\n\t\t\t\treturn option.$div;\n\t\t\t}\n\n\t\t\tif( create ){\n\t\t\t\treturn this._render('option', option);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the dom element of the next or previous dom element of the same type\n\t * Note: adjacent options may not be adjacent DOM elements (optgroups)\n\t *\n\t */\n\tgetAdjacent( option:null|HTMLElement, direction:number, type:string = 'option' ) : HTMLElement|null{\n\t\tvar self = this, all;\n\n\t\tif( !option ){\n\t\t\treturn null;\n\t\t}\n\n\t\tif( type == 'item' ){\n\t\t\tall\t\t\t= self.controlChildren();\n\t\t}else{\n\t\t\tall\t\t\t= self.dropdown_content.querySelectorAll('[data-selectable]');\n\t\t}\n\n\t\tfor( let i = 0; i < all.length; i++ ){\n\t\t\tif( all[i] != option ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( direction > 0 ){\n\t\t\t\treturn all[i+1] as HTMLElement;\n\t\t\t}\n\n\t\t\treturn all[i-1] as HTMLElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\n\t/**\n\t * Returns the dom element of the item\n\t * matching the given value.\n\t *\n\t */\n\tgetItem(item:string|TomItem|null):null|TomItem {\n\n\t\tif( typeof item == 'object' ){\n\t\t\treturn item;\n\t\t}\n\n\t\tvar value = hash_key(item);\n\t\treturn value !== null\n\t\t\t? this.control.querySelector(`[data-value=\"${addSlashes(value)}\"]`)\n\t\t\t: null;\n\t}\n\n\t/**\n\t * \"Selects\" multiple items at once. Adds them to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItems( values:string|string[], silent?:boolean ):void{\n\t\tvar self = this;\n\n\t\tvar items = Array.isArray(values) ? values : [values];\n\t\titems = items.filter(x => self.items.indexOf(x) === -1);\n\t\tfor (let i = 0, n = items.length; i < n; i++) {\n\t\t\tself.isPending = (i < n - 1);\n\t\t\tself.addItem(items[i], silent);\n\t\t}\n\t}\n\n\t/**\n\t * \"Selects\" an item. Adds it to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItem( value:string, silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change','dropdown_close'];\n\n\t\tdebounce_events(this, events, () => {\n\t\t\tvar item, wasFull;\n\t\t\tconst self = this;\n\t\t \tconst inputMode = self.settings.mode;\n\t\t\tconst hashed = hash_key(value);\n\n\t\t\tif( hashed && self.items.indexOf(hashed) !== -1 ){\n\n\t\t\t\tif( inputMode === 'single' ){\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( inputMode === 'single' || !self.settings.duplicates ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hashed === null || !self.options.hasOwnProperty(hashed)) return;\n\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\n\t\t\titem = self._render('item', self.options[hashed]);\n\n\t\t\tif( self.control.contains(item) ){ // duplicates\n\t\t\t\titem = item.cloneNode(true) as HTMLElement;\n\t\t\t}\n\n\t\t\twasFull = self.isFull();\n\t\t\tself.items.splice(self.caretPos, 0, hashed);\n\t\t\tself.insertAtCaret(item);\n\n\t\t\tif (self.isSetup) {\n\n\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\tif( !self.isPending && self.settings.hideSelected ){\n\t\t\t\t\tlet option = self.getOption(hashed);\n\t\t\t\t\tlet next = self.getAdjacent(option, 1);\n\t\t\t\t\tif( next ){\n\t\t\t\t\t\tself.setActiveOption(next);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// refreshOptions after setActiveOption(),\n\t\t\t\t// otherwise setActiveOption() will be called by refreshOptions() with the wrong value\n\t\t\t\tif( !self.isPending && !self.settings.closeAfterSelect ){\n\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t}\n\n\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\tif( self.settings.closeAfterSelect != false && self.isFull() ){\n\t\t\t\t\tself.close();\n\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\tself.positionDropdown();\n\t\t\t\t}\n\n\t\t\t\tself.trigger('item_add', hashed, item);\n\n\t\t\t\tif (!self.isPending) {\n\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\tself.inputState();\n\t\t\t\tself.refreshState();\n\t\t\t}\n\n\t\t});\n\t}\n\n\t/**\n\t * Removes the selected item matching\n\t * the provided value.\n\t *\n\t */\n\tremoveItem( item:string|TomItem|null=null, silent?:boolean ){\n\t\tconst self\t\t= this;\n\t\titem\t\t\t= self.getItem(item);\n\n\t\tif( !item ) return;\n\n\t\tvar i,idx;\n\t\tconst value\t= item.dataset.value;\n\t\ti = nodeIndex(item);\n\n\t\titem.remove();\n\t\tif( item.classList.contains('active') ){\n\t\t\tidx = self.activeItems.indexOf(item);\n\t\t\tself.activeItems.splice(idx, 1);\n\t\t\tremoveClasses(item,'active');\n\t\t}\n\n\t\tself.items.splice(i, 1);\n\t\tself.lastQuery = null;\n\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\tself.removeOption(value, silent);\n\t\t}\n\n\t\tif (i < self.caretPos) {\n\t\t\tself.setCaret(self.caretPos - 1);\n\t\t}\n\n\t\tself.updateOriginalInput({silent: silent});\n\t\tself.refreshState();\n\t\tself.positionDropdown();\n\t\tself.trigger('item_remove', value, item);\n\n\t}\n\n\t/**\n\t * Invokes the `create` method provided in the\n\t * TomSelect options that should provide the data\n\t * for the new item, given the user input.\n\t *\n\t * Once this completes, it will be added\n\t * to the item list.\n\t *\n\t */\n\tcreateItem( input:null|string=null, triggerDropdown:boolean=true, callback:TomCreateCallback = ()=>{} ):boolean{\n\t\tvar self = this;\n\t\tvar caret = self.caretPos;\n\t\tvar output;\n\t\tinput = input || self.inputValue();\n\n\t\tif (!self.canCreate(input)) {\n\t\t\tcallback();\n\t\t\treturn false;\n\t\t}\n\n\t\tself.lock();\n\n\t\tvar created = false;\n\t\tvar create = (data?:boolean|TomOption) => {\n\t\t\tself.unlock();\n\n\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\tif( typeof value !== 'string' ){\n\t\t\t\treturn callback();\n\t\t\t}\n\n\t\t\tself.setTextboxValue();\n\t\t\tself.addOption(data,true);\n\t\t\tself.setCaret(caret);\n\t\t\tself.addItem(value);\n\t\t\tcallback(data);\n\t\t\tcreated = true;\n\t\t};\n\n\t\tif( typeof self.settings.create === 'function' ){\n\t\t\toutput = self.settings.create.call(this, input, create);\n\t\t}else{\n\t\t\toutput = {\n\t\t\t\t[self.settings.labelField]: input,\n\t\t\t\t[self.settings.valueField]: input,\n\t\t\t};\n\t\t}\n\n\t\tif( !created ){\n\t\t\tcreate(output);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Re-renders the selected item lists.\n\t */\n\trefreshItems() {\n\t\tvar self = this;\n\t\tself.lastQuery = null;\n\n\t\tif (self.isSetup) {\n\t\t\tself.addItems(self.items);\n\t\t}\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Updates all state-dependent attributes\n\t * and CSS classes.\n\t */\n\trefreshState() {\n\t\tconst self = this;\n\n\t\tself.refreshValidityState();\n\n\t\tconst isFull\t= self.isFull();\n\t\tconst isLocked\t= self.isLocked;\n\n\t\tself.wrapper.classList.toggle('rtl',self.rtl);\n\n\n\t\tconst wrap_classList = self.wrapper.classList;\n\n\t\twrap_classList.toggle('focus', self.isFocused)\n\t\twrap_classList.toggle('disabled', self.isDisabled)\n\t\twrap_classList.toggle('required', self.isRequired)\n\t\twrap_classList.toggle('invalid', !self.isValid)\n\t\twrap_classList.toggle('locked', isLocked)\n\t\twrap_classList.toggle('full', isFull)\n\t\twrap_classList.toggle('input-active', self.isFocused && !self.isInputHidden)\n\t\twrap_classList.toggle('dropdown-active', self.isOpen)\n\t\twrap_classList.toggle('has-options', isEmptyObject(self.options) )\n\t\twrap_classList.toggle('has-items', self.items.length > 0);\n\n\t}\n\n\n\t/**\n\t * Update the `required` attribute of both input and control input.\n\t *\n\t * The `required` property needs to be activated on the control input\n\t * for the error to be displayed at the right place. `required` also\n\t * needs to be temporarily deactivated on the input since the input is\n\t * hidden and can't show errors.\n\t */\n\trefreshValidityState() {\n\t\tvar self = this;\n\n\t\tif( !self.input.checkValidity ){\n\t\t\treturn;\n\t\t}\n\n\t\tself.isValid = self.input.checkValidity();\n\t\tself.isInvalid = !self.isValid;\n\t}\n\n\t/**\n\t * Determines whether or not more items can be added\n\t * to the control without exceeding the user-defined maximum.\n\t *\n\t * @returns {boolean}\n\t */\n\tisFull() {\n\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t}\n\n\t/**\n\t * Refreshes the original <select> or <input>\n\t * element to reflect the current state.\n\t *\n\t */\n\tupdateOriginalInput( opts:TomArgObject = {} ){\n\t\tconst self = this;\n\t\tvar option, label;\n\n\t\tconst empty_option = self.input.querySelector('option[value=\"\"]') as HTMLOptionElement;\n\n\t\tif( self.is_select_tag ){\n\n\t\t\tconst selected:HTMLOptionElement[]\t\t= [];\n\t\t\tconst has_selected:number\t\t\t\t= self.input.querySelectorAll('option:checked').length;\n\n\t\t\tfunction AddSelected(option_el:HTMLOptionElement|null, value:string, label:string):HTMLOptionElement{\n\n\t\t\t\tif( !option_el ){\n\t\t\t\t\toption_el = getDom('<option value=\"' + escape_html(value) + '\">' + escape_html(label) + '</option>') as HTMLOptionElement;\n\t\t\t\t}\n\n\t\t\t\t// don't move empty option from top of list\n\t\t\t\t// fixes bug in firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1725293\n\t\t\t\tif( option_el != empty_option ){\n\t\t\t\t\tself.input.append(option_el);\n\t\t\t\t}\n\n\t\t\t\tselected.push(option_el);\n\n\t\t\t\t// marking empty option as selected can break validation\n\t\t\t\t// fixes https://github.com/orchidjs/tom-select/issues/303\n\t\t\t\tif( option_el != empty_option || has_selected > 0 ){\n\t\t\t\t\toption_el.selected = true;\n\t\t\t\t}\n\n\t\t\t\treturn option_el;\n\t\t\t}\n\n\t\t\t// unselect all selected options\n\t\t\tself.input.querySelectorAll('option:checked').forEach((option_el:Element) => {\n\t\t\t\t(<HTMLOptionElement>option_el).selected = false;\n\t\t\t});\n\n\n\t\t\t// nothing selected?\n\t\t\tif( self.items.length == 0 && self.settings.mode == 'single' ){\n\n\t\t\t\tAddSelected(empty_option, \"\", \"\");\n\n\t\t\t// order selected <option> tags for values in self.items\n\t\t\t}else{\n\n\t\t\t\tself.items.forEach((value)=>{\n\t\t\t\t\toption\t\t\t= self.options[value];\n\t\t\t\t\tlabel\t\t\t= option[self.settings.labelField] || '';\n\n\t\t\t\t\tif( selected.includes(option.$option) ){\n\t\t\t\t\t\tconst reuse_opt = self.input.querySelector(`option[value=\"${addSlashes(value)}\"]:not(:checked)`) as HTMLOptionElement;\n\t\t\t\t\t\tAddSelected(reuse_opt, value, label);\n\t\t\t\t\t}else{\n\t\t\t\t\t\toption.$option\t= AddSelected(option.$option, value, label);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tself.input.value = self.getValue() as string;\n\t\t}\n\n\t\tif (self.isSetup) {\n\t\t\tif (!opts.silent) {\n\t\t\t\tself.trigger('change', self.getValue() );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shows the autocomplete dropdown containing\n\t * the available options.\n\t */\n\topen() {\n\t\tvar self = this;\n\n\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\tself.isOpen = true;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'true'});\n\t\tself.refreshState();\n\t\tapplyCSS(self.dropdown,{visibility: 'hidden', display: 'block'});\n\t\tself.positionDropdown();\n\t\tapplyCSS(self.dropdown,{visibility: 'visible', display: 'block'});\n\t\tself.focus();\n\t\tself.trigger('dropdown_open', self.dropdown);\n\t}\n\n\t/**\n\t * Closes the autocomplete dropdown menu.\n\t */\n\tclose(setTextboxValue=true) {\n\t\tvar self = this;\n\t\tvar trigger = self.isOpen;\n\n\t\tif( setTextboxValue ){\n\n\t\t\t// before blur() to prevent form onchange event\n\t\t\tself.setTextboxValue();\n\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.hideInput();\n\t\t\t}\n\t\t}\n\n\t\tself.isOpen = false;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'false'});\n\t\tapplyCSS(self.dropdown,{display: 'none'});\n\t\tif( self.settings.hideSelected ){\n\t\t\tself.clearActiveOption();\n\t\t}\n\t\tself.refreshState();\n\n\t\tif (trigger) self.trigger('dropdown_close', self.dropdown);\n\t}\n\n\t/**\n\t * Calculates and applies the appropriate\n\t * position of the dropdown if dropdownParent = 'body'.\n\t * Otherwise, position is determined by css\n\t */\n\tpositionDropdown(){\n\n\t\tif( this.settings.dropdownParent !== 'body' ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar context\t\t\t= this.control;\n\t\tvar rect\t\t\t= context.getBoundingClientRect();\n\t\tvar top\t\t\t\t= context.offsetHeight + rect.top + window.scrollY;\n\t\tvar left\t\t\t= rect.left + window.scrollX;\n\n\n\t\tapplyCSS(this.dropdown,{\n\t\t\twidth : rect.width + 'px',\n\t\t\ttop : top + 'px',\n\t\t\tleft : left + 'px'\n\t\t});\n\n\t}\n\n\t/**\n\t * Resets / clears all selected items\n\t * from the control.\n\t *\n\t */\n\tclear(silent?:boolean) {\n\t\tvar self = this;\n\n\t\tif (!self.items.length) return;\n\n\t\tvar items = self.controlChildren();\n\t\titerate(items,(item)=>{\n\t\t\tself.removeItem(item,true);\n\t\t});\n\n\t\tself.showInput();\n\t\tif( !silent ) self.updateOriginalInput();\n\t\tself.trigger('clear');\n\t}\n\n\t/**\n\t * A helper method for inserting an element\n\t * at the current caret position.\n\t *\n\t */\n\tinsertAtCaret(el:HTMLElement) {\n\t\tconst self\t\t= this;\n\t\tconst caret\t\t= self.caretPos;\n\t\tconst target\t= self.control;\n\n\t\ttarget.insertBefore(el, target.children[caret]);\n\n\t\tself.setCaret(caret + 1);\n\t}\n\n\t/**\n\t * Removes the current selected item(s).\n\t *\n\t */\n\tdeleteSelection(e:KeyboardEvent):boolean {\n\t\tvar direction, selection, caret, tail;\n\t\tvar self = this;\n\n\t\tdirection = (e && e.keyCode === constants.KEY_BACKSPACE) ? -1 : 1;\n\t\tselection = getSelection(self.control_input);\n\n\n\t\t// determine items that will be removed\n\t\tconst rm_items:TomItem[]\t= [];\n\n\t\tif (self.activeItems.length) {\n\n\t\t\ttail = getTail(self.activeItems, direction);\n\t\t\tcaret = nodeIndex(tail);\n\n\t\t\tif (direction > 0) { caret++; }\n\n\t\t\titerate(self.activeItems, (item) => rm_items.push(item) );\n\n\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\tconst items = self.controlChildren();\n\t\t\tif (direction < 0 && selection.start === 0 && selection.length === 0) {\n\t\t\t\trm_items.push( items[self.caretPos - 1]);\n\n\t\t\t} else if (direction > 0 && selection.start === self.inputValue().length) {\n\t\t\t\trm_items.push(items[self.caretPos]);\n\t\t\t}\n\t\t}\n\n\t\tconst values = rm_items.map(item => item.dataset.value);\n\n\t\t// allow the callback to abort\n\t\tif (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.call(self,values,e) === false)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tpreventDefault(e,true);\n\n\t\t// perform removal\n\t\tif (typeof caret !== 'undefined') {\n\t\t\tself.setCaret(caret);\n\t\t}\n\n\t\twhile( rm_items.length ){\n\t\t\tself.removeItem(rm_items.pop());\n\t\t}\n\n\t\tself.showInput();\n\t\tself.positionDropdown();\n\t\tself.refreshOptions(false);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Selects the previous / next item (depending on the `direction` argument).\n\t *\n\t * > 0 - right\n\t * < 0 - left\n\t *\n\t */\n\tadvanceSelection(direction:number, e?:MouseEvent|KeyboardEvent) {\n\t\tvar last_active, adjacent, self = this;\n\n\t\tif (self.rtl) direction *= -1;\n\t\tif( self.inputValue().length ) return;\n\n\n\t\t// add or remove to active items\n\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) || isKeyDown('shiftKey',e) ){\n\n\t\t\tlast_active\t\t\t= self.getLastActive(direction);\n\t\t\tif( last_active ){\n\n\t\t\t\tif( !last_active.classList.contains('active') ){\n\t\t\t\t\tadjacent\t\t\t= last_active;\n\t\t\t\t}else{\n\t\t\t\t\tadjacent\t\t\t= self.getAdjacent(last_active,direction,'item');\n\t\t\t\t}\n\n\t\t\t// if no active item, get items adjacent to the control input\n\t\t\t}else if( direction > 0 ){\n\t\t\t\tadjacent\t\t\t= self.control_input.nextElementSibling;\n\t\t\t}else{\n\t\t\t\tadjacent\t\t\t= self.control_input.previousElementSibling;\n\t\t\t}\n\n\n\t\t\tif( adjacent ){\n\t\t\t\tif( adjacent.classList.contains('active') ){\n\t\t\t\t\tself.removeActiveItem(last_active);\n\t\t\t\t}\n\t\t\t\tself.setActiveItemClass(adjacent); // mark as last_active !! after removeActiveItem() on last_active\n\t\t\t}\n\n\t\t// move caret to the left or right\n\t\t}else{\n\t\t\tself.moveCaret(direction);\n\t\t}\n\t}\n\n\tmoveCaret(direction:number){}\n\n\t/**\n\t * Get the last active item\n\t *\n\t */\n\tgetLastActive(direction?:number){\n\n\t\tlet last_active = this.control.querySelector('.last-active');\n\t\tif( last_active ){\n\t\t\treturn last_active;\n\t\t}\n\n\n\t\tvar result = this.control.querySelectorAll('.active');\n\t\tif( result ){\n\t\t\treturn getTail(result,direction);\n\t\t}\n\t}\n\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tsetCaret(new_pos:number) {\n\t\tthis.caretPos = this.items.length;\n\t}\n\n\t/**\n\t * Return list of item dom elements\n\t *\n\t */\n\tcontrolChildren():TomItem[]{\n\t\treturn Array.from( this.control.querySelectorAll('[data-ts-item]') ) as TomItem[];\n\t}\n\n\t/**\n\t * Disables user input on the control. Used while\n\t * items are being asynchronously created.\n\t */\n\tlock() {\n\t\tthis.isLocked = true;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Re-enables user input on the control.\n\t */\n\tunlock() {\n\t\tthis.isLocked = false;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Disables user input on the control completely.\n\t * While disabled, it cannot receive focus.\n\t */\n\tdisable() {\n\t\tvar self = this;\n\t\tself.input.disabled\t\t\t\t= true;\n\t\tself.control_input.disabled\t\t= true;\n\t\tself.focus_node.tabIndex\t\t= -1;\n\t\tself.isDisabled\t\t\t\t\t= true;\n\t\tthis.close();\n\t\tself.lock();\n\t}\n\n\t/**\n\t * Enables the control so that it can respond\n\t * to focus and user input.\n\t */\n\tenable() {\n\t\tvar self = this;\n\t\tself.input.disabled\t\t\t\t= false;\n\t\tself.control_input.disabled\t\t= false;\n\t\tself.focus_node.tabIndex\t\t= self.tabIndex;\n\t\tself.isDisabled\t\t\t\t\t= false;\n\t\tself.unlock();\n\t}\n\n\t/**\n\t * Completely destroys the control and\n\t * unbinds all event listeners so that it can\n\t * be garbage collected.\n\t */\n\tdestroy() {\n\t\tvar self = this;\n\t\tvar revertSettings = self.revertSettings;\n\n\t\tself.trigger('destroy');\n\t\tself.off();\n\t\tself.wrapper.remove();\n\t\tself.dropdown.remove();\n\n\t\tself.input.innerHTML = revertSettings.innerHTML;\n\t\tself.input.tabIndex = revertSettings.tabIndex;\n\n\t\tremoveClasses(self.input,'tomselected','ts-hidden-accessible');\n\n\t\tself._destroy();\n\n\t\tdelete self.input.tomselect;\n\t}\n\n\t/**\n\t * A helper method for rendering \"item\" and\n\t * \"option\" templates, given the data.\n\t *\n\t */\n\trender( templateName:TomTemplateNames, data?:any ):null|HTMLElement{\n\n\t\tif( typeof this.settings.render[templateName] !== 'function' ){\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._render(templateName, data);\n\t}\n\n\t/**\n\t * _render() can be called directly when we know we don't want to hit the cache\n\t * return type could be null for some templates, we need https://github.com/microsoft/TypeScript/issues/33014\n\t */\n\t_render( templateName:TomTemplateNames, data?:any ):HTMLElement{\n\t\tvar value = '', id, html;\n\t\tconst self = this;\n\n\t\tif( templateName === 'option' || templateName == 'item' ){\n\t\t\tvalue\t= get_hash(data[self.settings.valueField]);\n\t\t}\n\n\t\t// render markup\n\t\thtml = self.settings.render[templateName].call(this, data, escape_html);\n\n\t\tif( html == null ){\n\t\t\treturn html;\n\t\t}\n\n\t\thtml = getDom( html );\n\n\t\t// add mandatory attributes\n\t\tif (templateName === 'option' || templateName === 'option_create') {\n\n\t\t\tif( data[self.settings.disabledField] ){\n\t\t\t\tsetAttr(html,{'aria-disabled':'true'});\n\t\t\t}else{\n\t\t\t\tsetAttr(html,{'data-selectable': ''});\n\t\t\t}\n\n\t\t}else if (templateName === 'optgroup') {\n\t\t\tid = data.group[self.settings.optgroupValueField];\n\t\t\tsetAttr(html,{'data-group': id});\n\t\t\tif(data.group[self.settings.disabledField]) {\n\t\t\t\tsetAttr(html,{'data-disabled': ''});\n\t\t\t}\n\t\t}\n\n\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\tsetAttr(html,{'data-value': value });\n\n\n\t\t\t// make sure we have some classes if a template is overwritten\n\t\t\tif( templateName === 'item' ){\n\t\t\t\taddClasses(html,self.settings.itemClass);\n\t\t\t\tsetAttr(html,{'data-ts-item':''});\n\t\t\t}else{\n\t\t\t\taddClasses(html,self.settings.optionClass);\n\t\t\t\tsetAttr(html,{\n\t\t\t\t\trole:'option',\n\t\t\t\t\tid:data.$id\n\t\t\t\t});\n\n\t\t\t\t// update cache\n\t\t\t\tself.options[value].$div = html;\n\t\t\t}\n\n\n\t\t}\n\n\t\treturn html;\n\t}\n\n\n\t/**\n\t * Clears the render cache for a template. If\n\t * no template is given, clears all render\n\t * caches.\n\t *\n\t */\n\tclearCache():void{\n\n\t\titerate(this.options, (option, value)=>{\n\t\t\tif( option.$div ){\n\t\t\t\toption.$div.remove();\n\t\t\t\tdelete option.$div;\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Removes a value from item and option caches\n\t *\n\t */\n\tuncacheValue(value:string){\n\n\t\tconst option_el\t\t\t= this.getOption(value);\n\t\tif( option_el ) option_el.remove();\n\n\t}\n\n\t/**\n\t * Determines whether or not to display the\n\t * create item prompt, given a user input.\n\t *\n\t */\n\tcanCreate( input:string ):boolean {\n\t\treturn this.settings.create && (input.length > 0) && (this.settings.createFilter as TomCreateFilter ).call(this, input);\n\t}\n\n\n\t/**\n\t * Wraps this.`method` so that `new_fn` can be invoked 'before', 'after', or 'instead' of the original method\n\t *\n\t * this.hook('instead','onKeyDown',function( arg1, arg2 ...){\n\t *\n\t * });\n\t */\n\thook( when:string, method:string, new_fn:any ){\n\t\tvar self = this;\n\t\tvar orig_method = self[method];\n\n\n\t\tself[method] = function(){\n\t\t\tvar result, result_new;\n\n\t\t\tif( when === 'after' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\tresult_new = new_fn.apply(self, arguments );\n\n\t\t\tif( when === 'instead' ){\n\t\t\t\treturn result_new;\n\t\t\t}\n\n\t\t\tif( when === 'before' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t}\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 */\n\ntype TSettings = {\n\t[key:string]:any\n}\n\ntype TPlugins = {\n\tnames: string[],\n\tsettings: TSettings,\n\trequested: {[key:string]:boolean},\n\tloaded: {[key:string]:any}\n};\n\nexport type TPluginItem = {name:string,options:{}};\nexport type TPluginHash = {[key:string]:{}};\n\n\n\n\nexport default function MicroPlugin(Interface: any ){\n\n\tInterface.plugins = {};\n\n\treturn class extends Interface{\n\n\t\tpublic plugins:TPlugins = {\n\t\t\tnames : [],\n\t\t\tsettings : {},\n\t\t\trequested : {},\n\t\t\tloaded : {}\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tstatic define(name:string, fn:(this:any,settings:TSettings)=>any){\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn' : fn\n\t\t\t};\n\t\t}\n\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t * ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t * [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t * {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {array|object} plugins\n\t\t */\n\t\tinitializePlugins(plugins:string[]|TPluginItem[]|TPluginHash) {\n\t\t\tvar key, name;\n\t\t\tconst self = this;\n\t\t\tconst queue:string[] = [];\n\n\t\t\tif (Array.isArray(plugins)) {\n\t\t\t\tplugins.forEach((plugin:string|TPluginItem)=>{\n\t\t\t\t\tif (typeof plugin === 'string') {\n\t\t\t\t\t\tqueue.push(plugin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugin.name] = plugin.options;\n\t\t\t\t\t\tqueue.push(plugin.name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile( name = queue.shift() ){\n\t\t\t\tself.require(name);\n\t\t\t}\n\t\t}\n\n\t\tloadPlugin(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' + name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t */\n\t\trequire(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t}\n\n\t};\n\n}\n","import TomSelect from './tom-select';\n\nimport change_listener from './plugins/change_listener/plugin';\nimport checkbox_options from './plugins/checkbox_options/plugin';\nimport clear_button from './plugins/clear_button/plugin';\nimport drag_drop from './plugins/drag_drop/plugin';\nimport dropdown_header from './plugins/dropdown_header/plugin';\nimport caret_position from './plugins/caret_position/plugin';\nimport dropdown_input from './plugins/dropdown_input/plugin';\nimport input_autogrow from './plugins/input_autogrow/plugin';\nimport no_backspace_delete from './plugins/no_backspace_delete/plugin';\nimport no_active_items from './plugins/no_active_items/plugin';\nimport optgroup_columns from './plugins/optgroup_columns/plugin';\nimport remove_button from './plugins/remove_button/plugin';\nimport restore_on_backspace from './plugins/restore_on_backspace/plugin';\nimport virtual_scroll from './plugins/virtual_scroll/plugin';\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 default TomSelect;\n","/**\n * Plugin: \"change_listener\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { addEvent } from '../../utils';\n\nexport default function(this:TomSelect) {\n\taddEvent(this.input,'change',()=>{\n\t\tthis.sync();\n\t});\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { preventDefault, hash_key } from '../../utils';\nimport { getDom } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_onOptionSelect = self.onOptionSelect;\n\n\tself.settings.hideSelected = false;\n\n\n\t// update the checkbox for an option\n\tvar UpdateCheckbox = function(option:HTMLElement){\n\t\tsetTimeout(()=>{\n\t\t\tvar checkbox = option.querySelector('input') as HTMLInputElement;\n\t\t\tif( option.classList.contains('selected') ){\n\t\t\t\tcheckbox.checked = true;\n\t\t\t}else{\n\t\t\t\tcheckbox.checked = false;\n\t\t\t}\n\t\t},1);\n\t};\n\n\t// add checkbox to option template\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_option = self.settings.render.option;\n\n\t\tself.settings.render.option = (data, escape_html) => {\n\t\t\tvar rendered = getDom(orig_render_option.call(self, data, escape_html));\n\t\t\tvar checkbox = document.createElement('input');\n\t\t\tcheckbox.addEventListener('click',function(evt){\n\t\t\t\tpreventDefault(evt);\n\t\t\t});\n\n\t\t\tcheckbox.type = 'checkbox';\n\t\t\tconst hashed = hash_key(data[self.settings.valueField]);\n\n\n\t\t\tif( hashed && self.items.indexOf(hashed) > -1 ){\n\t\t\t\tcheckbox.checked = true;\n\t\t\t}\n\n\t\t\trendered.prepend(checkbox);\n\t\t\treturn rendered;\n\t\t};\n\t});\n\n\t// uncheck when item removed\n\tself.on('item_remove',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\toption.classList.remove('selected'); // selected class won't be removed yet\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\t// check when item added\n\tself.on('item_add',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\n\t// remove items when selected option is clicked\n\tself.hook('instead','onOptionSelect',( evt:KeyboardEvent, option:HTMLElement )=>{\n\n\t\tif( option.classList.contains('selected') ){\n\t\t\toption.classList.remove('selected')\n\t\t\tself.removeItem(option.dataset.value);\n\t\t\tself.refreshOptions();\n\t\t\tpreventDefault(evt,true);\n\t\t\treturn;\n }\n\n\t\torig_onOptionSelect.call(self, evt, option);\n\n\t\tUpdateCheckbox(option);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { CBOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\tclassName: 'clear-button',\n\t\ttitle: 'Clear All',\n\t\thtml: (data:CBOptions) => {\n\t\t\treturn `<div class=\"${data.className}\" title=\"${data.title}\">&times;</div>`;\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar button = getDom(options.html(options));\n\t\tbutton.addEventListener('click',(evt)=>{\n\n\t\t\tif( self.isDisabled ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.clear();\n\n\t\t\tif( self.settings.mode === 'single' && self.settings.allowEmptyOption ){\n\t\t\t\tself.addItem('');\n\t\t\t}\n\n\t\t\tevt.preventDefault();\n\t\t\tevt.stopPropagation();\n\t\t});\n\t\tself.control.appendChild(button);\n\t});\n\n};\n","/**\n * Plugin: \"drag_drop\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tif (!$.fn.sortable) throw new Error('The \"drag_drop\" plugin requires jQuery UI \"sortable\".');\n\tif (self.settings.mode !== 'multi') return;\n\n\tvar orig_lock\t\t= self.lock;\n\tvar orig_unlock\t\t= self.unlock;\n\n\tself.hook('instead','lock',()=>{\n\t\tvar sortable = $(self.control).data('sortable');\n\t\tif (sortable) sortable.disable();\n\t\treturn orig_lock.call(self);\n\t});\n\n\tself.hook('instead','unlock',()=>{\n\t\tvar sortable = $(self.control).data('sortable');\n\t\tif (sortable) sortable.enable();\n\t\treturn orig_unlock.call(self);\n\t});\n\n\tself.on('initialize',()=>{\n\t\tvar $control = $(self.control).sortable({\n\t\t\titems: '[data-value]',\n\t\t\tforcePlaceholderSize: true,\n\t\t\tdisabled: self.isLocked,\n\t\t\tstart: (e, ui) => {\n\t\t\t\tui.placeholder.css('width', ui.helper.css('width'));\n\t\t\t\t$control.css({overflow: 'visible'});\n\t\t\t},\n\t\t\tstop: ()=>{\n\t\t\t\t$control.css({overflow: 'hidden'});\n\n\t\t\t\tvar values:string[] = [];\n\t\t\t\t$control.children('[data-value]').each(function(this:HTMLElement){\n\t\t\t\t\tif( this.dataset.value ) values.push(this.dataset.value);\n\t\t\t\t});\n\n\t\t\t\tself.setValue(values);\n\t\t\t}\n\t\t});\n\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { preventDefault } from '../../utils';\nimport { DHOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:DHOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttitle : 'Untitled',\n\t\theaderClass : 'dropdown-header',\n\t\ttitleRowClass : 'dropdown-header-title',\n\t\tlabelClass : 'dropdown-header-label',\n\t\tcloseClass : 'dropdown-header-close',\n\n\t\thtml: (data:DHOptions) => {\n\t\t\treturn (\n\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t'<a class=\"' + data.closeClass + '\">&times;</a>' +\n\t\t\t\t\t'</div>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar header = getDom(options.html(options));\n\n\t\tvar close_link = header.querySelector('.'+options.closeClass);\n\t\tif( close_link ){\n\t\t\tclose_link.addEventListener('click',(evt)=>{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\tself.close();\n\t\t\t});\n\t\t}\n\n\t\tself.dropdown.insertBefore(header, self.dropdown.firstChild);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { nodeIndex, removeClasses } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tself.hook('instead','setCaret',(new_pos:number) => {\n\n\t\tif( self.settings.mode === 'single' || !self.control.contains(self.control_input) ) {\n\t\t\tnew_pos = self.items.length;\n\t\t} else {\n\t\t\tnew_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n\t\t\tif( new_pos != self.caretPos && !self.isPending ){\n\n\t\t\t\tself.controlChildren().forEach((child,j) => {\n\t\t\t\t\tif( j < new_pos ){\n\t\t\t\t\t\tself.control_input.insertAdjacentElement('beforebegin', child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.control.appendChild( child );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tself.caretPos = new_pos;\n\t});\n\n\tself.hook('instead','moveCaret',(direction:number) => {\n\n\t\tif( !self.isFocused ) return;\n\n\t\t// move caret before or after selected items\n\t\tconst last_active\t\t= self.getLastActive(direction);\n\t\tif( last_active ){\n\t\t\tconst idx = nodeIndex(last_active);\n\t\t\tself.setCaret(direction > 0 ? idx + 1: idx);\n\t\t\tself.setActiveItem();\n\t\t\tremoveClasses(last_active as HTMLElement,'last-active');\n\n\t\t// move caret left or right of current position\n\t\t}else{\n\t\t\tself.setCaret(self.caretPos + direction);\n\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport * as constants from '../../constants';\nimport { getDom, addClasses } from '../../vanilla';\nimport { addEvent, preventDefault } from '../../utils';\n\n\nexport default function(this:TomSelect) {\n\tconst self = this;\n\n\tself.settings.shouldOpen = true; // make sure the input is shown even if there are no options to display in the dropdown\n\n\tself.hook('before','setup',()=>{\n\t\tself.focus_node\t\t= self.control;\n\n\t\taddClasses( self.control_input, 'dropdown-input');\n\n\t \tconst div = getDom('<div class=\"dropdown-input-wrap\">');\n\t\tdiv.append(self.control_input);\n\t\tself.dropdown.insertBefore(div, self.dropdown.firstChild);\n\n\t\t// set a placeholder in the select control\n\t\tconst placeholder = getDom('<input class=\"items-placeholder\" tabindex=\"-1\" />') as HTMLInputElement;\n\t\tplaceholder.placeholder = self.settings.placeholder ||'';\n\t\tself.control.append(placeholder);\n\n\t});\n\n\n\tself.on('initialize',()=>{\n\n\t\t// set tabIndex on control to -1, otherwise [shift+tab] will put focus right back on control_input\n\t\tself.control_input.addEventListener('keydown',(evt:KeyboardEvent) =>{\n\t\t//addEvent(self.control_input,'keydown' as const,(evt:KeyboardEvent) =>{\n\t\t\tswitch( evt.keyCode ){\n\t\t\t\tcase constants.KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\tpreventDefault(evt,true);\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\t\t\t\tcase constants.KEY_TAB:\n\t\t\t\t\tself.focus_node.tabIndex = -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn self.onKeyDown.call(self,evt);\n\t\t});\n\n\t\tself.on('blur',()=>{\n\t\t\tself.focus_node.tabIndex = self.isDisabled ? -1 : self.tabIndex;\n\t\t});\n\n\n\t\t// give the control_input focus when the dropdown is open\n\t\tself.on('dropdown_open',() =>{\n\t\t\tself.control_input.focus();\n\t\t});\n\n\t\t// prevent onBlur from closing when focus is on the control_input\n\t\tconst orig_onBlur = self.onBlur;\n\t\tself.hook('instead','onBlur',(evt?:FocusEvent)=>{\n\t\t\tif( evt && evt.relatedTarget == self.control_input ) return;\n\t\t\treturn orig_onBlur.call(self);\n\t\t});\n\n\t\taddEvent(self.control_input,'blur', () => self.onBlur() );\n\n\t\t// return focus to control to allow further keyboard input\n\t\tself.hook('before','close',() =>{\n\n\t\t\tif( !self.isOpen ) return;\n\t\t\tself.focus_node.focus();\n\t\t});\n\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { addEvent } from '../../utils';\n\nexport default function(this:TomSelect) {\n\tvar self\t\t\t\t\t= this;\n\n\tself.on('initialize',()=>{\n\n\n\t\tvar test_input\t\t\t\t= document.createElement('span');\n\t\tvar control\t\t\t\t\t= self.control_input;\n\t\ttest_input.style.cssText\t= 'position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ';\n\n\t\tself.wrapper.appendChild(test_input);\n\n\n\t\tvar transfer_styles\t\t\t= [ 'letterSpacing', 'fontSize', 'fontFamily', 'fontWeight', 'textTransform' ];\n\n\t\tfor( const style_name of transfer_styles ){\n\t\t\t// @ts-ignore TS7015 https://stackoverflow.com/a/50506154/697576\n\t\t\ttest_input.style[style_name] = control.style[style_name];\n\t\t}\n\n\n\t\t/**\n\t\t * Set the control width\n\t\t *\n\t\t */\n\t\tvar resize = ()=>{\n\t\t\tif( self.items.length > 0 ){\n\t\t\t\ttest_input.textContent\t= control.value;\n\t\t\t\tcontrol.style.width\t\t= test_input.clientWidth+'px';\n\t\t\t}else{\n\t\t\t\tcontrol.style.width\t\t= '';\n\t\t\t}\n\n\t\t};\n\n\t\tresize();\n\t\tself.on('update item_add item_remove',resize);\n\t\taddEvent(control,'input', resize );\n\t\taddEvent(control,'keyup', resize );\n\t\taddEvent(control,'blur', resize );\n\t\taddEvent(control,'update', resize );\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_deleteSelection = self.deleteSelection;\n\n\tthis.hook('instead','deleteSelection',(evt:KeyboardEvent) => {\n\n\t\tif( self.activeItems.length ){\n\t\t\treturn orig_deleteSelection.call(self, evt);\n\t\t}\n\n\t\treturn false;\n\t});\n\n};\n","/**\n * Plugin: \"no_active_items\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tthis.hook('instead','setActiveItem',() => {});\n\tthis.hook('instead','selectAll',() => {});\n};\n","/**\n * Plugin: \"optgroup_columns\" (Tom Select.js)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport * as constants from '../../constants';\nimport { parentMatch, nodeIndex } from '../../vanilla';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\tvar orig_keydown = self.onKeyDown;\n\n\tself.hook('instead','onKeyDown',(evt:KeyboardEvent)=>{\n\t\tvar index, option, options, optgroup;\n\n\t\tif( !self.isOpen || !(evt.keyCode === constants.KEY_LEFT || evt.keyCode === constants.KEY_RIGHT)) {\n\t\t\treturn orig_keydown.call(self,evt);\n\t\t}\n\n\t\toptgroup\t\t\t= parentMatch(self.activeOption,'[data-group]');\n\t\tindex\t\t\t\t= nodeIndex(self.activeOption,'[data-selectable]');\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( evt.keyCode === constants.KEY_LEFT ){\n\t\t\toptgroup = optgroup.previousSibling;\n\t\t} else {\n\t\t\toptgroup = optgroup.nextSibling;\n\t\t}\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\toptions\t\t\t\t= (<HTMLOptGroupElement>optgroup).querySelectorAll('[data-selectable]');\n\t\toption\t\t\t\t= options[ Math.min(options.length - 1, index) ] as HTMLElement;\n\n\t\tif( option ){\n\t\t\tself.setActiveOption(option);\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"remove_button\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { escape_html, preventDefault, addEvent } from '../../utils';\nimport { TomOption } from '../../types/index';\nimport { RBOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:RBOptions) {\n\n\tconst options = Object.assign({\n\t\t\tlabel : '&times;',\n\t\t\ttitle : 'Remove',\n\t\t\tclassName : 'remove',\n\t\t\tappend : true\n\t\t}, userOptions);\n\n\n\t//options.className = 'remove-single';\n\tvar self\t\t\t= this;\n\n\t// override the render method to add remove button to each item\n\tif( !options.append ){\n\t\treturn;\n\t}\n\n\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\n\t\t\tvar rendered = getDom(orig_render_item.call(self, data, escape));\n\n\t\t\tvar close_button = getDom(html);\n\t\t\trendered.appendChild(close_button);\n\n\t\t\taddEvent(close_button,'mousedown',(evt) => {\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t});\n\n\t\t\taddEvent(close_button,'click',(evt) => {\n\n\t\t\t\t// propagating will trigger the dropdown to show for single mode\n\t\t\t\tpreventDefault(evt,true);\n\n\t\t\t\tif (self.isLocked) return;\n\n\t\t\t\tvar value = rendered.dataset.value;\n\t\t\t\tself.removeItem(value);\n\t\t\t\tself.refreshOptions(false);\n\t\t\t\tself.inputState();\n\t\t\t});\n\n\t\t\treturn rendered;\n\t\t};\n\n\t});\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 */\nimport TomSelect from '../../tom-select';\nimport { TomOption } from '../../types/index';\n\ntype TPluginOptions = {\n\ttext?:(option:TomOption)=>string,\n};\n\nexport default function(this:TomSelect, userOptions:TPluginOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttext: (option:TomOption) => {\n\t\t\treturn option[self.settings.labelField];\n\t\t}\n\t},userOptions);\n\n\tself.on('item_remove',function(value:string){\n\t\tif( !self.isFocused ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.control_input.value.trim() === '' ){\n\t\t\tvar option = self.options[value];\n\t\t\tif( option ){\n\t\t\t\tself.setTextboxValue(options.text.call(self, option));\n\t\t\t}\n\t\t}\n\t});\n\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { TomOption } from '../../types/index';\nimport { addClasses } from '../../vanilla';\n\nexport default function(this:TomSelect) {\n\tconst self\t\t\t\t\t\t\t= this;\n\tconst orig_canLoad\t\t\t\t\t= self.canLoad;\n\tconst orig_clearActiveOption\t\t= self.clearActiveOption;\n\tconst orig_loadCallback\t\t\t\t= self.loadCallback;\n\n\tvar pagination:{[key:string]:any}\t= {};\n\tvar dropdown_content:HTMLElement;\n\tvar loading_more\t\t\t\t\t= false;\n\tvar load_more_opt:HTMLElement;\n\n\n\tif( !self.settings.shouldLoadMore ){\n\n\t\t// return true if additional results should be loaded\n\t\tself.settings.shouldLoadMore = function():boolean{\n\n\t\t\tconst scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);\n\t\t\tif( scroll_percent > 0.9 ){\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif( self.activeOption ){\n\t\t\t\tvar selectable\t= self.selectable();\n\t\t\t\tvar index\t\t= [...selectable].indexOf(self.activeOption);\n\t\t\t\tif( index >= (selectable.length-2) ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\n\tif( !self.settings.firstUrl ){\n\t\tthrow 'virtual_scroll plugin requires a firstUrl() method';\n\t\treturn;\n\t}\n\n\n\t// in order for virtual scrolling to work,\n\t// options need to be ordered the same way they're returned from the remote data source\n\tself.settings.sortField\t\t\t= [{field:'$order'},{field:'$score'}];\n\n\n\t// can we load more results for given query?\n\tfunction canLoadMore(query:string):boolean{\n\n\t\tif( typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions ){\n\t\t\treturn false;\n\t\t}\n\n\t\tif( (query in pagination) && pagination[query] ){\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\t// set the next url that will be\n\tself.setNextUrl = function(value:string,next_url:any):void{\n\t\tpagination[value] = next_url;\n\t};\n\n\t// getUrl() to be used in settings.load()\n\tself.getUrl = function(query:string):any{\n\n\t\tif( query in pagination ){\n\t\t\tconst next_url = pagination[query];\n\t\t\tpagination[query] = false;\n\t\t\treturn next_url;\n\t\t}\n\n\t\t// if the user goes back to a previous query\n\t\t// we need to load the first page again\n\t\tpagination = {};\n\n\t\treturn self.settings.firstUrl.call(self,query);\n\t};\n\n\n\t// don't clear the active option (and cause unwanted dropdown scroll)\n\t// while loading more results\n\tself.hook('instead','clearActiveOption',()=>{\n\n\t\tif( loading_more ){\n\t\t\treturn;\n\t\t}\n\n\t\treturn orig_clearActiveOption.call(self);\n\t});\n\n\t// override the canLoad method\n\tself.hook('instead','canLoad',(query:string)=>{\n\n\t\t// first time the query has been seen\n\t\tif( !(query in pagination) ){\n\t\t\treturn orig_canLoad.call(self,query);\n\t\t}\n\n\t\treturn canLoadMore(query);\n\t});\n\n\n\t// wrap the load\n\tself.hook('instead','loadCallback',( options:TomOption[], optgroups:TomOption[])=>{\n\n\t\tif( !loading_more ){\n\t\t\tself.clearOptions();\n\t\t}else if( load_more_opt && options.length > 0 ){\n\t\t\tload_more_opt.dataset.value\t\t= options[0][self.settings.valueField];\n\t\t}\n\n\t\torig_loadCallback.call( self, options, optgroups);\n\n\t\tloading_more = false;\n\t});\n\n\n\t// add templates to dropdown\n\t//\tloading_more if we have another url in the queue\n\t//\tno_more_results if we don't have another url in the queue\n\tself.hook('after','refreshOptions',()=>{\n\n\t\tconst query\t\t= self.lastValue;\n\t\tvar option;\n\n\t\tif( canLoadMore(query) ){\n\t\t\toption = self.render('loading_more',{query:query});\n\t\t\tif( option ){\n\t\t\t\toption.setAttribute('data-selectable',''); // so that navigating dropdown with [down] keypresses can navigate to this node\n\t\t\t\tload_more_opt = option;\n\t\t\t}\n\n\t\t}else if( (query in pagination) && !dropdown_content.querySelector('.no-results') ){\n\t\t\toption = self.render('no_more_results',{query:query});\n\t\t}\n\n\t\tif( option ){\n\t\t\taddClasses(option,self.settings.optionClass);\n\t\t\tdropdown_content.append( option );\n\t\t}\n\n\t});\n\n\n\t// add scroll listener and default templates\n\tself.on('initialize',()=>{\n\t\tdropdown_content = self.dropdown_content;\n\n\t\t// default templates\n\t\tself.settings.render = Object.assign({}, {\n\t\t\tloading_more:function(){\n\t\t\t\treturn `<div class=\"loading-more-results\">Loading more results ... </div>`;\n\t\t\t},\n\t\t\tno_more_results:function(){\n\t\t\t\treturn `<div class=\"no-more-results\">No more results</div>`;\n\t\t\t}\n\t\t},self.settings.render);\n\n\n\t\t// watch dropdown content scroll position\n\t\tdropdown_content.addEventListener('scroll',function(){\n\n\t\t\tif( !self.settings.shouldLoadMore.call(self) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true\n\t\t\tif( !canLoadMore(self.lastValue) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// don't call load() too much\n\t\t\tif( loading_more ) return;\n\n\n\t\t\tloading_more = true;\n\t\t\tself.load.call(self,self.lastValue);\n\t\t});\n\t});\n\n};\n"],"names":["forEvents","events","callback","split","forEach","event","MicroEvent","constructor","_events","on","fct","this","push","off","n","arguments","length","splice","indexOf","trigger","args","self","apply","latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","longest","a","Math","max","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","unshift","diacriticRegexPoints","regex","undefined","diacritics","code_range","i","diacritic","String","fromCharCode","latin","patt","match","latin_chars","sort","b","pattern","map","sub_pat","l","hasOwnProperty","generateDiacritics","part","no_accent","composed_part","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","escape_regex","propToArray","key","Array","isArray","iterate","object","cmp","Sifter","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","implicit_score","sort_empty","sort_flds","multipliers","bind","get_field","id","direction","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","_","fn_sort","limit","getDom","jquery","HTMLElement","isHtmlString","div","document","createElement","innerHTML","firstChild","querySelector","arg","triggerEvent","dom_el","event_name","createEvent","initEvent","dispatchEvent","applyCSS","css","style","addClasses","elmts","classes","norm_classes","classesArray","castAsArray","el","cls","classList","add","removeClasses","remove","_classes","concat","Boolean","parentMatch","target","selector","wrapper","contains","matches","parentNode","getTail","list","nodeIndex","amongst","nodeName","previousElementSibling","setAttr","attrs","val","attr","removeAttribute","setAttribute","replaceNode","existing","replacement","replaceChild","highlight","element","highlightRecursive","node","nodeType","spannode","className","middlebit","splitText","index","middleclone","cloneNode","appendChild","highlightText","childNodes","test","tagName","highlightChildren","KEY_SHORTCUT","navigator","userAgent","optgroups","plugins","delimiter","splitOn","persist","create","createOnBlur","createFilter","openOnFocus","shouldOpen","maxOptions","maxItems","hideSelected","duplicates","addPrecedence","selectOnTab","preload","allowEmptyOption","loadThrottle","loadingClass","dataAttr","optgroupField","valueField","labelField","disabledField","optgroupLabelField","optgroupValueField","lockOptgroupOrder","sortField","searchField","searchConjunction","mode","wrapperClass","controlClass","dropdownClass","dropdownContentClass","itemClass","optionClass","dropdownParent","controlInput","copyClassesToDropdown","placeholder","hidePlaceholder","shouldLoad","render","hash_key","get_hash","escape_html","loadDebounce","fn","delay","timeout","loading","clearTimeout","setTimeout","loadedSearches","call","debounce_events","types","type","event_args","preventDefault","evt","stop","stopPropagation","addEvent","addEventListener","isKeyDown","key_name","altKey","ctrlKey","shiftKey","metaKey","getId","existing_id","getAttribute","addSlashes","append","parent","getSettings","settings_user","defaults","attr_data","field_label","field_value","field_disabled","field_optgroup","field_optgroup_label","field_optgroup_value","tag_name","option","textContent","optionsMap","group_count","readData","addOption","settings_element","dataset","json","JSON","parse","group","arr","option_data","disabled","$option","selected","hasAttribute","children","child","optgroup","optgroup_data","data_raw","opt","values","init_textbox","instance_i","TomSelect","Interface","requested","loaded","initializePlugins","queue","plugin","require","loadPlugin","Error","MicroPlugin","input_arg","user_settings","dir","control_input","dropdown","control","dropdown_content","focus_node","order","tabIndex","is_select_tag","rtl","inputId","_destroy","sifter","isOpen","isDisabled","isRequired","isInvalid","isValid","isLocked","isFocused","isInputHidden","isSetup","ignoreFocus","hasOptions","currentResults","lastValue","caretPos","activeOption","activeItems","userOptions","tomselect","window","getComputedStyle","getPropertyValue","required","setupCallbacks","setupTemplates","_render","inputMode","setup","passive_event","passive","listboxId","role","control_id","escapeQuery","label","label_click","focus","for","label_id","width","classes_plugins","multiple","load","onOptionSelect","target_match","onItemSelect","onClick","e","onKeyDown","onKeyPress","onInput","positionDropdown","onBlur","onFocus","onPaste","doc_mousedown","composedPath","blur","inputState","win_scroll","removeEventListener","revertSettings","insertAdjacentElement","sync","refreshState","updateOriginalInput","refreshItems","close","disable","enable","onChange","setupOptions","addOptions","registerOptionGroup","templates","escape","callbacks","get_settings","setValue","lastQuery","clearActiveItems","onMouseDown","pastedText","inputValue","splitInput","piece","createItem","character","keyCode","which","constants","selectAll","open","next","getAdjacent","setActiveOption","prev","canSelect","advanceSelection","deleteSelection","refreshOptions","wasFocused","showInput","hasFocus","deactivate","setActiveItem","setCaret","parentElement","closeAfterSelect","addItem","canLoad","loadCallback","clearActiveOption","setTextboxValue","getValue","silent","clear","addItems","setMaxItems","eventName","begin","end","swap","last","getLastActive","prototype","setActiveItemClass","removeActiveItem","hideInput","last_active","idx","scrollToOption","behavior","content","height_menu","clientHeight","scrollTop","height_item","offsetHeight","y","getBoundingClientRect","top","scroll","scrollBehavior","controlChildren","toggle","offsetWidth","getSearchOptions","calculateScore","hashed","triggerDropdown","j","k","html","has_create_option","active_value","active_group","groups","groups_order","elements","results","active_option","show_dropdown","closest","min","opt_value","option_el","getOption","includes","createDocumentFragment","$id","$order","group_options","header","group_html","querySelectorAll","tok","add_template","template","insertBefore","canCreate","active_index","selectable","user_created","dat","registerOption","addOptionGroup","hashed_id","removeOptionGroup","clearCache","clearOptionGroups","updateOption","item_new","index_item","value_old","value_new","getItem","uncacheValue","option_new","removeOption","removeItem","clearOptions","$div","all","x","isPending","wasFull","isFull","insertAtCaret","output","caret","lock","created","unlock","refreshValidityState","wrap_classList","checkValidity","opts","empty_option","has_selected","AddSelected","visibility","display","context","rect","scrollY","left","scrollX","selection","tail","start","selectionStart","selectionEnd","rm_items","onDelete","pop","adjacent","nextElementSibling","moveCaret","new_pos","from","destroy","templateName","hook","when","method","new_fn","orig_method","result_new","define","orig_onOptionSelect","UpdateCheckbox","checkbox","checked","orig_render_option","rendered","prepend","title","button","$","sortable","orig_lock","orig_unlock","$control","forcePlaceholderSize","ui","helper","overflow","each","headerClass","titleRowClass","labelClass","closeClass","close_link","orig_onBlur","relatedTarget","test_input","cssText","style_name","resize","clientWidth","orig_deleteSelection","orig_keydown","previousSibling","nextSibling","orig_render_item","close_button","text","orig_canLoad","orig_clearActiveOption","orig_loadCallback","load_more_opt","pagination","loading_more","shouldLoadMore","scrollHeight","firstUrl","canLoadMore","setNextUrl","next_url","getUrl","no_more_results"],"mappings":"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"}
1
+ {"version":3,"file":"tom-select.complete.min.js","sources":["../../src/contrib/microevent.ts","../../node_modules/@orchidjs/sifter/lib/diacritics.ts","../../node_modules/@orchidjs/sifter/lib/utils.ts","../../node_modules/@orchidjs/sifter/lib/sifter.ts","../../src/vanilla.ts","../../src/contrib/highlight.ts","../../src/constants.ts","../../src/defaults.ts","../../src/utils.ts","../../src/getSettings.ts","../../src/tom-select.ts","../../src/contrib/microplugin.ts","../../src/tom-select.complete.ts","../../src/plugins/change_listener/plugin.ts","../../src/plugins/checkbox_options/plugin.ts","../../src/plugins/clear_button/plugin.ts","../../src/plugins/drag_drop/plugin.ts","../../src/plugins/dropdown_header/plugin.ts","../../src/plugins/caret_position/plugin.ts","../../src/plugins/dropdown_input/plugin.ts","../../src/plugins/input_autogrow/plugin.ts","../../src/plugins/no_backspace_delete/plugin.ts","../../src/plugins/no_active_items/plugin.ts","../../src/plugins/optgroup_columns/plugin.ts","../../src/plugins/remove_button/plugin.ts","../../src/plugins/restore_on_backspace/plugin.ts","../../src/plugins/virtual_scroll/plugin.ts"],"sourcesContent":["/**\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\ntype TCallback = (...args:any) => any;\n\n/**\n * Execute callback for each event in space separated list of event names\n *\n */\nfunction forEvents(events:string,callback:(event:string)=>any){\n\tevents.split(/\\s+/).forEach((event) =>{\n\t\tcallback(event);\n\t});\n}\n\nexport default class MicroEvent{\n\n\tpublic _events: {[key:string]:TCallback[]};\n\n\tconstructor(){\n\t\tthis._events = {};\n\t}\n\n\ton(events:string, fct:TCallback){\n\t\tforEvents(events,(event) => {\n\t\t\tthis._events[event] = this._events[event] || [];\n\t\t\tthis._events[event].push(fct);\n\t\t});\n\t}\n\n\toff(events:string, fct:TCallback){\n\t\tvar n = arguments.length;\n\t\tif( n === 0 ){\n\t\t\tthis._events = {};\n\t\t\treturn;\n\t\t}\n\n\t\tforEvents(events,(event) => {\n\n\t\t\tif (n === 1) return delete this._events[event];\n\n\t\t\tif (event in this._events === false) return;\n\t\t\tthis._events[event].splice(this._events[event].indexOf(fct), 1);\n\t\t});\n\t}\n\n\ttrigger(events:string, ...args:any){\n\t\tvar self = this;\n\n\t\tforEvents(events,(event) => {\n\t\t\tif(event in self._events === false) return;\n\t\t\tfor( let fct of self._events[event] ){\n\t\t\t\tfct.apply(self, args );\n\t\t\t}\n\t\t});\n\t}\n};\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { escape_regex } from './utils.ts';\n\ntype TDiacraticList = {[key:string]:string};\n\n// https://github.com/andrewrk/node-diacritics/blob/master/index.js\n\nvar latin_pat:RegExp;\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\nconst accent_reg = new RegExp(accent_pat,'gu');\nvar diacritic_patterns:TDiacraticList;\n\nconst latin_convert:TDiacraticList = {\n\t'æ': 'ae',\n\t'ⱥ': 'a',\n\t'ø': 'o',\n};\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|'),'gu');\n\nconst code_points:[[number,number]] = [[ 0, 65535 ]];\n\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n *\n */\nexport const asciifold = (str:string):string => {\n\treturn str\n\t\t.normalize('NFKD')\n\t\t.replace(accent_reg, '')\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,function(foreignletter) {\n\t\t\treturn latin_convert[foreignletter];\n\t\t});\n};\n\n/**\n * Convert array of strings to a regular expression\n *\tex ['ab','a'] => (?:ab|a)\n * \tex ['a','b'] => [ab]\n *\n */\nexport const arrayToPattern = (chars:string[],glue:string='|'):string =>{\n\n\tif( chars.length == 1 ){\n\t\treturn chars[0];\n\t}\n\n\tvar longest = 1;\n\tchars.forEach((a)=>{longest = Math.max(longest,a.length)});\n\n\tif( longest == 1 ){\n\t\treturn '['+chars.join('')+']';\n\t}\n\n\treturn '(?:'+chars.join(glue)+')';\n};\n\nexport const escapeToPattern = (chars:string[]):string =>{\n\tconst escaped = chars.map((diacritic) => escape_regex(diacritic));\n\treturn arrayToPattern(escaped);\n};\n\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 *\n */\nexport const allSubstrings = (input:string):string[][] => {\n\n if( input.length === 1) return [[input]];\n\n var result:string[][] = [];\n allSubstrings(input.substring(1)).forEach(function(subresult) {\n var tmp = subresult.slice(0);\n tmp[0] = input.charAt(0) + tmp[0];\n result.push(tmp);\n\n tmp = subresult.slice(0);\n tmp.unshift(input.charAt(0));\n result.push(tmp);\n });\n\n return result;\n}\n\n/**\n * Generate a list of diacritics from the list of code points\n *\n */\nexport const generateDiacritics = (code_points:[[number,number]]):TDiacraticList => {\n\n\tvar diacritics:{[key:string]:string[]} = {};\n\tcode_points.forEach((code_range)=>{\n\n\t\tfor(let i = code_range[0]; i <= code_range[1]; i++){\n\n\t\t\tlet diacritic\t= String.fromCharCode(i);\n\t\t\tlet\tlatin\t\t= asciifold(diacritic);\n\n\t\t\tif( latin == diacritic.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// skip when latin is a string longer than 3 characters long\n\t\t\t// bc the resulting regex patterns will be long\n\t\t\t// eg:\n\t\t\t// latin صلى الله عليه وسلم length 18 code point 65018\n\t\t\t// latin جل جلاله length 8 code point 65019\n\t\t\tif( latin.length > 3 ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( !(latin in diacritics) ){\n\t\t\t\tdiacritics[latin] = [latin];\n\t\t\t}\n\n\t\t\tvar patt = new RegExp( escapeToPattern(diacritics[latin]),'iu');\n\t\t\tif( diacritic.match(patt) ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdiacritics[latin].push(diacritic);\n\t\t}\n\t});\n\n\t// filter out if there's only one character in the list\n\tlet latin_chars = Object.keys(diacritics);\n\tfor( let i = 0; i < latin_chars.length; i++){\n\t\tconst latin = latin_chars[i];\n\t\tif( diacritics[latin].length < 2 ){\n\t\t\tdelete diacritics[latin];\n\t\t}\n\t}\n\n\n\t// latin character pattern\n\t// match longer substrings first\n\tlatin_chars\t\t= Object.keys(diacritics).sort((a, b) => b.length - a.length );\n\tlatin_pat\t\t= new RegExp('('+ escapeToPattern(latin_chars) + accent_pat + '*)','gu');\n\n\n\t// build diacritic patterns\n\t// ae needs:\n\t//\t(?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n\tvar diacritic_patterns:TDiacraticList = {};\n\tlatin_chars.sort((a,b) => a.length -b.length).forEach((latin)=>{\n\n\t\tvar substrings\t= allSubstrings(latin);\n\t\tvar pattern = substrings.map((sub_pat)=>{\n\n\t\t\tsub_pat = sub_pat.map((l)=>{\n\t\t\t\tif( diacritics.hasOwnProperty(l) ){\n\t\t\t\t\treturn escapeToPattern(diacritics[l]);\n\t\t\t\t}\n\t\t\t\treturn l;\n\t\t\t});\n\n\t\t\treturn arrayToPattern(sub_pat,'');\n\t\t});\n\n\t\tdiacritic_patterns[latin] = arrayToPattern(pattern);\n\t});\n\n\n\treturn diacritic_patterns;\n}\n\n/**\n * Expand a regular expression pattern to include diacritics\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n */\nexport const diacriticRegexPoints = (regex:string):string => {\n\n\tif( diacritic_patterns === undefined ){\n\t\tdiacritic_patterns = generateDiacritics(code_points);\n\t}\n\n\tconst decomposed\t\t= regex.normalize('NFKD').toLowerCase();\n\n\treturn decomposed.split(latin_pat).map((part:string)=>{\n\n\t\t// \"ffl\" or \"ffl\"\n\t\tconst no_accent = asciifold(part);\n\t\tif( no_accent == '' ){\n\t\t\treturn '';\n\t\t}\n\n\t\tif( diacritic_patterns.hasOwnProperty(no_accent) ){\n\t\t\treturn diacritic_patterns[no_accent];\n\t\t}\n\n\t\treturn part;\n\t}).join('');\n\n}\n","\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { asciifold } from './diacritics.ts';\n\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from './types.ts';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n/**\n *\n * https://stackoverflow.com/questions/63006601/why-does-u-throw-an-invalid-escape-error\n */\nexport const escape_regex = (str:string):string => {\n\treturn (str + '').replace(/([\\$\\(\\)\\*\\+\\.\\?\\[\\]\\^\\{\\|\\}\\\\])/gu, '\\\\$1');\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\n\tif( typeof value == 'function' ) return value;\n\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\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 */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:number|string)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\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\n // @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { scoreValue, getAttr, getAttrNesting, escape_regex, propToArray, iterate, cmp } from './utils.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport { diacriticRegexPoints } from './diacritics.ts';\n// @ts-ignore TS2691 \"An import path cannot end with a '.ts' extension\"\nimport * as T from 'types.ts';\n\nexport default class Sifter{\n\n\tpublic items; // []|{};\n\tpublic settings: T.Settings;\n\n\t/**\n\t * Textually searches arrays and hashes of objects\n\t * by property (or multiple properties). Designed\n\t * specifically for autocomplete.\n\t *\n\t */\n\tconstructor(items:any, settings:T.Settings) {\n\t\tthis.items = items;\n\t\tthis.settings = settings || {diacritics: true};\n\t};\n\n\t/**\n\t * Splits a search string into an array of individual\n\t * regexps to be used to match results.\n\t *\n\t */\n\ttokenize(query:string, respect_word_boundaries?:boolean, weights?:T.Weights ):T.Token[] {\n\t\tif (!query || !query.length) return [];\n\n\t\tconst tokens:T.Token[]\t= [];\n\t\tconst words\t\t\t\t= query.split(/\\s+/);\n\t\tvar field_regex:RegExp;\n\n\t\tif( weights ){\n\t\t\tfield_regex = new RegExp( '^('+ Object.keys(weights).map(escape_regex).join('|')+')\\:(.*)$');\n\t\t}\n\n\t\twords.forEach((word:string) => {\n\t\t\tlet field_match;\n\t\t\tlet field:null|string\t= null;\n\t\t\tlet regex:null|string\t= null;\n\n\t\t\t// look for \"field:query\" tokens\n\t\t\tif( field_regex && (field_match = word.match(field_regex)) ){\n\t\t\t\tfield\t= field_match[1];\n\t\t\t\tword\t= field_match[2];\n\t\t\t}\n\n\t\t\tif( word.length > 0 ){\n\t\t\t\tif( this.settings.diacritics ){\n\t\t\t\t\tregex = diacriticRegexPoints(word);\n\t\t\t\t}else{\n\t\t\t\t\tregex = escape_regex(word);\n\t\t\t\t}\n\t\t\t\tif( respect_word_boundaries ) regex = \"\\\\b\"+regex;\n\t\t\t}\n\n\t\t\ttokens.push({\n\t\t\t\tstring : word,\n\t\t\t\tregex : regex ? new RegExp(regex,'iu') : null,\n\t\t\t\tfield : field,\n\t\t\t});\n\t\t});\n\n\t\treturn tokens;\n\t};\n\n\n\t/**\n\t * Returns a function to be used to score individual results.\n\t *\n\t * Good matches will have a higher score than poor matches.\n\t * If an item is not a match, 0 will be returned by the function.\n\t *\n\t * @returns {function}\n\t */\n\tgetScoreFunction(query:string, options:T.Options ){\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getScoreFunction(search);\n\t}\n\n\t_getScoreFunction(search:T.PrepareObj ){\n\t\tconst tokens\t\t= search.tokens,\n\t\ttoken_count\t\t\t= tokens.length;\n\n\t\tif (!token_count) {\n\t\t\treturn function() { return 0; };\n\t\t}\n\n\t\tconst fields\t= search.options.fields,\n\t\tweights\t\t\t= search.weights,\n\t\tfield_count\t\t= fields.length,\n\t\tgetAttrFn\t\t= search.getAttrFn;\n\n\t\tif (!field_count) {\n\t\t\treturn function() { return 1; };\n\t\t}\n\n\n\t\t/**\n\t\t * Calculates the score of an object\n\t\t * against the search query.\n\t\t *\n\t\t */\n\t\tconst scoreObject = (function() {\n\n\n\t\t\tif (field_count === 1) {\n\t\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\t\tconst field = fields[0].field;\n\t\t\t\t\treturn scoreValue(getAttrFn(data, field), token, weights[field]);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function(token:T.Token, data:{}) {\n\t\t\t\tvar sum = 0;\n\n\t\t\t\t// is the token specific to a field?\n\t\t\t\tif( token.field ){\n\n\t\t\t\t\tconst value = getAttrFn(data, token.field);\n\n\t\t\t\t\tif( !token.regex && value ){\n\t\t\t\t\t\tsum += (1/field_count);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tsum += scoreValue(value, token, 1);\n\t\t\t\t\t}\n\n\n\n\t\t\t\t}else{\n\t\t\t\t\titerate(weights, (weight:number, field:string) => {\n\t\t\t\t\t\tsum += scoreValue(getAttrFn(data, field), token, weight);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn sum / field_count;\n\t\t\t};\n\t\t})();\n\n\t\tif (token_count === 1) {\n\t\t\treturn function(data:{}) {\n\t\t\t\treturn scoreObject(tokens[0], data);\n\t\t\t};\n\t\t}\n\n\t\tif (search.options.conjunction === 'and') {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar i = 0, score, sum = 0;\n\t\t\t\tfor (; i < token_count; i++) {\n\t\t\t\t\tscore = scoreObject(tokens[i], data);\n\t\t\t\t\tif (score <= 0) return 0;\n\t\t\t\t\tsum += score;\n\t\t\t\t}\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(data:{}) {\n\t\t\t\tvar sum = 0;\n\t\t\t\titerate(tokens,(token:T.Token)=>{\n\t\t\t\t\tsum += scoreObject(token, data);\n\t\t\t\t});\n\t\t\t\treturn sum / token_count;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Returns a function that can be used to compare two\n\t * results, for sorting purposes. If no sorting should\n\t * be performed, `null` will be returned.\n\t *\n\t * @return function(a,b)\n\t */\n\tgetSortFunction(query:string, options:T.Options) {\n\t\tvar search = this.prepareSearch(query, options);\n\t\treturn this._getSortFunction(search);\n\t}\n\n\t_getSortFunction(search:T.PrepareObj){\n\t\tvar i, n, implicit_score;\n\n\t\tconst self\t= this,\n\t\toptions\t\t= search.options,\n\t\tsort\t\t= (!search.query && options.sort_empty) ? options.sort_empty : options.sort,\n\t\tsort_flds:T.Sort[]\t\t= [],\n\t\tmultipliers:number[]\t= [];\n\n\n\t\tif( typeof sort == 'function' ){\n\t\t\treturn sort.bind(this);\n\t\t}\n\n\t\t/**\n\t\t * Fetches the specified sort field value\n\t\t * from a search result item.\n\t\t *\n\t\t */\n\t\tconst get_field = function(name:string, result:T.ResultItem):string|number {\n\t\t\tif (name === '$score') return result.score;\n\t\t\treturn search.getAttrFn(self.items[result.id], name);\n\t\t};\n\n\t\t// parse options\n\t\tif (sort) {\n\t\t\tfor (i = 0, n = sort.length; i < n; i++) {\n\t\t\t\tif (search.query || sort[i].field !== '$score') {\n\t\t\t\t\tsort_flds.push(sort[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the \"$score\" field is implied to be the primary\n\t\t// sort field, unless it's manually specified\n\t\tif (search.query) {\n\t\t\timplicit_score = true;\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\timplicit_score = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (implicit_score) {\n\t\t\t\tsort_flds.unshift({field: '$score', direction: 'desc'});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\t\tif (sort_flds[i].field === '$score') {\n\t\t\t\t\tsort_flds.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, n = sort_flds.length; i < n; i++) {\n\t\t\tmultipliers.push(sort_flds[i].direction === 'desc' ? -1 : 1);\n\t\t}\n\n\t\t// build function\n\t\tconst sort_flds_count = sort_flds.length;\n\t\tif (!sort_flds_count) {\n\t\t\treturn null;\n\t\t} else if (sort_flds_count === 1) {\n\t\t\tconst sort_fld = sort_flds[0].field;\n\t\t\tconst multiplier = multipliers[0];\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\treturn multiplier * cmp(\n\t\t\t\t\tget_field(sort_fld, a),\n\t\t\t\t\tget_field(sort_fld, b)\n\t\t\t\t);\n\t\t\t};\n\t\t} else {\n\t\t\treturn function(a:T.ResultItem, b:T.ResultItem) {\n\t\t\t\tvar i, result, field;\n\t\t\t\tfor (i = 0; i < sort_flds_count; i++) {\n\t\t\t\t\tfield = sort_flds[i].field;\n\t\t\t\t\tresult = multipliers[i] * cmp(\n\t\t\t\t\t\tget_field(field, a),\n\t\t\t\t\t\tget_field(field, b)\n\t\t\t\t\t);\n\t\t\t\t\tif (result) return result;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\t\t}\n\t};\n\n\t/**\n\t * Parses a search query and returns an object\n\t * with tokens and fields ready to be populated\n\t * with results.\n\t *\n\t */\n\tprepareSearch(query:string, optsUser:Partial<T.Options>):T.PrepareObj {\n\t\tconst weights:T.Weights = {};\n\t\tvar options\t\t= Object.assign({},optsUser);\n\n\t\tpropToArray(options,'sort');\n\t\tpropToArray(options,'sort_empty');\n\n\t\t// convert fields to new format\n\t\tif( options.fields ){\n\t\t\tpropToArray(options,'fields');\n\t\t\tconst fields:T.Field[] = [];\n\t\t\toptions.fields.forEach((field:string|T.Field) => {\n\t\t\t\tif( typeof field == 'string' ){\n\t\t\t\t\tfield = {field:field,weight:1};\n\t\t\t\t}\n\t\t\t\tfields.push(field);\n\t\t\t\tweights[field.field] = ('weight' in field) ? field.weight : 1;\n\t\t\t});\n\t\t\toptions.fields = fields;\n\t\t}\n\n\n\t\treturn {\n\t\t\toptions\t\t: options,\n\t\t\tquery\t\t: query.toLowerCase().trim(),\n\t\t\ttokens\t\t: this.tokenize(query, options.respect_word_boundaries, weights),\n\t\t\ttotal\t\t: 0,\n\t\t\titems\t\t: [],\n\t\t\tweights\t\t: weights,\n\t\t\tgetAttrFn\t: (options.nesting) ? getAttrNesting : getAttr,\n\t\t};\n\t};\n\n\t/**\n\t * Searches through all items and returns a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string, options:T.Options) : T.PrepareObj {\n\t\tvar self = this, score, search:T.PrepareObj;\n\n\t\tsearch = this.prepareSearch(query, options);\n\t\toptions = search.options;\n\t\tquery = search.query;\n\n\t\t// generate result scoring function\n\t\tconst fn_score = options.score || self._getScoreFunction(search);\n\n\t\t// perform search and sort\n\t\tif (query.length) {\n\t\t\titerate(self.items, (item:T.ResultItem, id:string|number) => {\n\t\t\t\tscore = fn_score(item);\n\t\t\t\tif (options.filter === false || score > 0) {\n\t\t\t\t\tsearch.items.push({'score': score, 'id': id});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\titerate(self.items, (_:T.ResultItem, id:string|number) => {\n\t\t\t\tsearch.items.push({'score': 1, 'id': id});\n\t\t\t});\n\t\t}\n\n\t\tconst fn_sort = self._getSortFunction(search);\n\t\tif (fn_sort) search.items.sort(fn_sort);\n\n\t\t// apply limits\n\t\tsearch.total = search.items.length;\n\t\tif (typeof options.limit === 'number') {\n\t\t\tsearch.items = search.items.slice(0, options.limit);\n\t\t}\n\n\t\treturn search;\n\t};\n}\n","\nimport { iterate } from '@orchidjs/sifter/lib/utils';\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 */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tlet div = document.createElement('div');\n\t\tdiv.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn div.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\11\\12\\14\\15\\40]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\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 */\n\nimport {replaceNode} from '../vanilla';\n\n\nexport const highlight = (element:HTMLElement, regex:string|RegExp) => {\n\n\tif( regex === null ) return;\n\n\t// convet string to regex\n\tif( typeof regex === 'string' ){\n\n\t\tif( !regex.length ) return;\n\t\tregex = new RegExp(regex, 'i');\n\t}\n\n\n\t// Wrap matching part of text node with highlighting <span>, e.g.\n\t// Soccer -> <span class=\"highlight\">Soc</span>cer for regex = /soc/i\n\tconst highlightText = ( node:Text ):number => {\n\n\t\tvar match = node.data.match(regex);\n\t\tif( match && node.data.length > 0 ){\n\t\t\tvar spannode\t\t= document.createElement('span');\n\t\t\tspannode.className\t= 'highlight';\n\t\t\tvar middlebit\t\t= node.splitText(match.index as number);\n\n\t\t\tmiddlebit.splitText(match[0].length);\n\t\t\tvar middleclone\t\t= middlebit.cloneNode(true);\n\n\t\t\tspannode.appendChild(middleclone);\n\t\t\treplaceNode(middlebit, spannode);\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t// Recurse element node, looking for child text nodes to highlight, unless element\n\t// is childless, <script>, <style>, or already highlighted: <span class=\"hightlight\">\n\tconst highlightChildren = ( node:Element ):void => {\n\t\tif( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' ) ){\n\t\t\tfor (var i = 0; i < node.childNodes.length; ++i) {\n\t\t\t\ti += highlightRecursive(node.childNodes[i]);\n\t\t\t}\n\t\t}\n\t};\n\n\n\tconst highlightRecursive = ( node:Node|Element ):number => {\n\n\t\tif( node.nodeType === 3 ){\n\t\t\treturn highlightText(node as Text);\n\t\t}\n\n\t\thighlightChildren(node as Element);\n\n\t\treturn 0;\n\t};\n\n\thighlightRecursive( element );\n};\n\n/**\n * removeHighlight fn copied from highlight v5 and\n * edited to remove with(), pass js strict mode, and use without jquery\n */\nexport const removeHighlight = (el:HTMLElement) => {\n\tvar elements = el.querySelectorAll(\"span.highlight\");\n\tArray.prototype.forEach.call(elements, function(el:HTMLElement){\n\t\tvar parent = el.parentNode as Node;\n\t\tparent.replaceChild(el.firstChild as Node, el);\n\t\tparent.normalize();\n\t});\n};\n","export const KEY_A\t\t\t\t= 65;\nexport const KEY_RETURN\t\t\t= 13;\nexport const KEY_ESC\t\t\t= 27;\nexport const KEY_LEFT\t\t\t= 37;\nexport const KEY_UP\t\t\t\t= 38;\nexport const KEY_RIGHT\t\t\t= 39;\nexport const KEY_DOWN\t\t\t= 40;\nexport const KEY_BACKSPACE\t\t= 8;\nexport const KEY_DELETE\t\t\t= 46;\nexport const KEY_TAB\t\t\t= 9;\n\nexport const IS_MAC \t\t= typeof navigator === 'undefined' ? false : /Mac/.test(navigator.userAgent);\nexport const KEY_SHORTCUT\t\t= IS_MAC ? 'metaKey' : 'ctrlKey'; // ctrl key or apple key for ma\n","\nexport default {\n\toptions: [],\n\toptgroups: [],\n\n\tplugins: [],\n\tdelimiter: ',',\n\tsplitOn: null, // regexp or string for splitting up values from a paste command\n\tpersist: true,\n\tdiacritics: true,\n\tcreate: null,\n\tcreateOnBlur: false,\n\tcreateFilter: null,\n\thighlight: true,\n\topenOnFocus: true,\n\tshouldOpen: null,\n\tmaxOptions: 50,\n\tmaxItems: null,\n\thideSelected: null,\n\tduplicates: false,\n\taddPrecedence: false,\n\tselectOnTab: false,\n\tpreload: null,\n\tallowEmptyOption: false,\n\t//closeAfterSelect: false,\n\n\tloadThrottle: 300,\n\tloadingClass: 'loading',\n\n\tdataAttr: null, //'data-data',\n\toptgroupField: 'optgroup',\n\tvalueField: 'value',\n\tlabelField: 'text',\n\tdisabledField: 'disabled',\n\toptgroupLabelField: 'label',\n\toptgroupValueField: 'value',\n\tlockOptgroupOrder: false,\n\n\tsortField: '$order',\n\tsearchField: ['text'],\n\tsearchConjunction: 'and',\n\n\tmode: null,\n\twrapperClass: 'ts-wrapper',\n\tcontrolClass: 'ts-control',\n\tdropdownClass: 'ts-dropdown',\n\tdropdownContentClass: 'ts-dropdown-content',\n\titemClass: 'item',\n\toptionClass: 'option',\n\n\tdropdownParent: null,\n\tcontrolInput: '<input type=\"text\" autocomplete=\"off\" size=\"1\" />',\n\n\tcopyClassesToDropdown: false,\n\n\tplaceholder: null,\n\thidePlaceholder: null,\n\n\tshouldLoad: function(query:string):boolean{\n\t\treturn query.length > 0;\n\t},\n\n\t/*\n\tload : null, // function(query, callback) { ... }\n\tscore : null, // function(search) { ... }\n\tonInitialize : null, // function() { ... }\n\tonChange : null, // function(value) { ... }\n\tonItemAdd : null, // function(value, $item) { ... }\n\tonItemRemove : null, // function(value) { ... }\n\tonClear : null, // function() { ... }\n\tonOptionAdd : null, // function(value, data) { ... }\n\tonOptionRemove : null, // function(value) { ... }\n\tonOptionClear : null, // function() { ... }\n\tonOptionGroupAdd : null, // function(id, data) { ... }\n\tonOptionGroupRemove : null, // function(id) { ... }\n\tonOptionGroupClear : null, // function() { ... }\n\tonDropdownOpen : null, // function(dropdown) { ... }\n\tonDropdownClose : null, // function(dropdown) { ... }\n\tonType : null, // function(str) { ... }\n\tonDelete : null, // function(values) { ... }\n\t*/\n\n\trender: {\n\t\t/*\n\t\titem: null,\n\t\toptgroup: null,\n\t\toptgroup_header: null,\n\t\toption: null,\n\t\toption_create: null\n\t\t*/\n\t}\n};\n","\nimport TomSelect from './tom-select';\nimport { TomLoadCallback } from './types/index';\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 */\nexport const hash_key = (value:undefined|null|boolean|string):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;');\n};\n\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\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 */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Prevent default\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n","import defaults from './defaults';\nimport { hash_key } from './utils';\nimport { TomOption, TomSettings } from './types/index';\nimport { iterate } from '@orchidjs/sifter/lib/utils';\nimport { TomInput } from './types/index';\n\n\nexport default function getSettings( input:TomInput, settings_user:Partial<TomSettings>):TomSettings{\n\tvar settings:TomSettings\t= Object.assign({}, defaults, settings_user);\n\n\tvar attr_data\t\t\t\t= settings.dataAttr;\n\tvar field_label\t\t\t\t= settings.labelField;\n\tvar field_value\t\t\t\t= settings.valueField;\n\tvar field_disabled\t\t\t= settings.disabledField;\n\tvar field_optgroup\t\t\t= settings.optgroupField;\n\tvar field_optgroup_label\t= settings.optgroupLabelField;\n\tvar field_optgroup_value\t= settings.optgroupValueField;\n\n\tvar tag_name\t\t\t\t= input.tagName.toLowerCase();\n\tvar placeholder\t\t\t\t= input.getAttribute('placeholder') || input.getAttribute('data-placeholder');\n\n\tif (!placeholder && !settings.allowEmptyOption) {\n\t\tlet option\t\t= input.querySelector('option[value=\"\"]');\n\t\tif( option ){\n\t\t\tplaceholder = option.textContent;\n\t\t}\n\n\t}\n\n\tvar settings_element:{\n\t\tplaceholder\t: null|string,\n\t\toptions\t\t: TomOption[],\n\t\toptgroups\t: TomOption[],\n\t\titems\t\t: string[],\n\t\tmaxItems\t: null|number,\n\t} = {\n\t\tplaceholder\t: placeholder,\n\t\toptions\t\t: [],\n\t\toptgroups\t: [],\n\t\titems\t\t: [],\n\t\tmaxItems\t: null,\n\t};\n\n\n\t/**\n\t * Initialize from a <select> element.\n\t *\n\t */\n\tvar init_select = () => {\n\t\tvar tagName;\n\t\tvar options = settings_element.options;\n\t\tvar optionsMap:{[key:string]:any} = {};\n\t\tvar group_count = 1;\n\n\t\tvar readData = (el:HTMLElement):TomOption => {\n\n\t\t\tvar data\t= Object.assign({},el.dataset); // get plain object from DOMStringMap\n\t\t\tvar json\t= attr_data && data[attr_data];\n\n\t\t\tif( typeof json === 'string' && json.length ){\n\t\t\t\tdata = Object.assign(data,JSON.parse(json));\n\t\t\t}\n\n\t\t\treturn data;\n\t\t};\n\n\t\tvar addOption = (option:HTMLOptionElement, group?:string) => {\n\n\t\t\tvar value = hash_key(option.value);\n\t\t\tif ( value == null ) return;\n\t\t\tif ( !value && !settings.allowEmptyOption) return;\n\n\t\t\t// if the option already exists, it's probably been\n\t\t\t// duplicated in another optgroup. in this case, push\n\t\t\t// the current group to the \"optgroup\" property on the\n\t\t\t// existing option so that it's rendered in both places.\n\t\t\tif (optionsMap.hasOwnProperty(value)) {\n\t\t\t\tif (group) {\n\t\t\t\t\tvar arr = optionsMap[value][field_optgroup];\n\t\t\t\t\tif (!arr) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = group;\n\t\t\t\t\t} else if (!Array.isArray(arr)) {\n\t\t\t\t\t\toptionsMap[value][field_optgroup] = [arr, group];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tarr.push(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}else{\n\n\t\t\t\tvar option_data = readData(option);\n\t\t\t\toption_data[field_label] = option_data[field_label] || option.textContent;\n\t\t\t\toption_data[field_value] = option_data[field_value] || value;\n\t\t\t\toption_data[field_disabled] = option_data[field_disabled] || option.disabled;\n\t\t\t\toption_data[field_optgroup] = option_data[field_optgroup] || group;\n\t\t\t\toption_data.$option\t\t\t= option;\n\n\t\t\t\toptionsMap[value] = option_data;\n\t\t\t\toptions.push(option_data);\n\t\t\t}\n\n\t\t\tif( option.selected ){\n\t\t\t\tsettings_element.items.push(value);\n\t\t\t}\n\t\t};\n\n\t\tvar addGroup = ( optgroup:HTMLOptGroupElement ) => {\n\t\t\tvar id:string, optgroup_data\n\n\t\t\toptgroup_data\t\t\t\t\t\t\t= readData(optgroup);\n\t\t\toptgroup_data[field_optgroup_label]\t\t= optgroup_data[field_optgroup_label] || optgroup.getAttribute('label') || '';\n\t\t\toptgroup_data[field_optgroup_value]\t\t= optgroup_data[field_optgroup_value] || group_count++;\n\t\t\toptgroup_data[field_disabled]\t\t\t= optgroup_data[field_disabled] || optgroup.disabled;\n\t\t\tsettings_element.optgroups.push(optgroup_data);\n\n\t\t\tid = optgroup_data[field_optgroup_value];\n\n\t\t\titerate(optgroup.children, (option)=>{\n\t\t\t\taddOption(option as HTMLOptionElement, id);\n\t\t\t});\n\n\t\t};\n\n\t\tsettings_element.maxItems = input.hasAttribute('multiple') ? null : 1;\n\n\t\titerate(input.children,(child)=>{\n\t\t\ttagName = child.tagName.toLowerCase();\n\t\t\tif (tagName === 'optgroup') {\n\t\t\t\taddGroup(child as HTMLOptGroupElement);\n\t\t\t} else if (tagName === 'option') {\n\t\t\t\taddOption(child as HTMLOptionElement);\n\t\t\t}\n\t\t});\n\n\t};\n\n\n\t/**\n\t * Initialize from a <input type=\"text\"> element.\n\t *\n\t */\n\tvar init_textbox = () => {\n\t\tconst data_raw = input.getAttribute(attr_data);\n\n\t\tif (!data_raw) {\n\t\t\tvar value = input.value.trim() || '';\n\t\t\tif (!settings.allowEmptyOption && !value.length) return;\n\t\t\tconst values = value.split(settings.delimiter);\n\n\t\t\titerate( values, (value) => {\n\t\t\t\tconst option:TomOption = {};\n\t\t\t\toption[field_label] = value;\n\t\t\t\toption[field_value] = value;\n\t\t\t\tsettings_element.options.push(option);\n\t\t\t});\n\t\t\tsettings_element.items = values;\n\t\t} else {\n\t\t\tsettings_element.options = JSON.parse(data_raw);\n\t\t\titerate( settings_element.options, (opt) => {\n\t\t\t\tsettings_element.items.push(opt[field_value]);\n\t\t\t});\n\t\t}\n\t};\n\n\n\tif (tag_name === 'select') {\n\t\tinit_select();\n\t} else {\n\t\tinit_textbox();\n\t}\n\n\treturn Object.assign( {}, defaults, settings_element, settings_user) as TomSettings;\n};\n","\nimport MicroEvent from './contrib/microevent';\nimport MicroPlugin from './contrib/microplugin';\nimport Sifter from '@orchidjs/sifter/lib/sifter';\nimport { escape_regex, iterate } from '@orchidjs/sifter/lib/utils';\nimport { TomInput, TomArgObject, TomOption, TomOptions, TomCreateFilter, TomCreateCallback, TomItem, TomSettings, TomTemplateNames, TomClearFilter } from './types/index';\nimport {highlight, removeHighlight} from './contrib/highlight';\nimport * as constants from './constants';\nimport getSettings from './getSettings';\nimport {\n\thash_key,\n\tget_hash,\n\tescape_html,\n\tdebounce_events,\n\tgetSelection,\n\tpreventDefault,\n\taddEvent,\n\tloadDebounce,\n\tisKeyDown,\n\tgetId,\n\taddSlashes,\n\tappend\n} from './utils';\n\nimport {\n\tgetDom,\n\tisHtmlString,\n\tescapeQuery,\n\ttriggerEvent,\n\tapplyCSS,\n\taddClasses,\n\tremoveClasses,\n\tparentMatch,\n\tgetTail,\n\tisEmptyObject,\n\tnodeIndex,\n\tsetAttr,\n\treplaceNode\n} from './vanilla';\n\nvar instance_i = 0;\n\nexport default class TomSelect extends MicroPlugin(MicroEvent){\n\n\tpublic control_input\t\t\t: HTMLInputElement;\n\tpublic wrapper\t\t\t\t\t: HTMLElement;\n\tpublic dropdown\t\t\t\t\t: HTMLElement;\n\tpublic control\t\t\t\t\t: HTMLElement;\n\tpublic dropdown_content\t\t\t: HTMLElement;\n\tpublic focus_node\t\t\t\t: HTMLElement;\n\n\tpublic order\t\t\t\t\t: number = 0;\n\tpublic settings\t\t\t\t\t: TomSettings;\n\tpublic input\t\t\t\t\t: TomInput;\n\tpublic tabIndex\t\t\t\t\t: number;\n\tpublic is_select_tag\t\t\t: boolean;\n\tpublic rtl\t\t\t\t\t\t: boolean;\n\tprivate inputId\t\t\t\t\t: string;\n\n\tprivate _destroy\t\t\t\t!: () => void;\n\tpublic sifter\t\t\t\t\t: Sifter;\n\n\n\tpublic isOpen\t\t\t\t\t: boolean = false;\n\tpublic isDisabled\t\t\t\t: boolean = false;\n\tpublic isRequired\t\t\t\t: boolean;\n\tpublic isInvalid\t\t\t\t: boolean = false; // @deprecated 1.8\n\tpublic isValid\t\t\t\t\t: boolean = true;\n\tpublic isLocked\t\t\t\t\t: boolean = false;\n\tpublic isFocused\t\t\t\t: boolean = false;\n\tpublic isInputHidden\t\t\t: boolean = false;\n\tpublic isSetup\t\t\t\t\t: boolean = false;\n\tpublic ignoreFocus\t\t\t\t: boolean = false;\n\tpublic ignoreHover\t\t\t\t: boolean = false;\n\tpublic hasOptions\t\t\t\t: boolean = false;\n\tpublic currentResults\t\t\t?: ReturnType<Sifter['search']>;\n\tpublic lastValue\t\t\t\t: string = '';\n\tpublic caretPos\t\t\t\t\t: number = 0;\n\tpublic loading\t\t\t\t\t: number = 0;\n\tpublic loadedSearches\t\t\t: { [key: string]: boolean } = {};\n\n\tpublic activeOption\t\t\t\t: null|HTMLElement = null;\n\tpublic activeItems\t\t\t\t: TomItem[] = [];\n\n\tpublic optgroups\t\t\t\t: TomOptions = {};\n\tpublic options\t\t\t\t\t: TomOptions = {};\n\tpublic userOptions\t\t\t\t: {[key:string]:boolean} = {};\n\tpublic items\t\t\t\t\t: string[] = [];\n\n\n\n\tconstructor( input_arg: string|TomInput, user_settings:Partial<TomSettings> ){\n\t\tsuper();\n\n\t\tinstance_i++;\n\n\t\tvar dir;\n\t\tvar input\t\t\t\t= getDom( input_arg ) as TomInput;\n\n\t\tif( input.tomselect ){\n\t\t\tthrow new Error('Tom Select already initialized on this element');\n\t\t}\n\n\n\t\tinput.tomselect\t\t\t= this;\n\n\n\t\t// detect rtl environment\n\t\tvar computedStyle\t\t= window.getComputedStyle && window.getComputedStyle(input, null);\n\t\tdir\t\t\t\t\t\t= computedStyle.getPropertyValue('direction');\n\n\t\t// setup default state\n\t\tconst settings\t\t\t= getSettings( input, user_settings );\n\t\tthis.settings\t\t\t= settings;\n\t\tthis.input\t\t\t\t= input;\n\t\tthis.tabIndex\t\t\t= input.tabIndex || 0;\n\t\tthis.is_select_tag\t\t= input.tagName.toLowerCase() === 'select';\n\t\tthis.rtl\t\t\t\t= /rtl/i.test(dir);\n\t\tthis.inputId\t\t\t= getId(input, 'tomselect-'+instance_i);\n\t\tthis.isRequired\t\t\t= input.required;\n\n\n\t\t// search system\n\t\tthis.sifter = new Sifter(this.options, {diacritics: settings.diacritics});\n\n\t\t// option-dependent defaults\n\t\tsettings.mode = settings.mode || (settings.maxItems === 1 ? 'single' : 'multi');\n\t\tif (typeof settings.hideSelected !== 'boolean') {\n\t\t\tsettings.hideSelected = settings.mode === 'multi';\n\t\t}\n\n\t\tif( typeof settings.hidePlaceholder !== 'boolean' ){\n\t\t\tsettings.hidePlaceholder = settings.mode !== 'multi';\n\t\t}\n\n\t\t// set up createFilter callback\n\t\tvar filter = settings.createFilter;\n\t\tif( typeof filter !== 'function' ){\n\n\t\t\tif( typeof filter === 'string' ){\n\t\t\t\tfilter = new RegExp(filter);\n\t\t\t}\n\n\t\t\tif( filter instanceof RegExp ){\n\t\t\t\tsettings.createFilter = (input) => (filter as RegExp).test(input);\n\t\t\t}else{\n\t\t\t\tsettings.createFilter = (value) => {\n\t\t\t\t\treturn this.settings.duplicates || !this.options[value];\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\n\t\tthis.initializePlugins(settings.plugins);\n\t\tthis.setupCallbacks();\n\t\tthis.setupTemplates();\n\n\n\t\t// Create all elements\n\t\tconst wrapper\t\t\t= getDom('<div>');\n\t\tconst control\t\t\t= getDom('<div>');\n\t\tconst dropdown\t\t\t= this._render('dropdown');\n\t\tconst dropdown_content\t= getDom(`<div role=\"listbox\" tabindex=\"-1\">`);\n\n\t\tconst classes\t\t\t= this.input.getAttribute('class') || '';\n\t\tconst inputMode\t\t\t= settings.mode;\n\n\t\tvar control_input: HTMLInputElement;\n\n\n\t\taddClasses( wrapper, settings.wrapperClass, classes, inputMode);\n\n\n\t\taddClasses(control,settings.controlClass);\n\t\tappend( wrapper, control );\n\n\n\t\taddClasses(dropdown, settings.dropdownClass, inputMode);\n\t\tif( settings.copyClassesToDropdown ){\n\t\t\taddClasses( dropdown, classes);\n\t\t}\n\n\n\t\taddClasses(dropdown_content, settings.dropdownContentClass);\n\t\tappend( dropdown, dropdown_content );\n\n\t\tgetDom( settings.dropdownParent || wrapper ).appendChild( dropdown );\n\n\n\t\t// default controlInput\n\t\tif( isHtmlString(settings.controlInput) ){\n\t\t\tcontrol_input\t\t= getDom(settings.controlInput ) as HTMLInputElement;\n\n\t\t\t// set attributes\n\t\t\tvar attrs = ['autocorrect','autocapitalize','autocomplete'];\n\t\t\titerate(attrs,(attr) => {\n\t\t\t\tif( input.getAttribute(attr) ){\n\t\t\t\t\tsetAttr(control_input,{[attr]:input.getAttribute(attr)});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontrol_input.tabIndex = -1;\n\t\t\tcontrol.appendChild( control_input );\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t// dom element\n\t\t}else if( settings.controlInput ){\n\t\t\tcontrol_input\t\t= getDom( settings.controlInput ) as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control_input;\n\n\t\t}else{\n\t\t\tcontrol_input\t\t= getDom('<input/>') as HTMLInputElement;\n\t\t\tthis.focus_node\t\t= control;\n\t\t}\n\n\t\tthis.wrapper\t\t\t= wrapper;\n\t\tthis.dropdown\t\t\t= dropdown;\n\t\tthis.dropdown_content\t= dropdown_content;\n\t\tthis.control \t\t\t= control;\n\t\tthis.control_input\t\t= control_input;\n\n\t\tthis.setup();\n\t}\n\n\t/**\n\t * set up event bindings.\n\t *\n\t */\n\tsetup(){\n\n\t\tconst self = this;\n\t\tconst settings\t\t\t\t= self.settings;\n\t\tconst control_input\t\t\t= self.control_input;\n\t\tconst dropdown\t\t\t\t= self.dropdown;\n\t\tconst dropdown_content\t\t= self.dropdown_content;\n\t\tconst wrapper\t\t\t\t= self.wrapper;\n\t\tconst control\t\t\t\t= self.control;\n\t\tconst input\t\t\t\t\t= self.input;\n\t\tconst focus_node\t\t\t= self.focus_node;\n\t\tconst passive_event\t\t\t= { passive: true };\n\t\tconst listboxId\t\t\t\t= self.inputId +'-ts-dropdown';\n\n\n\t\tsetAttr(dropdown_content,{\n\t\t\tid: listboxId\n\t\t});\n\n\t\tsetAttr(focus_node,{\n\t\t\trole:'combobox',\n\t\t\t'aria-haspopup':'listbox',\n\t\t\t'aria-expanded':'false',\n\t\t\t'aria-controls':listboxId\n\t\t});\n\n\t\tconst control_id\t= getId(focus_node,self.inputId + '-ts-control');\n\t\tconst query\t\t\t= \"label[for='\"+escapeQuery(self.inputId)+\"']\";\n\t\tconst label\t\t\t= document.querySelector(query);\n\t\tconst label_click\t= self.focus.bind(self);\n\t\tif( label ){\n\t\t\taddEvent(label,'click', label_click );\n\t\t\tsetAttr(label,{for:control_id});\n\t\t\tconst label_id = getId(label,self.inputId+'-ts-label');\n\t\t\tsetAttr(focus_node,{'aria-labelledby':label_id});\n\t\t\tsetAttr(dropdown_content,{'aria-labelledby':label_id});\n\t\t}\n\n\t\twrapper.style.width = input.style.width;\n\n\t\tif (self.plugins.names.length) {\n\t\t\tconst classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');\n\t\t\taddClasses( [wrapper,dropdown], classes_plugins);\n\t\t}\n\n\t\tif ((settings.maxItems === null || settings.maxItems > 1) && self.is_select_tag ){\n\t\t\tsetAttr(input,{multiple:'multiple'});\n\t\t}\n\n\t\tif (settings.placeholder) {\n\t\t\tsetAttr(control_input,{placeholder:settings.placeholder});\n\t\t}\n\n\t\t// if splitOn was not passed in, construct it from the delimiter to allow pasting universally\n\t\tif (!settings.splitOn && settings.delimiter) {\n\t\t\tsettings.splitOn = new RegExp('\\\\s*' + escape_regex(settings.delimiter) + '+\\\\s*');\n\t\t}\n\n\t\t// debounce user defined load() if loadThrottle > 0\n\t\t// after initializePlugins() so plugins can create/modify user defined loaders\n\t\tif( settings.load && settings.loadThrottle ){\n\t\t\tsettings.load = loadDebounce(settings.load,settings.loadThrottle)\n\t\t}\n\n\t\tself.control_input.type\t= input.type;\n\n\t\taddEvent(dropdown,'mouseenter', (e) => {\n\n\t\t\tvar target_match = parentMatch(e.target as HTMLElement, '[data-selectable]', dropdown);\n\t\t\tif( target_match ) self.onOptionHover( e as MouseEvent, target_match );\n\n\t\t}, {capture:true});\n\n\t\t// clicking on an option should select it\n\t\taddEvent(dropdown,'click',(evt) => {\n\t\t\tconst option = parentMatch(evt.target as HTMLElement, '[data-selectable]');\n\t\t\tif( option ){\n\t\t\t\tself.onOptionSelect( evt as MouseEvent, option );\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\t\t});\n\n\t\taddEvent(control,'click', (evt) => {\n\n\t\t\tvar target_match = parentMatch( evt.target as HTMLElement, '[data-ts-item]', control);\n\t\t\tif( target_match && self.onItemSelect(evt as MouseEvent, target_match as TomItem) ){\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// retain focus (see control_input mousedown)\n\t\t\tif( control_input.value != '' ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.onClick();\n\t\t\tpreventDefault(evt,true);\n\t\t});\n\n\n\t\t// keydown on focus_node for arrow_down/arrow_up\n\t\taddEvent(focus_node,'keydown',\t\t(e) => self.onKeyDown(e as KeyboardEvent) );\n\n\t\t// keypress and input/keyup\n\t\taddEvent(control_input,'keypress',\t(e) => self.onKeyPress(e as KeyboardEvent) );\n\t\taddEvent(control_input,'input',\t\t(e) => self.onInput(e as KeyboardEvent) );\n\n\t\taddEvent(focus_node,'resize',\t\t() => self.positionDropdown(), passive_event);\n\t\taddEvent(focus_node,'blur', \t\t(e) => self.onBlur(e as FocusEvent) );\n\t\taddEvent(focus_node,'focus',\t\t(e) => self.onFocus(e as MouseEvent) );\n\t\taddEvent(control_input,'paste',\t\t(e) => self.onPaste(e as MouseEvent) );\n\n\n\t\tconst doc_mousedown = (evt:Event) => {\n\n\t\t\t// blur if target is outside of this instance\n\t\t\t// dropdown is not always inside wrapper\n\t\t\tconst target = evt.composedPath()[0];\n\t\t\tif( !wrapper.contains(target as HTMLElement) && !dropdown.contains(target as HTMLElement) ){\n\t\t\t\tif (self.isFocused) {\n\t\t\t\t\tself.blur();\n\t\t\t\t}\n\t\t\t\tself.inputState();\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\t// retain focus by preventing native handling. if the\n\t\t\t// event target is the input it should not be modified.\n\t\t\t// otherwise, text selection within the input won't work.\n\t\t\t// Fixes bug #212 which is no covered by tests\n\t\t\tif( target == control_input && self.isOpen ){\n\t\t\t\tevt.stopPropagation();\n\n\t\t\t// clicking anywhere in the control should not blur the control_input (which would close the dropdown)\n\t\t\t}else{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t}\n\n\t\t};\n\n\t\tconst win_scroll = () => {\n\t\t\tif (self.isOpen) {\n\t\t\t\tself.positionDropdown();\n\t\t\t}\n\t\t};\n\n\t\tconst win_hover = () => {\n\t\t\tself.ignoreHover = false;\n\t\t};\n\n\t\taddEvent(document,'mousedown', doc_mousedown);\n\t\taddEvent(window,'scroll', win_scroll, passive_event);\n\t\taddEvent(window,'resize', win_scroll, passive_event);\n\t\taddEvent(window,'mousemove', win_hover, passive_event);\n\n\t\tthis._destroy = () => {\n\t\t\tdocument.removeEventListener('mousedown',doc_mousedown);\n\t\t\twindow.removeEventListener('mousemove',win_hover);\n\t\t\twindow.removeEventListener('scroll',win_scroll);\n\t\t\twindow.removeEventListener('resize',win_scroll);\n\t\t\tif( label ) label.removeEventListener('click',label_click);\n\t\t};\n\n\t\t// store original html and tab index so that they can be\n\t\t// restored when the destroy() method is called.\n\t\tthis.revertSettings = {\n\t\t\tinnerHTML : input.innerHTML,\n\t\t\ttabIndex : input.tabIndex\n\t\t};\n\n\n\t\tinput.tabIndex = -1;\n\t\tinput.insertAdjacentElement('afterend', self.wrapper);\n\n\t\tself.sync(false);\n\t\tsettings.items = [];\n\t\tdelete settings.optgroups;\n\t\tdelete settings.options;\n\n\t\taddEvent(input,'invalid', (e) => {\n\t\t\tif( self.isValid ){\n\t\t\t\tself.isValid = false;\n\t\t\t\tself.isInvalid = true;\n\t\t\t\tself.refreshState();\n\t\t\t}\n\t\t});\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshItems();\n\t\tself.close(false);\n\t\tself.inputState();\n\t\tself.isSetup = true;\n\n\t\tif( input.disabled ){\n\t\t\tself.disable();\n\t\t}else{\n\t\t\tself.enable(); //sets tabIndex\n\t\t}\n\n\t\tself.on('change', this.onChange);\n\n\t\taddClasses(input,'tomselected','ts-hidden-accessible');\n\t\tself.trigger('initialize');\n\n\t\t// preload options\n\t\tif (settings.preload === true) {\n\t\t\tself.preload();\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Register options and optgroups\n\t *\n\t */\n\tsetupOptions(options:TomOption[] = [], optgroups:TomOption[] = []){\n\n\t\t// build options table\n\t\tthis.addOptions(options);\n\n\n\t\t// build optgroup table\n\t\titerate( optgroups, (optgroup) => {\n\t\t\tthis.registerOptionGroup(optgroup);\n\t\t});\n\t}\n\n\t/**\n\t * Sets up default rendering functions.\n\t */\n\tsetupTemplates() {\n\t\tvar self = this;\n\t\tvar field_label = self.settings.labelField;\n\t\tvar field_optgroup = self.settings.optgroupLabelField;\n\n\t\tvar templates = {\n\t\t\t'optgroup': (data:TomOption) => {\n\t\t\t\tlet optgroup = document.createElement('div');\n\t\t\t\toptgroup.className = 'optgroup';\n\t\t\t\toptgroup.appendChild(data.options);\n\t\t\t\treturn optgroup;\n\n\t\t\t},\n\t\t\t'optgroup_header': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"optgroup-header\">' + escape(data[field_optgroup]) + '</div>';\n\t\t\t},\n\t\t\t'option': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'item': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div>' + escape(data[field_label]) + '</div>';\n\t\t\t},\n\t\t\t'option_create': (data:TomOption, escape:typeof escape_html) => {\n\t\t\t\treturn '<div class=\"create\">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';\n\t\t\t},\n\t\t\t'no_results':() => {\n\t\t\t\treturn '<div class=\"no-results\">No results found</div>';\n\t\t\t},\n\t\t\t'loading':() => {\n\t\t\t\treturn '<div class=\"spinner\"></div>';\n\t\t\t},\n\t\t\t'not_loading':() => {},\n\t\t\t'dropdown':() => {\n\t\t\t\treturn '<div></div>';\n\t\t\t}\n\t\t};\n\n\n\t\tself.settings.render = Object.assign({}, templates, self.settings.render);\n\t}\n\n\t/**\n\t * Maps fired events to callbacks provided\n\t * in the settings used when creating the control.\n\t */\n\tsetupCallbacks() {\n\t\tvar key, fn;\n\t\tvar callbacks:{[key:string]:string} = {\n\t\t\t'initialize' : 'onInitialize',\n\t\t\t'change' : 'onChange',\n\t\t\t'item_add' : 'onItemAdd',\n\t\t\t'item_remove' : 'onItemRemove',\n\t\t\t'item_select' : 'onItemSelect',\n\t\t\t'clear' : 'onClear',\n\t\t\t'option_add' : 'onOptionAdd',\n\t\t\t'option_remove' : 'onOptionRemove',\n\t\t\t'option_clear' : 'onOptionClear',\n\t\t\t'optgroup_add' : 'onOptionGroupAdd',\n\t\t\t'optgroup_remove' : 'onOptionGroupRemove',\n\t\t\t'optgroup_clear' : 'onOptionGroupClear',\n\t\t\t'dropdown_open' : 'onDropdownOpen',\n\t\t\t'dropdown_close' : 'onDropdownClose',\n\t\t\t'type' : 'onType',\n\t\t\t'load' : 'onLoad',\n\t\t\t'focus' : 'onFocus',\n\t\t\t'blur' : 'onBlur'\n\t\t};\n\n\t\tfor (key in callbacks) {\n\n\t\t\tfn = this.settings[callbacks[key] as (keyof TomSettings)];\n\t\t\tif (fn) this.on(key, fn);\n\n\t\t}\n\t}\n\n\t/**\n\t * Sync the Tom Select instance with the original input or select\n\t *\n\t */\n\tsync(get_settings:boolean=true):void{\n\t\tconst self\t\t= this;\n\t\tconst settings\t= get_settings ? getSettings( self.input, {delimiter:self.settings.delimiter} as TomSettings ) : self.settings;\n\n\t\tself.setupOptions(settings.options,settings.optgroups);\n\n\t\tself.setValue(settings.items||[],true); // silent prevents recursion\n\n\t\tself.lastQuery = null; // so updated options will be displayed in dropdown\n\t}\n\n\t/**\n\t * Triggered when the main control element\n\t * has a click event.\n\t *\n\t */\n\tonClick():void {\n\t\tvar self = this;\n\n\t\tif( self.activeItems.length > 0 ){\n\t\t\tself.clearActiveItems();\n\t\t\tself.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.isFocused && self.isOpen ){\n\t\t\tself.blur();\n\t\t} else {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * @deprecated v1.7\n\t *\n\t */\n\tonMouseDown():void {}\n\n\t/**\n\t * Triggered when the value of the control has been changed.\n\t * This should propagate the event to the original DOM\n\t * input / select element.\n\t */\n\tonChange() {\n\t\ttriggerEvent(this.input, 'input');\n\t\ttriggerEvent(this.input, 'change');\n\t}\n\n\t/**\n\t * Triggered on <input> paste.\n\t *\n\t */\n\tonPaste(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isInputHidden || self.isLocked ){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a regex or string is included, this will split the pasted\n\t\t// input and create Items for each separate value\n\t\tif( !self.settings.splitOn ){\n\t\t\treturn;\n\t\t}\n\n\t\t// Wait for pasted text to be recognized in value\n\t\tsetTimeout(() => {\n\t\t\tvar pastedText = self.inputValue();\n\t\t\tif( !pastedText.match(self.settings.splitOn)){\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar splitInput = pastedText.trim().split(self.settings.splitOn);\n\t\t\titerate( splitInput, (piece) => {\n\n\t\t\t\tpiece = hash_key(piece);\n\t\t\t\tif( this.options[piece] ){\n\t\t\t\t\tself.addItem(piece);\n\t\t\t\t}else{\n\t\t\t\t\tself.createItem(piece);\n\t\t\t\t}\n\t\t\t});\n\t\t}, 0);\n\n\t}\n\n\t/**\n\t * Triggered on <input> keypress.\n\t *\n\t */\n\tonKeyPress(e:KeyboardEvent):void {\n\t\tvar self = this;\n\t\tif(self.isLocked){\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t\tvar character = String.fromCharCode(e.keyCode || e.which);\n\t\tif (self.settings.create && self.settings.mode === 'multi' && character === self.settings.delimiter) {\n\t\t\tself.createItem();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keydown.\n\t *\n\t */\n\tonKeyDown(e:KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tself.ignoreHover = true;\n\n\t\tif (self.isLocked) {\n\t\t\tif (e.keyCode !== constants.KEY_TAB) {\n\t\t\t\tpreventDefault(e);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (e.keyCode) {\n\n\t\t\t// ctrl+A: select all\n\t\t\tcase constants.KEY_A:\n\t\t\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\t\t\tif( self.control_input.value == '' ){\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t\tself.selectAll();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t// esc: close dropdown\n\t\t\tcase constants.KEY_ESC:\n\t\t\t\tif (self.isOpen) {\n\t\t\t\t\tpreventDefault(e,true);\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\n\t\t\t// down: open dropdown or move selection down\n\t\t\tcase constants.KEY_DOWN:\n\t\t\t\tif (!self.isOpen && self.hasOptions) {\n\t\t\t\t\tself.open();\n\t\t\t\t} else if (self.activeOption) {\n\t\t\t\t\tlet next = self.getAdjacent(self.activeOption, 1);\n\t\t\t\t\tif (next) self.setActiveOption(next);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// up: move selection up\n\t\t\tcase constants.KEY_UP:\n\t\t\t\tif (self.activeOption) {\n\t\t\t\t\tlet prev = self.getAdjacent(self.activeOption, -1);\n\t\t\t\t\tif (prev) self.setActiveOption(prev);\n\t\t\t\t}\n\t\t\t\tpreventDefault(e);\n\t\t\t\treturn;\n\n\t\t\t// return: select active option\n\t\t\tcase constants.KEY_RETURN:\n\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// if the option_create=null, the dropdown might be closed\n\t\t\t\t}else if (self.settings.create && self.createItem()) {\n\t\t\t\t\tpreventDefault(e);\n\n\t\t\t\t// don't submit form when searching for a value\n\t\t\t\t}else if( document.activeElement == self.control_input && self.isOpen ){\n\t\t\t\t\tpreventDefault(e);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\n\t\t\t// left: modifiy item selection to the left\n\t\t\tcase constants.KEY_LEFT:\n\t\t\t\tself.advanceSelection(-1, e);\n\t\t\t\treturn;\n\n\t\t\t// right: modifiy item selection to the right\n\t\t\tcase constants.KEY_RIGHT:\n\t\t\t\tself.advanceSelection(1, e);\n\t\t\t\treturn;\n\n\t\t\t// tab: select active option and/or create item\n\t\t\tcase constants.KEY_TAB:\n\n\t\t\t\tif( self.settings.selectOnTab ){\n\t\t\t\t\tif( self.canSelect(self.activeOption) ){\n\t\t\t\t\t\tself.onOptionSelect(e,self.activeOption!);\n\n\t\t\t\t\t\t// prevent default [tab] behaviour of jump to the next field\n\t\t\t\t\t\t// if select isFull, then the dropdown won't be open and [tab] will work normally\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t\tif (self.settings.create && self.createItem()) {\n\t\t\t\t\t\tpreventDefault(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\n\t\t\t// delete|backspace: delete items\n\t\t\tcase constants.KEY_BACKSPACE:\n\t\t\tcase constants.KEY_DELETE:\n\t\t\t\tself.deleteSelection(e);\n\t\t\t\treturn;\n\t\t}\n\n\t\t// don't enter text in the control_input when active items are selected\n\t\tif( self.isInputHidden && !isKeyDown(constants.KEY_SHORTCUT,e) ){\n\t\t\tpreventDefault(e);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered on <input> keyup.\n\t *\n\t */\n\tonInput(e:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\n\t\tif( self.isLocked ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar value = self.inputValue();\n\t\tif (self.lastValue !== value) {\n\t\t\tself.lastValue = value;\n\n\t\t\tif( self.settings.shouldLoad.call(self,value) ){\n\t\t\t\tself.load(value);\n\t\t\t}\n\n\t\t\tself.refreshOptions();\n\t\t\tself.trigger('type', value);\n\t\t}\n\t}\n\n\t/**\n\t * Triggered when the user rolls over\n\t * an option in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionHover( evt:MouseEvent|KeyboardEvent, option:HTMLElement ):void{\n\t\tif( this.ignoreHover ) return;\n\t\tthis.setActiveOption(option, false);\n\t}\n\n\t/**\n\t * Triggered on <input> focus.\n\t *\n\t */\n\tonFocus(e?:MouseEvent|KeyboardEvent):void {\n\t\tvar self = this;\n\t\tvar wasFocused = self.isFocused;\n\n\t\tif (self.isDisabled) {\n\t\t\tself.blur();\n\t\t\tpreventDefault(e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (self.ignoreFocus) return;\n\t\tself.isFocused = true;\n\t\tif( self.settings.preload === 'focus' ) self.preload();\n\n\t\tif (!wasFocused) self.trigger('focus');\n\n\t\tif (!self.activeItems.length) {\n\t\t\tself.showInput();\n\t\t\tself.refreshOptions(!!self.settings.openOnFocus);\n\t\t}\n\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Triggered on <input> blur.\n\t *\n\t */\n\tonBlur(e?:FocusEvent):void {\n\n\t\tif( document.hasFocus() === false ) return;\n\n\t\tvar self = this;\n\t\tif (!self.isFocused) return;\n\t\tself.isFocused = false;\n\t\tself.ignoreFocus = false;\n\n\t\tvar deactivate = () => {\n\t\t\tself.close();\n\t\t\tself.setActiveItem();\n\t\t\tself.setCaret(self.items.length);\n\t\t\tself.trigger('blur');\n\t\t};\n\n\t\tif (self.settings.create && self.settings.createOnBlur) {\n\t\t\tself.createItem(null, false, deactivate);\n\t\t} else {\n\t\t\tdeactivate();\n\t\t}\n\t}\n\n\n\t/**\n\t * Triggered when the user clicks on an option\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\tonOptionSelect( evt:MouseEvent|KeyboardEvent, option:HTMLElement ){\n\t\tvar value, self = this;\n\n\n\t\t// should not be possible to trigger a option under a disabled optgroup\n\t\tif( option.parentElement && option.parentElement.matches('[data-disabled]') ){\n\t\t\treturn;\n\t\t}\n\n\n\t\tif( option.classList.contains('create') ){\n\t\t\tself.createItem(null, true, () => {\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tvalue = option.dataset.value;\n\t\t\tif (typeof value !== 'undefined') {\n\t\t\t\tself.lastQuery = null;\n\t\t\t\tself.addItem(value);\n\t\t\t\tif (self.settings.closeAfterSelect) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( !self.settings.hideSelected && evt.type && /click/.test(evt.type) ){\n\t\t\t\t\tself.setActiveOption(option);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return true if the given option can be selected\n\t *\n\t */\n\tcanSelect(option:HTMLElement|null):boolean{\n\n\t\tif( this.isOpen && option && this.dropdown_content.contains(option) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Triggered when the user clicks on an item\n\t * that has been selected.\n\t *\n\t */\n\tonItemSelect( evt?:MouseEvent, item?:TomItem ):boolean{\n\t\tvar self = this;\n\n\t\tif( !self.isLocked && self.settings.mode === 'multi' ){\n\t\t\tpreventDefault(evt);\n\t\t\tself.setActiveItem(item, evt);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determines whether or not to invoke\n\t * the user-provided option provider / loader\n\t *\n\t * Note, there is a subtle difference between\n\t * this.canLoad() and this.settings.shouldLoad();\n\t *\n\t *\t- settings.shouldLoad() is a user-input validator.\n\t *\tWhen false is returned, the not_loading template\n\t *\twill be added to the dropdown\n\t *\n\t *\t- canLoad() is lower level validator that checks\n\t * \tthe Tom Select instance. There is no inherent user\n\t *\tfeedback when canLoad returns false\n\t *\n\t */\n\tcanLoad(value:string):boolean{\n\n\t\tif( !this.settings.load ) return false;\n\t\tif( this.loadedSearches.hasOwnProperty(value) ) return false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Invokes the user-provided option provider / loader.\n\t *\n\t */\n\tload(value:string):void {\n\t\tconst self = this;\n\n\t\tif( !self.canLoad(value) ) return;\n\n\t\taddClasses(self.wrapper,self.settings.loadingClass);\n\t\tself.loading++;\n\n\t\tconst callback = self.loadCallback.bind(self);\n\t\tself.settings.load.call(self, value, callback);\n\t}\n\n\t/**\n\t * Invoked by the user-provided option provider\n\t *\n\t */\n\tloadCallback( options:TomOption[], optgroups:TomOption[] ):void{\n\t\tconst self = this;\n\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\tself.lastQuery = null;\n\n\t\tself.clearActiveOption(); // when new results load, focus should be on first option\n\t\tself.setupOptions(options,optgroups);\n\n\t\tself.refreshOptions(self.isFocused && !self.isInputHidden);\n\n\t\tif (!self.loading) {\n\t\t\tremoveClasses(self.wrapper,self.settings.loadingClass);\n\t\t}\n\n\t\tself.trigger('load', options, optgroups);\n\t}\n\n\tpreload():void{\n\t\tvar classList = this.wrapper.classList;\n\t\tif( classList.contains('preloaded') ) return;\n\t\tclassList.add('preloaded');\n\t\tthis.load('');\n\t}\n\n\n\t/**\n\t * Sets the input field of the control to the specified value.\n\t *\n\t */\n\tsetTextboxValue(value:string = '') {\n\t\tvar input = this.control_input;\n\t\tvar changed = input.value !== value;\n\t\tif (changed) {\n\t\t\tinput.value = value;\n\t\t\ttriggerEvent(input,'update');\n\t\t\tthis.lastValue = value;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the value of the control. If multiple items\n\t * can be selected (e.g. <select multiple>), this returns\n\t * an array. If only one item can be selected, this\n\t * returns a string.\n\t *\n\t */\n\tgetValue():string|string[] {\n\n\t\tif( this.is_select_tag && this.input.hasAttribute('multiple')) {\n\t\t\treturn this.items;\n\t\t}\n\n\t\treturn this.items.join(this.settings.delimiter);\n\t}\n\n\t/**\n\t * Resets the selected items to the given value.\n\t *\n\t */\n\tsetValue( value:string|string[], silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change'];\n\n\t\tdebounce_events(this, events,() => {\n\t\t\tthis.clear(silent);\n\t\t\tthis.addItems(value, silent);\n\t\t});\n\t}\n\n\n\t/**\n\t * Resets the number of max items to the given value\n\t *\n\t */\n\tsetMaxItems(value:null|number){\n\t\tif(value === 0) value = null; //reset to unlimited items.\n\t\tthis.settings.maxItems = value;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Sets the selected item.\n\t *\n\t */\n\tsetActiveItem( item?:TomItem, e?:MouseEvent|KeyboardEvent ){\n\t\tvar self = this;\n\t\tvar eventName;\n\t\tvar i, begin, end, swap;\n\t\tvar last;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\t// clear the active selection\n\t\tif( !item ){\n\t\t\tself.clearActiveItems();\n\t\t\tif (self.isFocused) {\n\t\t\t\tself.showInput();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// modify selection\n\t\teventName = e && e.type.toLowerCase();\n\n\t\tif (eventName === 'click' && isKeyDown('shiftKey',e) && self.activeItems.length) {\n\t\t\tlast\t= self.getLastActive();\n\t\t\tbegin\t= Array.prototype.indexOf.call(self.control.children, last);\n\t\t\tend\t\t= Array.prototype.indexOf.call(self.control.children, item);\n\n\t\t\tif (begin > end) {\n\t\t\t\tswap = begin;\n\t\t\t\tbegin = end;\n\t\t\t\tend = swap;\n\t\t\t}\n\t\t\tfor (i = begin; i <= end; i++) {\n\t\t\t\titem = self.control.children[i] as TomItem;\n\t\t\t\tif (self.activeItems.indexOf(item) === -1) {\n\t\t\t\t\tself.setActiveItemClass(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpreventDefault(e);\n\t\t} else if ((eventName === 'click' && isKeyDown(constants.KEY_SHORTCUT,e) ) || (eventName === 'keydown' && isKeyDown('shiftKey',e))) {\n\t\t\tif( item.classList.contains('active') ){\n\t\t\t\tself.removeActiveItem( item );\n\t\t\t} else {\n\t\t\t\tself.setActiveItemClass(item);\n\t\t\t}\n\t\t} else {\n\t\t\tself.clearActiveItems();\n\t\t\tself.setActiveItemClass(item);\n\t\t}\n\n\t\t// ensure control has focus\n\t\tself.hideInput();\n\t\tif (!self.isFocused) {\n\t\t\tself.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Set the active and last-active classes\n\t *\n\t */\n\tsetActiveItemClass( item:TomItem ){\n\t\tconst self = this;\n\t\tconst last_active = self.control.querySelector('.last-active');\n\t\tif( last_active ) removeClasses(last_active as HTMLElement,'last-active');\n\n\t\taddClasses(item,'active last-active');\n\t\tself.trigger('item_select', item);\n\t\tif( self.activeItems.indexOf(item) == -1 ){\n\t\t\tself.activeItems.push( item );\n\t\t}\n\t}\n\n\t/**\n\t * Remove active item\n\t *\n\t */\n\tremoveActiveItem( item:TomItem ){\n\t\tvar idx = this.activeItems.indexOf(item);\n\t\tthis.activeItems.splice(idx, 1);\n\t\tremoveClasses(item,'active');\n\t}\n\n\t/**\n\t * Clears all the active items\n\t *\n\t */\n\tclearActiveItems(){\n\t\tremoveClasses(this.activeItems,'active');\n\t\tthis.activeItems = [];\n\t}\n\n\t/**\n\t * Sets the selected item in the dropdown menu\n\t * of available options.\n\t *\n\t */\n\tsetActiveOption( option:null|HTMLElement,scroll:boolean=true ):void{\n\n\t\tif( option === this.activeOption ){\n\t\t\treturn;\n\t\t}\n\n\t\tthis.clearActiveOption();\n\t\tif( !option ) return;\n\n\t\tthis.activeOption = option;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':option.getAttribute('id')});\n\t\tsetAttr(option,{'aria-selected':'true'});\n\t\taddClasses(option,'active');\n\t\tif( scroll ) this.scrollToOption(option);\n\t}\n\n\t/**\n\t * Sets the dropdown_content scrollTop to display the option\n\t *\n\t */\n\tscrollToOption( option:null|HTMLElement, behavior?:string ):void{\n\n\t\tif( !option ) return;\n\n\t\tconst content\t\t= this.dropdown_content;\n\t\tconst height_menu\t= content.clientHeight;\n\t\tconst scrollTop\t\t= content.scrollTop || 0;\n\t\tconst height_item\t= option.offsetHeight;\n\t\tconst y\t\t\t\t= option.getBoundingClientRect().top - content.getBoundingClientRect().top + scrollTop;\n\n\t\tif (y + height_item > height_menu + scrollTop) {\n\t\t\tthis.scroll(y - height_menu + height_item, behavior);\n\n\t\t} else if (y < scrollTop) {\n\t\t\tthis.scroll(y, behavior);\n\t\t}\n\t}\n\n\t/**\n\t * Scroll the dropdown to the given position\n\t *\n\t */\n\tscroll( scrollTop:number, behavior?:string ):void{\n\t\tconst content = this.dropdown_content;\n\t\tif( behavior ){\n\t\t\tcontent.style.scrollBehavior = behavior;\n\t\t}\n\t\tcontent.scrollTop = scrollTop;\n\t\tcontent.style.scrollBehavior = '';\n\t}\n\n\t/**\n\t * Clears the active option\n\t *\n\t */\n\tclearActiveOption(){\n\t\tif( this.activeOption ){\n\t\t\tremoveClasses(this.activeOption,'active');\n\t\t\tsetAttr(this.activeOption,{'aria-selected':null});\n\t\t}\n\t\tthis.activeOption = null;\n\t\tsetAttr(this.focus_node,{'aria-activedescendant':null});\n\t}\n\n\n\t/**\n\t * Selects all items (CTRL + A).\n\t */\n\tselectAll() {\n\t\tconst self = this;\n\n\t\tif (self.settings.mode === 'single') return;\n\n\t\tconst activeItems = self.controlChildren();\n\n\t\tif( !activeItems.length ) return;\n\n\t\tself.hideInput();\n\t\tself.close();\n\n\t\tself.activeItems = activeItems;\n\t\titerate( activeItems, (item) => {\n\t\t\tself.setActiveItemClass(item);\n\t\t});\n\n\t}\n\n\t/**\n\t * Determines if the control_input should be in a hidden or visible state\n\t *\n\t */\n\tinputState(){\n\t\tvar self = this;\n\n\t\tif( !self.control.contains(self.control_input) ) return;\n\n\t\tsetAttr(self.control_input,{placeholder:self.settings.placeholder});\n\n\t\tif( self.activeItems.length > 0 || (!self.isFocused && self.settings.hidePlaceholder && self.items.length > 0) ){\n\t\t\tself.setTextboxValue();\n\t\t\tself.isInputHidden = true;\n\n\t\t}else{\n\n\t\t\tif( self.settings.hidePlaceholder && self.items.length > 0 ){\n\t\t\t\tsetAttr(self.control_input,{placeholder:''});\n\t\t\t}\n\t\t\tself.isInputHidden = false;\n\t\t}\n\n\t\tself.wrapper.classList.toggle('input-hidden', self.isInputHidden );\n\t}\n\n\t/**\n\t * Hides the input element out of view, while\n\t * retaining its focus.\n\t * @deprecated 1.3\n\t */\n\thideInput() {\n\t\tthis.inputState();\n\t}\n\n\t/**\n\t * Restores input visibility.\n\t * @deprecated 1.3\n\t */\n\tshowInput() {\n\t\tthis.inputState();\n\t}\n\n\t/**\n\t * Get the input value\n\t */\n\tinputValue(){\n\t\treturn this.control_input.value.trim();\n\t}\n\n\t/**\n\t * Gives the control focus.\n\t */\n\tfocus() {\n\t\tvar self = this;\n\t\tif (self.isDisabled) return;\n\n\t\tself.ignoreFocus = true;\n\n\t\tif( self.control_input.offsetWidth ){\n\t\t\tself.control_input.focus();\n\t\t}else{\n\t\t\tself.focus_node.focus();\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tself.ignoreFocus = false;\n\t\t\tself.onFocus();\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Forces the control out of focus.\n\t *\n\t */\n\tblur():void {\n\t\tthis.focus_node.blur();\n\t\tthis.onBlur();\n\t}\n\n\t/**\n\t * Returns a function that scores an object\n\t * to show how good of a match it is to the\n\t * provided query.\n\t *\n\t * @return {function}\n\t */\n\tgetScoreFunction(query:string) {\n\t\treturn this.sifter.getScoreFunction(query, this.getSearchOptions());\n\t}\n\n\t/**\n\t * Returns search options for sifter (the system\n\t * for scoring and sorting results).\n\t *\n\t * @see https://github.com/orchidjs/sifter.js\n\t * @return {object}\n\t */\n\tgetSearchOptions() {\n\t\tvar settings = this.settings;\n\t\tvar sort = settings.sortField;\n\t\tif (typeof settings.sortField === 'string') {\n\t\t\tsort = [{field: settings.sortField}];\n\t\t}\n\n\t\treturn {\n\t\t\tfields : settings.searchField,\n\t\t\tconjunction : settings.searchConjunction,\n\t\t\tsort : sort,\n\t\t\tnesting : settings.nesting\n\t\t};\n\t}\n\n\t/**\n\t * Searches through available options and returns\n\t * a sorted array of matches.\n\t *\n\t */\n\tsearch(query:string) : ReturnType<Sifter['search']>{\n\t\tvar i, result, calculateScore;\n\t\tvar self = this;\n\t\tvar options = this.getSearchOptions();\n\n\t\t// validate user-provided result scoring function\n\t\tif ( self.settings.score ){\n\t\t\tcalculateScore = self.settings.score.call(self,query);\n\t\t\tif (typeof calculateScore !== 'function') {\n\t\t\t\tthrow new Error('Tom Select \"score\" setting must be a function that returns a function');\n\t\t\t}\n\t\t}\n\n\t\t// perform search\n\t\tif (query !== self.lastQuery) {\n\t\t\tself.lastQuery\t\t\t= query;\n\t\t\tresult\t\t\t\t\t= self.sifter.search(query, Object.assign(options, {score: calculateScore}));\n\t\t\tself.currentResults\t\t= result;\n\t\t} else {\n\t\t\tresult\t\t\t\t\t= Object.assign( {}, self.currentResults);\n\t\t}\n\n\t\t// filter out selected items\n\t\tif( self.settings.hideSelected ){\n\t\t\tfor (i = result.items.length - 1; i >= 0; i--) {\n\t\t\t\tlet hashed = hash_key(result.items[i].id);\n\t\t\t\tif( hashed && self.items.indexOf(hashed) !== -1 ){\n\t\t\t\t\tresult.items.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Refreshes the list of available options shown\n\t * in the autocomplete dropdown menu.\n\t *\n\t */\n\trefreshOptions( triggerDropdown:boolean = true ){\n\t\tvar i, j, k, n, optgroup, optgroups, html:DocumentFragment, has_create_option, active_value, active_group;\n\t\tvar create;\n\t\tconst groups: {[key:string]:DocumentFragment} = {};\n\n\t\tconst groups_order:string[]\t= [];\n\t\tvar self\t\t\t\t\t= this;\n\t\tvar query\t\t\t\t\t= self.inputValue();\n\t\tvar results\t\t\t\t\t= self.search(query);\n\t\tvar active_option\t\t\t= null; //self.activeOption;\n\t\tvar show_dropdown\t\t\t= self.settings.shouldOpen || false;\n\t\tvar dropdown_content\t\t= self.dropdown_content;\n\n\t\tif( self.activeOption ){\n\t\t\tactive_value = self.activeOption.dataset.value;\n\t\t\tactive_group = self.activeOption.closest('[data-group]') as HTMLElement;\n\t\t}\n\n\t\t// build markup\n\t\tn = results.items.length;\n\t\tif (typeof self.settings.maxOptions === 'number') {\n\t\t\tn = Math.min(n, self.settings.maxOptions);\n\t\t}\n\n\t\tif( n > 0 ){\n\t\t\tshow_dropdown = true;\n\t\t}\n\n\t\t// render and group available options individually\n\t\tfor (i = 0; i < n; i++) {\n\n\t\t\t// get option dom element\n\t\t\tlet opt_value\t\t= results.items[i].id;\n\t\t\tlet option\t\t\t= self.options[opt_value];\n\t\t\tlet option_el\t\t= self.getOption(opt_value,true) as HTMLElement;\n\n\n\t\t\t// toggle 'selected' class\n\t\t\tif( !self.settings.hideSelected ){\n\t\t\t\toption_el.classList.toggle('selected', self.items.includes(opt_value) );\n\t\t\t}\n\n\t\t\toptgroup = option[self.settings.optgroupField] || '';\n\t\t\toptgroups = Array.isArray(optgroup) ? optgroup : [optgroup];\n\n\t\t\tfor (j = 0, k = optgroups && optgroups.length; j < k; j++) {\n\t\t\t\toptgroup = optgroups[j];\n\t\t\t\tif (!self.optgroups.hasOwnProperty(optgroup)) {\n\t\t\t\t\toptgroup = '';\n\t\t\t\t}\n\t\t\t\tif (!groups.hasOwnProperty(optgroup)) {\n\t\t\t\t\tgroups[optgroup] = document.createDocumentFragment();\n\t\t\t\t\tgroups_order.push(optgroup);\n\t\t\t\t}\n\n\t\t\t\t// nodes can only have one parent, so if the option is in mutple groups, we need a clone\n\t\t\t\tif( j > 0 ){\n\t\t\t\t\toption_el = option_el.cloneNode(true) as HTMLElement;\n\t\t\t\t\tsetAttr(option_el,{id: option.$id+'-clone-'+j,'aria-selected':null});\n\t\t\t\t\toption_el.classList.add('ts-cloned');\n\t\t\t\t\tremoveClasses(option_el,'active');\n\t\t\t\t}\n\n\t\t\t\t// make sure we keep the activeOption in the same group\n\t\t\t\tif( !active_option && active_value == opt_value ){\n\t\t\t\t\tif( active_group ){\n\t\t\t\t\t\tif( active_group.dataset.group === optgroup ){\n\t\t\t\t\t\t\tactive_option = option_el;\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{\n\t\t\t\t\t\tactive_option = option_el;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgroups[optgroup].appendChild(option_el);\n\t\t\t}\n\t\t}\n\n\t\t// sort optgroups\n\t\tif (this.settings.lockOptgroupOrder) {\n\t\t\tgroups_order.sort((a, b) => {\n\t\t\t\tvar a_order = self.optgroups[a] && self.optgroups[a].$order || 0;\n\t\t\t\tvar b_order = self.optgroups[b] && self.optgroups[b].$order || 0;\n\t\t\t\treturn a_order - b_order;\n\t\t\t});\n\t\t}\n\n\t\t// render optgroup headers & join groups\n\t\thtml = document.createDocumentFragment();\n\t\titerate( groups_order, (optgroup) => {\n\t\t\tif (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].children.length) {\n\n\t\t\t\tlet group_options = document.createDocumentFragment();\n\t\t\t\tlet header = self.render('optgroup_header', self.optgroups[optgroup]);\n\t\t\t\tappend( group_options, header );\n\t\t\t\tappend( group_options, groups[optgroup] );\n\n\t\t\t\tlet group_html = self.render('optgroup', {group:self.optgroups[optgroup],options:group_options} );\n\n\t\t\t\tappend( html, group_html );\n\n\t\t\t} else {\n\t\t\t\tappend( html, groups[optgroup] );\n\t\t\t}\n\t\t});\n\n\t\tdropdown_content.innerHTML = '';\n\t\tappend( dropdown_content, html );\n\n\t\t// highlight matching terms inline\n\t\tif (self.settings.highlight) {\n\t\t\tremoveHighlight( dropdown_content );\n\t\t\tif (results.query.length && results.tokens.length) {\n\t\t\t\titerate( results.tokens, (tok) => {\n\t\t\t\t\thighlight( dropdown_content, tok.regex);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// helper method for adding templates to dropdown\n\t\tvar add_template = (template:TomTemplateNames) => {\n\t\t\tlet content = self.render(template,{input:query});\n\t\t\tif( content ){\n\t\t\t\tshow_dropdown = true;\n\t\t\t\tdropdown_content.insertBefore(content, dropdown_content.firstChild);\n\t\t\t}\n\t\t\treturn content;\n\t\t};\n\n\n\t\t// add loading message\n\t\tif( self.loading ){\n\t\t\tadd_template('loading');\n\n\t\t// invalid query\n\t\t}else if( !self.settings.shouldLoad.call(self,query) ){\n\t\t\tadd_template('not_loading');\n\n\t\t// add no_results message\n\t\t}else if( results.items.length === 0 ){\n\t\t\tadd_template('no_results');\n\n\t\t}\n\n\n\n\t\t// add create option\n\t\thas_create_option = self.canCreate(query);\n\t\tif (has_create_option) {\n\t\t\tcreate = add_template('option_create');\n\t\t}\n\n\n\t\t// activate\n\t\tself.hasOptions = results.items.length > 0 || has_create_option;\n\t\tif( show_dropdown ){\n\n\t\t\tif (results.items.length > 0) {\n\n\t\t\t\tif( !active_option && self.settings.mode === 'single' && self.items.length ){\n\t\t\t\t\tactive_option = self.getOption(self.items[0]);\n\t\t\t\t}\n\n\t\t\t\tif( !dropdown_content.contains(active_option) ){\n\n\t\t\t\t\tlet active_index = 0;\n\t\t\t\t\tif( create && !self.settings.addPrecedence ){\n\t\t\t\t\t\tactive_index = 1;\n\t\t\t\t\t}\n\t\t\t\t\tactive_option = self.selectable()[active_index] as HTMLElement;\n\t\t\t\t}\n\n\t\t\t}else if( create ){\n\t\t\t\tactive_option = create;\n\t\t\t}\n\n\t\t\tif( triggerDropdown && !self.isOpen ){\n\t\t\t\tself.open();\n\t\t\t\tself.scrollToOption(active_option,'auto');\n\t\t\t}\n\t\t\tself.setActiveOption(active_option);\n\n\t\t}else{\n\t\t\tself.clearActiveOption();\n\t\t\tif( triggerDropdown && self.isOpen ){\n\t\t\t\tself.close(false); // if create_option=null, we want the dropdown to close but not reset the textbox value\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Return list of selectable options\n\t *\n\t */\n\tselectable():NodeList{\n\t\treturn this.dropdown_content.querySelectorAll('[data-selectable]');\n\t}\n\n\n\n\t/**\n\t * Adds an available option. If it already exists,\n\t * nothing will happen. Note: this does not refresh\n\t * the options list dropdown (use `refreshOptions`\n\t * for that).\n\t *\n\t * Usage:\n\t *\n\t * this.addOption(data)\n\t *\n\t */\n\taddOption( data:TomOption, user_created = false ):false|string {\n\t\tconst self = this;\n\n\t\t// @deprecated 1.7.7\n\t\t// use addOptions( array, user_created ) for adding multiple options\n\t\tif( Array.isArray(data) ){\n\t\t\tself.addOptions( data, user_created);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst key = hash_key(data[self.settings.valueField]);\n\t\tif( key === null || self.options.hasOwnProperty(key) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tdata.$order\t\t\t= data.$order || ++self.order;\n\t\tdata.$id\t\t\t= self.inputId + '-opt-' + data.$order;\n\t\tself.options[key]\t= data;\n\t\tself.lastQuery\t\t= null;\n\n\t\tif( user_created ){\n\t\t\tself.userOptions[key] = user_created;\n\t\t\tself.trigger('option_add', key, data);\n\t\t}\n\n\t\treturn key;\n\t}\n\n\t/**\n\t * Add multiple options\n\t *\n\t */\n\taddOptions( data:TomOption[], user_created = false ):void{\n\t\titerate( data, (dat) => {\n\t\t\tthis.addOption(dat, user_created);\n\t\t});\n\t}\n\n\t/**\n\t * @deprecated 1.7.7\n\t */\n\tregisterOption( data:TomOption ):false|string {\n\t\treturn this.addOption(data);\n\t}\n\n\t/**\n\t * Registers an option group to the pool of option groups.\n\t *\n\t * @return {boolean|string}\n\t */\n\tregisterOptionGroup(data:TomOption) {\n\t\tvar key = hash_key(data[this.settings.optgroupValueField]);\n\n\t\tif ( key === null ) return false;\n\n\t\tdata.$order = data.$order || ++this.order;\n\t\tthis.optgroups[key] = data;\n\t\treturn key;\n\t}\n\n\t/**\n\t * Registers a new optgroup for options\n\t * to be bucketed into.\n\t *\n\t */\n\taddOptionGroup(id:string, data:TomOption) {\n\t\tvar hashed_id;\n\t\tdata[this.settings.optgroupValueField] = id;\n\n\t\tif( hashed_id = this.registerOptionGroup(data) ){\n\t\t\tthis.trigger('optgroup_add', hashed_id, data);\n\t\t}\n\t}\n\n\t/**\n\t * Removes an existing option group.\n\t *\n\t */\n\tremoveOptionGroup(id:string) {\n\t\tif (this.optgroups.hasOwnProperty(id)) {\n\t\t\tdelete this.optgroups[id];\n\t\t\tthis.clearCache();\n\t\t\tthis.trigger('optgroup_remove', id);\n\t\t}\n\t}\n\n\t/**\n\t * Clears all existing option groups.\n\t */\n\tclearOptionGroups() {\n\t\tthis.optgroups = {};\n\t\tthis.clearCache();\n\t\tthis.trigger('optgroup_clear');\n\t}\n\n\t/**\n\t * Updates an option available for selection. If\n\t * it is visible in the selected items or options\n\t * dropdown, it will be re-rendered automatically.\n\t *\n\t */\n\tupdateOption(value:string, data:TomOption) {\n\t\tconst self = this;\n\t\tvar item_new;\n\t\tvar index_item;\n\n\t\tconst value_old\t\t= hash_key(value);\n\t\tconst value_new\t\t= hash_key(data[self.settings.valueField]);\n\n\t\t// sanity checks\n\t\tif( value_old === null ) return;\n\t\tif( !self.options.hasOwnProperty(value_old) ) return;\n\t\tif( typeof value_new !== 'string' ) throw new Error('Value must be set in option data');\n\n\n\t\tconst option\t\t= self.getOption(value_old);\n\t\tconst item\t\t\t= self.getItem(value_old);\n\n\n\t\tdata.$order = data.$order || self.options[value_old].$order;\n\t\tdelete self.options[value_old];\n\n\t\t// invalidate render cache\n\t\t// don't remove existing node yet, we'll remove it after replacing it\n\t\tself.uncacheValue(value_new);\n\n\t\tself.options[value_new] = data;\n\n\t\t// update the option if it's in the dropdown\n\t\tif( option ){\n\t\t\tif( self.dropdown_content.contains(option) ){\n\n\t\t\t\tconst option_new\t= self._render('option', data);\n\t\t\t\treplaceNode(option, option_new);\n\n\t\t\t\tif( self.activeOption === option ){\n\t\t\t\t\tself.setActiveOption(option_new);\n\t\t\t\t}\n\t\t\t}\n\t\t\toption.remove();\n\t\t}\n\n\t\t// update the item if we have one\n\t\tif( item ){\n\t\t\tindex_item = self.items.indexOf(value_old);\n\t\t\tif (index_item !== -1) {\n\t\t\t\tself.items.splice(index_item, 1, value_new);\n\t\t\t}\n\n\t\t\titem_new\t= self._render('item', data);\n\n\t\t\tif( item.classList.contains('active') ) addClasses(item_new,'active');\n\n\t\t\treplaceNode( item, item_new);\n\t\t}\n\n\t\t// invalidate last query because we might have updated the sortField\n\t\tself.lastQuery = null;\n\t}\n\n\t/**\n\t * Removes a single option.\n\t *\n\t */\n\tremoveOption(value:string, silent?:boolean):void {\n\t\tconst self = this;\n\t\tvalue = get_hash(value);\n\n\t\tself.uncacheValue(value);\n\n\t\tdelete self.userOptions[value];\n\t\tdelete self.options[value];\n\t\tself.lastQuery = null;\n\t\tself.trigger('option_remove', value);\n\t\tself.removeItem(value, silent);\n\t}\n\n\t/**\n\t * Clears all options.\n\t */\n\tclearOptions(filter?:TomClearFilter ) {\n\n\t\tconst boundFilter = (filter || this.clearFilter).bind(this);\n\n\t\tthis.loadedSearches\t\t= {};\n\t\tthis.userOptions\t\t= {};\n\t\tthis.clearCache();\n\n\t\tconst selected:TomOptions\t= {};\n\t\titerate(this.options,(option,key)=>{\n\t\t\tif( boundFilter(option,key as string) ){\n\t\t\t\tselected[key] = this.options[key];\n\t\t\t}\n\t\t});\n\n\t\tthis.options = this.sifter.items = selected;\n\t\tthis.lastQuery = null;\n\t\tthis.trigger('option_clear');\n\t}\n\n\t/**\n\t * Used by clearOptions() to decide whether or not an option should be removed\n\t * Return true to keep an option, false to remove\n\t *\n\t */\n\tclearFilter(option:TomOption,value:string){\n\t\tif( this.items.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns the dom element of the option\n\t * matching the given value.\n\t *\n\t */\n\tgetOption(value:null|string, create:boolean=false):null|HTMLElement {\n\t\tconst hashed = hash_key(value);\n\n\t\tif( hashed !== null && this.options.hasOwnProperty(hashed) ){\n\t\t\tconst option = this.options[hashed];\n\n\t\t\tif( option.$div ){\n\t\t\t\treturn option.$div;\n\t\t\t}\n\n\t\t\tif( create ){\n\t\t\t\treturn this._render('option', option);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the dom element of the next or previous dom element of the same type\n\t * Note: adjacent options may not be adjacent DOM elements (optgroups)\n\t *\n\t */\n\tgetAdjacent( option:null|HTMLElement, direction:number, type:string = 'option' ) : HTMLElement|null{\n\t\tvar self = this, all;\n\n\t\tif( !option ){\n\t\t\treturn null;\n\t\t}\n\n\t\tif( type == 'item' ){\n\t\t\tall\t\t\t= self.controlChildren();\n\t\t}else{\n\t\t\tall\t\t\t= self.dropdown_content.querySelectorAll('[data-selectable]');\n\t\t}\n\n\t\tfor( let i = 0; i < all.length; i++ ){\n\t\t\tif( all[i] != option ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( direction > 0 ){\n\t\t\t\treturn all[i+1] as HTMLElement;\n\t\t\t}\n\n\t\t\treturn all[i-1] as HTMLElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\n\t/**\n\t * Returns the dom element of the item\n\t * matching the given value.\n\t *\n\t */\n\tgetItem(item:string|TomItem|null):null|TomItem {\n\n\t\tif( typeof item == 'object' ){\n\t\t\treturn item;\n\t\t}\n\n\t\tvar value = hash_key(item);\n\t\treturn value !== null\n\t\t\t? this.control.querySelector(`[data-value=\"${addSlashes(value)}\"]`)\n\t\t\t: null;\n\t}\n\n\t/**\n\t * \"Selects\" multiple items at once. Adds them to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItems( values:string|string[], silent?:boolean ):void{\n\t\tvar self = this;\n\n\t\tvar items = Array.isArray(values) ? values : [values];\n\t\titems = items.filter(x => self.items.indexOf(x) === -1);\n\t\tfor (let i = 0, n = items.length; i < n; i++) {\n\t\t\tself.isPending = (i < n - 1);\n\t\t\tself.addItem(items[i], silent);\n\t\t}\n\t}\n\n\t/**\n\t * \"Selects\" an item. Adds it to the list\n\t * at the current caret position.\n\t *\n\t */\n\taddItem( value:string, silent?:boolean ):void{\n\t\tvar events = silent ? [] : ['change','dropdown_close'];\n\n\t\tdebounce_events(this, events, () => {\n\t\t\tvar item, wasFull;\n\t\t\tconst self = this;\n\t\t \tconst inputMode = self.settings.mode;\n\t\t\tconst hashed = hash_key(value);\n\n\t\t\tif( hashed && self.items.indexOf(hashed) !== -1 ){\n\n\t\t\t\tif( inputMode === 'single' ){\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\n\t\t\t\tif( inputMode === 'single' || !self.settings.duplicates ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hashed === null || !self.options.hasOwnProperty(hashed)) return;\n\t\t\tif (inputMode === 'single') self.clear(silent);\n\t\t\tif (inputMode === 'multi' && self.isFull()) return;\n\n\t\t\titem = self._render('item', self.options[hashed]);\n\n\t\t\tif( self.control.contains(item) ){ // duplicates\n\t\t\t\titem = item.cloneNode(true) as HTMLElement;\n\t\t\t}\n\n\t\t\twasFull = self.isFull();\n\t\t\tself.items.splice(self.caretPos, 0, hashed);\n\t\t\tself.insertAtCaret(item);\n\n\t\t\tif (self.isSetup) {\n\n\t\t\t\t// update menu / remove the option (if this is not one item being added as part of series)\n\t\t\t\tif( !self.isPending && self.settings.hideSelected ){\n\t\t\t\t\tlet option = self.getOption(hashed);\n\t\t\t\t\tlet next = self.getAdjacent(option, 1);\n\t\t\t\t\tif( next ){\n\t\t\t\t\t\tself.setActiveOption(next);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// refreshOptions after setActiveOption(),\n\t\t\t\t// otherwise setActiveOption() will be called by refreshOptions() with the wrong value\n\t\t\t\tif( !self.isPending && !self.settings.closeAfterSelect ){\n\t\t\t\t\tself.refreshOptions(self.isFocused && inputMode !== 'single');\n\t\t\t\t}\n\n\t\t\t\t// hide the menu if the maximum number of items have been selected or no options are left\n\t\t\t\tif( self.settings.closeAfterSelect != false && self.isFull() ){\n\t\t\t\t\tself.close();\n\t\t\t\t} else if (!self.isPending) {\n\t\t\t\t\tself.positionDropdown();\n\t\t\t\t}\n\n\t\t\t\tself.trigger('item_add', hashed, item);\n\n\t\t\t\tif (!self.isPending) {\n\t\t\t\t\tself.updateOriginalInput({silent: silent});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!self.isPending || (!wasFull && self.isFull())) {\n\t\t\t\tself.inputState();\n\t\t\t\tself.refreshState();\n\t\t\t}\n\n\t\t});\n\t}\n\n\t/**\n\t * Removes the selected item matching\n\t * the provided value.\n\t *\n\t */\n\tremoveItem( item:string|TomItem|null=null, silent?:boolean ){\n\t\tconst self\t\t= this;\n\t\titem\t\t\t= self.getItem(item);\n\n\t\tif( !item ) return;\n\n\t\tvar i,idx;\n\t\tconst value\t= item.dataset.value;\n\t\ti = nodeIndex(item);\n\n\t\titem.remove();\n\t\tif( item.classList.contains('active') ){\n\t\t\tidx = self.activeItems.indexOf(item);\n\t\t\tself.activeItems.splice(idx, 1);\n\t\t\tremoveClasses(item,'active');\n\t\t}\n\n\t\tself.items.splice(i, 1);\n\t\tself.lastQuery = null;\n\t\tif (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {\n\t\t\tself.removeOption(value, silent);\n\t\t}\n\n\t\tif (i < self.caretPos) {\n\t\t\tself.setCaret(self.caretPos - 1);\n\t\t}\n\n\t\tself.updateOriginalInput({silent: silent});\n\t\tself.refreshState();\n\t\tself.positionDropdown();\n\t\tself.trigger('item_remove', value, item);\n\n\t}\n\n\t/**\n\t * Invokes the `create` method provided in the\n\t * TomSelect options that should provide the data\n\t * for the new item, given the user input.\n\t *\n\t * Once this completes, it will be added\n\t * to the item list.\n\t *\n\t */\n\tcreateItem( input:null|string=null, triggerDropdown:boolean=true, callback:TomCreateCallback = ()=>{} ):boolean{\n\t\tvar self = this;\n\t\tvar caret = self.caretPos;\n\t\tvar output;\n\t\tinput = input || self.inputValue();\n\n\t\tif (!self.canCreate(input)) {\n\t\t\tcallback();\n\t\t\treturn false;\n\t\t}\n\n\t\tself.lock();\n\n\t\tvar created = false;\n\t\tvar create = (data?:boolean|TomOption) => {\n\t\t\tself.unlock();\n\n\t\t\tif (!data || typeof data !== 'object') return callback();\n\t\t\tvar value = hash_key(data[self.settings.valueField]);\n\t\t\tif( typeof value !== 'string' ){\n\t\t\t\treturn callback();\n\t\t\t}\n\n\t\t\tself.setTextboxValue();\n\t\t\tself.addOption(data,true);\n\t\t\tself.setCaret(caret);\n\t\t\tself.addItem(value);\n\t\t\tcallback(data);\n\t\t\tcreated = true;\n\t\t};\n\n\t\tif( typeof self.settings.create === 'function' ){\n\t\t\toutput = self.settings.create.call(this, input, create);\n\t\t}else{\n\t\t\toutput = {\n\t\t\t\t[self.settings.labelField]: input,\n\t\t\t\t[self.settings.valueField]: input,\n\t\t\t};\n\t\t}\n\n\t\tif( !created ){\n\t\t\tcreate(output);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Re-renders the selected item lists.\n\t */\n\trefreshItems() {\n\t\tvar self = this;\n\t\tself.lastQuery = null;\n\n\t\tif (self.isSetup) {\n\t\t\tself.addItems(self.items);\n\t\t}\n\n\t\tself.updateOriginalInput();\n\t\tself.refreshState();\n\t}\n\n\t/**\n\t * Updates all state-dependent attributes\n\t * and CSS classes.\n\t */\n\trefreshState() {\n\t\tconst self = this;\n\n\t\tself.refreshValidityState();\n\n\t\tconst isFull\t= self.isFull();\n\t\tconst isLocked\t= self.isLocked;\n\n\t\tself.wrapper.classList.toggle('rtl',self.rtl);\n\n\n\t\tconst wrap_classList = self.wrapper.classList;\n\n\t\twrap_classList.toggle('focus', self.isFocused)\n\t\twrap_classList.toggle('disabled', self.isDisabled)\n\t\twrap_classList.toggle('required', self.isRequired)\n\t\twrap_classList.toggle('invalid', !self.isValid)\n\t\twrap_classList.toggle('locked', isLocked)\n\t\twrap_classList.toggle('full', isFull)\n\t\twrap_classList.toggle('input-active', self.isFocused && !self.isInputHidden)\n\t\twrap_classList.toggle('dropdown-active', self.isOpen)\n\t\twrap_classList.toggle('has-options', isEmptyObject(self.options) )\n\t\twrap_classList.toggle('has-items', self.items.length > 0);\n\n\t}\n\n\n\t/**\n\t * Update the `required` attribute of both input and control input.\n\t *\n\t * The `required` property needs to be activated on the control input\n\t * for the error to be displayed at the right place. `required` also\n\t * needs to be temporarily deactivated on the input since the input is\n\t * hidden and can't show errors.\n\t */\n\trefreshValidityState() {\n\t\tvar self = this;\n\n\t\tif( !self.input.validity ){\n\t\t\treturn;\n\t\t}\n\n\t\tself.isValid = self.input.validity.valid;\n\t\tself.isInvalid = !self.isValid;\n\t}\n\n\t/**\n\t * Determines whether or not more items can be added\n\t * to the control without exceeding the user-defined maximum.\n\t *\n\t * @returns {boolean}\n\t */\n\tisFull() {\n\t\treturn this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;\n\t}\n\n\t/**\n\t * Refreshes the original <select> or <input>\n\t * element to reflect the current state.\n\t *\n\t */\n\tupdateOriginalInput( opts:TomArgObject = {} ){\n\t\tconst self = this;\n\t\tvar option, label;\n\n\t\tconst empty_option = self.input.querySelector('option[value=\"\"]') as HTMLOptionElement;\n\n\t\tif( self.is_select_tag ){\n\n\t\t\tconst selected:HTMLOptionElement[]\t\t= [];\n\t\t\tconst has_selected:number\t\t\t\t= self.input.querySelectorAll('option:checked').length;\n\n\t\t\tfunction AddSelected(option_el:HTMLOptionElement|null, value:string, label:string):HTMLOptionElement{\n\n\t\t\t\tif( !option_el ){\n\t\t\t\t\toption_el = getDom('<option value=\"' + escape_html(value) + '\">' + escape_html(label) + '</option>') as HTMLOptionElement;\n\t\t\t\t}\n\n\t\t\t\t// don't move empty option from top of list\n\t\t\t\t// fixes bug in firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1725293\n\t\t\t\tif( option_el != empty_option ){\n\t\t\t\t\tself.input.append(option_el);\n\t\t\t\t}\n\n\t\t\t\tselected.push(option_el);\n\n\t\t\t\t// marking empty option as selected can break validation\n\t\t\t\t// fixes https://github.com/orchidjs/tom-select/issues/303\n\t\t\t\tif( option_el != empty_option || has_selected > 0 ){\n\t\t\t\t\toption_el.selected = true;\n\t\t\t\t}\n\n\t\t\t\treturn option_el;\n\t\t\t}\n\n\t\t\t// unselect all selected options\n\t\t\tself.input.querySelectorAll('option:checked').forEach((option_el:Element) => {\n\t\t\t\t(<HTMLOptionElement>option_el).selected = false;\n\t\t\t});\n\n\n\t\t\t// nothing selected?\n\t\t\tif( self.items.length == 0 && self.settings.mode == 'single' ){\n\n\t\t\t\tAddSelected(empty_option, \"\", \"\");\n\n\t\t\t// order selected <option> tags for values in self.items\n\t\t\t}else{\n\n\t\t\t\tself.items.forEach((value)=>{\n\t\t\t\t\toption\t\t\t= self.options[value];\n\t\t\t\t\tlabel\t\t\t= option[self.settings.labelField] || '';\n\n\t\t\t\t\tif( selected.includes(option.$option) ){\n\t\t\t\t\t\tconst reuse_opt = self.input.querySelector(`option[value=\"${addSlashes(value)}\"]:not(:checked)`) as HTMLOptionElement;\n\t\t\t\t\t\tAddSelected(reuse_opt, value, label);\n\t\t\t\t\t}else{\n\t\t\t\t\t\toption.$option\t= AddSelected(option.$option, value, label);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tself.input.value = self.getValue() as string;\n\t\t}\n\n\t\tif (self.isSetup) {\n\t\t\tif (!opts.silent) {\n\t\t\t\tself.trigger('change', self.getValue() );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Shows the autocomplete dropdown containing\n\t * the available options.\n\t */\n\topen() {\n\t\tvar self = this;\n\n\t\tif (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;\n\t\tself.isOpen = true;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'true'});\n\t\tself.refreshState();\n\t\tapplyCSS(self.dropdown,{visibility: 'hidden', display: 'block'});\n\t\tself.positionDropdown();\n\t\tapplyCSS(self.dropdown,{visibility: 'visible', display: 'block'});\n\t\tself.focus();\n\t\tself.trigger('dropdown_open', self.dropdown);\n\t}\n\n\t/**\n\t * Closes the autocomplete dropdown menu.\n\t */\n\tclose(setTextboxValue=true) {\n\t\tvar self = this;\n\t\tvar trigger = self.isOpen;\n\n\t\tif( setTextboxValue ){\n\n\t\t\t// before blur() to prevent form onchange event\n\t\t\tself.setTextboxValue();\n\n\t\t\tif (self.settings.mode === 'single' && self.items.length) {\n\t\t\t\tself.hideInput();\n\t\t\t}\n\t\t}\n\n\t\tself.isOpen = false;\n\t\tsetAttr(self.focus_node,{'aria-expanded': 'false'});\n\t\tapplyCSS(self.dropdown,{display: 'none'});\n\t\tif( self.settings.hideSelected ){\n\t\t\tself.clearActiveOption();\n\t\t}\n\t\tself.refreshState();\n\n\t\tif (trigger) self.trigger('dropdown_close', self.dropdown);\n\t}\n\n\t/**\n\t * Calculates and applies the appropriate\n\t * position of the dropdown if dropdownParent = 'body'.\n\t * Otherwise, position is determined by css\n\t */\n\tpositionDropdown(){\n\n\t\tif( this.settings.dropdownParent !== 'body' ){\n\t\t\treturn;\n\t\t}\n\n\t\tvar context\t\t\t= this.control;\n\t\tvar rect\t\t\t= context.getBoundingClientRect();\n\t\tvar top\t\t\t\t= context.offsetHeight + rect.top + window.scrollY;\n\t\tvar left\t\t\t= rect.left + window.scrollX;\n\n\n\t\tapplyCSS(this.dropdown,{\n\t\t\twidth : rect.width + 'px',\n\t\t\ttop : top + 'px',\n\t\t\tleft : left + 'px'\n\t\t});\n\n\t}\n\n\t/**\n\t * Resets / clears all selected items\n\t * from the control.\n\t *\n\t */\n\tclear(silent?:boolean) {\n\t\tvar self = this;\n\n\t\tif (!self.items.length) return;\n\n\t\tvar items = self.controlChildren();\n\t\titerate(items,(item)=>{\n\t\t\tself.removeItem(item,true);\n\t\t});\n\n\t\tself.showInput();\n\t\tif( !silent ) self.updateOriginalInput();\n\t\tself.trigger('clear');\n\t}\n\n\t/**\n\t * A helper method for inserting an element\n\t * at the current caret position.\n\t *\n\t */\n\tinsertAtCaret(el:HTMLElement) {\n\t\tconst self\t\t= this;\n\t\tconst caret\t\t= self.caretPos;\n\t\tconst target\t= self.control;\n\n\t\ttarget.insertBefore(el, target.children[caret]);\n\n\t\tself.setCaret(caret + 1);\n\t}\n\n\t/**\n\t * Removes the current selected item(s).\n\t *\n\t */\n\tdeleteSelection(e:KeyboardEvent):boolean {\n\t\tvar direction, selection, caret, tail;\n\t\tvar self = this;\n\n\t\tdirection = (e && e.keyCode === constants.KEY_BACKSPACE) ? -1 : 1;\n\t\tselection = getSelection(self.control_input);\n\n\n\t\t// determine items that will be removed\n\t\tconst rm_items:TomItem[]\t= [];\n\n\t\tif (self.activeItems.length) {\n\n\t\t\ttail = getTail(self.activeItems, direction);\n\t\t\tcaret = nodeIndex(tail);\n\n\t\t\tif (direction > 0) { caret++; }\n\n\t\t\titerate(self.activeItems, (item) => rm_items.push(item) );\n\n\t\t} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {\n\t\t\tconst items = self.controlChildren();\n\t\t\tif (direction < 0 && selection.start === 0 && selection.length === 0) {\n\t\t\t\trm_items.push( items[self.caretPos - 1]);\n\n\t\t\t} else if (direction > 0 && selection.start === self.inputValue().length) {\n\t\t\t\trm_items.push(items[self.caretPos]);\n\t\t\t}\n\t\t}\n\n\t\tif( !self.shouldDelete(rm_items,e) ){\n\t\t\treturn false;\n\t\t}\n\n\t\tpreventDefault(e,true);\n\n\t\t// perform removal\n\t\tif (typeof caret !== 'undefined') {\n\t\t\tself.setCaret(caret);\n\t\t}\n\n\t\twhile( rm_items.length ){\n\t\t\tself.removeItem(rm_items.pop());\n\t\t}\n\n\t\tself.showInput();\n\t\tself.positionDropdown();\n\t\tself.refreshOptions(false);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Return true if the items should be deleted\n\t */\n\tshouldDelete(items:TomItem[],evt:MouseEvent|KeyboardEvent){\n\n\t\tconst values = items.map(item => item.dataset.value);\n\n\t\t// allow the callback to abort\n\t\tif( !values.length || (typeof this.settings.onDelete === 'function' && this.settings.onDelete(values,evt) === false) ){\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Selects the previous / next item (depending on the `direction` argument).\n\t *\n\t * > 0 - right\n\t * < 0 - left\n\t *\n\t */\n\tadvanceSelection(direction:number, e?:MouseEvent|KeyboardEvent) {\n\t\tvar last_active, adjacent, self = this;\n\n\t\tif (self.rtl) direction *= -1;\n\t\tif( self.inputValue().length ) return;\n\n\n\t\t// add or remove to active items\n\t\tif( isKeyDown(constants.KEY_SHORTCUT,e) || isKeyDown('shiftKey',e) ){\n\n\t\t\tlast_active\t\t\t= self.getLastActive(direction);\n\t\t\tif( last_active ){\n\n\t\t\t\tif( !last_active.classList.contains('active') ){\n\t\t\t\t\tadjacent\t\t\t= last_active;\n\t\t\t\t}else{\n\t\t\t\t\tadjacent\t\t\t= self.getAdjacent(last_active,direction,'item');\n\t\t\t\t}\n\n\t\t\t// if no active item, get items adjacent to the control input\n\t\t\t}else if( direction > 0 ){\n\t\t\t\tadjacent\t\t\t= self.control_input.nextElementSibling;\n\t\t\t}else{\n\t\t\t\tadjacent\t\t\t= self.control_input.previousElementSibling;\n\t\t\t}\n\n\n\t\t\tif( adjacent ){\n\t\t\t\tif( adjacent.classList.contains('active') ){\n\t\t\t\t\tself.removeActiveItem(last_active);\n\t\t\t\t}\n\t\t\t\tself.setActiveItemClass(adjacent); // mark as last_active !! after removeActiveItem() on last_active\n\t\t\t}\n\n\t\t// move caret to the left or right\n\t\t}else{\n\t\t\tself.moveCaret(direction);\n\t\t}\n\t}\n\n\tmoveCaret(direction:number){}\n\n\t/**\n\t * Get the last active item\n\t *\n\t */\n\tgetLastActive(direction?:number){\n\n\t\tlet last_active = this.control.querySelector('.last-active');\n\t\tif( last_active ){\n\t\t\treturn last_active;\n\t\t}\n\n\n\t\tvar result = this.control.querySelectorAll('.active');\n\t\tif( result ){\n\t\t\treturn getTail(result,direction);\n\t\t}\n\t}\n\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tsetCaret(new_pos:number) {\n\t\tthis.caretPos = this.items.length;\n\t}\n\n\t/**\n\t * Return list of item dom elements\n\t *\n\t */\n\tcontrolChildren():TomItem[]{\n\t\treturn Array.from( this.control.querySelectorAll('[data-ts-item]') ) as TomItem[];\n\t}\n\n\t/**\n\t * Disables user input on the control. Used while\n\t * items are being asynchronously created.\n\t */\n\tlock() {\n\t\tthis.isLocked = true;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Re-enables user input on the control.\n\t */\n\tunlock() {\n\t\tthis.isLocked = false;\n\t\tthis.refreshState();\n\t}\n\n\t/**\n\t * Disables user input on the control completely.\n\t * While disabled, it cannot receive focus.\n\t */\n\tdisable() {\n\t\tvar self = this;\n\t\tself.input.disabled\t\t\t\t= true;\n\t\tself.control_input.disabled\t\t= true;\n\t\tself.focus_node.tabIndex\t\t= -1;\n\t\tself.isDisabled\t\t\t\t\t= true;\n\t\tthis.close();\n\t\tself.lock();\n\t}\n\n\t/**\n\t * Enables the control so that it can respond\n\t * to focus and user input.\n\t */\n\tenable() {\n\t\tvar self = this;\n\t\tself.input.disabled\t\t\t\t= false;\n\t\tself.control_input.disabled\t\t= false;\n\t\tself.focus_node.tabIndex\t\t= self.tabIndex;\n\t\tself.isDisabled\t\t\t\t\t= false;\n\t\tself.unlock();\n\t}\n\n\t/**\n\t * Completely destroys the control and\n\t * unbinds all event listeners so that it can\n\t * be garbage collected.\n\t */\n\tdestroy() {\n\t\tvar self = this;\n\t\tvar revertSettings = self.revertSettings;\n\n\t\tself.trigger('destroy');\n\t\tself.off();\n\t\tself.wrapper.remove();\n\t\tself.dropdown.remove();\n\n\t\tself.input.innerHTML = revertSettings.innerHTML;\n\t\tself.input.tabIndex = revertSettings.tabIndex;\n\n\t\tremoveClasses(self.input,'tomselected','ts-hidden-accessible');\n\n\t\tself._destroy();\n\n\t\tdelete self.input.tomselect;\n\t}\n\n\t/**\n\t * A helper method for rendering \"item\" and\n\t * \"option\" templates, given the data.\n\t *\n\t */\n\trender( templateName:TomTemplateNames, data?:any ):null|HTMLElement{\n\n\t\tif( typeof this.settings.render[templateName] !== 'function' ){\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this._render(templateName, data);\n\t}\n\n\t/**\n\t * _render() can be called directly when we know we don't want to hit the cache\n\t * return type could be null for some templates, we need https://github.com/microsoft/TypeScript/issues/33014\n\t */\n\t_render( templateName:TomTemplateNames, data?:any ):HTMLElement{\n\t\tvar value = '', id, html;\n\t\tconst self = this;\n\n\t\tif( templateName === 'option' || templateName == 'item' ){\n\t\t\tvalue\t= get_hash(data[self.settings.valueField]);\n\t\t}\n\n\t\t// render markup\n\t\thtml = self.settings.render[templateName].call(this, data, escape_html);\n\n\t\tif( html == null ){\n\t\t\treturn html;\n\t\t}\n\n\t\thtml = getDom( html );\n\n\t\t// add mandatory attributes\n\t\tif (templateName === 'option' || templateName === 'option_create') {\n\n\t\t\tif( data[self.settings.disabledField] ){\n\t\t\t\tsetAttr(html,{'aria-disabled':'true'});\n\t\t\t}else{\n\t\t\t\tsetAttr(html,{'data-selectable': ''});\n\t\t\t}\n\n\t\t}else if (templateName === 'optgroup') {\n\t\t\tid = data.group[self.settings.optgroupValueField];\n\t\t\tsetAttr(html,{'data-group': id});\n\t\t\tif(data.group[self.settings.disabledField]) {\n\t\t\t\tsetAttr(html,{'data-disabled': ''});\n\t\t\t}\n\t\t}\n\n\t\tif (templateName === 'option' || templateName === 'item') {\n\t\t\tsetAttr(html,{'data-value': value });\n\n\n\t\t\t// make sure we have some classes if a template is overwritten\n\t\t\tif( templateName === 'item' ){\n\t\t\t\taddClasses(html,self.settings.itemClass);\n\t\t\t\tsetAttr(html,{'data-ts-item':''});\n\t\t\t}else{\n\t\t\t\taddClasses(html,self.settings.optionClass);\n\t\t\t\tsetAttr(html,{\n\t\t\t\t\trole:'option',\n\t\t\t\t\tid:data.$id\n\t\t\t\t});\n\n\t\t\t\t// update cache\n\t\t\t\tself.options[value].$div = html;\n\t\t\t}\n\n\n\t\t}\n\n\t\treturn html;\n\t}\n\n\n\t/**\n\t * Clears the render cache for a template. If\n\t * no template is given, clears all render\n\t * caches.\n\t *\n\t */\n\tclearCache():void{\n\n\t\titerate(this.options, (option, value)=>{\n\t\t\tif( option.$div ){\n\t\t\t\toption.$div.remove();\n\t\t\t\tdelete option.$div;\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Removes a value from item and option caches\n\t *\n\t */\n\tuncacheValue(value:string){\n\n\t\tconst option_el\t\t\t= this.getOption(value);\n\t\tif( option_el ) option_el.remove();\n\n\t}\n\n\t/**\n\t * Determines whether or not to display the\n\t * create item prompt, given a user input.\n\t *\n\t */\n\tcanCreate( input:string ):boolean {\n\t\treturn this.settings.create && (input.length > 0) && (this.settings.createFilter as TomCreateFilter ).call(this, input);\n\t}\n\n\n\t/**\n\t * Wraps this.`method` so that `new_fn` can be invoked 'before', 'after', or 'instead' of the original method\n\t *\n\t * this.hook('instead','onKeyDown',function( arg1, arg2 ...){\n\t *\n\t * });\n\t */\n\thook( when:string, method:string, new_fn:any ){\n\t\tvar self = this;\n\t\tvar orig_method = self[method];\n\n\n\t\tself[method] = function(){\n\t\t\tvar result, result_new;\n\n\t\t\tif( when === 'after' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\tresult_new = new_fn.apply(self, arguments );\n\n\t\t\tif( when === 'instead' ){\n\t\t\t\treturn result_new;\n\t\t\t}\n\n\t\t\tif( when === 'before' ){\n\t\t\t\tresult = orig_method.apply(self, arguments);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t}\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 */\n\ntype TSettings = {\n\t[key:string]:any\n}\n\ntype TPlugins = {\n\tnames: string[],\n\tsettings: TSettings,\n\trequested: {[key:string]:boolean},\n\tloaded: {[key:string]:any}\n};\n\nexport type TPluginItem = {name:string,options:{}};\nexport type TPluginHash = {[key:string]:{}};\n\n\n\n\nexport default function MicroPlugin(Interface: any ){\n\n\tInterface.plugins = {};\n\n\treturn class extends Interface{\n\n\t\tpublic plugins:TPlugins = {\n\t\t\tnames : [],\n\t\t\tsettings : {},\n\t\t\trequested : {},\n\t\t\tloaded : {}\n\t\t};\n\n\t\t/**\n\t\t * Registers a plugin.\n\t\t *\n\t\t * @param {function} fn\n\t\t */\n\t\tstatic define(name:string, fn:(this:any,settings:TSettings)=>any){\n\t\t\tInterface.plugins[name] = {\n\t\t\t\t'name' : name,\n\t\t\t\t'fn' : fn\n\t\t\t};\n\t\t}\n\n\n\t\t/**\n\t\t * Initializes the listed plugins (with options).\n\t\t * Acceptable formats:\n\t\t *\n\t\t * List (without options):\n\t\t * ['a', 'b', 'c']\n\t\t *\n\t\t * List (with options):\n\t\t * [{'name': 'a', options: {}}, {'name': 'b', options: {}}]\n\t\t *\n\t\t * Hash (with options):\n\t\t * {'a': { ... }, 'b': { ... }, 'c': { ... }}\n\t\t *\n\t\t * @param {array|object} plugins\n\t\t */\n\t\tinitializePlugins(plugins:string[]|TPluginItem[]|TPluginHash) {\n\t\t\tvar key, name;\n\t\t\tconst self = this;\n\t\t\tconst queue:string[] = [];\n\n\t\t\tif (Array.isArray(plugins)) {\n\t\t\t\tplugins.forEach((plugin:string|TPluginItem)=>{\n\t\t\t\t\tif (typeof plugin === 'string') {\n\t\t\t\t\t\tqueue.push(plugin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.plugins.settings[plugin.name] = plugin.options;\n\t\t\t\t\t\tqueue.push(plugin.name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (plugins) {\n\t\t\t\tfor (key in plugins) {\n\t\t\t\t\tif (plugins.hasOwnProperty(key)) {\n\t\t\t\t\t\tself.plugins.settings[key] = plugins[key];\n\t\t\t\t\t\tqueue.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twhile( name = queue.shift() ){\n\t\t\t\tself.require(name);\n\t\t\t}\n\t\t}\n\n\t\tloadPlugin(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\t\t\tvar plugin = Interface.plugins[name];\n\n\t\t\tif (!Interface.plugins.hasOwnProperty(name)) {\n\t\t\t\tthrow new Error('Unable to find \"' + name + '\" plugin');\n\t\t\t}\n\n\t\t\tplugins.requested[name] = true;\n\t\t\tplugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);\n\t\t\tplugins.names.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Initializes a plugin.\n\t\t *\n\t\t */\n\t\trequire(name:string) {\n\t\t\tvar self = this;\n\t\t\tvar plugins = self.plugins;\n\n\t\t\tif (!self.plugins.loaded.hasOwnProperty(name)) {\n\t\t\t\tif (plugins.requested[name]) {\n\t\t\t\t\tthrow new Error('Plugin has circular dependency (\"' + name + '\")');\n\t\t\t\t}\n\t\t\t\tself.loadPlugin(name);\n\t\t\t}\n\n\t\t\treturn plugins.loaded[name];\n\t\t}\n\n\t};\n\n}\n","import TomSelect from './tom-select';\n\nimport change_listener from './plugins/change_listener/plugin';\nimport checkbox_options from './plugins/checkbox_options/plugin';\nimport clear_button from './plugins/clear_button/plugin';\nimport drag_drop from './plugins/drag_drop/plugin';\nimport dropdown_header from './plugins/dropdown_header/plugin';\nimport caret_position from './plugins/caret_position/plugin';\nimport dropdown_input from './plugins/dropdown_input/plugin';\nimport input_autogrow from './plugins/input_autogrow/plugin';\nimport no_backspace_delete from './plugins/no_backspace_delete/plugin';\nimport no_active_items from './plugins/no_active_items/plugin';\nimport optgroup_columns from './plugins/optgroup_columns/plugin';\nimport remove_button from './plugins/remove_button/plugin';\nimport restore_on_backspace from './plugins/restore_on_backspace/plugin';\nimport virtual_scroll from './plugins/virtual_scroll/plugin';\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 default TomSelect;\n","/**\n * Plugin: \"change_listener\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { addEvent } from '../../utils';\n\nexport default function(this:TomSelect) {\n\taddEvent(this.input,'change',()=>{\n\t\tthis.sync();\n\t});\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { preventDefault, hash_key } from '../../utils';\nimport { getDom } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_onOptionSelect = self.onOptionSelect;\n\n\tself.settings.hideSelected = false;\n\n\n\t// update the checkbox for an option\n\tvar UpdateCheckbox = function(option:HTMLElement){\n\t\tsetTimeout(()=>{\n\t\t\tvar checkbox = option.querySelector('input');\n\t\t\tif( checkbox instanceof HTMLInputElement ){\n\t\t\t\tif( option.classList.contains('selected') ){\n\t\t\t\t\tcheckbox.checked = true;\n\t\t\t\t}else{\n\t\t\t\t\tcheckbox.checked = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},1);\n\t};\n\n\t// add checkbox to option template\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_option = self.settings.render.option;\n\n\t\tself.settings.render.option = (data, escape_html) => {\n\t\t\tvar rendered = getDom(orig_render_option.call(self, data, escape_html));\n\t\t\tvar checkbox = document.createElement('input');\n\t\t\tcheckbox.addEventListener('click',function(evt){\n\t\t\t\tpreventDefault(evt);\n\t\t\t});\n\n\t\t\tcheckbox.type = 'checkbox';\n\t\t\tconst hashed = hash_key(data[self.settings.valueField]);\n\n\n\t\t\tif( hashed && self.items.indexOf(hashed) > -1 ){\n\t\t\t\tcheckbox.checked = true;\n\t\t\t}\n\n\t\t\trendered.prepend(checkbox);\n\t\t\treturn rendered;\n\t\t};\n\t});\n\n\t// uncheck when item removed\n\tself.on('item_remove',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\toption.classList.remove('selected'); // selected class won't be removed yet\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\t// check when item added\n\tself.on('item_add',(value:string) => {\n\t\tvar option = self.getOption(value);\n\n\t\tif( option ){ // if dropdown hasn't been opened yet, the option won't exist\n\t\t\tUpdateCheckbox(option);\n\t\t}\n\t});\n\n\n\t// remove items when selected option is clicked\n\tself.hook('instead','onOptionSelect',( evt:KeyboardEvent, option:HTMLElement )=>{\n\n\t\tif( option.classList.contains('selected') ){\n\t\t\toption.classList.remove('selected')\n\t\t\tself.removeItem(option.dataset.value);\n\t\t\tself.refreshOptions();\n\t\t\tpreventDefault(evt,true);\n\t\t\treturn;\n }\n\n\t\torig_onOptionSelect.call(self, evt, option);\n\n\t\tUpdateCheckbox(option);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { CBOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:CBOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\tclassName: 'clear-button',\n\t\ttitle: 'Clear All',\n\t\thtml: (data:CBOptions) => {\n\t\t\treturn `<div class=\"${data.className}\" title=\"${data.title}\">&times;</div>`;\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar button = getDom(options.html(options));\n\t\tbutton.addEventListener('click',(evt)=>{\n\n\t\t\tif( self.isDisabled ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.clear();\n\n\t\t\tif( self.settings.mode === 'single' && self.settings.allowEmptyOption ){\n\t\t\t\tself.addItem('');\n\t\t\t}\n\n\t\t\tevt.preventDefault();\n\t\t\tevt.stopPropagation();\n\t\t});\n\t\tself.control.appendChild(button);\n\t});\n\n};\n","/**\n * Plugin: \"drag_drop\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tif (!$.fn.sortable) throw new Error('The \"drag_drop\" plugin requires jQuery UI \"sortable\".');\n\tif (self.settings.mode !== 'multi') return;\n\n\tvar orig_lock\t\t= self.lock;\n\tvar orig_unlock\t\t= self.unlock;\n\n\tself.hook('instead','lock',()=>{\n\t\tvar sortable = $(self.control).data('sortable');\n\t\tif (sortable) sortable.disable();\n\t\treturn orig_lock.call(self);\n\t});\n\n\tself.hook('instead','unlock',()=>{\n\t\tvar sortable = $(self.control).data('sortable');\n\t\tif (sortable) sortable.enable();\n\t\treturn orig_unlock.call(self);\n\t});\n\n\tself.on('initialize',()=>{\n\t\tvar $control = $(self.control).sortable({\n\t\t\titems: '[data-value]',\n\t\t\tforcePlaceholderSize: true,\n\t\t\tdisabled: self.isLocked,\n\t\t\tstart: (e, ui) => {\n\t\t\t\tui.placeholder.css('width', ui.helper.css('width'));\n\t\t\t\t$control.css({overflow: 'visible'});\n\t\t\t},\n\t\t\tstop: ()=>{\n\t\t\t\t$control.css({overflow: 'hidden'});\n\n\t\t\t\tvar values:string[] = [];\n\t\t\t\t$control.children('[data-value]').each(function(this:HTMLElement){\n\t\t\t\t\tif( this.dataset.value ) values.push(this.dataset.value);\n\t\t\t\t});\n\n\t\t\t\tself.setValue(values);\n\t\t\t}\n\t\t});\n\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_header\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { preventDefault } from '../../utils';\nimport { DHOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:DHOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttitle : 'Untitled',\n\t\theaderClass : 'dropdown-header',\n\t\ttitleRowClass : 'dropdown-header-title',\n\t\tlabelClass : 'dropdown-header-label',\n\t\tcloseClass : 'dropdown-header-close',\n\n\t\thtml: (data:DHOptions) => {\n\t\t\treturn (\n\t\t\t\t'<div class=\"' + data.headerClass + '\">' +\n\t\t\t\t\t'<div class=\"' + data.titleRowClass + '\">' +\n\t\t\t\t\t\t'<span class=\"' + data.labelClass + '\">' + data.title + '</span>' +\n\t\t\t\t\t\t'<a class=\"' + data.closeClass + '\">&times;</a>' +\n\t\t\t\t\t'</div>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t}\n\t}, userOptions);\n\n\tself.on('initialize',()=>{\n\t\tvar header = getDom(options.html(options));\n\n\t\tvar close_link = header.querySelector('.'+options.closeClass);\n\t\tif( close_link ){\n\t\t\tclose_link.addEventListener('click',(evt)=>{\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t\tself.close();\n\t\t\t});\n\t\t}\n\n\t\tself.dropdown.insertBefore(header, self.dropdown.firstChild);\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { nodeIndex, removeClasses } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tself.hook('instead','setCaret',(new_pos:number) => {\n\n\t\tif( self.settings.mode === 'single' || !self.control.contains(self.control_input) ) {\n\t\t\tnew_pos = self.items.length;\n\t\t} else {\n\t\t\tnew_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n\t\t\tif( new_pos != self.caretPos && !self.isPending ){\n\n\t\t\t\tself.controlChildren().forEach((child,j) => {\n\t\t\t\t\tif( j < new_pos ){\n\t\t\t\t\t\tself.control_input.insertAdjacentElement('beforebegin', child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.control.appendChild( child );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tself.caretPos = new_pos;\n\t});\n\n\tself.hook('instead','moveCaret',(direction:number) => {\n\n\t\tif( !self.isFocused ) return;\n\n\t\t// move caret before or after selected items\n\t\tconst last_active\t\t= self.getLastActive(direction);\n\t\tif( last_active ){\n\t\t\tconst idx = nodeIndex(last_active);\n\t\t\tself.setCaret(direction > 0 ? idx + 1: idx);\n\t\t\tself.setActiveItem();\n\t\t\tremoveClasses(last_active as HTMLElement,'last-active');\n\n\t\t// move caret left or right of current position\n\t\t}else{\n\t\t\tself.setCaret(self.caretPos + direction);\n\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport * as constants from '../../constants';\nimport { getDom, addClasses } from '../../vanilla';\nimport { addEvent, preventDefault } from '../../utils';\n\n\nexport default function(this:TomSelect) {\n\tconst self = this;\n\n\tself.settings.shouldOpen = true; // make sure the input is shown even if there are no options to display in the dropdown\n\n\tself.hook('before','setup',()=>{\n\t\tself.focus_node\t\t= self.control;\n\n\t\taddClasses( self.control_input, 'dropdown-input');\n\n\t \tconst div = getDom('<div class=\"dropdown-input-wrap\">');\n\t\tdiv.append(self.control_input);\n\t\tself.dropdown.insertBefore(div, self.dropdown.firstChild);\n\n\t\t// set a placeholder in the select control\n\t\tconst placeholder = getDom('<input class=\"items-placeholder\" tabindex=\"-1\" />') as HTMLInputElement;\n\t\tplaceholder.placeholder = self.settings.placeholder ||'';\n\t\tself.control.append(placeholder);\n\n\t});\n\n\n\tself.on('initialize',()=>{\n\n\t\t// set tabIndex on control to -1, otherwise [shift+tab] will put focus right back on control_input\n\t\tself.control_input.addEventListener('keydown',(evt:KeyboardEvent) =>{\n\t\t//addEvent(self.control_input,'keydown' as const,(evt:KeyboardEvent) =>{\n\t\t\tswitch( evt.keyCode ){\n\t\t\t\tcase constants.KEY_ESC:\n\t\t\t\t\tif (self.isOpen) {\n\t\t\t\t\t\tpreventDefault(evt,true);\n\t\t\t\t\t\tself.close();\n\t\t\t\t\t}\n\t\t\t\t\tself.clearActiveItems();\n\t\t\t\treturn;\n\t\t\t\tcase constants.KEY_TAB:\n\t\t\t\t\tself.focus_node.tabIndex = -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn self.onKeyDown.call(self,evt);\n\t\t});\n\n\t\tself.on('blur',()=>{\n\t\t\tself.focus_node.tabIndex = self.isDisabled ? -1 : self.tabIndex;\n\t\t});\n\n\n\t\t// give the control_input focus when the dropdown is open\n\t\tself.on('dropdown_open',() =>{\n\t\t\tself.control_input.focus();\n\t\t});\n\n\t\t// prevent onBlur from closing when focus is on the control_input\n\t\tconst orig_onBlur = self.onBlur;\n\t\tself.hook('instead','onBlur',(evt?:FocusEvent)=>{\n\t\t\tif( evt && evt.relatedTarget == self.control_input ) return;\n\t\t\treturn orig_onBlur.call(self);\n\t\t});\n\n\t\taddEvent(self.control_input,'blur', () => self.onBlur() );\n\n\t\t// return focus to control to allow further keyboard input\n\t\tself.hook('before','close',() =>{\n\n\t\t\tif( !self.isOpen ) return;\n\t\t\tself.focus_node.focus({preventScroll: true});\n\t\t});\n\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { addEvent } from '../../utils';\n\nexport default function(this:TomSelect) {\n\tvar self\t\t\t\t\t= this;\n\n\tself.on('initialize',()=>{\n\n\n\t\tvar test_input\t\t\t\t= document.createElement('span');\n\t\tvar control\t\t\t\t\t= self.control_input;\n\t\ttest_input.style.cssText\t= 'position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ';\n\n\t\tself.wrapper.appendChild(test_input);\n\n\n\t\tvar transfer_styles\t\t\t= [ 'letterSpacing', 'fontSize', 'fontFamily', 'fontWeight', 'textTransform' ];\n\n\t\tfor( const style_name of transfer_styles ){\n\t\t\t// @ts-ignore TS7015 https://stackoverflow.com/a/50506154/697576\n\t\t\ttest_input.style[style_name] = control.style[style_name];\n\t\t}\n\n\n\t\t/**\n\t\t * Set the control width\n\t\t *\n\t\t */\n\t\tvar resize = ()=>{\n\t\t\ttest_input.textContent\t= control.value;\n\t\t\tcontrol.style.width\t\t= test_input.clientWidth+'px';\n\t\t};\n\n\t\tresize();\n\t\tself.on('update item_add item_remove',resize);\n\t\taddEvent(control,'input', resize );\n\t\taddEvent(control,'keyup', resize );\n\t\taddEvent(control,'blur', resize );\n\t\taddEvent(control,'update', resize );\n\t});\n\n};\n","/**\n * Plugin: \"input_autogrow\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\tvar orig_deleteSelection = self.deleteSelection;\n\n\tthis.hook('instead','deleteSelection',(evt:KeyboardEvent) => {\n\n\t\tif( self.activeItems.length ){\n\t\t\treturn orig_deleteSelection.call(self, evt);\n\t\t}\n\n\t\treturn false;\n\t});\n\n};\n","/**\n * Plugin: \"no_active_items\" (Tom Select)\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\n\nexport default function(this:TomSelect) {\n\tthis.hook('instead','setActiveItem',() => {});\n\tthis.hook('instead','selectAll',() => {});\n};\n","/**\n * Plugin: \"optgroup_columns\" (Tom Select.js)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport * as constants from '../../constants';\nimport { parentMatch, nodeIndex } from '../../vanilla';\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\tvar orig_keydown = self.onKeyDown;\n\n\tself.hook('instead','onKeyDown',(evt:KeyboardEvent)=>{\n\t\tvar index, option, options, optgroup;\n\n\t\tif( !self.isOpen || !(evt.keyCode === constants.KEY_LEFT || evt.keyCode === constants.KEY_RIGHT)) {\n\t\t\treturn orig_keydown.call(self,evt);\n\t\t}\n\n\t\tself.ignoreHover\t= true;\n\t\toptgroup\t\t\t= parentMatch(self.activeOption,'[data-group]');\n\t\tindex\t\t\t\t= nodeIndex(self.activeOption,'[data-selectable]');\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( evt.keyCode === constants.KEY_LEFT ){\n\t\t\toptgroup = optgroup.previousSibling;\n\t\t} else {\n\t\t\toptgroup = optgroup.nextSibling;\n\t\t}\n\n\t\tif( !optgroup ){\n\t\t\treturn;\n\t\t}\n\n\t\toptions\t\t\t\t= (<HTMLOptGroupElement>optgroup).querySelectorAll('[data-selectable]');\n\t\toption\t\t\t\t= options[ Math.min(options.length - 1, index) ] as HTMLElement;\n\n\t\tif( option ){\n\t\t\tself.setActiveOption(option);\n\t\t}\n\n\t});\n\n};\n","/**\n * Plugin: \"remove_button\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { getDom } from '../../vanilla';\nimport { escape_html, preventDefault, addEvent } from '../../utils';\nimport { TomOption, TomItem } from '../../types/index';\nimport { RBOptions } from './types';\n\nexport default function(this:TomSelect, userOptions:RBOptions) {\n\n\tconst options = Object.assign({\n\t\t\tlabel : '&times;',\n\t\t\ttitle : 'Remove',\n\t\t\tclassName : 'remove',\n\t\t\tappend : true\n\t\t}, userOptions);\n\n\n\t//options.className = 'remove-single';\n\tvar self\t\t\t= this;\n\n\t// override the render method to add remove button to each item\n\tif( !options.append ){\n\t\treturn;\n\t}\n\n\tvar html = '<a href=\"javascript:void(0)\" class=\"' + options.className + '\" tabindex=\"-1\" title=\"' + escape_html(options.title) + '\">' + options.label + '</a>';\n\n\tself.hook('after','setupTemplates',() => {\n\n\t\tvar orig_render_item = self.settings.render.item;\n\n\t\tself.settings.render.item = (data:TomOption, escape:typeof escape_html) => {\n\n\t\t\tvar item = getDom(orig_render_item.call(self, data, escape)) as TomItem;\n\n\t\t\tvar close_button = getDom(html);\n\t\t\titem.appendChild(close_button);\n\n\t\t\taddEvent(close_button,'mousedown',(evt) => {\n\t\t\t\tpreventDefault(evt,true);\n\t\t\t});\n\n\t\t\taddEvent(close_button,'click',(evt) => {\n\n\t\t\t\t// propagating will trigger the dropdown to show for single mode\n\t\t\t\tpreventDefault(evt,true);\n\n\t\t\t\tif( self.isLocked ) return;\n\t\t\t\tif( !self.shouldDelete([item],evt as MouseEvent) ) return;\n\n\t\t\t\tself.removeItem(item);\n\t\t\t\tself.refreshOptions(false);\n\t\t\t\tself.inputState();\n\t\t\t});\n\n\t\t\treturn item;\n\t\t};\n\n\t});\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 */\nimport TomSelect from '../../tom-select';\nimport { TomOption } from '../../types/index';\n\ntype TPluginOptions = {\n\ttext?:(option:TomOption)=>string,\n};\n\nexport default function(this:TomSelect, userOptions:TPluginOptions) {\n\tconst self = this;\n\n\tconst options = Object.assign({\n\t\ttext: (option:TomOption) => {\n\t\t\treturn option[self.settings.labelField];\n\t\t}\n\t},userOptions);\n\n\tself.on('item_remove',function(value:string){\n\t\tif( !self.isFocused ){\n\t\t\treturn;\n\t\t}\n\n\t\tif( self.control_input.value.trim() === '' ){\n\t\t\tvar option = self.options[value];\n\t\t\tif( option ){\n\t\t\t\tself.setTextboxValue(options.text.call(self, option));\n\t\t\t}\n\t\t}\n\t});\n\n};\n","/**\n * Plugin: \"restore_on_backspace\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { TomOption } from '../../types/index';\nimport { addClasses } from '../../vanilla';\n\nexport default function(this:TomSelect) {\n\tconst self\t\t\t\t\t\t\t= this;\n\tconst orig_canLoad\t\t\t\t\t= self.canLoad;\n\tconst orig_clearActiveOption\t\t= self.clearActiveOption;\n\tconst orig_loadCallback\t\t\t\t= self.loadCallback;\n\n\tvar pagination:{[key:string]:any}\t= {};\n\tvar dropdown_content:HTMLElement;\n\tvar loading_more\t\t\t\t\t= false;\n\tvar load_more_opt:HTMLElement;\n\tvar default_values: string[]\t\t= [];\n\n\tif( !self.settings.shouldLoadMore ){\n\n\t\t// return true if additional results should be loaded\n\t\tself.settings.shouldLoadMore = ():boolean=>{\n\n\t\t\tconst scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);\n\t\t\tif( scroll_percent > 0.9 ){\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif( self.activeOption ){\n\t\t\t\tvar selectable\t= self.selectable();\n\t\t\t\tvar index\t\t= [...selectable].indexOf(self.activeOption);\n\t\t\t\tif( index >= (selectable.length-2) ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\n\tif( !self.settings.firstUrl ){\n\t\tthrow 'virtual_scroll plugin requires a firstUrl() method';\n\t\treturn;\n\t}\n\n\n\t// in order for virtual scrolling to work,\n\t// options need to be ordered the same way they're returned from the remote data source\n\tself.settings.sortField\t\t\t= [{field:'$order'},{field:'$score'}];\n\n\n\t// can we load more results for given query?\n\tconst canLoadMore = (query:string):boolean => {\n\n\t\tif( typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions ){\n\t\t\treturn false;\n\t\t}\n\n\t\tif( (query in pagination) && pagination[query] ){\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tconst clearFilter = (option:TomOption, value:string):boolean => {\n\t\tif( self.items.indexOf(value) >= 0 || default_values.indexOf(value) >= 0 ){\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\n\t// set the next url that will be\n\tself.setNextUrl = (value:string,next_url:any):void => {\n\t\tpagination[value] = next_url;\n\t};\n\n\t// getUrl() to be used in settings.load()\n\tself.getUrl = (query:string):any =>{\n\n\t\tif( query in pagination ){\n\t\t\tconst next_url = pagination[query];\n\t\t\tpagination[query] = false;\n\t\t\treturn next_url;\n\t\t}\n\n\t\t// if the user goes back to a previous query\n\t\t// we need to load the first page again\n\t\tpagination = {};\n\n\t\treturn self.settings.firstUrl.call(self,query);\n\t};\n\n\n\t// don't clear the active option (and cause unwanted dropdown scroll)\n\t// while loading more results\n\tself.hook('instead','clearActiveOption',()=>{\n\n\t\tif( loading_more ){\n\t\t\treturn;\n\t\t}\n\n\t\treturn orig_clearActiveOption.call(self);\n\t});\n\n\t// override the canLoad method\n\tself.hook('instead','canLoad',(query:string)=>{\n\n\t\t// first time the query has been seen\n\t\tif( !(query in pagination) ){\n\t\t\treturn orig_canLoad.call(self,query);\n\t\t}\n\n\t\treturn canLoadMore(query);\n\t});\n\n\n\t// wrap the load\n\tself.hook('instead','loadCallback',( options:TomOption[], optgroups:TomOption[])=>{\n\n\t\tif( !loading_more ){\n\t\t\tself.clearOptions(clearFilter);\n\t\t}else if( load_more_opt && options.length > 0 ){\n\t\t\tload_more_opt.dataset.value\t\t= options[0][self.settings.valueField];\n\t\t}\n\n\t\torig_loadCallback.call( self, options, optgroups);\n\n\t\tloading_more = false;\n\t});\n\n\n\t// add templates to dropdown\n\t//\tloading_more if we have another url in the queue\n\t//\tno_more_results if we don't have another url in the queue\n\tself.hook('after','refreshOptions',()=>{\n\n\t\tconst query\t\t= self.lastValue;\n\t\tvar option;\n\n\t\tif( canLoadMore(query) ){\n\n\t\t\toption = self.render('loading_more',{query:query});\n\t\t\tif( option ){\n\t\t\t\toption.setAttribute('data-selectable',''); // so that navigating dropdown with [down] keypresses can navigate to this node\n\t\t\t\tload_more_opt = option;\n\t\t\t}\n\n\t\t}else if( (query in pagination) && !dropdown_content.querySelector('.no-results') ){\n\t\t\toption = self.render('no_more_results',{query:query});\n\t\t}\n\n\t\tif( option ){\n\t\t\taddClasses(option,self.settings.optionClass);\n\t\t\tdropdown_content.append( option );\n\t\t}\n\n\t});\n\n\n\t// add scroll listener and default templates\n\tself.on('initialize',()=>{\n\t\tdefault_values = Object.keys(self.options);\n\t\tdropdown_content = self.dropdown_content;\n\n\t\t// default templates\n\t\tself.settings.render = Object.assign({}, {\n\t\t\tloading_more:() => {\n\t\t\t\treturn `<div class=\"loading-more-results\">Loading more results ... </div>`;\n\t\t\t},\n\t\t\tno_more_results:() =>{\n\t\t\t\treturn `<div class=\"no-more-results\">No more results</div>`;\n\t\t\t}\n\t\t},self.settings.render);\n\n\n\t\t// watch dropdown content scroll position\n\t\tdropdown_content.addEventListener('scroll',()=>{\n\n\t\t\tif( !self.settings.shouldLoadMore.call(self) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true\n\t\t\tif( !canLoadMore(self.lastValue) ){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// don't call load() too much\n\t\t\tif( loading_more ) return;\n\n\n\t\t\tloading_more = true;\n\t\t\tself.load.call(self,self.lastValue);\n\t\t});\n\t});\n\n};\n"],"names":["forEvents","events","callback","split","forEach","event","MicroEvent","constructor","_events","on","fct","this","push","off","n","arguments","length","splice","indexOf","trigger","args","self","apply","latin_pat","accent_pat","accent_reg","RegExp","diacritic_patterns","latin_convert","convert_pat","Object","keys","join","code_points","asciifold","str","normalize","replace","toLowerCase","foreignletter","arrayToPattern","chars","glue","longest","a","Math","max","escapeToPattern","escaped","map","diacritic","escape_regex","allSubstrings","input","result","substring","subresult","tmp","slice","charAt","unshift","diacriticRegexPoints","regex","undefined","diacritics","code_range","i","String","fromCharCode","latin","patt","match","latin_chars","sort","b","pattern","sub_pat","l","hasOwnProperty","generateDiacritics","part","no_accent","getAttr","obj","name","getAttrNesting","names","shift","scoreValue","value","token","weight","score","pos","search","string","propToArray","key","Array","isArray","iterate","object","cmp","Sifter","items","settings","tokenize","query","respect_word_boundaries","weights","tokens","words","field_regex","word","field_match","field","getScoreFunction","options","prepareSearch","_getScoreFunction","token_count","fields","field_count","getAttrFn","scoreObject","data","sum","conjunction","getSortFunction","_getSortFunction","implicit_score","sort_empty","sort_flds","multipliers","bind","get_field","id","direction","sort_flds_count","sort_fld","multiplier","optsUser","assign","trim","total","nesting","fn_score","item","filter","_","fn_sort","limit","getDom","jquery","HTMLElement","isHtmlString","div","document","createElement","innerHTML","firstChild","querySelector","arg","triggerEvent","dom_el","event_name","createEvent","initEvent","dispatchEvent","applyCSS","css","style","addClasses","elmts","classes","norm_classes","classesArray","castAsArray","el","cls","classList","add","removeClasses","remove","_classes","concat","Boolean","parentMatch","target","selector","wrapper","contains","matches","parentNode","getTail","list","nodeIndex","amongst","nodeName","previousElementSibling","setAttr","attrs","val","attr","removeAttribute","setAttribute","replaceNode","existing","replacement","replaceChild","highlight","element","highlightRecursive","node","nodeType","spannode","className","middlebit","splitText","index","middleclone","cloneNode","appendChild","highlightText","childNodes","test","tagName","highlightChildren","KEY_SHORTCUT","navigator","userAgent","optgroups","plugins","delimiter","splitOn","persist","create","createOnBlur","createFilter","openOnFocus","shouldOpen","maxOptions","maxItems","hideSelected","duplicates","addPrecedence","selectOnTab","preload","allowEmptyOption","loadThrottle","loadingClass","dataAttr","optgroupField","valueField","labelField","disabledField","optgroupLabelField","optgroupValueField","lockOptgroupOrder","sortField","searchField","searchConjunction","mode","wrapperClass","controlClass","dropdownClass","dropdownContentClass","itemClass","optionClass","dropdownParent","controlInput","copyClassesToDropdown","placeholder","hidePlaceholder","shouldLoad","render","hash_key","get_hash","escape_html","loadDebounce","fn","delay","timeout","loading","clearTimeout","setTimeout","loadedSearches","call","debounce_events","types","type","event_args","preventDefault","evt","stop","stopPropagation","addEvent","addEventListener","isKeyDown","key_name","altKey","ctrlKey","shiftKey","metaKey","getId","existing_id","getAttribute","addSlashes","append","parent","getSettings","settings_user","defaults","attr_data","field_label","field_value","field_disabled","field_optgroup","field_optgroup_label","field_optgroup_value","tag_name","option","textContent","optionsMap","group_count","readData","addOption","settings_element","dataset","json","JSON","parse","group","arr","option_data","disabled","$option","selected","hasAttribute","children","child","optgroup","optgroup_data","data_raw","opt","values","init_textbox","instance_i","TomSelect","Interface","requested","loaded","initializePlugins","queue","plugin","require","loadPlugin","Error","MicroPlugin","input_arg","user_settings","dir","control_input","dropdown","control","dropdown_content","focus_node","order","tabIndex","is_select_tag","rtl","inputId","_destroy","sifter","isOpen","isDisabled","isRequired","isInvalid","isValid","isLocked","isFocused","isInputHidden","isSetup","ignoreFocus","ignoreHover","hasOptions","currentResults","lastValue","caretPos","activeOption","activeItems","userOptions","tomselect","window","getComputedStyle","getPropertyValue","required","setupCallbacks","setupTemplates","_render","inputMode","setup","passive_event","passive","listboxId","role","control_id","escapeQuery","label","label_click","focus","for","label_id","width","classes_plugins","multiple","load","e","target_match","onOptionHover","capture","onOptionSelect","onItemSelect","onClick","onKeyDown","onKeyPress","onInput","positionDropdown","onBlur","onFocus","onPaste","doc_mousedown","composedPath","blur","inputState","win_scroll","win_hover","removeEventListener","revertSettings","insertAdjacentElement","sync","refreshState","updateOriginalInput","refreshItems","close","disable","enable","onChange","setupOptions","addOptions","registerOptionGroup","templates","escape","callbacks","get_settings","setValue","lastQuery","clearActiveItems","onMouseDown","pastedText","inputValue","splitInput","piece","addItem","createItem","character","keyCode","which","constants","selectAll","open","next","getAdjacent","setActiveOption","prev","canSelect","activeElement","advanceSelection","deleteSelection","refreshOptions","wasFocused","showInput","hasFocus","deactivate","setActiveItem","setCaret","parentElement","closeAfterSelect","canLoad","loadCallback","clearActiveOption","setTextboxValue","getValue","silent","clear","addItems","setMaxItems","eventName","begin","end","swap","last","getLastActive","prototype","setActiveItemClass","removeActiveItem","hideInput","last_active","idx","scroll","scrollToOption","behavior","content","height_menu","clientHeight","scrollTop","height_item","offsetHeight","y","getBoundingClientRect","top","scrollBehavior","controlChildren","toggle","offsetWidth","getSearchOptions","calculateScore","hashed","triggerDropdown","j","k","html","has_create_option","active_value","active_group","groups","groups_order","elements","results","active_option","show_dropdown","closest","min","opt_value","option_el","getOption","includes","createDocumentFragment","$id","$order","group_options","header","group_html","querySelectorAll","tok","add_template","template","insertBefore","canCreate","active_index","selectable","user_created","dat","registerOption","addOptionGroup","hashed_id","removeOptionGroup","clearCache","clearOptionGroups","updateOption","item_new","index_item","value_old","value_new","getItem","uncacheValue","option_new","removeOption","removeItem","clearOptions","boundFilter","clearFilter","$div","all","x","isPending","wasFull","isFull","insertAtCaret","output","caret","lock","created","unlock","refreshValidityState","wrap_classList","validity","valid","opts","empty_option","has_selected","AddSelected","visibility","display","context","rect","scrollY","left","scrollX","selection","tail","start","selectionStart","selectionEnd","rm_items","shouldDelete","pop","onDelete","adjacent","nextElementSibling","moveCaret","new_pos","from","destroy","templateName","hook","when","method","new_fn","orig_method","result_new","define","orig_onOptionSelect","UpdateCheckbox","checkbox","HTMLInputElement","checked","orig_render_option","rendered","prepend","title","button","$","sortable","orig_lock","orig_unlock","$control","forcePlaceholderSize","ui","helper","overflow","each","headerClass","titleRowClass","labelClass","closeClass","close_link","orig_onBlur","relatedTarget","preventScroll","test_input","cssText","style_name","resize","clientWidth","orig_deleteSelection","orig_keydown","previousSibling","nextSibling","orig_render_item","close_button","text","orig_canLoad","orig_clearActiveOption","orig_loadCallback","load_more_opt","pagination","loading_more","default_values","shouldLoadMore","scrollHeight","firstUrl","canLoadMore","setNextUrl","next_url","getUrl","no_more_results"],"mappings":";;;;;AAgBA,SAASA,EAAUC,EAAcC,GAChCD,EAAOE,MAAM,OAAOC,SAASC,IAC5BH,EAASG,MAII,MAAMC,EAIpBC,mBAFOC,oBAGDA,QAAU,GAGhBC,GAAGR,EAAeS,GACjBV,EAAUC,GAAQI,SACZG,QAAQH,GAASM,KAAKH,QAAQH,IAAU,QACxCG,QAAQH,GAAOO,KAAKF,MAI3BG,IAAIZ,EAAeS,OACdI,EAAIC,UAAUC;AACR,IAANF,EAKJd,EAAUC,GAAQI,OAEP,IAANS,EAAS,cAAcH,KAAKH,QAAQH;AAEpCA,KAASM,KAAKH,UAAY,QACzBA,QAAQH,GAAOY,OAAON,KAAKH,QAAQH,GAAOa,QAAQR,GAAM,WATxDF,QAAU,GAajBW,QAAQlB,KAAkBmB,OACrBC,EAAOV;AAEXX,EAAUC,GAAQI,OACdA,KAASgB,EAAKb,UAAY,MACxB,IAAIE,KAAOW,EAAKb,QAAQH,GAC5BK,EAAIY,MAAMD,EAAMD,OCnDpB,IAAIG;AACJ,MAAMC,EAAa,UACbC,EAAa,IAAIC,OAAOF,EAAW;AACzC,IAAIG;AAEJ,MAAMC,EAA+B,KAC/B,SACA,QACA,KAGAC,EAAc,IAAIH,OAAOI,OAAOC,KAAKH,GAAeI,KAAK,KAAK,MAE9DC,EAAgC,CAAC,CAAE,EAAG,QAO/BC,EAAaC,GAClBA,EACLC,UAAU,QACVC,QAAQZ,EAAY,IACpBa,cACAD,QAAQR,GAAY,SAASU,UACtBX,EAAcW,MAUXC,EAAiB,CAACC,EAAeC,EAAY,UAErC,GAAhBD,EAAMzB,cACFyB,EAAM;IAGVE,EAAU;OACdF,EAAMrC,SAASwC,IAAKD,EAAUE,KAAKC,IAAIH,EAAQC,EAAE5B,WAElC,GAAX2B,EACI,IAAIF,EAAMT,KAAK,IAAI,IAGpB,MAAMS,EAAMT,KAAKU,GAAM,KAGlBK,EAAmBN,UACzBO,EAAUP,EAAMQ,KAAKC,GAAcC,EAAaD;OAC/CV,EAAeQ,IAQVI,EAAiBC,OAEL,IAAjBA,EAAMrC,OAAc,MAAO,CAAC,CAACqC;IAE7BC,EAAoB;OACxBF,EAAcC,EAAME,UAAU,IAAInD,SAAQ,SAASoD,OAC3CC,EAAMD,EAAUE,MAAM;AAC1BD,EAAI,GAAKJ,EAAMM,OAAO,GAAKF,EAAI,GAC/BH,EAAO1C,KAAK6C,IAEZA,EAAMD,EAAUE,MAAM,IAClBE,QAAQP,EAAMM,OAAO,IACzBL,EAAO1C,KAAK6C,MAGTH,GA0FEO,EAAwBC,SAETC,IAAvBpC,IACHA,EAtFiCM,CAAAA,QAE9B+B,EAAqC;AACzC/B,EAAY7B,SAAS6D,QAEhB,IAAIC,EAAID,EAAW,GAAIC,GAAKD,EAAW,GAAIC,IAAI,KAE9ChB,EAAYiB,OAAOC,aAAaF,GAChCG,EAASnC,EAAUgB;GAEnBmB,GAASnB,EAAUZ,iBASnB+B,EAAMrD,OAAS,IAIbqD,KAASL,IACdA,EAAWK,GAAS,CAACA;IAGlBC,EAAO,IAAI5C,OAAQqB,EAAgBiB,EAAWK,IAAQ;AACtDnB,EAAUqB,MAAMD,IAIpBN,EAAWK,GAAOzD,KAAKsC;IAKrBsB,EAAc1C,OAAOC,KAAKiC;IACzB,IAAIE,EAAI,EAAGA,EAAIM,EAAYxD,OAAQkD,IAAI,OACrCG,EAAQG,EAAYN;AACtBF,EAAWK,GAAOrD,OAAS,UACvBgD,EAAWK,GAOpBG,EAAe1C,OAAOC,KAAKiC,GAAYS,MAAK,CAAC7B,EAAG8B,IAAMA,EAAE1D,OAAS4B,EAAE5B,SACnEO,EAAa,IAAIG,OAAO,IAAKqB,EAAgByB,GAArB,YAAsD;IAM1E7C,EAAoC;OACxC6C,EAAYC,MAAK,CAAC7B,EAAE8B,IAAM9B,EAAE5B,OAAQ0D,EAAE1D,SAAQZ,SAASiE,QAGlDM,EADavB,EAAciB,GACNpB,KAAK2B,IAE7BA,EAAUA,EAAQ3B,KAAK4B,GAClBb,EAAWc,eAAeD,GACtB9B,EAAgBiB,EAAWa,IAE5BA,IAGDrC,EAAeoC,EAAQ;AAG/BjD,EAAmB0C,GAAS7B,EAAemC,MAIrChD,GAWeoD,CAAmB9C;OAGrB6B,EAAM1B,UAAU,QAAQE,cAE1BnC,MAAMoB,GAAW0B,KAAK+B,UAGjCC,EAAY/C,EAAU8C;MACX,IAAbC,EACI,GAGJtD,EAAmBmD,eAAeG,GAC9BtD,EAAmBsD,GAGpBD,KACLhD,KAAK,KCtLIkD,EAAU,CAACC,EAAwBC,QACvCD,SACEA,EAAIC,IASFC,EAAiB,CAACF,EAAwBC,QAC9CD,WACDH,EAAMM,EAAQF,EAAKjF,MAAM,MACxB6E,EAAOM,EAAMC,WAAaJ,EAAMA,EAAIH,aAClCG,IAQEK,EAAa,CAACC,EAAcC,EAAeC,SACnDC,EAAOC;OAENJ,GAIQ,KADbI,GADAJ,GAAgB,IACJK,OAAOJ,EAAM5B,QACF,GAEvB8B,EAAQF,EAAMK,OAAO/E,OAASyE,EAAMzE,OACxB,IAAR6E,IAAWD,GAAS,IAEjBA,EAAQD,GATI,GAgBPxC,EAAgBhB,IACpBA,EAAM,IAAIE,QAAQ,6BAAsC,QAQpD2D,EAAc,CAACb,EAAwBc,SAC/CR,EAAQN,EAAIc;GAEI,mBAATR,EAAsB,OAAOA;AAEpCA,IAAUS,MAAMC,QAAQV,KAC3BN,EAAIc,GAAO,CAACR,KAeDW,EAAU,CAACC,EAA8BnG,QAEhDgG,MAAMC,QAAQE,GAClBA,EAAOjG,QAAQF;SAIV,IAAI+F,KAAOI,EACXA,EAAOvB,eAAemB,IACzB/F,EAASmG,EAAOJ,GAAMA,IAQbK,EAAM,CAAC1D,EAAiB8B,IACnB,iBAAN9B,GAA+B,iBAAN8B,EAC5B9B,EAAI8B,EAAI,EAAK9B,EAAI8B,GAAK,EAAI,GAElC9B,EAAIV,EAAUU,EAAI,IAAIN,gBACtBoC,EAAIxC,EAAUwC,EAAI,IAAIpC,eACJ,EACdoC,EAAI9B,GAAW,EACZ;ACxFO,MAAM2D,EAWpBhG,YAAYiG,EAAWC,QAThBD,kBACAC,qBASDD,MAAQA,OACRC,SAAWA,GAAY,CAACzC,YAAY,GAQ1C0C,SAASC,EAAcC,EAAkCC,OACnDF,IAAUA,EAAM3F,OAAQ,MAAO;MAE9B8F,EAAmB,GACnBC,EAAWJ,EAAMxG,MAAM;IACzB6G;OAEAH,IACHG,EAAc,IAAItF,OAAQ,KAAMI,OAAOC,KAAK8E,GAAS5D,IAAIE,GAAcnB,KAAK,KAAK,YAGlF+E,EAAM3G,SAAS6G,QACVC,EACAC,EAAoB,KACpBrD,EAAoB;AAGpBkD,IAAgBE,EAAcD,EAAK1C,MAAMyC,MAC5CG,EAAQD,EAAY,GACpBD,EAAOC,EAAY,IAGhBD,EAAKjG,OAAS,IAEhB8C,EADGnD,KAAK8F,SAASzC,WACTH,EAAqBoD,GAErB9D,EAAa8D,GAElBL,IAA0B9C,EAAQ,MAAMA,IAG7CgD,EAAOlG,KAAK,CACXmF,OAASkB,EACTnD,MAASA,EAAQ,IAAIpC,OAAOoC,EAAM,MAAQ,KAC1CqD,MAASA,OAIJL,EAYRM,iBAAiBT,EAAcU,OAC1BvB,EAASnF,KAAK2G,cAAcX,EAAOU;OAChC1G,KAAK4G,kBAAkBzB,GAG/ByB,kBAAkBzB,SACXgB,EAAUhB,EAAOgB,OACvBU,EAAgBV,EAAO9F;IAElBwG,SACG,kBAAoB;MAGtBC,EAAS3B,EAAOuB,QAAQI,OAC9BZ,EAAYf,EAAOe,QACnBa,EAAeD,EAAOzG,OACtB2G,EAAa7B,EAAO6B;IAEfD,SACG,kBAAoB;MAStBE,EAGe,IAAhBF,EACI,SAAShC,EAAemC,SACxBV,EAAQM,EAAO,GAAGN;OACjB3B,EAAWmC,EAAUE,EAAMV,GAAQzB,EAAOmB,EAAQM,KAIpD,SAASzB,EAAemC,OAC1BC,EAAM;GAGNpC,EAAMyB,MAAO,OAEV1B,EAAQkC,EAAUE,EAAMnC,EAAMyB;CAE/BzB,EAAM5B,OAAS2B,EACnBqC,GAAQ,EAAEJ,EAEVI,GAAOtC,EAAWC,EAAOC,EAAO,QAMjCU,EAAQS,GAAS,CAAClB,EAAewB,KAChCW,GAAOtC,EAAWmC,EAAUE,EAAMV,GAAQzB,EAAOC;OAI5CmC,EAAMJ;OAIK,IAAhBF,EACI,SAASK,UACRD,EAAYd,EAAO,GAAIe,IAIG,QAA/B/B,EAAOuB,QAAQU,YACX,SAASF,WACJjC,EAAP1B,EAAI,EAAU4D,EAAM,EACjB5D,EAAIsD,EAAatD,IAAK,KAC5B0B,EAAQgC,EAAYd,EAAO5C,GAAI2D,KAClB,EAAG,OAAO;AACvBC,GAAOlC,SAEDkC,EAAMN,GAGP,SAASK,OACXC,EAAM;OACV1B,EAAQU,GAAQpB,IACfoC,GAAOF,EAAYlC,EAAOmC,MAEpBC,EAAMN,GAYhBQ,gBAAgBrB,EAAcU,OACzBvB,EAAUnF,KAAK2G,cAAcX,EAAOU;OACjC1G,KAAKsH,iBAAiBnC,GAG9BmC,iBAAiBnC,OACZ5B,EAAGpD,EAAGoH;MAEJ7G,EAAOV,KACb0G,EAAWvB,EAAOuB,QAClB5C,GAAUqB,EAAOa,OAASU,EAAQc,WAAcd,EAAQc,WAAad,EAAQ5C,KAC7E2D,EAAsB,GACtBC,EAAuB;GAGJ,mBAAR5D,SACHA,EAAK6D,KAAK3H;MAQZ4H,EAAY,SAASnD,EAAa9B,SAC1B,WAAT8B,EAA0B9B,EAAOsC,MAC9BE,EAAO6B,UAAUtG,EAAKmF,MAAMlD,EAAOkF,IAAKpD;GAI5CX,MACEP,EAAI,EAAGpD,EAAI2D,EAAKzD,OAAQkD,EAAIpD,EAAGoD,KAC/B4B,EAAOa,OAA2B,WAAlBlC,EAAKP,GAAGiD,QAC3BiB,EAAUxH,KAAK6D,EAAKP;GAOnB4B,EAAOa,MAAO,KACjBuB,GAAiB,EACZhE,EAAI,EAAGpD,EAAIsH,EAAUpH,OAAQkD,EAAIpD,EAAGoD,OACb,WAAvBkE,EAAUlE,GAAGiD,MAAoB,CACpCe,GAAiB;MAIfA,GACHE,EAAUxE,QAAQ,CAACuD,MAAO,SAAUsB,UAAW,kBAG3CvE,EAAI,EAAGpD,EAAIsH,EAAUpH,OAAQkD,EAAIpD,EAAGoD,OACb,WAAvBkE,EAAUlE,GAAGiD,MAAoB,CACpCiB,EAAUnH,OAAOiD,EAAG;UAMlBA,EAAI,EAAGpD,EAAIsH,EAAUpH,OAAQkD,EAAIpD,EAAGoD,IACxCmE,EAAYzH,KAAgC,SAA3BwH,EAAUlE,GAAGuE,WAAwB,EAAI;MAIrDC,EAAkBN,EAAUpH;GAC7B0H,EAEE,CAAA,GAAwB,IAApBA,EAAuB,OAC3BC,EAAWP,EAAU,GAAGjB,MACxByB,EAAaP,EAAY;OACxB,SAASzF,EAAgB8B,UACxBkE,EAAatC,EACnBiC,EAAUI,EAAU/F,GACpB2F,EAAUI,EAAUjE,YAIf,SAAS9B,EAAgB8B,OAC3BR,EAAGZ,EAAQ6D;IACVjD,EAAI,EAAGA,EAAIwE,EAAiBxE,OAChCiD,EAAQiB,EAAUlE,GAAGiD,MACrB7D,EAAS+E,EAAYnE,GAAKoC,EACzBiC,EAAUpB,EAAOvE,GACjB2F,EAAUpB,EAAOzC,IAEN,OAAOpB;OAEb,UArBD,KAgCTgE,cAAcX,EAAckC,SACrBhC,EAAoB;IACtBQ,EAAWvF,OAAOgH,OAAO,GAAGD;GAEhC7C,EAAYqB,EAAQ,QACpBrB,EAAYqB,EAAQ,cAGhBA,EAAQI,OAAQ,CACnBzB,EAAYqB,EAAQ;MACdI,EAAmB;AACzBJ,EAAQI,OAAOrH,SAAS+G,IACH,iBAATA,IACVA,EAAQ,CAACA,MAAMA,EAAMxB,OAAO,IAE7B8B,EAAO7G,KAAKuG,GACZN,EAAQM,EAAMA,OAAU,WAAYA,EAASA,EAAMxB,OAAS,KAE7D0B,EAAQI,OAASA,QAIX,CACNJ,QAAWA,EACXV,MAASA,EAAMrE,cAAcyG,OAC7BjC,OAAUnG,KAAK+F,SAASC,EAAOU,EAAQT,wBAAyBC,GAChEmC,MAAS,EACTxC,MAAS,GACTK,QAAWA,EACXc,UAAaN,EAAQ4B,QAAW5D,EAAiBH,GAQnDY,OAAOa,EAAcU,OACHzB,EAAOE,EAApBzE,EAAOV;AAEXmF,EAAUnF,KAAK2G,cAAcX,EAAOU,GACpCA,EAAUvB,EAAOuB,QACjBV,EAAUb,EAAOa;MAGXuC,EAAW7B,EAAQzB,OAASvE,EAAKkG,kBAAkBzB;AAGrDa,EAAM3F,OACToF,EAAQ/E,EAAKmF,OAAO,CAAC2C,EAAmBX,KACvC5C,EAAQsD,EAASC,KACM,IAAnB9B,EAAQ+B,QAAoBxD,EAAQ,IACvCE,EAAOU,MAAM5F,KAAK,OAAUgF,KAAa4C,OAI3CpC,EAAQ/E,EAAKmF,OAAO,CAAC6C,EAAgBb,KACpC1C,EAAOU,MAAM5F,KAAK,OAAU,KAAS4H;MAIjCc,EAAUjI,EAAK4G,iBAAiBnC;OAClCwD,GAASxD,EAAOU,MAAM/B,KAAK6E,GAG/BxD,EAAOkD,MAAQlD,EAAOU,MAAMxF,OACC,iBAAlBqG,EAAQkC,QAClBzD,EAAOU,MAAQV,EAAOU,MAAM9C,MAAM,EAAG2D,EAAQkC,QAGvCzD,GChWF,MAAM0D,EAAW7C,OAEnBA,EAAM8C,cACF9C,EAAM;GAGVA,aAAiB+C,mBACb/C;GAGJgD,EAAahD,GAAQ,KACpBiD,EAAMC,SAASC,cAAc;OACjCF,EAAIG,UAAYpD,EAAMoC,OACfa,EAAII,kBAGLH,SAASI,cAActD,IAGlBgD,EAAgBO,GACT,iBAARA,GAAoBA,EAAIhJ,QAAQ,MAAQ,EAcvCiJ,EAAe,CAAEC,EAAoBC,SAC7ChK,EAAQwJ,SAASS,YAAY;AACjCjK,EAAMkK,UAAUF,GAAY,GAAM,GAClCD,EAAOI,cAAcnK,IAOToK,EAAW,CAAEL,EAAoBM,KAC7C5I,OAAOgH,OAAOsB,EAAOO,MAAOD,IAQhBE,EAAa,CAAEC,KAAoCC,SAE3DC,EAAgBC,EAAaF,IACjCD,EAAWI,EAAYJ,IAEjB5H,KAAKiI,IACVH,EAAa9H,KAAKkI,IACjBD,EAAGE,UAAUC,IAAKF,UASPG,EAAgB,CAAET,KAAoCC,SAE9DC,EAAgBC,EAAaF,IAClCD,EAAWI,EAAYJ,IAEjB5H,KAAKiI,IACVH,EAAa9H,KAAIkI,IACfD,EAAGE,UAAUG,OAAQJ,UAUZH,EAAgB5J,QACxB0J,EAAmB;OACvB1E,EAAShF,GAAOoK,IACS,iBAAbA,IACVA,EAAWA,EAASzC,OAAO5I,MAAM,sBAE9B+F,MAAMC,QAAQqF,KACjBV,EAAUA,EAAQW,OAAOD,OAIpBV,EAAQ1B,OAAOsC,UAQVT,EAAef,IACtBhE,MAAMC,QAAQ+D,KACjBA,EAAM,CAACA,IAEFA,GASKyB,EAAc,CAAEC,EAAyBC,EAAiBC,SAElEA,GAAYA,EAAQC,SAASH,QAI1BA,GAAUA,EAAOI,SAAS,IAE5BJ,EAAOI,QAAQH,UACXD;AAGRA,EAASA,EAAOK,aAYLC,EAAU,CAAEC,EAA0B1D,EAAiB,IAE/DA,EAAY,EACR0D,EAAKA,EAAKnL,OAAO,GAGlBmL,EAAK,GAgBAC,EAAY,CAAElB,EAAiBmB,SACtCnB,EAAI,OAAQ;AAEjBmB,EAAUA,GAAWnB,EAAGoB;QAEpBpI,EAAI,EACDgH,EAAKA,EAAGqB,wBAEVrB,EAAGc,QAAQK,IACdnI;OAGKA,GAQKsI,EAAU,CAACtB,EAAWuB,KAClCrG,EAASqG,GAAM,CAACC,EAAIC,KACR,MAAPD,EACHxB,EAAG0B,gBAAgBD,GAEnBzB,EAAG2B,aAAaF,EAAgB,GAAGD,OASzBI,EAAc,CAAEC,EAAeC,KACvCD,EAASd,YAAac,EAASd,WAAWgB,aAAaD,EAAaD,ICrM5DG,EAAY,CAACC,EAAqBrJ,QAEhC,OAAVA,EAAiB;GAGA,iBAAVA,EAAoB,KAEzBA,EAAM9C,OAAS;AACpB8C,EAAQ,IAAIpC,OAAOoC,EAAO,WAoCrBsJ,EAAuBC,GAEN,IAAlBA,EAAKC,SAhCcD,CAAAA,QAEnB9I,EAAQ8I,EAAKxF,KAAKtD,MAAMT;GACxBS,GAAS8I,EAAKxF,KAAK7G,OAAS,EAAG,KAC9BuM,EAAY1D,SAASC,cAAc;AACvCyD,EAASC,UAAY;IACjBC,EAAaJ,EAAKK,UAAUnJ,EAAMoJ;AAEtCF,EAAUC,UAAUnJ,EAAM,GAAGvD;IACzB4M,EAAeH,EAAUI,WAAU;OAEvCN,EAASO,YAAYF,GACrBd,EAAYW,EAAWF,GAChB,SAGD,GAiBCQ,CAAcV,IAZKA,CAAAA,OACL,IAAlBA,EAAKC,UAAkBD,EAAKW,aAAe,kBAAkBC,KAAKZ,EAAKa,WAAiC,cAAnBb,EAAKG,WAA8C,SAAjBH,EAAKa,aAC1H,IAAIhK,EAAI,EAAGA,EAAImJ,EAAKW,WAAWhN,SAAUkD,EAC7CA,GAAKkJ,EAAmBC,EAAKW,WAAW9J,KAY1CiK,CAAkBd,GAEX;AAGRD,EAAoBD,ICtDRiB,EADqC,oBAAdC,WAAoC,MAAMJ,KAAKI,UAAUC,WACvD,UAAY;MCXnC,CACdjH,QAAS,GACTkH,UAAW,GAEXC,QAAS,GACTC,UAAW,IACXC,QAAS,KACTC,SAAS,EACT3K,YAAY,EACZ4K,OAAQ,KACRC,cAAc,EACdC,aAAc,KACd5B,WAAW,EACX6B,aAAa,EACbC,WAAY,KACZC,WAAY,GACZC,SAAU,KACVC,aAAc,KACdC,YAAY,EACZC,eAAe,EACfC,aAAa,EACbC,QAAS,KACTC,kBAAkB,EAGlBC,aAAc,IACdC,aAAc,UAEdC,SAAU,KACVC,cAAe,WACfC,WAAY,QACZC,WAAY,OACZC,cAAe,WACfC,mBAAoB,QACpBC,mBAAoB,QACpBC,mBAAmB,EAEnBC,UAAW,SACXC,YAAa,CAAC,QACdC,kBAAmB,MAEnBC,KAAM,KACNC,aAAc,aACdC,aAAc,aACdC,cAAe,cACfC,qBAAsB,sBACtBC,UAAW,OACXC,YAAa,SAEbC,eAAgB,KAChBC,aAAc,oDAEdC,uBAAuB,EAEvBC,YAAa,KACbC,gBAAiB,KAEjBC,WAAY,SAASvK,UACbA,EAAM3F,OAAS,GAuBvBmQ,OAAQ;AC/DF,MAAMC,EAAY3L,GACpB,MAAOA,EAAgD,KACpD4L,EAAS5L,GAGJ4L,EAAY5L,GACH,kBAAVA,EAA4BA,EAAQ,IAAM,IAC9CA,EAAQ,GAOH6L,EAAenP,IACnBA,EAAM,IACZE,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UAQJkP,EAAe,CAACC,EAAmDC,SAC3EC;OACG,SAAyBjM,EAAavF,OACxCmB,EAAOV;AAEP+Q,IACHrQ,EAAKsQ,QAAU9O,KAAKC,IAAIzB,EAAKsQ,QAAU,EAAG,GAC1CC,aAAaF,IAEdA,EAAUG,YAAW,WACpBH,EAAU,KACVrQ,EAAKyQ,eAAerM,IAAS,EAC7B+L,EAAGO,KAAK1Q,EAAMoE,EAAOvF,KAEnBuR,KAUQO,EAAkB,CAAE3Q,EAAgB4Q,EAAgBT,SAC5DU,EACA/Q,EAAUE,EAAKF,QACfgR,EAAoC;IAiBnCD,KAdL7Q,EAAKF,QAAU,eACV+Q,EAAOnR,UAAU;IACQ,IAAzBkR,EAAM/Q,QAAQgR,UAGV/Q,EAAQG,MAAMD,EAAMN;AAF3BoR,EAAWD,GAAQnR,WAOrByQ,EAAGlQ,MAAMD,EAAM,IACfA,EAAKF,QAAUA,EAGF8Q,GACRC,KAAQC,GACXhR,EAAQG,MAAMD,EAAM8Q,EAAWD,KAyBrBE,EAAiB,CAACC,EAAYC,GAAa,KACnDD,IACHA,EAAID,iBACAE,GACHD,EAAIE,oBAUMC,EAAW,CAAC5G,EAAoBsG,EAAahS,EAA6CmH,KACtGuE,EAAO6G,iBAAiBP,EAAKhS,EAASmH,IAU1BqL,EAAY,CAAEC,EAA2CN,MAEhEA,MAIAA,EAAIM,IAMK,KAFDN,EAAIO,OAAO,EAAE,IAAMP,EAAIQ,QAAQ,EAAE,IAAMR,EAAIS,SAAS,EAAE,IAAMT,EAAIU,QAAQ,EAAE,IAe3EC,EAAQ,CAAC9H,EAAW1C,WAC1ByK,EAAc/H,EAAGgI,aAAa;OAChCD,IAIJ/H,EAAG2B,aAAa,KAAKrE,GACdA,IAOK2K,EAAchR,GACnBA,EAAIE,QAAQ,UAAW,QAMlB+Q,EAAS,CAAEC,EAAiChG,KACpDA,GAAOgG,EAAOD,OAAO/F;ACtLX,SAASiG,EAAajQ,EAAgBkQ,OAChD9M,EAAuB3E,OAAOgH,OAAO,GAAI0K,EAAUD,GAEnDE,EAAehN,EAASkJ,SACxB+D,EAAiBjN,EAASqJ,WAC1B6D,EAAiBlN,EAASoJ,WAC1B+D,EAAmBnN,EAASsJ,cAC5B8D,EAAmBpN,EAASmJ,cAC5BkE,EAAuBrN,EAASuJ,mBAChC+D,EAAuBtN,EAASwJ,mBAEhC+D,EAAc3Q,EAAM6K,QAAQ5L,cAC5B0O,EAAiB3N,EAAM6P,aAAa,gBAAkB7P,EAAM6P,aAAa;IAExElC,IAAgBvK,EAAS+I,iBAAkB,KAC3CyE,EAAU5Q,EAAM4G,cAAc;AAC9BgK,IACHjD,EAAciD,EAAOC,iBAyBlBhG,EACA7G,EACA8M,EACAC,EAEAC,EAYAC,EArCDC,EAMA,CACHvD,YAAcA,EACd3J,QAAW,GACXkH,UAAY,GACZ/H,MAAS,GACT0I,SAAW;MA6HK,WAAb8E,GAnHC3M,EAAUkN,EAAiBlN,QAC3B8M,EAAgC,GAChCC,EAAc,EAEdC,EAAYnJ,QAEXrD,EAAO/F,OAAOgH,OAAO,GAAGoC,EAAGsJ,SAC3BC,EAAOhB,GAAa5L,EAAK4L;MAET,iBAATgB,GAAqBA,EAAKzT,SACpC6G,EAAO/F,OAAOgH,OAAOjB,EAAK6M,KAAKC,MAAMF,KAG/B5M,GAGJyM,EAAY,CAACL,EAA0BW,SAEtCnP,EAAQ2L,EAAS6C,EAAOxO;GACd,MAATA,IACCA,GAAUgB,EAAS+I,sBAMrB2E,EAAWrP,eAAeW,OACzBmP,EAAO,KACNC,EAAMV,EAAW1O,GAAOoO;AACvBgB,EAEO3O,MAAMC,QAAQ0O,GAGzBA,EAAIjU,KAAKgU,GAFTT,EAAW1O,GAAOoO,GAAkB,CAACgB,EAAKD,GAF1CT,EAAW1O,GAAOoO,GAAkBe,OAQlC,KAEAE,EAA0BT,EAASJ;AACvCa,EAAYpB,GAAkBoB,EAAYpB,IAAgBO,EAAOC,YACjEY,EAAYnB,GAAkBmB,EAAYnB,IAAgBlO,EAC1DqP,EAAYlB,GAAkBkB,EAAYlB,IAAmBK,EAAOc,SACpED,EAAYjB,GAAkBiB,EAAYjB,IAAmBe,EAC7DE,EAAYE,QAAYf,EAExBE,EAAW1O,GAASqP,EACpBzN,EAAQzG,KAAKkU,GAGVb,EAAOgB,UACVV,EAAiB/N,MAAM5F,KAAK6E,KAqB9B8O,EAAiBrF,SAAW7L,EAAM6R,aAAa,YAAc,KAAO,EAEpE9O,EAAQ/C,EAAM8R,UAAUC,IAnBPC,IAAAA,EACZ7M,EAAW8M;AAoBC,cADhBpH,EAAUkH,EAAMlH,QAAQ5L,iBAjBxBgT,EAAsBjB,EAHNgB,EAsBND,IAlBItB,GAAyBwB,EAAcxB,IAAyBuB,EAASnC,aAAa,UAAY,GAChHoC,EAAcvB,GAAyBuB,EAAcvB,IAAyBK,IAC9EkB,EAAc1B,GAAoB0B,EAAc1B,IAAmByB,EAASN,SAC5ER,EAAiBhG,UAAU3N,KAAK0U,GAEhC9M,EAAK8M,EAAcvB,GAEnB3N,EAAQiP,EAASF,UAAWlB,IAC3BK,EAAUL,EAA6BzL,OAWjB,WAAZ0F,GACVoG,EAAUc,OAWM,YACZG,EAAWlS,EAAM6P,aAAaO;GAE/B8B,EAaJhB,EAAiBlN,QAAUqN,KAAKC,MAAMY,GACtCnP,EAASmO,EAAiBlN,SAAUmO,IACnCjB,EAAiB/N,MAAM5F,KAAK4U,EAAI7B;IAfnB,KACVlO,EAAQpC,EAAMoC,MAAMsD,QAAU;IAC7BtC,EAAS+I,mBAAqB/J,EAAMzE,OAAQ;MAC3CyU,EAAShQ,EAAMtF,MAAMsG,EAASgI;AAEpCrI,EAASqP,GAAShQ,UACXwO,EAAmB;AACzBA,EAAOP,GAAejO,EACtBwO,EAAON,GAAelO,EACtB8O,EAAiBlN,QAAQzG,KAAKqT,MAE/BM,EAAiB/N,MAAQiP,IAa1BC,GAGM5T,OAAOgH,OAAQ,GAAI0K,EAAUe,EAAkBhB,GCnIvD,IAAIoC,EAAa;AAEF,MAAMC,UCTN,SAAqBC,UAEnCA,EAAUrH,QAAU,GAEb,cAAcqH,qCAEbrH,QAAmB,CACzBlJ,MAAY,GACZmB,SAAY,GACZqP,UAAY,GACZC,OAAY,kBAQC3Q,EAAaoM,GAC1BqE,EAAUrH,QAAQpJ,GAAQ,MAChBA,KACAoM,GAoBXwE,kBAAkBxH,OACbvI,EAAKb;MACH/D,EAAQV,KACRsV,EAAiB;GAEnB/P,MAAMC,QAAQqI,GACjBA,EAAQpO,SAAS8V,IACM,iBAAXA,EACVD,EAAMrV,KAAKsV,IAEX7U,EAAKmN,QAAQ/H,SAASyP,EAAO9Q,MAAQ8Q,EAAO7O,QAC5C4O,EAAMrV,KAAKsV,EAAO9Q;KAGd,GAAIoJ,MACLvI,KAAOuI,EACPA,EAAQ1J,eAAemB,KAC1B5E,EAAKmN,QAAQ/H,SAASR,GAAOuI,EAAQvI,GACrCgQ,EAAMrV,KAAKqF;KAKPb,EAAO6Q,EAAM1Q,SACnBlE,EAAK8U,QAAQ/Q,GAIfgR,WAAWhR,OACN/D,EAAUV,KACV6N,EAAUnN,EAAKmN,QACf0H,EAAUL,EAAUrH,QAAQpJ;IAE3ByQ,EAAUrH,QAAQ1J,eAAeM,SAC/B,IAAIiR,MAAM,mBAAsBjR,EAAO;AAG9CoJ,EAAQsH,UAAU1Q,IAAQ,EAC1BoJ,EAAQuH,OAAO3Q,GAAQ8Q,EAAO1E,GAAGlQ,MAAMD,EAAM,CAACA,EAAKmN,QAAQ/H,SAASrB,IAAS,KAC7EoJ,EAAQlJ,MAAM1E,KAAKwE,GAOpB+Q,QAAQ/Q,OACH/D,EAAOV,KACP6N,EAAUnN,EAAKmN;IAEdnN,EAAKmN,QAAQuH,OAAOjR,eAAeM,GAAO,IAC1CoJ,EAAQsH,UAAU1Q,SACf,IAAIiR,MAAM,oCAAsCjR,EAAO;AAE9D/D,EAAK+U,WAAWhR,UAGVoJ,EAAQuH,OAAO3Q,KDzFckR,CAAYhW,IAiDlDC,YAAagW,EAA4BC,OAKpCC;aApDEC,0BACA5K,oBACA6K,qBACAC,oBACAC,6BACAC,uBAEAC,MAAqB,OACrBtQ,qBACApD,kBACA2T,qBACAC,0BACAC,gBACCC,oBAEAC,qBACDC,mBAGAC,QAAuB,OACvBC,YAA0B,OAC1BC,uBACAC,WAAyB,OACzBC,SAAwB,OACxBC,UAAyB,OACzBC,WAAyB,OACzBC,eAA4B,OAC5BC,SAAwB,OACxBC,aAA2B,OAC3BC,aAA2B,OAC3BC,YAA0B,OAC1BC,2BACAC,UAAwB,QACxBC,SAAwB,OACxBzG,QAAuB,OACvBG,eAAgD,QAEhDuG,aAAqC,UACrCC,YAA6B,QAE7B/J,UAA4B,QAC5BlH,QAA2B,QAC3BkR,YAA0C,QAC1C/R,MAAuB,GAO7BmP;IAGItS,EAAWmG,EAAQ+M;GAEnBlT,EAAMmV,gBACH,IAAInC,MAAM;AAIjBhT,EAAMmV,UAAc7X,KAKpB8V,GADqBgC,OAAOC,kBAAoBD,OAAOC,iBAAiBrV,EAAO,OACtDsV,iBAAiB;MAGpClS,EAAa6M,EAAajQ,EAAOmT;KAClC/P,SAAaA,OACbpD,MAAWA,OACX2T,SAAa3T,EAAM2T,UAAY,OAC/BC,cAAiD,WAAhC5T,EAAM6K,QAAQ5L,mBAC/B4U,IAAS,OAAOjJ,KAAKwI,QACrBU,QAAYnE,EAAM3P,EAAO,aAAasS,QACtC6B,WAAenU,EAAMuV,cAIrBvB,OAAS,IAAI9Q,EAAO5F,KAAK0G,QAAS,CAACrD,WAAYyC,EAASzC,aAG7DyC,EAAS6J,KAAO7J,EAAS6J,OAA+B,IAAtB7J,EAASyI,SAAiB,SAAW,SAClC,kBAA1BzI,EAAS0I,eACnB1I,EAAS0I,aAAiC,UAAlB1I,EAAS6J,MAGM,kBAA7B7J,EAASwK,kBACnBxK,EAASwK,gBAAoC,UAAlBxK,EAAS6J;IAIjClH,EAAS3C,EAASqI;AACA,mBAAX1F,IAEY,iBAAXA,IACVA,EAAS,IAAI1H,OAAO0H,IAGjBA,aAAkB1H,OACrB+E,EAASqI,aAAgBzL,GAAW+F,EAAkB6E,KAAK5K,GAE3DoD,EAASqI,aAAgBrJ,GACjB9E,KAAK8F,SAAS2I,aAAezO,KAAK0G,QAAQ5B,SAM/CuQ,kBAAkBvP,EAAS+H,cAC3BqK,sBACAC;MAIChN,EAAYtC,EAAO,SACnBoN,EAAYpN,EAAO,SACnBmN,EAAahW,KAAKoY,QAAQ,YAC1BlC,EAAmBrN,EAAQ,sCAE3BsB,EAAYnK,KAAK0C,MAAM6P,aAAa,UAAY,GAChD8F,EAAcvS,EAAS6J;IAEzBoG;GAGJ9L,EAAYkB,EAASrF,EAAS8J,aAAczF,EAASkO,GAGrDpO,EAAWgM,EAAQnQ,EAAS+J,cAC5B4C,EAAQtH,EAAS8K,GAGjBhM,EAAW+L,EAAUlQ,EAASgK,cAAeuI,GACzCvS,EAASsK,uBACZnG,EAAY+L,EAAU7L,GAIvBF,EAAWiM,EAAkBpQ,EAASiK,sBACtC0C,EAAQuD,EAAUE,GAElBrN,EAAQ/C,EAASoK,gBAAkB/E,GAAUgC,YAAa6I,GAItDhN,EAAalD,EAASqK,cAAe,CACxC4F,EAAiBlN,EAAO/C,EAASqK;AAIjC1K,EADY,CAAC,cAAc,iBAAiB,iBAC7BuG,IACVtJ,EAAM6P,aAAavG,IACtBH,EAAQkK,EAAc,EAAE/J,GAAMtJ,EAAM6P,aAAavG,QAInD+J,EAAcM,UAAY,EAC1BJ,EAAQ9I,YAAa4I,QAChBI,WAAcJ,OAGVjQ,EAASqK,cAClB4F,EAAiBlN,EAAQ/C,EAASqK,mBAC7BgG,WAAcJ,IAGnBA,EAAiBlN,EAAO,iBACnBsN,WAAcF;KAGf9K,QAAYA,OACZ6K,SAAaA,OACbE,iBAAmBA,OACnBD,QAAaA,OACbF,cAAiBA,OAEjBuC,QAONA,cAEO5X,EAAOV,KACP8F,EAAcpF,EAAKoF,SACnBiQ,EAAkBrV,EAAKqV,cACvBC,EAActV,EAAKsV,SACnBE,EAAoBxV,EAAKwV,iBACzB/K,EAAazK,EAAKyK,QAClB8K,EAAavV,EAAKuV,QAClBvT,EAAYhC,EAAKgC,MACjByT,EAAezV,EAAKyV,WACpBoC,EAAkB,CAAEC,SAAS,GAC7BC,EAAe/X,EAAK8V,QAAS;AAGnC3K,EAAQqK,EAAiB,CACxBrO,GAAI4Q,IAGL5M,EAAQsK,EAAW,CAClBuC,KAAK,2BACW,0BACA,wBACAD;MAGXE,EAAatG,EAAM8D,EAAWzV,EAAK8V,QAAU,eAC7CxQ,EAAU,cN5NUA,CAAAA,GACpBA,EAAMtE,QAAQ,UAAW,QM2NDkX,CAAYlY,EAAK8V,SAAS,KAClDqC,EAAU3P,SAASI,cAActD,GACjC8S,EAAcpY,EAAKqY,MAAMpR,KAAKjH;GAChCmY,EAAO,CACVhH,EAASgH,EAAM,QAASC,GACxBjN,EAAQgN,EAAM,CAACG,IAAIL;MACbM,EAAW5G,EAAMwG,EAAMnY,EAAK8V,QAAQ;AAC1C3K,EAAQsK,EAAW,mBAAmB8C,IACtCpN,EAAQqK,EAAiB,mBAAmB+C,OAG7C9N,EAAQnB,MAAMkP,MAAQxW,EAAMsH,MAAMkP,MAE9BxY,EAAKmN,QAAQlJ,MAAMtE,OAAQ,OACxB8Y,EAAkB,UAAYzY,EAAKmN,QAAQlJ,MAAMtD,KAAK;AAC5D4I,EAAY,CAACkB,EAAQ6K,GAAWmD,IAGN,OAAtBrT,EAASyI,UAAqBzI,EAASyI,SAAW,IAAM7N,EAAK4V,eACjEzK,EAAQnJ,EAAM,CAAC0W,SAAS,aAGrBtT,EAASuK,aACZxE,EAAQkK,EAAc,CAAC1F,YAAYvK,EAASuK,eAIxCvK,EAASiI,SAAWjI,EAASgI,YACjChI,EAASiI,QAAU,IAAIhN,OAAO,OAASyB,EAAasD,EAASgI,WAAa,UAKvEhI,EAASuT,MAAQvT,EAASgJ,eAC7BhJ,EAASuT,KAAOzI,EAAa9K,EAASuT,KAAKvT,EAASgJ,eAGrDpO,EAAKqV,cAAcxE,KAAO7O,EAAM6O,KAEhCM,EAASmE,EAAS,cAAesD,QAE5BC,EAAevO,EAAYsO,EAAErO,OAAuB,oBAAqB+K;AACzEuD,GAAe7Y,EAAK8Y,cAAeF,EAAiBC,KAEtD,CAACE,SAAQ,IAGZ5H,EAASmE,EAAS,SAAStE,UACpB4B,EAAStI,EAAY0G,EAAIzG,OAAuB;AAClDqI,IACH5S,EAAKgZ,eAAgBhI,EAAmB4B,GACxC7B,EAAeC,GAAI,OAIrBG,EAASoE,EAAQ,SAAUvE,QAEtB6H,EAAevO,EAAa0G,EAAIzG,OAAuB,iBAAkBgL;AACzEsD,GAAgB7Y,EAAKiZ,aAAajI,EAAmB6H,GACxD9H,EAAeC,GAAI,GAKO,IAAvBqE,EAAcjR,QAIlBpE,EAAKkZ,UACLnI,EAAeC,GAAI,OAKpBG,EAASsE,EAAW,WAAamD,GAAM5Y,EAAKmZ,UAAUP,KAGtDzH,EAASkE,EAAc,YAAauD,GAAM5Y,EAAKoZ,WAAWR,KAC1DzH,EAASkE,EAAc,SAAWuD,GAAM5Y,EAAKqZ,QAAQT,KAErDzH,EAASsE,EAAW,UAAW,IAAMzV,EAAKsZ,oBAAoBzB,GAC9D1G,EAASsE,EAAW,QAAWmD,GAAM5Y,EAAKuZ,OAAOX,KACjDzH,EAASsE,EAAW,SAAWmD,GAAM5Y,EAAKwZ,QAAQZ,KAClDzH,EAASkE,EAAc,SAAWuD,GAAM5Y,EAAKyZ,QAAQb;MAG/Cc,EAAiB1I,UAIhBzG,EAASyG,EAAI2I,eAAe;IAC7BlP,EAAQC,SAASH,KAA2B+K,EAAS5K,SAASH,UAC9DvK,EAAKuW,WACRvW,EAAK4Z,YAEN5Z,EAAK6Z;AASFtP,GAAU8K,GAAiBrV,EAAKiW,OACnCjF,EAAIE,kBAIJH,EAAeC,GAAI,IAKf8I,EAAa,KACd9Z,EAAKiW,QACRjW,EAAKsZ,oBAIDS,EAAY,KACjB/Z,EAAK2W,aAAc;AAGpBxF,EAAS3I,SAAS,YAAakR,GAC/BvI,EAASiG,OAAO,SAAU0C,EAAYjC,GACtC1G,EAASiG,OAAO,SAAU0C,EAAYjC,GACtC1G,EAASiG,OAAO,YAAa2C,EAAWlC,QAEnC9B,SAAW,KACfvN,SAASwR,oBAAoB,YAAYN,GACzCtC,OAAO4C,oBAAoB,YAAYD,GACvC3C,OAAO4C,oBAAoB,SAASF,GACpC1C,OAAO4C,oBAAoB,SAASF,GAChC3B,GAAQA,EAAM6B,oBAAoB,QAAQ5B,SAK1C6B,eAAiB,CACrBvR,UAAY1G,EAAM0G,UAClBiN,SAAW3T,EAAM2T,UAIlB3T,EAAM2T,UAAY,EAClB3T,EAAMkY,sBAAsB,WAAYla,EAAKyK,SAE7CzK,EAAKma,MAAK,GACV/U,EAASD,MAAQ,UACVC,EAAS8H,iBACT9H,EAASY,QAEhBmL,EAASnP,EAAM,WAAY4W,IACtB5Y,EAAKqW,UACRrW,EAAKqW,SAAU,EACfrW,EAAKoW,WAAY,EACjBpW,EAAKoa,mBAIPpa,EAAKqa,sBACLra,EAAKsa,eACLta,EAAKua,OAAM,GACXva,EAAK6Z,aACL7Z,EAAKyW,SAAU,EAEXzU,EAAM0R,SACT1T,EAAKwa,UAELxa,EAAKya,SAGNza,EAAKZ,GAAG,SAAUE,KAAKob,UAEvBnR,EAAWvH,EAAM,cAAc,wBAC/BhC,EAAKF,QAAQ,eAGY,IAArBsF,EAAS8I,SACZlO,EAAKkO,UAUPyM,aAAa3U,EAAsB,GAAIkH,EAAwB,SAGzD0N,WAAW5U,GAIhBjB,EAASmI,GAAY8G,SACf6G,oBAAoB7G,MAO3ByD,qBACKzX,EAAOV,KACP+S,EAAcrS,EAAKoF,SAASqJ,WAC5B+D,EAAiBxS,EAAKoF,SAASuJ,mBAE/BmM,EAAY,UACFtU,QACRwN,EAAWxL,SAASC,cAAc;OACtCuL,EAAS7H,UAAY,WACrB6H,EAASvH,YAAYjG,EAAKR,SACnBgO,mBAGW,CAACxN,EAAgBuU,IAC5B,gCAAkCA,EAAOvU,EAAKgM,IAAmB,gBAE/D,CAAChM,EAAgBuU,IACnB,QAAUA,EAAOvU,EAAK6L,IAAgB,cAEtC,CAAC7L,EAAgBuU,IACjB,QAAUA,EAAOvU,EAAK6L,IAAgB,uBAE7B,CAAC7L,EAAgBuU,IAC1B,mCAAqCA,EAAOvU,EAAKxE,OAAS,qCAErD,IACL,yDAEE,IACF,0CAEM,gBACH,IACH;AAKThC,EAAKoF,SAAS0K,OAASrP,OAAOgH,OAAO,GAAIqT,EAAW9a,EAAKoF,SAAS0K,QAOnE0H,qBACK5S,EAAKuL,EACL6K,EAAkC,YACjB,sBACA,oBACA,wBACA,2BACA,qBACA,qBACA,4BACA,8BACA,6BACA,mCACA,qCACA,mCACA,gCACA,uBACA,cACA,eACA,eACA;IAGhBpW,KAAOoW,GAEX7K,EAAK7Q,KAAK8F,SAAS4V,EAAUpW,MACrBtF,KAAKF,GAAGwF,EAAKuL,GASvBgK,KAAKc,GAAqB,SACnBjb,EAAQV,KACR8F,EAAW6V,EAAehJ,EAAajS,EAAKgC,MAAO,CAACoL,UAAUpN,EAAKoF,SAASgI,YAA8BpN,EAAKoF;AAErHpF,EAAK2a,aAAavV,EAASY,QAAQZ,EAAS8H,WAE5ClN,EAAKkb,SAAS9V,EAASD,OAAO,IAAG,GAEjCnF,EAAKmb,UAAY,KAQlBjC,cACKlZ,EAAOV;GAEPU,EAAKiX,YAAYtX,OAAS,SAC7BK,EAAKob,wBACLpb,EAAKqY;AAIFrY,EAAKuW,WAAavW,EAAKiW,OAC1BjW,EAAK4Z,OAEL5Z,EAAKqY,QAQPgD,eAOAX,WACC5R,EAAaxJ,KAAK0C,MAAO,SACzB8G,EAAaxJ,KAAK0C,MAAO,UAO1ByX,QAAQb,OACH5Y,EAAOV;AAEPU,EAAKwW,eAAiBxW,EAAKsW,SAC9BvF,EAAe6H,GAMX5Y,EAAKoF,SAASiI,SAKnBmD,YAAW,SACN8K,EAAatb,EAAKub;GACjBD,EAAWpY,MAAMlD,EAAKoF,SAASiI,cAIhCmO,EAAaF,EAAW5T,OAAO5I,MAAMkB,EAAKoF,SAASiI;AACvDtI,EAASyW,GAAaC,IAErBA,EAAQ1L,EAAS0L,GACbnc,KAAK0G,QAAQyV,GAChBzb,EAAK0b,QAAQD,GAEbzb,EAAK2b,WAAWF,SAGhB,GAQJrC,WAAWR,OACN5Y,EAAOV;IACRU,EAAKsW,cAIJsF,EAAY9Y,OAAOC,aAAa6V,EAAEiD,SAAWjD,EAAEkD;OAC/C9b,EAAKoF,SAASmI,QAAiC,UAAvBvN,EAAKoF,SAAS6J,MAAoB2M,IAAc5b,EAAKoF,SAASgI,WACzFpN,EAAK2b,kBACL5K,EAAe6H,WANf7H,EAAe6H,GAejBO,UAAUP,OACL5Y,EAAOV;GAEXU,EAAK2W,aAAc,EAEf3W,EAAKsW,SJroBc,IIsoBlBsC,EAAEiD,SACL9K,EAAe6H;YAKTA,EAAEiD,cJrpBY,MIypBhBxK,EAAU0K,EAAuBnD,IACJ,IAA5B5Y,EAAKqV,cAAcjR,aACtB2M,EAAe6H,QACf5Y,EAAKgc;;KJ1pBc,UIkqBjBhc,EAAKiW,SACRlF,EAAe6H,GAAE,GACjB5Y,EAAKua,cAENva,EAAKob;KJlqBiB,OIuqBjBpb,EAAKiW,QAAUjW,EAAK4W,WACxB5W,EAAKic;KACC,GAAIjc,EAAKgX,aAAc,KACzBkF,EAAOlc,EAAKmc,YAAYnc,EAAKgX,aAAc;AAC3CkF,GAAMlc,EAAKoc,gBAAgBF,eAEhCnL,EAAe6H;KJ/qBM,MIorBjB5Y,EAAKgX,aAAc,KAClBqF,EAAOrc,EAAKmc,YAAYnc,EAAKgX,cAAe;AAC5CqF,GAAMrc,EAAKoc,gBAAgBC,eAEhCtL,EAAe6H;KJ3rBS,eIgsBpB5Y,EAAKsc,UAAUtc,EAAKgX,eACvBhX,EAAKgZ,eAAeJ,EAAE5Y,EAAKgX,cAC3BjG,EAAe6H,KAGN5Y,EAAKoF,SAASmI,QAAUvN,EAAK2b,cAI7BnT,SAAS+T,eAAiBvc,EAAKqV,eAAiBrV,EAAKiW,SAH9DlF,EAAe6H;KJpsBM,eI+sBtB5Y,EAAKwc,kBAAkB,EAAG5D;KJ7sBH,eIktBvB5Y,EAAKwc,iBAAiB,EAAG5D;KJ9sBJ,cIotBjB5Y,EAAKoF,SAAS6I,cACbjO,EAAKsc,UAAUtc,EAAKgX,gBACvBhX,EAAKgZ,eAAeJ,EAAE5Y,EAAKgX,cAI3BjG,EAAe6H,IAEZ5Y,EAAKoF,SAASmI,QAAUvN,EAAK2b,cAChC5K,EAAe6H;KJ/tBS,OACF,eIsuBxB5Y,EAAKyc,gBAAgB7D,GAKnB5Y,EAAKwW,gBAAkBnF,EAAU0K,EAAuBnD,IAC3D7H,EAAe6H,IAQjBS,QAAQT,OACH5Y,EAAOV;IAEPU,EAAKsW,cAILlS,EAAQpE,EAAKub;AACbvb,EAAK8W,YAAc1S,IACtBpE,EAAK8W,UAAY1S,EAEbpE,EAAKoF,SAASyK,WAAWa,KAAK1Q,EAAKoE,IACtCpE,EAAK2Y,KAAKvU,GAGXpE,EAAK0c,iBACL1c,EAAKF,QAAQ,OAAQsE,KASvB0U,cAAe9H,EAA8B4B,GACxCtT,KAAKqX,kBACJyF,gBAAgBxJ,GAAQ,GAO9B4G,QAAQZ,OACH5Y,EAAOV,KACPqd,EAAa3c,EAAKuW;GAElBvW,EAAKkW,kBACRlW,EAAK4Z,YACL7I,EAAe6H;AAIZ5Y,EAAK0W,cACT1W,EAAKuW,WAAY,EACa,UAA1BvW,EAAKoF,SAAS8I,SAAsBlO,EAAKkO,UAExCyO,GAAY3c,EAAKF,QAAQ,SAEzBE,EAAKiX,YAAYtX,SACrBK,EAAK4c,YACL5c,EAAK0c,iBAAiB1c,EAAKoF,SAASsI,cAGrC1N,EAAKoa,gBAONb,OAAOX,OAEsB,IAAxBpQ,SAASqU,gBAET7c,EAAOV;GACNU,EAAKuW,WACVvW,EAAKuW,WAAY,EACjBvW,EAAK0W,aAAc;IAEfoG,EAAa,KAChB9c,EAAKua,QACLva,EAAK+c,gBACL/c,EAAKgd,SAAShd,EAAKmF,MAAMxF,QACzBK,EAAKF,QAAQ;AAGVE,EAAKoF,SAASmI,QAAUvN,EAAKoF,SAASoI,aACzCxN,EAAK2b,WAAW,MAAM,EAAOmB,GAE7BA,MAUF9D,eAAgBhI,EAA8B4B,OACzCxO,EAAOpE,EAAOV;AAIdsT,EAAOqK,eAAiBrK,EAAOqK,cAActS,QAAQ,qBAKrDiI,EAAO7I,UAAUW,SAAS,UAC7B1K,EAAK2b,WAAW,MAAM,GAAM,KACvB3b,EAAKoF,SAAS8X,kBACjBld,EAAKua,gBAKc,KADrBnW,EAAQwO,EAAOO,QAAQ/O,SAEtBpE,EAAKmb,UAAY,KACjBnb,EAAK0b,QAAQtX,GACTpE,EAAKoF,SAAS8X,kBACjBld,EAAKua,SAGDva,EAAKoF,SAAS0I,cAAgBkD,EAAIH,MAAQ,QAAQjE,KAAKoE,EAAIH,OAC/D7Q,EAAKoc,gBAAgBxJ,KAUzB0J,UAAU1J,YAELtT,KAAK2W,QAAUrD,GAAUtT,KAAKkW,iBAAiB9K,SAASkI,IAW7DqG,aAAcjI,EAAiBlJ,OAC1B9H,EAAOV;OAENU,EAAKsW,UAAmC,UAAvBtW,EAAKoF,SAAS6J,OACnC8B,EAAeC,GACfhR,EAAK+c,cAAcjV,EAAMkJ,IAClB,GAqBTmM,QAAQ/Y,WAEF9E,KAAK8F,SAASuT,OACfrZ,KAAKmR,eAAehN,eAAeW,GASxCuU,KAAKvU,SACEpE,EAAOV;IAERU,EAAKmd,QAAQ/Y,GAAS;AAE3BmF,EAAWvJ,EAAKyK,QAAQzK,EAAKoF,SAASiJ,cACtCrO,EAAKsQ;MAECzR,EAAWmB,EAAKod,aAAanW,KAAKjH;AACxCA,EAAKoF,SAASuT,KAAKjI,KAAK1Q,EAAMoE,EAAOvF,GAOtCue,aAAcpX,EAAqBkH,SAC5BlN,EAAOV;AACbU,EAAKsQ,QAAU9O,KAAKC,IAAIzB,EAAKsQ,QAAU,EAAG,GAC1CtQ,EAAKmb,UAAY,KAEjBnb,EAAKqd,oBACLrd,EAAK2a,aAAa3U,EAAQkH,GAE1BlN,EAAK0c,eAAe1c,EAAKuW,YAAcvW,EAAKwW,eAEvCxW,EAAKsQ,SACTrG,EAAcjK,EAAKyK,QAAQzK,EAAKoF,SAASiJ,cAG1CrO,EAAKF,QAAQ,OAAQkG,EAASkH,GAG/BgB,cACKnE,EAAYzK,KAAKmL,QAAQV;AACzBA,EAAUW,SAAS,eACvBX,EAAUC,IAAI,kBACT2O,KAAK,KAQX2E,gBAAgBlZ,EAAe,QAC1BpC,EAAQ1C,KAAK+V;AACHrT,EAAMoC,QAAUA,IAE7BpC,EAAMoC,MAAQA,EACd0E,EAAa9G,EAAM,eACd8U,UAAY1S,GAWnBmZ,kBAEKje,KAAKsW,eAAiBtW,KAAK0C,MAAM6R,aAAa,YAC1CvU,KAAK6F,MAGN7F,KAAK6F,MAAMxE,KAAKrB,KAAK8F,SAASgI,WAOtC8N,SAAU9W,EAAuBoZ,GAGhC7M,EAAgBrR,KAFHke,EAAS,GAAK,CAAC,WAEC,UACvBC,MAAMD,QACNE,SAAStZ,EAAOoZ,MASvBG,YAAYvZ,GACE,IAAVA,IAAaA,EAAQ,WACnBgB,SAASyI,SAAWzJ,OACpBgW,eAON2C,cAAejV,EAAe8Q,OAEzBgF,EACA/a,EAAGgb,EAAOC,EAAKC,EACfC,EAHAhe,EAAOV;GAKgB,WAAvBU,EAAKoF,SAAS6J,UAGbnH,SACJ9H,EAAKob,wBACDpb,EAAKuW,WACRvW,EAAK4c;GAQW,WAFlBgB,EAAYhF,GAAKA,EAAE/H,KAAK5P,gBAEKoQ,EAAU,WAAWuH,IAAM5Y,EAAKiX,YAAYtX,OAAQ,KAChFqe,EAAOhe,EAAKie,iBACZJ,EAAQhZ,MAAMqZ,UAAUre,QAAQ6Q,KAAK1Q,EAAKuV,QAAQzB,SAAUkK,KAC5DF,EAAOjZ,MAAMqZ,UAAUre,QAAQ6Q,KAAK1Q,EAAKuV,QAAQzB,SAAUhM,MAG1DiW,EAAQF,EACRA,EAAQC,EACRA,EAAQC,GAEJlb,EAAIgb,EAAOhb,GAAKib,EAAKjb,IACzBiF,EAAO9H,EAAKuV,QAAQzB,SAASjR,IACW,IAApC7C,EAAKiX,YAAYpX,QAAQiI,IAC5B9H,EAAKme,mBAAmBrW;AAG1BiJ,EAAe6H,OACU,UAAdgF,GAAyBvM,EAAU0K,EAAuBnD,IAAuB,YAAdgF,GAA2BvM,EAAU,WAAWuH,GAC1H9Q,EAAKiC,UAAUW,SAAS,UAC3B1K,EAAKoe,iBAAkBtW,GAEvB9H,EAAKme,mBAAmBrW,IAGzB9H,EAAKob,mBACLpb,EAAKme,mBAAmBrW;AAIzB9H,EAAKqe,YACAre,EAAKuW,WACTvW,EAAKqY,SAQP8F,mBAAoBrW,SACb9H,EAAOV,KACPgf,EAActe,EAAKuV,QAAQ3M,cAAc;AAC3C0V,GAAcrU,EAAcqU,EAA2B,eAE3D/U,EAAWzB,EAAK,sBAChB9H,EAAKF,QAAQ,cAAegI,IACW,GAAnC9H,EAAKiX,YAAYpX,QAAQiI,IAC5B9H,EAAKiX,YAAY1X,KAAMuI,GAQzBsW,iBAAkBtW,OACbyW,EAAMjf,KAAK2X,YAAYpX,QAAQiI;KAC9BmP,YAAYrX,OAAO2e,EAAK,GAC7BtU,EAAcnC,EAAK,UAOpBsT,mBACCnR,EAAc3K,KAAK2X,YAAY,eAC1BA,YAAc,GAQpBmF,gBAAiBxJ,EAAwB4L,GAAe,GAEnD5L,IAAWtT,KAAK0X,oBAIfqG,oBACAzK,SAEAoE,aAAepE,EACpBzH,EAAQ7L,KAAKmW,WAAW,yBAAyB7C,EAAOf,aAAa,QACrE1G,EAAQyH,EAAO,iBAAiB,SAChCrJ,EAAWqJ,EAAO,UACd4L,GAASlf,KAAKmf,eAAe7L,KAOlC6L,eAAgB7L,EAAyB8L,OAEnC9L,EAAS;MAER+L,EAAWrf,KAAKkW,iBAChBoJ,EAAcD,EAAQE,aACtBC,EAAaH,EAAQG,WAAa,EAClCC,EAAcnM,EAAOoM,aACrBC,EAAOrM,EAAOsM,wBAAwBC,IAAMR,EAAQO,wBAAwBC,IAAML;AAEpFG,EAAIF,EAAcH,EAAcE,OAC9BN,OAAOS,EAAIL,EAAcG,EAAaL,GAEjCO,EAAIH,QACTN,OAAOS,EAAGP,GAQjBF,OAAQM,EAAkBJ,SACnBC,EAAUrf,KAAKkW;AACjBkJ,IACHC,EAAQrV,MAAM8V,eAAiBV,GAEhCC,EAAQG,UAAYA,EACpBH,EAAQrV,MAAM8V,eAAiB,GAOhC/B,oBACK/d,KAAK0X,eACR/M,EAAc3K,KAAK0X,aAAa,UAChC7L,EAAQ7L,KAAK0X,aAAa,iBAAiB,aAEvCA,aAAe,KACpB7L,EAAQ7L,KAAKmW,WAAW,yBAAyB,OAOlDuG,kBACOhc,EAAOV;GAEc,WAAvBU,EAAKoF,SAAS6J,KAAmB;MAE/BgI,EAAcjX,EAAKqf;AAEpBpI,EAAYtX,SAEjBK,EAAKqe,YACLre,EAAKua,QAELva,EAAKiX,YAAcA,EACnBlS,EAASkS,GAAcnP,IACtB9H,EAAKme,mBAAmBrW,OAS1B+R,iBACK7Z,EAAOV;AAENU,EAAKuV,QAAQ7K,SAAS1K,EAAKqV,iBAEhClK,EAAQnL,EAAKqV,cAAc,CAAC1F,YAAY3P,EAAKoF,SAASuK,cAElD3P,EAAKiX,YAAYtX,OAAS,IAAOK,EAAKuW,WAAavW,EAAKoF,SAASwK,iBAAmB5P,EAAKmF,MAAMxF,OAAS,GAC3GK,EAAKsd,kBACLtd,EAAKwW,eAAgB,IAIjBxW,EAAKoF,SAASwK,iBAAmB5P,EAAKmF,MAAMxF,OAAS,GACxDwL,EAAQnL,EAAKqV,cAAc,CAAC1F,YAAY,KAEzC3P,EAAKwW,eAAgB,GAGtBxW,EAAKyK,QAAQV,UAAUuV,OAAO,eAAgBtf,EAAKwW,gBAQpD6H,iBACMxE,aAON+C,iBACM/C,aAMN0B,oBACQjc,KAAK+V,cAAcjR,MAAMsD,OAMjC2Q,YACKrY,EAAOV;AACPU,EAAKkW,aAETlW,EAAK0W,aAAc,EAEf1W,EAAKqV,cAAckK,YACtBvf,EAAKqV,cAAcgD,QAEnBrY,EAAKyV,WAAW4C,QAGjB7H,YAAW,KACVxQ,EAAK0W,aAAc,EACnB1W,EAAKwZ,YACH,IAOJI,YACMnE,WAAWmE,YACXL,SAUNxT,iBAAiBT,UACThG,KAAK0W,OAAOjQ,iBAAiBT,EAAOhG,KAAKkgB,oBAUjDA,uBACKpa,EAAW9F,KAAK8F,SAChBhC,EAAOgC,EAAS0J;MACc,iBAAvB1J,EAAS0J,YACnB1L,EAAO,CAAC,CAAC0C,MAAOV,EAAS0J,aAGnB,CACN1I,OAAchB,EAAS2J,YACvBrI,YAActB,EAAS4J,kBACvB5L,KAAcA,EACdwE,QAAcxC,EAASwC,SASzBnD,OAAOa,OACFzC,EAAGZ,EAAQwd,EACXzf,EAAWV,KACX0G,EAAW1G,KAAKkgB;GAGfxf,EAAKoF,SAASb,OAEY,mBAD9Bkb,EAAiBzf,EAAKoF,SAASb,MAAMmM,KAAK1Q,EAAKsF,UAExC,IAAI0P,MAAM;GAKd1P,IAAUtF,EAAKmb,WAClBnb,EAAKmb,UAAc7V,EACnBrD,EAAajC,EAAKgW,OAAOvR,OAAOa,EAAO7E,OAAOgH,OAAOzB,EAAS,CAACzB,MAAOkb,KACtEzf,EAAK6W,eAAkB5U,GAEvBA,EAAaxB,OAAOgH,OAAQ,GAAIzH,EAAK6W,gBAIlC7W,EAAKoF,SAAS0I,iBACZjL,EAAIZ,EAAOkD,MAAMxF,OAAS,EAAGkD,GAAK,EAAGA,IAAK,KAC1C6c,EAAS3P,EAAS9N,EAAOkD,MAAMtC,GAAGsE;AAClCuY,IAA0C,IAAhC1f,EAAKmF,MAAMtF,QAAQ6f,IAChCzd,EAAOkD,MAAMvF,OAAOiD,EAAG,UAKnBZ,EAQRya,eAAgBiD,GAA0B,OACrC9c,EAAG+c,EAAGC,EAAGpgB,EAAGuU,EAAU9G,EAAW4S,EAAuBC,EAAmBC,EAAcC,EACzF1S;MACE2S,EAA0C,GAE1CC,EAAwB;ILjyC3BC,EKkyCCpgB,EAAWV,KACXgG,EAAYtF,EAAKub,aACjB8E,EAAcrgB,EAAKyE,OAAOa,GAC1Bgb,EAAkB,KAClBC,EAAkBvgB,EAAKoF,SAASuI,aAAc,EAC9C6H,EAAoBxV,EAAKwV;IAEzBxV,EAAKgX,eACRgJ,EAAehgB,EAAKgX,aAAa7D,QAAQ/O,MACzC6b,EAAejgB,EAAKgX,aAAawJ,QAAQ,iBAI1C/gB,EAAI4gB,EAAQlb,MAAMxF,OACsB,iBAA7BK,EAAKoF,SAASwI,aACxBnO,EAAI+B,KAAKif,IAAIhhB,EAAGO,EAAKoF,SAASwI,aAG3BnO,EAAI,IACP8gB,GAAgB,GAIZ1d,EAAI,EAAGA,EAAIpD,EAAGoD,IAAK,KAGnB6d,EAAaL,EAAQlb,MAAMtC,GAAGsE,GAC9ByL,EAAW5S,EAAKgG,QAAQ0a,GACxBC,EAAa3gB,EAAK4gB,UAAUF,GAAU;IAIrC1gB,EAAKoF,SAAS0I,cAClB6S,EAAU5W,UAAUuV,OAAO,WAAYtf,EAAKmF,MAAM0b,SAASH,IAG5D1M,EAAcpB,EAAO5S,EAAKoF,SAASmJ,gBAAkB,GAGhDqR,EAAI,EAAGC,GAFZ3S,EAAcrI,MAAMC,QAAQkP,GAAYA,EAAW,CAACA,KAEvB9G,EAAUvN,OAAQigB,EAAIC,EAAGD,IACrD5L,EAAW9G,EAAU0S,GAChB5f,EAAKkN,UAAUzJ,eAAeuQ,KAClCA,EAAW,IAEPkM,EAAOzc,eAAeuQ,KAC1BkM,EAAOlM,GAAYxL,SAASsY,yBAC5BX,EAAa5gB,KAAKyU,IAIf4L,EAAI,IACPe,EAAYA,EAAUnU,WAAU,GAChCrB,EAAQwV,EAAU,CAACxZ,GAAIyL,EAAOmO,IAAI,UAAUnB,kBAAkB,OAC9De,EAAU5W,UAAUC,IAAI,aACxBC,EAAc0W,EAAU,WAIpBL,GAAiBN,GAAgBU,IACjCT,EACCA,EAAa9M,QAAQI,QAAUS,IAClCsM,EAAgBK,GAGjBL,EAAgBK,GAIlBT,EAAOlM,GAAUvH,YAAYkU,GAK3BrhB,KAAK8F,SAASyJ,mBACjBsR,EAAa/c,MAAK,CAAC7B,EAAG8B,KACPrD,EAAKkN,UAAU3L,IAAMvB,EAAKkN,UAAU3L,GAAGyf,QAAU,IACjDhhB,EAAKkN,UAAU7J,IAAMrD,EAAKkN,UAAU7J,GAAG2d,QAAU,KAMjElB,EAAOtX,SAASsY,yBAChB/b,EAASob,GAAenM,OACnBhU,EAAKkN,UAAUzJ,eAAeuQ,IAAakM,EAAOlM,GAAUF,SAASnU,OAAQ,KAE5EshB,EAAgBzY,SAASsY,yBACzBI,EAASlhB,EAAK8P,OAAO,kBAAmB9P,EAAKkN,UAAU8G;AAC3DjC,EAAQkP,EAAeC,GACvBnP,EAAQkP,EAAef,EAAOlM;IAE1BmN,EAAanhB,EAAK8P,OAAO,WAAY,CAACyD,MAAMvT,EAAKkN,UAAU8G,GAAUhO,QAAQib;AAEjFlP,EAAQ+N,EAAMqB,QAGdpP,EAAQ+N,EAAMI,EAAOlM,OAIvBwB,EAAiB9M,UAAY,GAC7BqJ,EAAQyD,EAAkBsK,GAGtB9f,EAAKoF,SAASyG,YL14CfuU,EK24Ce5K,EL34CD4L,iBAAiB,kBACnCvc,MAAMqZ,UAAUnf,QAAQ2R,KAAK0P,GAAU,SAASvW,OAC3CmI,EAASnI,EAAGe;AAChBoH,EAAOpG,aAAa/B,EAAGlB,WAAoBkB,GAC3CmI,EAAOjR,eKw4CFsf,EAAQ/a,MAAM3F,QAAU0gB,EAAQ5a,OAAO9F,QAC1CoF,EAASsb,EAAQ5a,QAAS4b,IACzBxV,EAAW2J,EAAkB6L,EAAI5e;IAMhC6e,EAAgBC,QACf5C,EAAU3e,EAAK8P,OAAOyR,EAAS,CAACvf,MAAMsD;OACtCqZ,IACH4B,GAAgB,EAChB/K,EAAiBgM,aAAa7C,EAASnJ,EAAiB7M,aAElDgW;GAKJ3e,EAAKsQ,QACRgR,EAAa,WAGHthB,EAAKoF,SAASyK,WAAWa,KAAK1Q,EAAKsF,GAIX,IAAzB+a,EAAQlb,MAAMxF,QACvB2hB,EAAa,cAJbA,EAAa,gBAWdvB,EAAoB/f,EAAKyhB,UAAUnc,MAElCiI,EAAS+T,EAAa,kBAKvBthB,EAAK4W,WAAayJ,EAAQlb,MAAMxF,OAAS,GAAKogB,EAC1CQ,EAAe,IAEdF,EAAQlb,MAAMxF,OAAS,OAErB2gB,GAAwC,WAAvBtgB,EAAKoF,SAAS6J,MAAqBjP,EAAKmF,MAAMxF,SACnE2gB,EAAgBtgB,EAAK4gB,UAAU5gB,EAAKmF,MAAM,MAGtCqQ,EAAiB9K,SAAS4V,GAAiB,KAE3CoB,EAAe;AACfnU,IAAWvN,EAAKoF,SAAS4I,gBAC5B0T,EAAe,GAEhBpB,EAAgBtgB,EAAK2hB,aAAaD,SAG1BnU,IACT+S,EAAgB/S;AAGboS,IAAoB3f,EAAKiW,SAC5BjW,EAAKic,OACLjc,EAAKye,eAAe6B,EAAc,SAEnCtgB,EAAKoc,gBAAgBkE,QAGrBtgB,EAAKqd,oBACDsC,GAAmB3f,EAAKiW,QAC3BjW,EAAKua,OAAM,GASdoH,oBACQriB,KAAKkW,iBAAiB4L,iBAAiB,qBAgB/CnO,UAAWzM,EAAgBob,GAAe,SACnC5hB,EAAOV;GAITuF,MAAMC,QAAQ0B,UACjBxG,EAAK4a,WAAYpU,EAAMob,IAChB;MAGFhd,EAAMmL,EAASvJ,EAAKxG,EAAKoF,SAASoJ;OAC5B,OAAR5J,IAAgB5E,EAAKgG,QAAQvC,eAAemB,KAIhD4B,EAAKwa,OAAWxa,EAAKwa,UAAYhhB,EAAK0V,MACtClP,EAAKua,IAAQ/gB,EAAK8V,QAAU,QAAUtP,EAAKwa,OAC3ChhB,EAAKgG,QAAQpB,GAAO4B,EACpBxG,EAAKmb,UAAa,KAEdyG,IACH5hB,EAAKkX,YAAYtS,GAAOgd,EACxB5hB,EAAKF,QAAQ,aAAc8E,EAAK4B,IAG1B5B,GAORgW,WAAYpU,EAAkBob,GAAe,GAC5C7c,EAASyB,GAAOqb,SACV5O,UAAU4O,EAAKD,MAOtBE,eAAgBtb,UACRlH,KAAK2T,UAAUzM,GAQvBqU,oBAAoBrU,OACf5B,EAAMmL,EAASvJ,EAAKlH,KAAK8F,SAASwJ;OAEzB,OAARhK,IAEL4B,EAAKwa,OAASxa,EAAKwa,UAAY1hB,KAAKoW,WAC/BxI,UAAUtI,GAAO4B,EACf5B,GAQRmd,eAAe5a,EAAWX,OACrBwb;AACJxb,EAAKlH,KAAK8F,SAASwJ,oBAAsBzH,GAErC6a,EAAY1iB,KAAKub,oBAAoBrU,UACnC1G,QAAQ,eAAgBkiB,EAAWxb,GAQ1Cyb,kBAAkB9a,GACb7H,KAAK4N,UAAUzJ,eAAe0D,YAC1B7H,KAAK4N,UAAU/F,QACjB+a,kBACApiB,QAAQ,kBAAmBqH,IAOlCgb,yBACMjV,UAAY,QACZgV,kBACApiB,QAAQ,kBASdsiB,aAAahe,EAAcoC,SACpBxG,EAAOV;IACT+iB,EACAC;MAEEC,EAAaxS,EAAS3L,GACtBoe,EAAazS,EAASvJ,EAAKxG,EAAKoF,SAASoJ;GAG7B,OAAd+T,EAAqB;IACpBviB,EAAKgG,QAAQvC,eAAe8e,GAAa;GACrB,iBAAdC,EAAyB,MAAM,IAAIxN,MAAM;MAG9CpC,EAAU5S,EAAK4gB,UAAU2B,GACzBza,EAAS9H,EAAKyiB,QAAQF;GAG5B/b,EAAKwa,OAASxa,EAAKwa,QAAUhhB,EAAKgG,QAAQuc,GAAWvB,cAC9ChhB,EAAKgG,QAAQuc,GAIpBviB,EAAK0iB,aAAaF,GAElBxiB,EAAKgG,QAAQwc,GAAahc,EAGtBoM,EAAQ,IACP5S,EAAKwV,iBAAiB9K,SAASkI,GAAS,OAErC+P,EAAa3iB,EAAK0X,QAAQ,SAAUlR;AAC1CiF,EAAYmH,EAAQ+P,GAEhB3iB,EAAKgX,eAAiBpE,GACzB5S,EAAKoc,gBAAgBuG,GAGvB/P,EAAO1I,SAIJpC,KAEiB,KADpBwa,EAAatiB,EAAKmF,MAAMtF,QAAQ0iB,KAE/BviB,EAAKmF,MAAMvF,OAAO0iB,EAAY,EAAGE,GAGlCH,EAAWriB,EAAK0X,QAAQ,OAAQlR,GAE5BsB,EAAKiC,UAAUW,SAAS,WAAYnB,EAAW8Y,EAAS,UAE5D5W,EAAa3D,EAAMua,IAIpBriB,EAAKmb,UAAY,KAOlByH,aAAaxe,EAAcoZ,SACpBxd,EAAOV;AACb8E,EAAQ4L,EAAS5L,GAEjBpE,EAAK0iB,aAAate,UAEXpE,EAAKkX,YAAY9S,UACjBpE,EAAKgG,QAAQ5B,GACpBpE,EAAKmb,UAAY,KACjBnb,EAAKF,QAAQ,gBAAiBsE,GAC9BpE,EAAK6iB,WAAWze,EAAOoZ,GAMxBsF,aAAa/a,SAENgb,GAAehb,GAAUzI,KAAK0jB,aAAa/b,KAAK3H;KAEjDmR,eAAkB,QAClByG,YAAe,QACfgL;MAECtO,EAAsB;AAC5B7O,EAAQzF,KAAK0G,SAAQ,CAAC4M,EAAOhO,KACxBme,EAAYnQ,EAAOhO,KACtBgP,EAAShP,GAAOtF,KAAK0G,QAAQpB,YAI1BoB,QAAU1G,KAAK0W,OAAO7Q,MAAQyO,OAC9BuH,UAAY,UACZrb,QAAQ,gBAQdkjB,YAAYpQ,EAAiBxO,UACxB9E,KAAK6F,MAAMtF,QAAQuE,IAAU,EAWlCwc,UAAUxc,EAAmBmJ,GAAe,SACrCmS,EAAS3P,EAAS3L;GAET,OAAXsb,GAAmBpgB,KAAK0G,QAAQvC,eAAeic,GAAS,OACrD9M,EAAStT,KAAK0G,QAAQ0Z;GAExB9M,EAAOqQ,YACHrQ,EAAOqQ;GAGX1V,SACIjO,KAAKoY,QAAQ,SAAU9E,UAIzB,KAQRuJ,YAAavJ,EAAyBxL,EAAkByJ,EAAc,cACpDqS;IAEZtQ,SACG;AAIPsQ,EADW,QAARrS,EANOvR,KAOG+f,kBAPH/f,KASGkW,iBAAiB4L,iBAAiB;IAG3C,IAAIve,EAAI,EAAGA,EAAIqgB,EAAIvjB,OAAQkD,OAC3BqgB,EAAIrgB,IAAM+P,SAIVxL,EAAY,EACR8b,EAAIrgB,EAAE,GAGPqgB,EAAIrgB,EAAE;OAEP,KASR4f,QAAQ3a,MAEY,iBAARA,SACHA;IAGJ1D,EAAQ2L,EAASjI;OACJ,OAAV1D,EACJ9E,KAAKiW,QAAQ3M,cAAe,gBAAekJ,EAAW1N,QACtD,KAQJsZ,SAAUtJ,EAAwBoJ,OAC7Bxd,EAAOV,KAEP6F,EAAQN,MAAMC,QAAQsP,GAAUA,EAAS,CAACA;IAEzC,IAAIvR,EAAI,EAAGpD,GADhB0F,EAAQA,EAAM4C,QAAOob,IAAgC,IAA3BnjB,EAAKmF,MAAMtF,QAAQsjB,MACnBxjB,OAAQkD,EAAIpD,EAAGoD,IACxC7C,EAAKojB,UAAavgB,EAAIpD,EAAI,EAC1BO,EAAK0b,QAAQvW,EAAMtC,GAAI2a,GASzB9B,QAAStX,EAAcoZ,GAGtB7M,EAAgBrR,KAFHke,EAAS,GAAK,CAAC,SAAS,mBAEP,SACzB1V,EAAMub;MACJrjB,EAAOV,KACNqY,EAAY3X,EAAKoF,SAAS6J,KAC3ByQ,EAAS3P,EAAS3L;KAEpBsb,IAA0C,IAAhC1f,EAAKmF,MAAMtF,QAAQ6f,KAEd,WAAd/H,GACH3X,EAAKua,QAGY,WAAd5C,GAA2B3X,EAAKoF,SAAS2I,cAK/B,OAAX2R,GAAoB1f,EAAKgG,QAAQvC,eAAeic,KAClC,WAAd/H,GAAwB3X,EAAKyd,MAAMD,GACrB,UAAd7F,IAAyB3X,EAAKsjB,cAElCxb,EAAO9H,EAAK0X,QAAQ,OAAQ1X,EAAKgG,QAAQ0Z,IAErC1f,EAAKuV,QAAQ7K,SAAS5C,KACzBA,EAAOA,EAAK0E,WAAU,IAGvB6W,EAAUrjB,EAAKsjB,SACftjB,EAAKmF,MAAMvF,OAAOI,EAAK+W,SAAU,EAAG2I,GACpC1f,EAAKujB,cAAczb,GAEf9H,EAAKyW,QAAS,KAGZzW,EAAKojB,WAAapjB,EAAKoF,SAAS0I,aAAc,KAC9C8E,EAAS5S,EAAK4gB,UAAUlB,GACxBxD,EAAOlc,EAAKmc,YAAYvJ,EAAQ;AAChCsJ,GACHlc,EAAKoc,gBAAgBF,GAMlBlc,EAAKojB,WAAcpjB,EAAKoF,SAAS8X,kBACrCld,EAAK0c,eAAe1c,EAAKuW,WAA2B,WAAdoB,GAID,GAAlC3X,EAAKoF,SAAS8X,kBAA6Bld,EAAKsjB,SACnDtjB,EAAKua,QACMva,EAAKojB,WAChBpjB,EAAKsZ,mBAGNtZ,EAAKF,QAAQ,WAAY4f,EAAQ5X,GAE5B9H,EAAKojB,WACTpjB,EAAKqa,oBAAoB,CAACmD,OAAQA,MAI/Bxd,EAAKojB,YAAeC,GAAWrjB,EAAKsjB,YACxCtjB,EAAK6Z,aACL7Z,EAAKoa,oBAWRyI,WAAY/a,EAAyB,KAAM0V,SACpCxd,EAAQV;KACdwI,EAAS9H,EAAKyiB,QAAQ3a,IAEV;IAERjF,EAAE0b;MACAna,EAAQ0D,EAAKqL,QAAQ/O;AAC3BvB,EAAIkI,EAAUjD,GAEdA,EAAKoC,SACDpC,EAAKiC,UAAUW,SAAS,YAC3B6T,EAAMve,EAAKiX,YAAYpX,QAAQiI,GAC/B9H,EAAKiX,YAAYrX,OAAO2e,EAAK,GAC7BtU,EAAcnC,EAAK,WAGpB9H,EAAKmF,MAAMvF,OAAOiD,EAAG,GACrB7C,EAAKmb,UAAY,MACZnb,EAAKoF,SAASkI,SAAWtN,EAAKkX,YAAYzT,eAAeW,IAC7DpE,EAAK4iB,aAAaxe,EAAOoZ,GAGtB3a,EAAI7C,EAAK+W,UACZ/W,EAAKgd,SAAShd,EAAK+W,SAAW,GAG/B/W,EAAKqa,oBAAoB,CAACmD,OAAQA,IAClCxd,EAAKoa,eACLpa,EAAKsZ,mBACLtZ,EAAKF,QAAQ,cAAesE,EAAO0D,GAapC6T,WAAY3Z,EAAkB,KAAM2d,GAAwB,EAAM9gB,EAA6B,cAG1F2kB,EAFAxjB,EAAQV,KACRmkB,EAAQzjB,EAAK+W;GAEjB/U,EAAQA,GAAShC,EAAKub,cAEjBvb,EAAKyhB,UAAUzf,UACnBnD,KACO;AAGRmB,EAAK0jB;IAEDC,GAAU,EACVpW,EAAU/G,OACbxG,EAAK4jB,UAEApd,GAAwB,iBAATA,EAAmB,OAAO3H;IAC1CuF,EAAQ2L,EAASvJ,EAAKxG,EAAKoF,SAASoJ;GACnB,iBAAVpK,SACHvF;AAGRmB,EAAKsd,kBACLtd,EAAKiT,UAAUzM,GAAK,GACpBxG,EAAKgd,SAASyG,GACdzjB,EAAK0b,QAAQtX,GACbvF,EAAS2H,GACTmd,GAAU;OAIVH,EADmC,mBAAzBxjB,EAAKoF,SAASmI,OACfvN,EAAKoF,SAASmI,OAAOmD,KAAKpR,KAAM0C,EAAOuL,GAEvC,EACPvN,EAAKoF,SAASqJ,YAAazM,GAC3BhC,EAAKoF,SAASoJ,YAAaxM,GAIzB2hB,GACJpW,EAAOiW,IAGD,EAMRlJ,mBACKta,EAAOV;AACXU,EAAKmb,UAAY,KAEbnb,EAAKyW,SACRzW,EAAK0d,SAAS1d,EAAKmF,OAGpBnF,EAAKqa,sBACLra,EAAKoa,eAONA,qBACOpa,EAAWV;AAEjBU,EAAK6jB;MAECP,EAAStjB,EAAKsjB,SACdhN,EAAWtW,EAAKsW;AAEtBtW,EAAKyK,QAAQV,UAAUuV,OAAO,MAAMtf,EAAK6V;MAGnCiO,EAAiB9jB,EAAKyK,QAAQV;AN74DRjG,IAAAA;AM+4D5BggB,EAAexE,OAAO,QAAStf,EAAKuW,WACpCuN,EAAexE,OAAO,WAAYtf,EAAKkW,YACvC4N,EAAexE,OAAO,WAAYtf,EAAKmW,YACvC2N,EAAexE,OAAO,WAAYtf,EAAKqW,SACvCyN,EAAexE,OAAO,SAAUhJ,GAChCwN,EAAexE,OAAO,OAAQgE,GAC9BQ,EAAexE,OAAO,eAAgBtf,EAAKuW,YAAcvW,EAAKwW,eAC9DsN,EAAexE,OAAO,kBAAmBtf,EAAKiW,QAC9C6N,EAAexE,OAAO,eNv5DMxb,EMu5DuB9D,EAAKgG,QNt5DrB,IAA5BvF,OAAOC,KAAKoD,GAAKnE,SMu5DxBmkB,EAAexE,OAAO,YAAatf,EAAKmF,MAAMxF,OAAS,GAaxDkkB,2BACK7jB,EAAOV;AAENU,EAAKgC,MAAM+hB,WAIhB/jB,EAAKqW,QAAUrW,EAAKgC,MAAM+hB,SAASC,MACnChkB,EAAKoW,WAAapW,EAAKqW,SASxBiN,gBACmC,OAA3BhkB,KAAK8F,SAASyI,UAAqBvO,KAAK6F,MAAMxF,QAAUL,KAAK8F,SAASyI,SAQ9EwM,oBAAqB4J,EAAoB,UAClCjkB,EAAOV;IACTsT,EAAQuF;MAEN+L,EAAelkB,EAAKgC,MAAM4G,cAAc;GAE1C5I,EAAK4V,cAAe,OAEjBhC,EAAgC,GAChCuQ,EAAyBnkB,EAAKgC,MAAMof,iBAAiB,kBAAkBzhB;SAEpEykB,EAAYzD,EAAkCvc,EAAc+T,UAE/DwI,IACJA,EAAYxY,EAAO,kBAAoB8H,EAAY7L,GAAS,KAAO6L,EAAYkI,GAAS,cAKrFwI,GAAauD,GAChBlkB,EAAKgC,MAAM+P,OAAO4O,GAGnB/M,EAASrU,KAAKohB,IAIVA,GAAauD,GAAgBC,EAAe,KAC/CxD,EAAU/M,UAAW,GAGf+M,EAIR3gB,EAAKgC,MAAMof,iBAAiB,kBAAkBriB,SAAS4hB,IAClCA,EAAW/M,UAAW,KAKlB,GAArB5T,EAAKmF,MAAMxF,QAAqC,UAAtBK,EAAKoF,SAAS6J,KAE3CmV,EAAYF,EAAc,GAAI,IAK9BlkB,EAAKmF,MAAMpG,SAASqF,OACnBwO,EAAW5S,EAAKgG,QAAQ5B,GACxB+T,EAAUvF,EAAO5S,EAAKoF,SAASqJ,aAAe,GAE1CmF,EAASiN,SAASjO,EAAOe,SAAU,CAEtCyQ,EADkBpkB,EAAKgC,MAAM4G,cAAe,iBAAgBkJ,EAAW1N,sBAChDA,EAAO+T,QAE9BvF,EAAOe,QAAUyQ,EAAYxR,EAAOe,QAASvP,EAAO+T,WAOvDnY,EAAKgC,MAAMoC,MAAQpE,EAAKud;AAGrBvd,EAAKyW,UACHwN,EAAKzG,QACTxd,EAAKF,QAAQ,SAAUE,EAAKud,aAS/BtB,WACKjc,EAAOV;AAEPU,EAAKsW,UAAYtW,EAAKiW,QAAkC,UAAvBjW,EAAKoF,SAAS6J,MAAoBjP,EAAKsjB,WAC5EtjB,EAAKiW,QAAS,EACd9K,EAAQnL,EAAKyV,WAAW,iBAAkB,SAC1CzV,EAAKoa,eACLhR,EAASpJ,EAAKsV,SAAS,CAAC+O,WAAY,SAAUC,QAAS,UACvDtkB,EAAKsZ,mBACLlQ,EAASpJ,EAAKsV,SAAS,CAAC+O,WAAY,UAAWC,QAAS,UACxDtkB,EAAKqY,QACLrY,EAAKF,QAAQ,gBAAiBE,EAAKsV,WAMpCiF,MAAM+C,GAAgB,OACjBtd,EAAOV,KACPQ,EAAUE,EAAKiW;AAEfqH,IAGHtd,EAAKsd,kBAEsB,WAAvBtd,EAAKoF,SAAS6J,MAAqBjP,EAAKmF,MAAMxF,QACjDK,EAAKqe,aAIPre,EAAKiW,QAAS,EACd9K,EAAQnL,EAAKyV,WAAW,iBAAkB,UAC1CrM,EAASpJ,EAAKsV,SAAS,CAACgP,QAAS,SAC7BtkB,EAAKoF,SAAS0I,cACjB9N,EAAKqd,oBAENrd,EAAKoa,eAEDta,GAASE,EAAKF,QAAQ,iBAAkBE,EAAKsV,UAQlDgE,sBAEsC,SAAjCha,KAAK8F,SAASoK,oBAId+U,EAAYjlB,KAAKiW,QACjBiP,EAASD,EAAQrF,wBACjBC,EAASoF,EAAQvF,aAAewF,EAAKrF,IAAO/H,OAAOqN,QACnDC,EAASF,EAAKE,KAAOtN,OAAOuN;AAGhCvb,EAAS9J,KAAKgW,SAAS,CACtBkD,MAAQgM,EAAKhM,MAAQ,KACrB2G,IAAQA,EAAM,KACduF,KAAQA,EAAO,QAUjBjH,MAAMD,OACDxd,EAAOV;GAENU,EAAKmF,MAAMxF,YAEZwF,EAAQnF,EAAKqf;AACjBta,EAAQI,GAAO2C,IACd9H,EAAK6iB,WAAW/a,GAAK,MAGtB9H,EAAK4c,YACAY,GAASxd,EAAKqa,sBACnBra,EAAKF,QAAQ,UAQdyjB,cAAc1Z,SACP7J,EAAQV,KACRmkB,EAASzjB,EAAK+W,SACdxM,EAASvK,EAAKuV;AAEpBhL,EAAOiX,aAAa3X,EAAIU,EAAOuJ,SAAS2P,IAExCzjB,EAAKgd,SAASyG,EAAQ,GAOvBhH,gBAAgB7D,OACXxR,EAAWwd,EAAWnB,EAAOoB,EFlrEN7iB,EEmrEvBhC,EAAOV;AAEX8H,EAAawR,GJvxEe,IIuxEVA,EAAEiD,SAAwC,EAAI,EAChE+I,EFrrEM,CACNE,OAF2B9iB,EEsrEFhC,EAAKqV,eFprEhB0P,gBAAkB,EAChCplB,QAAUqC,EAAMgjB,cAAc,IAAMhjB,EAAM+iB,gBAAgB;MEurEpDE,EAAqB;GAEvBjlB,EAAKiX,YAAYtX,OAEpBklB,EAAOha,EAAQ7K,EAAKiX,YAAa7P,GACjCqc,EAAQ1Y,EAAU8Z,GAEdzd,EAAY,GAAKqc,IAErB1e,EAAQ/E,EAAKiX,aAAcnP,GAASmd,EAAS1lB,KAAKuI;KAE5C,IAAK9H,EAAKuW,WAAoC,WAAvBvW,EAAKoF,SAAS6J,OAAsBjP,EAAKmF,MAAMxF,OAAQ,OAC9EwF,EAAQnF,EAAKqf;AACfjY,EAAY,GAAyB,IAApBwd,EAAUE,OAAoC,IAArBF,EAAUjlB,OACvDslB,EAAS1lB,KAAM4F,EAAMnF,EAAK+W,SAAW,IAE3B3P,EAAY,GAAKwd,EAAUE,QAAU9kB,EAAKub,aAAa5b,QACjEslB,EAAS1lB,KAAK4F,EAAMnF,EAAK+W,eAItB/W,EAAKklB,aAAaD,EAASrM,UACxB;IAGR7H,EAAe6H,GAAE,QAGI,IAAV6K,GACVzjB,EAAKgd,SAASyG,GAGRwB,EAAStlB,QACfK,EAAK6iB,WAAWoC,EAASE;OAG1BnlB,EAAK4c,YACL5c,EAAKsZ,mBACLtZ,EAAK0c,gBAAe,IAEb,EAMRwI,aAAa/f,EAAgB6L,SAEtBoD,EAASjP,EAAMvD,KAAIkG,GAAQA,EAAKqL,QAAQ/O;SAGzCgQ,EAAOzU,QAA6C,mBAA3BL,KAAK8F,SAASggB,WAAkE,IAAvC9lB,KAAK8F,SAASggB,SAAShR,EAAOpD,IActGwL,iBAAiBpV,EAAkBwR,OAC9B0F,EAAa+G,EAAUrlB,EAAOV;AAE9BU,EAAK6V,MAAKzO,IAAc,GACxBpH,EAAKub,aAAa5b,SAIlB0R,EAAU0K,EAAuBnD,IAAMvH,EAAU,WAAWuH,IAQ7DyM,GANF/G,EAAgBte,EAAKie,cAAc7W,IAG7BkX,EAAYvU,UAAUW,SAAS,UAGtB1K,EAAKmc,YAAYmC,EAAYlX,EAAU,QAFvCkX,EAMLlX,EAAY,EACRpH,EAAKqV,cAAciQ,mBAEnBtlB,EAAKqV,cAAcnK,0BAK5Bma,EAAStb,UAAUW,SAAS,WAC/B1K,EAAKoe,iBAAiBE,GAEvBte,EAAKme,mBAAmBkH,IAKzBrlB,EAAKulB,UAAUne,IAIjBme,UAAUne,IAMV6W,cAAc7W,OAETkX,EAAchf,KAAKiW,QAAQ3M,cAAc;GACzC0V,SACIA;IAIJrc,EAAS3C,KAAKiW,QAAQ6L,iBAAiB;OACvCnf,EACI4I,EAAQ5I,EAAOmF,UAaxB4V,SAASwI,QACHzO,SAAWzX,KAAK6F,MAAMxF,OAO5B0f,yBACQxa,MAAM4gB,KAAMnmB,KAAKiW,QAAQ6L,iBAAiB,mBAOlDsC,YACMpN,UAAW,OACX8D,eAMNwJ,cACMtN,UAAW,OACX8D,eAONI,cACKxa,EAAOV;AACXU,EAAKgC,MAAM0R,UAAc,EACzB1T,EAAKqV,cAAc3B,UAAY,EAC/B1T,EAAKyV,WAAWE,UAAa,EAC7B3V,EAAKkW,YAAiB,OACjBqE,QACLva,EAAK0jB,OAONjJ,aACKza,EAAOV;AACXU,EAAKgC,MAAM0R,UAAc,EACzB1T,EAAKqV,cAAc3B,UAAY,EAC/B1T,EAAKyV,WAAWE,SAAY3V,EAAK2V,SACjC3V,EAAKkW,YAAiB,EACtBlW,EAAK4jB,SAQN8B,cACK1lB,EAAOV,KACP2a,EAAiBja,EAAKia;AAE1Bja,EAAKF,QAAQ,WACbE,EAAKR,MACLQ,EAAKyK,QAAQP,SACblK,EAAKsV,SAASpL,SAEdlK,EAAKgC,MAAM0G,UAAYuR,EAAevR,UACtC1I,EAAKgC,MAAM2T,SAAWsE,EAAetE,SAErC1L,EAAcjK,EAAKgC,MAAM,cAAc,wBAEvChC,EAAK+V,kBAEE/V,EAAKgC,MAAMmV,UAQnBrH,OAAQ6V,EAA+Bnf,SAEY,mBAAvClH,KAAK8F,SAAS0K,OAAO6V,GACxB,KAGDrmB,KAAKoY,QAAQiO,EAAcnf,GAOnCkR,QAASiO,EAA+Bnf,OACvBW,EAAI2Y,EAAhB1b,EAAQ;MACNpE,EAAOV;MAEQ,WAAjBqmB,GAA6C,QAAhBA,IAChCvhB,EAAQ4L,EAASxJ,EAAKxG,EAAKoF,SAASoJ,cAMzB,OAFZsR,EAAO9f,EAAKoF,SAAS0K,OAAO6V,GAAcjV,KAAKpR,KAAMkH,EAAMyJ,MAM3D6P,EAAO3X,EAAQ2X,GAGM,WAAjB6F,GAA8C,kBAAjBA,EAE5Bnf,EAAKxG,EAAKoF,SAASsJ,eACtBvD,EAAQ2U,EAAK,iBAAiB,SAE9B3U,EAAQ2U,EAAK,mBAAoB,KAGR,aAAjB6F,IACTxe,EAAKX,EAAK+M,MAAMvT,EAAKoF,SAASwJ,oBAC9BzD,EAAQ2U,EAAK,cAAe3Y,IACzBX,EAAK+M,MAAMvT,EAAKoF,SAASsJ,gBAC3BvD,EAAQ2U,EAAK,iBAAkB,MAIZ,WAAjB6F,GAA8C,SAAjBA,IAChCxa,EAAQ2U,EAAK,cAAe1b,IAIP,SAAjBuhB,GACHpc,EAAWuW,EAAK9f,EAAKoF,SAASkK,WAC9BnE,EAAQ2U,EAAK,gBAAgB,OAE7BvW,EAAWuW,EAAK9f,EAAKoF,SAASmK,aAC9BpE,EAAQ2U,EAAK,CACZ9H,KAAK,SACL7Q,GAAGX,EAAKua,MAIT/gB,EAAKgG,QAAQ5B,GAAO6e,KAAOnD,KAtCrBA,EAsDToC,aAECnd,EAAQzF,KAAK0G,SAAS,CAAC4M,EAAQxO,KAC1BwO,EAAOqQ,OACVrQ,EAAOqQ,KAAK/Y,gBACL0I,EAAOqQ,SAUjBP,aAAate,SAENuc,EAAcrhB,KAAKshB,UAAUxc;AAC/Buc,GAAYA,EAAUzW,SAS3BuX,UAAWzf,UACH1C,KAAK8F,SAASmI,QAAWvL,EAAMrC,OAAS,GAAOL,KAAK8F,SAASqI,aAAkCiD,KAAKpR,KAAM0C,GAWlH4jB,KAAMC,EAAaC,EAAeC,OAC7B/lB,EAAOV,KACP0mB,EAAchmB,EAAK8lB;AAGvB9lB,EAAK8lB,GAAU,eACV7jB,EAAQgkB;MAEC,UAATJ,IACH5jB,EAAS+jB,EAAY/lB,MAAMD,EAAMN,YAGlCumB,EAAaF,EAAO9lB,MAAMD,EAAMN,WAEnB,YAATmmB,EACII,GAGK,WAATJ,IACH5jB,EAAS+jB,EAAY/lB,MAAMD,EAAMN,YAG3BuC,YEznFVsS,EAAU2R,OAAO,mBCCF,WACd/U,EAAS7R,KAAK0C,MAAM,UAAS,UACvBmY,aDFP5F,EAAU2R,OAAO,oBEEF,eACVlmB,EAAOV,KACP6mB,EAAsBnmB,EAAKgZ;AAE/BhZ,EAAKoF,SAAS0I,cAAe;IAIzBsY,EAAiB,SAASxT,GAC7BpC,YAAW,SACN6V,EAAWzT,EAAOhK,cAAc;AAChCyd,aAAoBC,mBACnB1T,EAAO7I,UAAUW,SAAS,YAC7B2b,EAASE,SAAU,EAEnBF,EAASE,SAAU,KAGpB;AAIHvmB,EAAK4lB,KAAK,QAAQ,kBAAiB,SAE9BY,EAAqBxmB,EAAKoF,SAAS0K,OAAO8C;AAE9C5S,EAAKoF,SAAS0K,OAAO8C,OAAS,CAACpM,EAAMyJ,SAChCwW,EAAWte,EAAOqe,EAAmB9V,KAAK1Q,EAAMwG,EAAMyJ,IACtDoW,EAAW7d,SAASC,cAAc;AACtC4d,EAASjV,iBAAiB,SAAQ,SAASJ,GAC1CD,EAAeC,MAGhBqV,EAASxV,KAAO;MACV6O,EAAS3P,EAASvJ,EAAKxG,EAAKoF,SAASoJ;OAGvCkR,GAAU1f,EAAKmF,MAAMtF,QAAQ6f,IAAW,IAC3C2G,EAASE,SAAU,GAGpBE,EAASC,QAAQL,GACVI,MAKTzmB,EAAKZ,GAAG,eAAegF,QAClBwO,EAAS5S,EAAK4gB,UAAUxc;AAExBwO,IACHA,EAAO7I,UAAUG,OAAO,YACxBkc,EAAexT,OAKjB5S,EAAKZ,GAAG,YAAYgF,QACfwO,EAAS5S,EAAK4gB,UAAUxc;AAExBwO,GACHwT,EAAexT,MAMjB5S,EAAK4lB,KAAK,UAAU,kBAAiB,CAAE5U,EAAmB4B,QAErDA,EAAO7I,UAAUW,SAAS,mBAC7BkI,EAAO7I,UAAUG,OAAO,YACxBlK,EAAK6iB,WAAWjQ,EAAOO,QAAQ/O,OAC/BpE,EAAK0c,sBACL3L,EAAeC,GAAI;AAIpBmV,EAAoBzV,KAAK1Q,EAAMgR,EAAK4B,GAEpCwT,EAAexT,SFhFjB2B,EAAU2R,OAAO,gBGAF,SAAyBhP,SACjClX,EAAOV,KAEP0G,EAAUvF,OAAOgH,OAAO,CAC7B0E,UAAW,eACXwa,MAAO,YACP7G,KAAOtZ,GACE,eAAcA,EAAK2F,qBAAqB3F,EAAKmgB,wBAEpDzP;AAEHlX,EAAKZ,GAAG,cAAa,SAChBwnB,EAASze,EAAOnC,EAAQ8Z,KAAK9Z;AACjC4gB,EAAOxV,iBAAiB,SAASJ,IAE5BhR,EAAKkW,aAITlW,EAAKyd,QAEsB,WAAvBzd,EAAKoF,SAAS6J,MAAqBjP,EAAKoF,SAAS+I,kBACpDnO,EAAK0b,QAAQ,IAGd1K,EAAID,iBACJC,EAAIE,sBAELlR,EAAKuV,QAAQ9I,YAAYma,SH3B3BrS,EAAU2R,OAAO,aIHF,eACVlmB,EAAOV;IACNunB,EAAE1W,GAAG2W,SAAU,MAAM,IAAI9R,MAAM;GACT,UAAvBhV,EAAKoF,SAAS6J,UAEd8X,EAAa/mB,EAAK0jB,KAClBsD,EAAehnB,EAAK4jB;AAExB5jB,EAAK4lB,KAAK,UAAU,QAAO,SACtBkB,EAAWD,EAAE7mB,EAAKuV,SAAS/O,KAAK;OAChCsgB,GAAUA,EAAStM,UAChBuM,EAAUrW,KAAK1Q,MAGvBA,EAAK4lB,KAAK,UAAU,UAAS,SACxBkB,EAAWD,EAAE7mB,EAAKuV,SAAS/O,KAAK;OAChCsgB,GAAUA,EAASrM,SAChBuM,EAAYtW,KAAK1Q,MAGzBA,EAAKZ,GAAG,cAAa,SAChB6nB,EAAWJ,EAAE7mB,EAAKuV,SAASuR,SAAS,CACvC3hB,MAAO,eACP+hB,sBAAsB,EACtBxT,SAAU1T,EAAKsW,SACfwO,MAAO,CAAClM,EAAGuO,KACVA,EAAGxX,YAAYtG,IAAI,QAAS8d,EAAGC,OAAO/d,IAAI,UAC1C4d,EAAS5d,IAAI,CAACge,SAAU,aAEzBpW,KAAM,KACLgW,EAAS5d,IAAI,CAACge,SAAU;IAEpBjT,EAAkB;AACtB6S,EAASnT,SAAS,gBAAgBwT,MAAK,WAClChoB,KAAK6T,QAAQ/O,OAAQgQ,EAAO7U,KAAKD,KAAK6T,QAAQ/O,UAGnDpE,EAAKkb,SAAS9G,aJjClBG,EAAU2R,OAAO,mBKDF,SAAyBhP,SACjClX,EAAOV,KAEP0G,EAAUvF,OAAOgH,OAAO,CAC7Bkf,MAAgB,WAChBY,YAAgB,kBAChBC,cAAgB,wBAChBC,WAAgB,wBAChBC,WAAgB,wBAEhB5H,KAAOtZ,GAEL,eAAiBA,EAAK+gB,YAAtB,iBACkB/gB,EAAKghB,cADvB,kBAEoBhhB,EAAKihB,WAAa,KAAOjhB,EAAKmgB,MAFlD,oBAGiBngB,EAAKkhB,WAHtB,6BAQAxQ;AAEHlX,EAAKZ,GAAG,cAAa,SAChB8hB,EAAS/Y,EAAOnC,EAAQ8Z,KAAK9Z,IAE7B2hB,EAAazG,EAAOtY,cAAc,IAAI5C,EAAQ0hB;AAC9CC,GACHA,EAAWvW,iBAAiB,SAASJ,IACpCD,EAAeC,GAAI,GACnBhR,EAAKua,WAIPva,EAAKsV,SAASkM,aAAaN,EAAQlhB,EAAKsV,SAAS3M,kBL/BnD4L,EAAU2R,OAAO,kBMHF,eACVlmB,EAAOV;AAUXU,EAAK4lB,KAAK,UAAU,YAAYJ,IAEJ,WAAvBxlB,EAAKoF,SAAS6J,MAAsBjP,EAAKuV,QAAQ7K,SAAS1K,EAAKqV,gBAGlEmQ,EAAUhkB,KAAKC,IAAI,EAAGD,KAAKif,IAAIzgB,EAAKmF,MAAMxF,OAAQ6lB,MAEnCxlB,EAAK+W,UAAa/W,EAAKojB,WAErCpjB,EAAKqf,kBAAkBtgB,SAAQ,CAACgV,EAAM6L,KACjCA,EAAI4F,EACPxlB,EAAKqV,cAAc6E,sBAAsB,cAAenG,GAExD/T,EAAKuV,QAAQ9I,YAAasH,MAV7ByR,EAAUxlB,EAAKmF,MAAMxF,OAgBtBK,EAAK+W,SAAWyO,KAGjBxlB,EAAK4lB,KAAK,UAAU,aAAaxe,QAE3BpH,EAAKuW,UAAY;MAGhB+H,EAAete,EAAKie,cAAc7W;GACpCkX,EAAa,OACVC,EAAMxT,EAAUuT;AACtBte,EAAKgd,SAAS5V,EAAY,EAAImX,EAAM,EAAGA,GACvCve,EAAK+c,gBACL9S,EAAcqU,EAA2B,oBAIzCte,EAAKgd,SAAShd,EAAK+W,SAAW3P,SN3CjCmN,EAAU2R,OAAO,kBOFF,iBACRlmB,EAAOV;AAEbU,EAAKoF,SAASuI,YAAa,EAE3B3N,EAAK4lB,KAAK,SAAS,SAAQ,KAC1B5lB,EAAKyV,WAAczV,EAAKuV,QAExBhM,EAAYvJ,EAAKqV,cAAe;MAEzB9M,EAAMJ,EAAO;AACpBI,EAAIwJ,OAAO/R,EAAKqV,eAChBrV,EAAKsV,SAASkM,aAAajZ,EAAKvI,EAAKsV,SAAS3M;MAGxCgH,EAAcxH,EAAO;AAC3BwH,EAAYA,YAAc3P,EAAKoF,SAASuK,aAAc,GACtD3P,EAAKuV,QAAQxD,OAAOpC,MAKrB3P,EAAKZ,GAAG,cAAa,KAGpBY,EAAKqV,cAAcjE,iBAAiB,WAAWJ,WAEtCA,EAAI6K,cb9CU,UagDhB7b,EAAKiW,SACRlF,EAAeC,GAAI,GACnBhR,EAAKua,cAENva,EAAKob;Kb7Ce,EagDpBpb,EAAKyV,WAAWE,UAAY,SAGvB3V,EAAKmZ,UAAUzI,KAAK1Q,EAAKgR,MAGjChR,EAAKZ,GAAG,QAAO,KACdY,EAAKyV,WAAWE,SAAW3V,EAAKkW,YAAc,EAAIlW,EAAK2V,YAKxD3V,EAAKZ,GAAG,iBAAgB,KACvBY,EAAKqV,cAAcgD;MAIduP,EAAc5nB,EAAKuZ;AACzBvZ,EAAK4lB,KAAK,UAAU,UAAU5U,QACzBA,GAAOA,EAAI6W,eAAiB7nB,EAAKqV,qBAC9BuS,EAAYlX,KAAK1Q,MAGzBmR,EAASnR,EAAKqV,cAAc,QAAQ,IAAMrV,EAAKuZ,WAG/CvZ,EAAK4lB,KAAK,SAAS,SAAQ,KAErB5lB,EAAKiW,QACVjW,EAAKyV,WAAW4C,MAAM,CAACyP,eAAe,aP9DzCvT,EAAU2R,OAAO,kBQPF,eACVlmB,EAAWV;AAEfU,EAAKZ,GAAG,cAAa,SAGhB2oB,EAAgBvf,SAASC,cAAc,QACvC8M,EAAcvV,EAAKqV;AACvB0S,EAAWze,MAAM0e,QAAU,2FAE3BhoB,EAAKyK,QAAQgC,YAAYsb;IAKpB,MAAME,IAFa,CAAE,gBAAiB,WAAY,aAAc,aAAc,iBAIlFF,EAAWze,MAAM2e,GAAc1S,EAAQjM,MAAM2e;IAQ1CC,EAAS,KACZH,EAAWlV,YAAc0C,EAAQnR,MACjCmR,EAAQjM,MAAMkP,MAASuP,EAAWI,YAAY;AAG/CD,IACAloB,EAAKZ,GAAG,8BAA8B8oB,GACtC/W,EAASoE,EAAQ,QAAS2S,GAC1B/W,EAASoE,EAAQ,QAAS2S,GAC1B/W,EAASoE,EAAQ,OAAQ2S,GACzB/W,EAASoE,EAAQ,SAAU2S,SR3B7B3T,EAAU2R,OAAO,uBSTF,eACVlmB,EAAOV,KACP8oB,EAAuBpoB,EAAKyc;KAE3BmJ,KAAK,UAAU,mBAAmB5U,KAElChR,EAAKiX,YAAYtX,QACbyoB,EAAqB1X,KAAK1Q,EAAMgR,QTG1CuD,EAAU2R,OAAO,mBUVF,gBACTN,KAAK,UAAU,iBAAgB,cAC/BA,KAAK,UAAU,aAAY,YVSjCrR,EAAU2R,OAAO,oBWRF,eACVlmB,EAAOV,KAEP+oB,EAAeroB,EAAKmZ;AAExBnZ,EAAK4lB,KAAK,UAAU,aAAa5U,QAC5B1E,EAAOsG,EAAQ5M,EAASgO;IAEvBhU,EAAKiW,QjBxBc,KiBwBFjF,EAAI6K,SjBtBD,KiBsBmC7K,EAAI6K,eACxDwM,EAAa3X,KAAK1Q,EAAKgR;AAG/BhR,EAAK2W,aAAc,EACnB3C,EAAa1J,EAAYtK,EAAKgX,aAAa,gBAC3C1K,EAAWvB,EAAU/K,EAAKgX,aAAa,qBAElChD,IAKJA,EjBrCuB,KiBoCpBhD,EAAI6K,QACI7H,EAASsU,gBAETtU,EAASuU,eAQrB3V,GADA5M,EAAmCgO,EAAUoN,iBAAiB,sBACzC5f,KAAKif,IAAIza,EAAQrG,OAAS,EAAG2M,MAGjDtM,EAAKoc,gBAAgBxJ,SXzBxB2B,EAAU2R,OAAO,iBYPF,SAAyBhP,SAEjClR,EAAUvF,OAAOgH,OAAO,CAC5B0Q,MAAY,UACZwO,MAAY,SACZxa,UAAY,SACZ4F,QAAY,GACVmF;IAIAlX,EAASV;GAGR0G,EAAQ+L,YAIT+N,EAAO,uCAAyC9Z,EAAQmG,UAAY,0BAA4B8D,EAAYjK,EAAQ2gB,OAAS,KAAO3gB,EAAQmS,MAAQ;AAExJnY,EAAK4lB,KAAK,QAAQ,kBAAiB,SAE9B4C,EAAmBxoB,EAAKoF,SAAS0K,OAAOhI;AAE5C9H,EAAKoF,SAAS0K,OAAOhI,KAAO,CAACtB,EAAgBuU,SAExCjT,EAAOK,EAAOqgB,EAAiB9X,KAAK1Q,EAAMwG,EAAMuU,IAEhD0N,EAAetgB,EAAO2X;OAC1BhY,EAAK2E,YAAYgc,GAEjBtX,EAASsX,EAAa,aAAazX,IAClCD,EAAeC,GAAI,MAGpBG,EAASsX,EAAa,SAASzX,IAG9BD,EAAeC,GAAI,GAEfhR,EAAKsW,UACJtW,EAAKklB,aAAa,CAACpd,GAAMkJ,KAE9BhR,EAAK6iB,WAAW/a,GAChB9H,EAAK0c,gBAAe,GACpB1c,EAAK6Z,iBAGC/R,UZxCVyM,EAAU2R,OAAO,wBaRF,SAAyBhP,SACjClX,EAAOV,KAEP0G,EAAUvF,OAAOgH,OAAO,CAC7BihB,KAAO9V,GACCA,EAAO5S,EAAKoF,SAASqJ,aAE5ByI;AAEFlX,EAAKZ,GAAG,eAAc,SAASgF,MACzBpE,EAAKuW,WAI8B,KAApCvW,EAAKqV,cAAcjR,MAAMsD,OAAe,KACvCkL,EAAS5S,EAAKgG,QAAQ5B;AACtBwO,GACH5S,EAAKsd,gBAAgBtX,EAAQ0iB,KAAKhY,KAAK1Q,EAAM4S,WbRjD2B,EAAU2R,OAAO,kBcXF,iBACRlmB,EAAaV,KACbqpB,EAAmB3oB,EAAKmd,QACxByL,EAA0B5oB,EAAKqd,kBAC/BwL,EAAuB7oB,EAAKod;IAG9B5H,EAEAsT,EAHAC,EAAgC,GAEhCC,GAAmB,EAEnBC,EAA4B;GAE3BjpB,EAAKoF,SAAS8jB,iBAGlBlpB,EAAKoF,SAAS8jB,eAAiB,QAEP1T,EAAiBqJ,cAAgBrJ,EAAiB2T,aAAe3T,EAAiBsJ,WACpF,UACb;GAGJ9e,EAAKgX,aAAc,KAClB2K,EAAa3hB,EAAK2hB;GACT,IAAIA,GAAY9hB,QAAQG,EAAKgX,eAC5B2K,EAAWhiB,OAAO,SACxB,SAIF,KAKJK,EAAKoF,SAASgkB,cACZ;AAOPppB,EAAKoF,SAAS0J,UAAc,CAAC,CAAChJ,MAAM,UAAU,CAACA,MAAM;MAI/CujB,EAAe/jB,KAEoB,iBAA7BtF,EAAKoF,SAASwI,YAA2B4H,EAAiB1B,SAASnU,QAAUK,EAAKoF,SAASwI,iBAIjGtI,KAASyjB,KAAeA,EAAWzjB,IAOnC0d,EAAc,CAACpQ,EAAkBxO,IAClCpE,EAAKmF,MAAMtF,QAAQuE,IAAU,GAAK6kB,EAAeppB,QAAQuE,IAAU;AAQxEpE,EAAKspB,WAAa,CAACllB,EAAamlB,KAC/BR,EAAW3kB,GAASmlB,GAIrBvpB,EAAKwpB,OAAUlkB,OAEVA,KAASyjB,EAAY,OAClBQ,EAAWR,EAAWzjB;OAC5ByjB,EAAWzjB,IAAS,EACbikB,SAKRR,EAAa,GAEN/oB,EAAKoF,SAASgkB,SAAS1Y,KAAK1Q,EAAKsF,IAMzCtF,EAAK4lB,KAAK,UAAU,qBAAoB,SAEnCoD,SAIGJ,EAAuBlY,KAAK1Q,MAIpCA,EAAK4lB,KAAK,UAAU,WAAWtgB,GAGxBA,KAASyjB,EAIRM,EAAY/jB,GAHXqjB,EAAajY,KAAK1Q,EAAKsF,KAQhCtF,EAAK4lB,KAAK,UAAU,gBAAe,CAAE5f,EAAqBkH,KAEpD8b,EAEKF,GAAiB9iB,EAAQrG,OAAS,IAC3CmpB,EAAc3V,QAAQ/O,MAAS4B,EAAQ,GAAGhG,EAAKoF,SAASoJ,aAFxDxO,EAAK8iB,aAAaE,GAKnB6F,EAAkBnY,KAAM1Q,EAAMgG,EAASkH,GAEvC8b,GAAe,KAOhBhpB,EAAK4lB,KAAK,QAAQ,kBAAiB,WAE5BtgB,EAAStF,EAAK8W;IAChBlE;AAEAyW,EAAY/jB,IAEfsN,EAAS5S,EAAK8P,OAAO,eAAe,CAACxK,MAAMA,OAE1CsN,EAAOpH,aAAa,kBAAkB,IACtCsd,EAAgBlW,GAGPtN,KAASyjB,IAAgBvT,EAAiB5M,cAAc,iBAClEgK,EAAS5S,EAAK8P,OAAO,kBAAkB,CAACxK,MAAMA,KAG3CsN,IACHrJ,EAAWqJ,EAAO5S,EAAKoF,SAASmK,aAChCiG,EAAiBzD,OAAQa,OAO3B5S,EAAKZ,GAAG,cAAa,KACpB6pB,EAAiBxoB,OAAOC,KAAKV,EAAKgG,SAClCwP,EAAmBxV,EAAKwV,iBAGxBxV,EAAKoF,SAAS0K,OAASrP,OAAOgH,OAAO,GAAI,CACxCuhB,aAAa,IACJ,oEAETS,gBAAgB,IACP,sDAERzpB,EAAKoF,SAAS0K,QAIhB0F,EAAiBpE,iBAAiB,UAAS,KAErCpR,EAAKoF,SAAS8jB,eAAexY,KAAK1Q,IAKlCqpB,EAAYrpB,EAAK8W,aAKlBkS,IAGJA,GAAe,EACfhpB,EAAK2Y,KAAKjI,KAAK1Q,EAAKA,EAAK8W;"}