PageSourceSearch

https://venbest.ua/wp-content/themes/venbest/js/select2.js?ver=1.2.6

js venbest.ua collected 2026-09-24 12:30:08 UTC 219,638 bytes, 6,209 lines download raw bytes

vendor: 89,934 bytes, lines 1-2404
1/*!
2 * Select2 4.1.0-rc.0
3 * https://select2.github.io
4 *
5 * Released under the MIT license
6 * https://github.com/select2/select2/blob/master/LICENSE.md
7 */
8;(function (factory) {
9    if (typeof define === 'function' && define.amd) {
10        // AMD. Register as an anonymous module.
11        define(['jquery'], factory);
12    } else if (typeof module === 'object' && module.exports) {
13        // Node/CommonJS
14        module.exports = function (root, jQuery) {
15            if (jQuery === undefined) {
16                // require('jQuery') returns a factory that requires window to
17                // build a jQuery instance, we normalize how we use modules
18                // that require this pattern but the window provided is a noop
19                // if it's defined (how jquery works)
20                if (typeof window !== 'undefined') {
21                    jQuery = require('jquery');
22                }
23                else {
24                    jQuery = require('jquery')(root);
25                }
26            }
27            factory(jQuery);
28            return jQuery;
29        };
30    } else {
31        // Browser globals
32        factory(jQuery);
33    }
34} (function (jQuery) {
35    // This is needed so we can catch the AMD loader configuration and use it
36    // The inner file should be wrapped (by `banner.start.js`) in a function that
37    // returns the AMD loader references.
38    var S2 =(function () {
39        // Restore the Select2 AMD loader so it can be used
40        // Needed mostly in the language files, where the loader is not inserted
41        if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
42            var S2 = jQuery.fn.select2.amd;
43        }
44        var S2;(function () { if (!S2 || !S2.requirejs) {
45            if (!S2) { S2 = {}; } else { require = S2; }
46            /**
47             * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
48             * Released under MIT license, http://github.com/requirejs/almond/LICENSE
49             */
50//Going sloppy to avoid 'use strict' string cost, but strict practices should
51//be followed.
52            /*global setTimeout: false */
53
54            var requirejs, require, define;
55            (function (undef) {
56                var main, req, makeMap, handlers,
57                    defined = {},
58                    waiting = {},
59                    config = {},
60                    defining = {},
61                    hasOwn = Object.prototype.hasOwnProperty,
62                    aps = [].slice,
63                    jsSuffixRegExp = /\.js$/;
64
65                function hasProp(obj, prop) {
66                    return hasOwn.call(obj, prop);
67                }
68
69                /**
70                 * Given a relative module name, like ./something, normalize it to
71                 * a real name that can be mapped to a path.
72                 * @param {String} name the relative name
73                 * @param {String} baseName a real name that the name arg is relative
74                 * to.
75                 * @returns {String} normalized name
76                 */
77                function normalize(name, baseName) {
78                    var nameParts, nameSegment, mapValue, foundMap, lastIndex,
79                        foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,
80                        baseParts = baseName && baseName.split("/"),
81                        map = config.map,
82                        starMap = (map && map['*']) || {};
83
84                    //Adjust any relative paths.
85                    if (name) {
86                        name = name.split('/');
87                        lastIndex = name.length - 1;
88
89                        // If wanting node ID compatibility, strip .js from end
90                        // of IDs. Have to do this here, and not in nameToUrl
91                        // because node allows either .js or non .js to map
92                        // to same file.
93                        if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
94                            name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
95                        }
96
97                        // Starts with a '.' so need the baseName
98                        if (name[0].charAt(0) === '.' && baseParts) {
99                            //Convert baseName to array, and lop off the last part,
100                            //so that . matches that 'directory' and not name of the baseName's
101                            //module. For instance, baseName of 'one/two/three', maps to
102                            //'one/two/three.js', but we want the directory, 'one/two' for
103                            //this normalization.
104                            normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
105                            name = normalizedBaseParts.concat(name);
106                        }
107
108                        //start trimDots
109                        for (i = 0; i < name.length; i++) {
110                            part = name[i];
111                            if (part === '.') {
112                                name.splice(i, 1);
113                                i -= 1;
114                            } else if (part === '..') {
115                                // If at the start, or previous value is still ..,
116                                // keep them so that when converted to a path it may
117                                // still work when converted to a path, even though
118                                // as an ID it is less than ideal. In larger point
119                                // releases, may be better to just kick out an error.
120                                if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {
121                                    continue;
122                                } else if (i > 0) {
123                                    name.splice(i - 1, 2);
124                                    i -= 2;
125                                }
126                            }
127                        }
128                        //end trimDots
129
130                        name = name.join('/');
131                    }
132
133                    //Apply map config if available.
134                    if ((baseParts || starMap) && map) {
135                        nameParts = name.split('/');
136
137                        for (i = nameParts.length; i > 0; i -= 1) {
138                            nameSegment = nameParts.slice(0, i).join("/");
139
140                            if (baseParts) {
141                                //Find the longest baseName segment match in the config.
142                                //So, do joins on the biggest to smallest lengths of baseParts.
143                                for (j = baseParts.length; j > 0; j -= 1) {
144                                    mapValue = map[baseParts.slice(0, j).join('/')];
145
146                                    //baseName segment has  config, find if it has one for
147                                    //this name.
148                                    if (mapValue) {
149                                        mapValue = mapValue[nameSegment];
150                                        if (mapValue) {
151                                            //Match, update name to the new value.
152                                            foundMap = mapValue;
153                                            foundI = i;
154                                            break;
155                                        }
156                                    }
157                                }
158                            }
159
160                            if (foundMap) {
161                                break;
162                            }
163
164                            //Check for a star map match, but just hold on to it,
165                            //if there is a shorter segment match later in a matching
166                            //config, then favor over this star map.
167                            if (!foundStarMap && starMap && starMap[nameSegment]) {
168                                foundStarMap = starMap[nameSegment];
169                                starI = i;
170                            }
171                        }
172
173                        if (!foundMap && foundStarMap) {
174                            foundMap = foundStarMap;
175                            foundI = starI;
176                        }
177
178                        if (foundMap) {
179                            nameParts.splice(0, foundI, foundMap);
180                            name = nameParts.join('/');
181                        }
182                    }
183
184                    return name;
185                }
186
187                function makeRequire(relName, forceSync) {
188                    return function () {
189                        //A version of a require function that passes a moduleName
190                        //value for items that may need to
191                        //look up paths relative to the moduleName
192                        var args = aps.call(arguments, 0);
193
194                        //If first arg is not require('string'), and there is only
195                        //one arg, it is the array form without a callback. Insert
196                        //a null so that the following concat is correct.
197                        if (typeof args[0] !== 'string' && args.length === 1) {
198                            args.push(null);
199                        }
200                        return req.apply(undef, args.concat([relName, forceSync]));
201                    };
202                }
203
204                function makeNormalize(relName) {
205                    return function (name) {
206                        return normalize(name, relName);
207                    };
208                }
209
210                function makeLoad(depName) {
211                    return function (value) {
212                        defined[depName] = value;
213                    };
214                }
215
216                function callDep(name) {
217                    if (hasProp(waiting, name)) {
218                        var args = waiting[name];
219                        delete waiting[name];
220                        defining[name] = true;
221                        main.apply(undef, args);
222                    }
223
224                    if (!hasProp(defined, name) && !hasProp(defining, name)) {
225                        throw new Error('No ' + name);
226                    }
227                    return defined[name];
228                }
229
230                //Turns a plugin!resource to [plugin, resource]
231                //with the plugin being undefined if the name
232                //did not have a plugin prefix.
233                function splitPrefix(name) {
234                    var prefix,
235                        index = name ? name.indexOf('!') : -1;
236                    if (index > -1) {
237                        prefix = name.substring(0, index);
238                        name = name.substring(index + 1, name.length);
239                    }
240                    return [prefix, name];
241                }
242
243                //Creates a parts array for a relName where first part is plugin ID,
244                //second part is resource ID. Assumes relName has already been normalized.
245                function makeRelParts(relName) {
246                    return relName ? splitPrefix(relName) : [];
247                }
248
249                /**
250                 * Makes a name map, normalizing the name, and using a plugin
251                 * for normalization if necessary. Grabs a ref to plugin
252                 * too, as an optimization.
253                 */
254                makeMap = function (name, relParts) {
255                    var plugin,
256                        parts = splitPrefix(name),
257                        prefix = parts[0],
258                        relResourceName = relParts[1];
259
260                    name = parts[1];
261
262                    if (prefix) {
263                        prefix = normalize(prefix, relResourceName);
264                        plugin = callDep(prefix);
265                    }
266
267                    //Normalize according
268                    if (prefix) {
269                        if (plugin && plugin.normalize) {
270                            name = plugin.normalize(name, makeNormalize(relResourceName));
271                        } else {
272                            name = normalize(name, relResourceName);
273                        }
274                    } else {
275                        name = normalize(name, relResourceName);
276                        parts = splitPrefix(name);
277                        prefix = parts[0];
278                        name = parts[1];
279                        if (prefix) {
280                            plugin = callDep(prefix);
281                        }
282                    }
283
284                    //Using ridiculous property names for space reasons
285                    return {
286                        f: prefix ? prefix + '!' + name : name, //fullName
287                        n: name,
288                        pr: prefix,
289                        p: plugin
290                    };
291                };
292
293                function makeConfig(name) {
294                    return function () {
295                        return (config && config.config && config.config[name]) || {};
296                    };
297                }
298
299                handlers = {
300                    require: function (name) {
301                        return makeRequire(name);
302                    },
303                    exports: function (name) {
304                        var e = defined[name];
305                        if (typeof e !== 'undefined') {
306                            return e;
307                        } else {
308                            return (defined[name] = {});
309                        }
310                    },
311                    module: function (name) {
312                        return {
313                            id: name,
314                            uri: '',
315                            exports: defined[name],
316                            config: makeConfig(name)
317                        };
318                    }
319                };
320
321                main = function (name, deps, callback, relName) {
322                    var cjsModule, depName, ret, map, i, relParts,
323                        args = [],
324                        callbackType = typeof callback,
325                        usingExports;
326
327                    //Use name if no relName
328                    relName = relName || name;
329                    relParts = makeRelParts(relName);
330
331                    //Call the callback to define the module, if necessary.
332                    if (callbackType === 'undefined' || callbackType === 'function') {
333                        //Pull out the defined dependencies and pass the ordered
334                        //values to the callback.
335                        //Default to [require, exports, module] if no deps
336                        deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
337                        for (i = 0; i < deps.length; i += 1) {
338                            map = makeMap(deps[i], relParts);
339                            depName = map.f;
340
341                            //Fast path CommonJS standard dependencies.
342                            if (depName === "require") {
343                                args[i] = handlers.require(name);
344                            } else if (depName === "exports") {
345                                //CommonJS module spec 1.1
346                                args[i] = handlers.exports(name);
347                                usingExports = true;
348                            } else if (depName === "module") {
349                                //CommonJS module spec 1.1
350                                cjsModule = args[i] = handlers.module(name);
351                            } else if (hasProp(defined, depName) ||
352                                hasProp(waiting, depName) ||
353                                hasProp(defining, depName)) {
354                                args[i] = callDep(depName);
355                            } else if (map.p) {
356                                map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
357                                args[i] = defined[depName];
358                            } else {
359                                throw new Error(name + ' missing ' + depName);
360                            }
361                        }
362
363                        ret = callback ? callback.apply(defined[name], args) : undefined;
364
365                        if (name) {
366                            //If setting exports via "module" is in play,
367                            //favor that over return value and exports. After that,
368                            //favor a non-undefined return value over exports use.
369                            if (cjsModule && cjsModule.exports !== undef &&
370                                cjsModule.exports !== defined[name]) {
371                                defined[name] = cjsModule.exports;
372                            } else if (ret !== undef || !usingExports) {
373                                //Use the return value from the function.
374                                defined[name] = ret;
375                            }
376                        }
377                    } else if (name) {
378                        //May just be an object definition for the module. Only
379                        //worry about defining if have a module name.
380                        defined[name] = callback;
381                    }
382                };
383
384                requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
385                    if (typeof deps === "string") {
386                        if (handlers[deps]) {
387                            //callback in this case is really relName
388                            return handlers[deps](callback);
389                        }
390                        //Just return the module wanted. In this scenario, the
391                        //deps arg is the module name, and second arg (if passed)
392                        //is just the relName.
393                        //Normalize module name, if it contains . or ..
394                        return callDep(makeMap(deps, makeRelParts(callback)).f);
395                    } else if (!deps.splice) {
396                        //deps is a config object, not an array.
397                        config = deps;
398                        if (config.deps) {
399                            req(config.deps, config.callback);
400                        }
401                        if (!callback) {
402                            return;
403                        }
404
405                        if (callback.splice) {
406                            //callback is an array, which means it is a dependency list.
407                            //Adjust args if there are dependencies
408                            deps = callback;
409                            callback = relName;
410                            relName = null;
411                        } else {
412                            deps = undef;
413                        }
414                    }
415
416                    //Support require(['a'])
417                    callback = callback || function () {};
418
419                    //If relName is a function, it is an errback handler,
420                    //so remove it.
421                    if (typeof relName === 'function') {
422                        relName = forceSync;
423                        forceSync = alt;
424                    }
425
426                    //Simulate async callback;
427                    if (forceSync) {
428                        main(undef, deps, callback, relName);
429                    } else {
430                        //Using a non-zero value because of concern for what old browsers
431                        //do, and latest browsers "upgrade" to 4 if lower value is used:
432                        //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
433                        //If want a value immediately, use require('id') instead -- something
434                        //that works in almond on the global level, but not guaranteed and
435                        //unlikely to work in other AMD implementations.
436                        setTimeout(function () {
437                            main(undef, deps, callback, relName);
438                        }, 4);
439                    }
440
441                    return req;
442                };
443
444                /**
445                 * Just drops the config on the floor, but returns req in case
446                 * the config return value is used.
447                 */
448                req.config = function (cfg) {
449                    return req(cfg);
450                };
451
452                /**
453                 * Expose module registry for debugging and tooling
454                 */
455                requirejs._defined = defined;
456
457                define = function (name, deps, callback) {
458                    if (typeof name !== 'string') {
459                        throw new Error('See almond README: incorrect module build, no module name');
460                    }
461
462                    //This module may not have dependencies
463                    if (!deps.splice) {
464                        //deps is not an array, so probably means
465                        //an object literal or factory function for
466                        //the value. Adjust args.
467                        callback = deps;
468                        deps = [];
469                    }
470
471                    if (!hasProp(defined, name) && !hasProp(waiting, name)) {
472                        waiting[name] = [name, deps, callback];
473                    }
474                };
475
476                define.amd = {
477                    jQuery: true
478                };
479            }());
480
481            S2.requirejs = requirejs;S2.require = require;S2.define = define;
482        }
483        }());
484        S2.define("almond", function(){});
485
486        /* global jQuery:false, $:false */
487        S2.define('jquery',[],function () {
488            var _$ = jQuery || $;
489
490            if (_$ == null && console && console.error) {
491                console.error(
492                    'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
493                    'found. Make sure that you are including jQuery before Select2 on your ' +
494                    'web page.'
495                );
496            }
497
498            return _$;
499        });
500
501        S2.define('select2/utils',[
502            'jquery'
503        ], function ($) {
504            var Utils = {};
505
506            Utils.Extend = function (ChildClass, SuperClass) {
507                var __hasProp = {}.hasOwnProperty;
508
509                function BaseConstructor () {
510                    this.constructor = ChildClass;
511                }
512
513                for (var key in SuperClass) {
514                    if (__hasProp.call(SuperClass, key)) {
515                        ChildClass[key] = SuperClass[key];
516                    }
517                }
518
519                BaseConstructor.prototype = SuperClass.prototype;
520                ChildClass.prototype = new BaseConstructor();
521                ChildClass.__super__ = SuperClass.prototype;
522
523                return ChildClass;
524            };
525
526            function getMethods (theClass) {
527                var proto = theClass.prototype;
528
529                var methods = [];
530
531                for (var methodName in proto) {
532                    var m = proto[methodName];
533
534                    if (typeof m !== 'function') {
535                        continue;
536                    }
537
538                    if (methodName === 'constructor') {
539                        continue;
540                    }
541
542                    methods.push(methodName);
543                }
544
545                return methods;
546            }
547
548            Utils.Decorate = function (SuperClass, DecoratorClass) {
549                var decoratedMethods = getMethods(DecoratorClass);
550                var superMethods = getMethods(SuperClass);
551
552                function DecoratedClass () {
553                    var unshift = Array.prototype.unshift;
554
555                    var argCount = DecoratorClass.prototype.constructor.length;
556
557                    var calledConstructor = SuperClass.prototype.constructor;
558
559                    if (argCount > 0) {
560                        unshift.call(arguments, SuperClass.prototype.constructor);
561
562                        calledConstructor = DecoratorClass.prototype.constructor;
563                    }
564
565                    calledConstructor.apply(this, arguments);
566                }
567
568                DecoratorClass.displayName = SuperClass.displayName;
569
570                function ctr () {
571                    this.constructor = DecoratedClass;
572                }
573
574                DecoratedClass.prototype = new ctr();
575
576                for (var m = 0; m < superMethods.length; m++) {
577                    var superMethod = superMethods[m];
578
579                    DecoratedClass.prototype[superMethod] =
580                        SuperClass.prototype[superMethod];
581                }
582
583                var calledMethod = function (methodName) {
584                    // Stub out the original method if it's not decorating an actual method
585                    var originalMethod = function () {};
586
587                    if (methodName in DecoratedClass.prototype) {
588                        originalMethod = DecoratedClass.prototype[methodName];
589                    }
590
591                    var decoratedMethod = DecoratorClass.prototype[methodName];
592
593                    return function () {
594                        var unshift = Array.prototype.unshift;
595
596                        unshift.call(arguments, originalMethod);
597
598                        return decoratedMethod.apply(this, arguments);
599                    };
600                };
601
602                for (var d = 0; d < decoratedMethods.length; d++) {
603                    var decoratedMethod = decoratedMethods[d];
604
605                    DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
606                }
607
608                return DecoratedClass;
609            };
610
611            var Observable = function () {
612                this.listeners = {};
613            };
614
615            Observable.prototype.on = function (event, callback) {
616                this.listeners = this.listeners || {};
617
618                if (event in this.listeners) {
619                    this.listeners[event].push(callback);
620                } else {
621                    this.listeners[event] = [callback];
622                }
623            };
624
625            Observable.prototype.trigger = function (event) {
626                var slice = Array.prototype.slice;
627                var params = slice.call(arguments, 1);
628
629                this.listeners = this.listeners || {};
630
631                // Params should always come in as an array
632                if (params == null) {
633                    params = [];
634                }
635
636                // If there are no arguments to the event, use a temporary object
637                if (params.length === 0) {
638                    params.push({});
639                }
640
641                // Set the `_type` of the first object to the event
642                params[0]._type = event;
643
644                if (event in this.listeners) {
645                    this.invoke(this.listeners[event], slice.call(arguments, 1));
646                }
647
648                if ('*' in this.listeners) {
649                    this.invoke(this.listeners['*'], arguments);
650                }
651            };
652
653            Observable.prototype.invoke = function (listeners, params) {
654                for (var i = 0, len = listeners.length; i < len; i++) {
655                    listeners[i].apply(this, params);
656                }
657            };
658
659            Utils.Observable = Observable;
660
661            Utils.generateChars = function (length) {
662                var chars = '';
663
664                for (var i = 0; i < length; i++) {
665                    var randomChar = Math.floor(Math.random() * 36);
666                    chars += randomChar.toString(36);
667                }
668
669                return chars;
670            };
671
672            Utils.bind = function (func, context) {
673                return function () {
674                    func.apply(context, arguments);
675                };
676            };
677
678            Utils._convertData = function (data) {
679                for (var originalKey in data) {
680                    var keys = originalKey.split('-');
681
682                    var dataLevel = data;
683
684                    if (keys.length === 1) {
685                        continue;
686                    }
687
688                    for (var k = 0; k < keys.length; k++) {
689                        var key = keys[k];
690
691                        // Lowercase the first letter
692                        // By default, dash-separated becomes camelCase
693                        key = key.substring(0, 1).toLowerCase() + key.substring(1);
694
695                        if (!(key in dataLevel)) {
696                            dataLevel[key] = {};
697                        }
698
699                        if (k == keys.length - 1) {
700                            dataLevel[key] = data[originalKey];
701                        }
702
703                        dataLevel = dataLevel[key];
704                    }
705
706                    delete data[originalKey];
707                }
708
709                return data;
710            };
711
712            Utils.hasScroll = function (index, el) {
713                // Adapted from the function created by @ShadowScripter
714                // and adapted by @BillBarry on the Stack Exchange Code Review website.
715                // The original code can be found at
716                // http://codereview.stackexchange.com/q/13338
717                // and was designed to be used with the Sizzle selector engine.
718
719                var $el = $(el);
720                var overflowX = el.style.overflowX;
721                var overflowY = el.style.overflowY;
722
723                //Check both x and y declarations
724                if (overflowX === overflowY &&
725                    (overflowY === 'hidden' || overflowY === 'visible')) {
726                    return false;
727                }
728
729                if (overflowX === 'scroll' || overflowY === 'scroll') {
730                    return true;
731                }
732
733                return ($el.innerHeight() < el.scrollHeight ||
734                    $el.innerWidth() < el.scrollWidth);
735            };
736
737            Utils.escapeMarkup = function (markup) {
738                var replaceMap = {
739                    '\\': '&#92;',
740                    '&': '&amp;',
741                    '<': '&lt;',
742                    '>': '&gt;',
743                    '"': '&quot;',
744                    '\'': '&#39;',
745                    '/': '&#47;'
746                };
747
748                // Do not try to escape the markup if it's not a string
749                if (typeof markup !== 'string') {
750                    return markup;
751                }
752
753                return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
754                    return replaceMap[match];
755                });
756            };
757
758            // Cache objects in Utils.__cache instead of $.data (see #4346)
759            Utils.__cache = {};
760
761            var id = 0;
762            Utils.GetUniqueElementId = function (element) {
763                // Get a unique element Id. If element has no id,
764                // creates a new unique number, stores it in the id
765                // attribute and returns the new id with a prefix.
766                // If an id already exists, it simply returns it with a prefix.
767
768                var select2Id = element.getAttribute('data-select2-id');
769
770                if (select2Id != null) {
771                    return select2Id;
772                }
773
774                // If element has id, use it.
775                if (element.id) {
776                    select2Id = 'select2-data-' + element.id;
777                } else {
778                    select2Id = 'select2-data-' + (++id).toString() +
779                        '-' + Utils.generateChars(4);
780                }
781
782                element.setAttribute('data-select2-id', select2Id);
783
784                return select2Id;
785            };
786
787            Utils.StoreData = function (element, name, value) {
788                // Stores an item in the cache for a specified element.
789                // name is the cache key.
790                var id = Utils.GetUniqueElementId(element);
791                if (!Utils.__cache[id]) {
792                    Utils.__cache[id] = {};
793                }
794
795                Utils.__cache[id][name] = value;
796            };
797
798            Utils.GetData = function (element, name) {
799                // Retrieves a value from the cache by its key (name)
800                // name is optional. If no name specified, return
801                // all cache items for the specified element.
802                // and for a specified element.
803                var id = Utils.GetUniqueElementId(element);
804                if (name) {
805                    if (Utils.__cache[id]) {
806                        if (Utils.__cache[id][name] != null) {
807                            return Utils.__cache[id][name];
808                        }
809                        return $(element).data(name); // Fallback to HTML5 data attribs.
810                    }
811                    return $(element).data(name); // Fallback to HTML5 data attribs.
812                } else {
813                    return Utils.__cache[id];
814                }
815            };
816
817            Utils.RemoveData = function (element) {
818                // Removes all cached items for a specified element.
819                var id = Utils.GetUniqueElementId(element);
820                if (Utils.__cache[id] != null) {
821                    delete Utils.__cache[id];
822                }
823
824                element.removeAttribute('data-select2-id');
825            };
826
827            Utils.copyNonInternalCssClasses = function (dest, src) {
828                var classes;
829
830                var destinationClasses = dest.getAttribute('class').trim().split(/\s+/);
831
832                destinationClasses = destinationClasses.filter(function (clazz) {
833                    // Save all Select2 classes
834                    return clazz.indexOf('select2-') === 0;
835                });
836
837                var sourceClasses = src.getAttribute('class').trim().split(/\s+/);
838
839                sourceClasses = sourceClasses.filter(function (clazz) {
840                    // Only copy non-Select2 classes
841                    return clazz.indexOf('select2-') !== 0;
842                });
843
844                var replacements = destinationClasses.concat(sourceClasses);
845
846                dest.setAttribute('class', replacements.join(' '));
847            };
848
849            return Utils;
850        });
851
852        S2.define('select2/results',[
853            'jquery',
854            './utils'
855        ], function ($, Utils) {
856            function Results ($element, options, dataAdapter) {
857                this.$element = $element;
858                this.data = dataAdapter;
859                this.options = options;
860
861                Results.__super__.constructor.call(this);
862            }
863
864            Utils.Extend(Results, Utils.Observable);
865
866            Results.prototype.render = function () {
867                var $results = $(
868                    '<ul class="select2-results__options" role="listbox"></ul>'
869                );
870
871                if (this.options.get('multiple')) {
872                    $results.attr('aria-multiselectable', 'true');
873                }
874
875                this.$results = $results;
876
877                return $results;
878            };
879
880            Results.prototype.clear = function () {
881                this.$results.empty();
882            };
883
884            Results.prototype.displayMessage = function (params) {
885                var escapeMarkup = this.options.get('escapeMarkup');
886
887                this.clear();
888                this.hideLoading();
889
890                var $message = $(
891                    '<li role="alert" aria-live="assertive"' +
892                    ' class="select2-results__option"></li>'
893                );
894
895                var message = this.options.get('translations').get(params.message);
896
897                $message.append(
898                    escapeMarkup(
899                        message(params.args)
900                    )
901                );
902
903                $message[0].className += ' select2-results__message';
904
905                this.$results.append($message);
906            };
907
908            Results.prototype.hideMessages = function () {
909                this.$results.find('.select2-results__message').remove();
910            };
911
912            Results.prototype.append = function (data) {
913                this.hideLoading();
914
915                var $options = [];
916
917                if (data.results == null || data.results.length === 0) {
918                    if (this.$results.children().length === 0) {
919                        this.trigger('results:message', {
920                            message: 'noResults'
921                        });
922                    }
923
924                    return;
925                }
926
927                data.results = this.sort(data.results);
928
929                for (var d = 0; d < data.results.length; d++) {
930                    var item = data.results[d];
931
932                    var $option = this.option(item);
933
934                    $options.push($option);
935                }
936
937                this.$results.append($options);
938            };
939
940            Results.prototype.position = function ($results, $dropdown) {
941                var $resultsContainer = $dropdown.find('.select2-results');
942                $resultsContainer.append($results);
943            };
944
945            Results.prototype.sort = function (data) {
946                var sorter = this.options.get('sorter');
947
948                return sorter(data);
949            };
950
951            Results.prototype.highlightFirstItem = function () {
952                var $options = this.$results
953                    .find('.select2-results__option--selectable');
954
955                var $selected = $options.filter('.select2-results__option--selected');
956
957                // Check if there are any selected options
958                if ($selected.length > 0) {
959                    // If there are selected options, highlight the first
960                    $selected.first().trigger('mouseenter');
961                } else {
962                    // If there are no selected options, highlight the first option
963                    // in the dropdown
964                    $options.first().trigger('mouseenter');
965                }
966
967                this.ensureHighlightVisible();
968            };
969
970            Results.prototype.setClasses = function () {
971                var self = this;
972
973                this.data.current(function (selected) {
974                    var selectedIds = selected.map(function (s) {
975                        return s.id.toString();
976                    });
977
978                    var $options = self.$results
979                        .find('.select2-results__option--selectable');
980
981                    $options.each(function () {
982                        var $option = $(this);
983
984                        var item = Utils.GetData(this, 'data');
985
986                        // id needs to be converted to a string when comparing
987                        var id = '' + item.id;
988
989                        if ((item.element != null && item.element.selected) ||
990                            (item.element == null && selectedIds.indexOf(id) > -1)) {
991                            this.classList.add('select2-results__option--selected');
992                            $option.attr('aria-selected', 'true');
993                        } else {
994                            this.classList.remove('select2-results__option--selected');
995                            $option.attr('aria-selected', 'false');
996                        }
997                    });
998
999                });
1000            };
1001
1002            Results.prototype.showLoading = function (params) {
1003                this.hideLoading();
1004
1005                var loadingMore = this.options.get('translations').get('searching');
1006
1007                var loading = {
1008                    disabled: true,
1009                    loading: true,
1010                    text: loadingMore(params)
1011                };
1012                var $loading = this.option(loading);
1013                $loading.className += ' loading-results';
1014
1015                this.$results.prepend($loading);
1016            };
1017
1018            Results.prototype.hideLoading = function () {
1019                this.$results.find('.loading-results').remove();
1020            };
1021
1022            Results.prototype.option = function (data) {
1023                var option = document.createElement('li');
1024                option.classList.add('select2-results__option');
1025                option.classList.add('select2-results__option--selectable');
1026
1027                var attrs = {
1028                    'role': 'option'
1029                };
1030
1031                var matches = window.Element.prototype.matches ||
1032                    window.Element.prototype.msMatchesSelector ||
1033                    window.Element.prototype.webkitMatchesSelector;
1034
1035                if ((data.element != null && matches.call(data.element, ':disabled')) ||
1036                    (data.element == null && data.disabled)) {
1037                    attrs['aria-disabled'] = 'true';
1038
1039                    option.classList.remove('select2-results__option--selectable');
1040                    option.classList.add('select2-results__option--disabled');
1041                }
1042
1043                if (data.id == null) {
1044                    option.classList.remove('select2-results__option--selectable');
1045                }
1046
1047                if (data._resultId != null) {
1048                    option.id = data._resultId;
1049                }
1050
1051                if (data.title) {
1052                    option.title = data.title;
1053                }
1054
1055                if (data.children) {
1056                    attrs.role = 'group';
1057                    attrs['aria-label'] = data.text;
1058
1059                    option.classList.remove('select2-results__option--selectable');
1060                    option.classList.add('select2-results__option--group');
1061                }
1062
1063                for (var attr in attrs) {
1064                    var val = attrs[attr];
1065
1066                    option.setAttribute(attr, val);
1067                }
1068
1069                if (data.children) {
1070                    var $option = $(option);
1071
1072                    var label = document.createElement('strong');
1073                    label.className = 'select2-results__group';
1074
1075                    this.template(data, label);
1076
1077                    var $children = [];
1078
1079                    for (var c = 0; c < data.children.length; c++) {
1080                        var child = data.children[c];
1081
1082                        var $child = this.option(child);
1083
1084                        $children.push($child);
1085                    }
1086
1087                    var $childrenContainer = $('<ul></ul>', {
1088                        'class': 'select2-results__options select2-results__options--nested',
1089                        'role': 'none'
1090                    });
1091
1092                    $childrenContainer.append($children);
1093
1094                    $option.append(label);
1095                    $option.append($childrenContainer);
1096                } else {
1097                    this.template(data, option);
1098                }
1099
1100                Utils.StoreData(option, 'data', data);
1101
1102                return option;
1103            };
1104
1105            Results.prototype.bind = function (container, $container) {
1106                var self = this;
1107
1108                var id = container.id + '-results';
1109
1110                this.$results.attr('id', id);
1111
1112                container.on('results:all', function (params) {
1113                    self.clear();
1114                    self.append(params.data);
1115
1116                    if (container.isOpen()) {
1117                        self.setClasses();
1118                        self.highlightFirstItem();
1119                    }
1120                });
1121
1122                container.on('results:append', function (params) {
1123                    self.append(params.data);
1124
1125                    if (container.isOpen()) {
1126                        self.setClasses();
1127                    }
1128                });
1129
1130                container.on('query', function (params) {
1131                    self.hideMessages();
1132                    self.showLoading(params);
1133                });
1134
1135                container.on('select', function () {
1136                    if (!container.isOpen()) {
1137                        return;
1138                    }
1139
1140                    self.setClasses();
1141
1142                    if (self.options.get('scrollAfterSelect')) {
1143                        self.highlightFirstItem();
1144                    }
1145                });
1146
1147                container.on('unselect', function () {
1148                    if (!container.isOpen()) {
1149                        return;
1150                    }
1151
1152                    self.setClasses();
1153
1154                    if (self.options.get('scrollAfterSelect')) {
1155                        self.highlightFirstItem();
1156                    }
1157                });
1158
1159                container.on('open', function () {
1160                    // When the dropdown is open, aria-expended="true"
1161                    self.$results.attr('aria-expanded', 'true');
1162                    self.$results.attr('aria-hidden', 'false');
1163
1164                    self.setClasses();
1165                    self.ensureHighlightVisible();
1166                });
1167
1168                container.on('close', function () {
1169                    // When the dropdown is closed, aria-expended="false"
1170                    self.$results.attr('aria-expanded', 'false');
1171                    self.$results.attr('aria-hidden', 'true');
1172                    self.$results.removeAttr('aria-activedescendant');
1173                });
1174
1175                container.on('results:toggle', function () {
1176                    var $highlighted = self.getHighlightedResults();
1177
1178                    if ($highlighted.length === 0) {
1179                        return;
1180                    }
1181
1182                    $highlighted.trigger('mouseup');
1183                });
1184
1185                container.on('results:select', function () {
1186                    var $highlighted = self.getHighlightedResults();
1187
1188                    if ($highlighted.length === 0) {
1189                        return;
1190                    }
1191
1192                    var data = Utils.GetData($highlighted[0], 'data');
1193
1194                    if ($highlighted.hasClass('select2-results__option--selected')) {
1195                        self.trigger('close', {});
1196                    } else {
1197                        self.trigger('select', {
1198                            data: data
1199                        });
1200                    }
1201                });
1202
1203                container.on('results:previous', function () {
1204                    var $highlighted = self.getHighlightedResults();
1205
1206                    var $options = self.$results.find('.select2-results__option--selectable');
1207
1208                    var currentIndex = $options.index($highlighted);
1209
1210                    // If we are already at the top, don't move further
1211                    // If no options, currentIndex will be -1
1212                    if (currentIndex <= 0) {
1213                        return;
1214                    }
1215
1216                    var nextIndex = currentIndex - 1;
1217
1218                    // If none are highlighted, highlight the first
1219                    if ($highlighted.length === 0) {
1220                        nextIndex = 0;
1221                    }
1222
1223                    var $next = $options.eq(nextIndex);
1224
1225                    $next.trigger('mouseenter');
1226
1227                    var currentOffset = self.$results.offset().top;
1228                    var nextTop = $next.offset().top;
1229                    var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
1230
1231                    if (nextIndex === 0) {
1232                        self.$results.scrollTop(0);
1233                    } else if (nextTop - currentOffset < 0) {
1234                        self.$results.scrollTop(nextOffset);
1235                    }
1236                });
1237
1238                container.on('results:next', function () {
1239                    var $highlighted = self.getHighlightedResults();
1240
1241                    var $options = self.$results.find('.select2-results__option--selectable');
1242
1243                    var currentIndex = $options.index($highlighted);
1244
1245                    var nextIndex = currentIndex + 1;
1246
1247                    // If we are at the last option, stay there
1248                    if (nextIndex >= $options.length) {
1249                        return;
1250                    }
1251
1252                    var $next = $options.eq(nextIndex);
1253
1254                    $next.trigger('mouseenter');
1255
1256                    var currentOffset = self.$results.offset().top +
1257                        self.$results.outerHeight(false);
1258                    var nextBottom = $next.offset().top + $next.outerHeight(false);
1259                    var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
1260
1261                    if (nextIndex === 0) {
1262                        self.$results.scrollTop(0);
1263                    } else if (nextBottom > currentOffset) {
1264                        self.$results.scrollTop(nextOffset);
1265                    }
1266                });
1267
1268                container.on('results:focus', function (params) {
1269                    params.element[0].classList.add('select2-results__option--highlighted');
1270                    params.element[0].setAttribute('aria-selected', 'true');
1271                });
1272
1273                container.on('results:message', function (params) {
1274                    self.displayMessage(params);
1275                });
1276
1277                if ($.fn.mousewheel) {
1278                    this.$results.on('mousewheel', function (e) {
1279                        var top = self.$results.scrollTop();
1280
1281                        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
1282
1283                        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
1284                        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
1285
1286                        if (isAtTop) {
1287                            self.$results.scrollTop(0);
1288
1289                            e.preventDefault();
1290                            e.stopPropagation();
1291                        } else if (isAtBottom) {
1292                            self.$results.scrollTop(
1293                                self.$results.get(0).scrollHeight - self.$results.height()
1294                            );
1295
1296                            e.preventDefault();
1297                            e.stopPropagation();
1298                        }
1299                    });
1300                }
1301
1302                this.$results.on('mouseup', '.select2-results__option--selectable',
1303                    function (evt) {
1304                        var $this = $(this);
1305
1306                        var data = Utils.GetData(this, 'data');
1307
1308                        if ($this.hasClass('select2-results__option--selected')) {
1309                            if (self.options.get('multiple')) {
1310                                self.trigger('unselect', {
1311                                    originalEvent: evt,
1312                                    data: data
1313                                });
1314                            } else {
1315                                self.trigger('close', {});
1316                            }
1317
1318                            return;
1319                        }
1320
1321                        self.trigger('select', {
1322                            originalEvent: evt,
1323                            data: data
1324                        });
1325                    });
1326
1327                this.$results.on('mouseenter', '.select2-results__option--selectable',
1328                    function (evt) {
1329                        var data = Utils.GetData(this, 'data');
1330
1331                        self.getHighlightedResults()
1332                            .removeClass('select2-results__option--highlighted')
1333                            .attr('aria-selected', 'false');
1334
1335                        self.trigger('results:focus', {
1336                            data: data,
1337                            element: $(this)
1338                        });
1339                    });
1340            };
1341
1342            Results.prototype.getHighlightedResults = function () {
1343                var $highlighted = this.$results
1344                    .find('.select2-results__option--highlighted');
1345
1346                return $highlighted;
1347            };
1348
1349            Results.prototype.destroy = function () {
1350                this.$results.remove();
1351            };
1352
1353            Results.prototype.ensureHighlightVisible = function () {
1354                var $highlighted = this.getHighlightedResults();
1355
1356                if ($highlighted.length === 0) {
1357                    return;
1358                }
1359
1360                var $options = this.$results.find('.select2-results__option--selectable');
1361
1362                var currentIndex = $options.index($highlighted);
1363
1364                var currentOffset = this.$results.offset().top;
1365                var nextTop = $highlighted.offset().top;
1366                var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
1367
1368                var offsetDelta = nextTop - currentOffset;
1369                nextOffset -= $highlighted.outerHeight(false) * 2;
1370
1371                if (currentIndex <= 2) {
1372                    this.$results.scrollTop(0);
1373                } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
1374                    this.$results.scrollTop(nextOffset);
1375                }
1376            };
1377
1378            Results.prototype.template = function (result, container) {
1379                var template = this.options.get('templateResult');
1380                var escapeMarkup = this.options.get('escapeMarkup');
1381
1382                var content = template(result, container);
1383
1384                if (content == null) {
1385                    container.style.display = 'none';
1386                } else if (typeof content === 'string') {
1387                    container.innerHTML = escapeMarkup(content);
1388                } else {
1389                    $(container).append(content);
1390                }
1391            };
1392
1393            return Results;
1394        });
1395
1396        S2.define('select2/keys',[
1397
1398        ], function () {
1399            var KEYS = {
1400                BACKSPACE: 8,
1401                TAB: 9,
1402                ENTER: 13,
1403                SHIFT: 16,
1404                CTRL: 17,
1405                ALT: 18,
1406                ESC: 27,
1407                SPACE: 32,
1408                PAGE_UP: 33,
1409                PAGE_DOWN: 34,
1410                END: 35,
1411                HOME: 36,
1412                LEFT: 37,
1413                UP: 38,
1414                RIGHT: 39,
1415                DOWN: 40,
1416                DELETE: 46
1417            };
1418
1419            return KEYS;
1420        });
1421
1422        S2.define('select2/selection/base',[
1423            'jquery',
1424            '../utils',
1425            '../keys'
1426        ], function ($, Utils, KEYS) {
1427            function BaseSelection ($element, options) {
1428                this.$element = $element;
1429                this.options = options;
1430
1431                BaseSelection.__super__.constructor.call(this);
1432            }
1433
1434            Utils.Extend(BaseSelection, Utils.Observable);
1435
1436            BaseSelection.prototype.render = function () {
1437                var $selection = $(
1438                    '<span class="select2-selection" role="combobox" ' +
1439                    ' aria-haspopup="true" aria-expanded="false">' +
1440                    '</span>'
1441                );
1442
1443                this._tabindex = 0;
1444
1445                if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
1446                    this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
1447                } else if (this.$element.attr('tabindex') != null) {
1448                    this._tabindex = this.$element.attr('tabindex');
1449                }
1450
1451                $selection.attr('title', this.$element.attr('title'));
1452                $selection.attr('tabindex', this._tabindex);
1453                $selection.attr('aria-disabled', 'false');
1454
1455                this.$selection = $selection;
1456
1457                return $selection;
1458            };
1459
1460            BaseSelection.prototype.bind = function (container, $container) {
1461                var self = this;
1462
1463                var resultsId = container.id + '-results';
1464
1465                this.container = container;
1466
1467                this.$selection.on('focus', function (evt) {
1468                    self.trigger('focus', evt);
1469                });
1470
1471                this.$selection.on('blur', function (evt) {
1472                    self._handleBlur(evt);
1473                });
1474
1475                this.$selection.on('keydown', function (evt) {
1476                    self.trigger('keypress', evt);
1477
1478                    if (evt.which === KEYS.SPACE) {
1479                        evt.preventDefault();
1480                    }
1481                });
1482
1483                container.on('results:focus', function (params) {
1484                    self.$selection.attr('aria-activedescendant', params.data._resultId);
1485                });
1486
1487                container.on('selection:update', function (params) {
1488                    self.update(params.data);
1489                });
1490
1491                container.on('open', function () {
1492                    // When the dropdown is open, aria-expanded="true"
1493                    self.$selection.attr('aria-expanded', 'true');
1494                    self.$selection.attr('aria-owns', resultsId);
1495
1496                    self._attachCloseHandler(container);
1497                });
1498
1499                container.on('close', function () {
1500                    // When the dropdown is closed, aria-expanded="false"
1501                    self.$selection.attr('aria-expanded', 'false');
1502                    self.$selection.removeAttr('aria-activedescendant');
1503                    self.$selection.removeAttr('aria-owns');
1504
1505                    self.$selection.trigger('focus');
1506
1507                    self._detachCloseHandler(container);
1508                });
1509
1510                container.on('enable', function () {
1511                    self.$selection.attr('tabindex', self._tabindex);
1512                    self.$selection.attr('aria-disabled', 'false');
1513                });
1514
1515                container.on('disable', function () {
1516                    self.$selection.attr('tabindex', '-1');
1517                    self.$selection.attr('aria-disabled', 'true');
1518                });
1519            };
1520
1521            BaseSelection.prototype._handleBlur = function (evt) {
1522                var self = this;
1523
1524                // This needs to be delayed as the active element is the body when the tab
1525                // key is pressed, possibly along with others.
1526                window.setTimeout(function () {
1527                    // Don't trigger `blur` if the focus is still in the selection
1528                    if (
1529                        (document.activeElement == self.$selection[0]) ||
1530                        ($.contains(self.$selection[0], document.activeElement))
1531                    ) {
1532                        return;
1533                    }
1534
1535                    self.trigger('blur', evt);
1536                }, 1);
1537            };
1538
1539            BaseSelection.prototype._attachCloseHandler = function (container) {
1540
1541                $(document.body).on('mousedown.select2.' + container.id, function (e) {
1542                    var $target = $(e.target);
1543
1544                    var $select = $target.closest('.select2');
1545
1546                    var $all = $('.select2.select2-container--open');
1547
1548                    $all.each(function () {
1549                        if (this == $select[0]) {
1550                            return;
1551                        }
1552
1553                        var $element = Utils.GetData(this, 'element');
1554
1555                        $element.select2('close');
1556                    });
1557                });
1558            };
1559
1560            BaseSelection.prototype._detachCloseHandler = function (container) {
1561                $(document.body).off('mousedown.select2.' + container.id);
1562            };
1563
1564            BaseSelection.prototype.position = function ($selection, $container) {
1565                var $selectionContainer = $container.find('.selection');
1566                $selectionContainer.append($selection);
1567            };
1568
1569            BaseSelection.prototype.destroy = function () {
1570                this._detachCloseHandler(this.container);
1571            };
1572
1573            BaseSelection.prototype.update = function (data) {
1574                throw new Error('The `update` method must be defined in child classes.');
1575            };
1576
1577            /**
1578             * Helper method to abstract the "enabled" (not "disabled") state of this
1579             * object.
1580             *
1581             * @return {true} if the instance is not disabled.
1582             * @return {false} if the instance is disabled.
1583             */
1584            BaseSelection.prototype.isEnabled = function () {
1585                return !this.isDisabled();
1586            };
1587
1588            /**
1589             * Helper method to abstract the "disabled" state of this object.
1590             *
1591             * @return {true} if the disabled option is true.
1592             * @return {false} if the disabled option is false.
1593             */
1594            BaseSelection.prototype.isDisabled = function () {
1595                return this.options.get('disabled');
1596            };
1597
1598            return BaseSelection;
1599        });
1600
1601        S2.define('select2/selection/single',[
1602            'jquery',
1603            './base',
1604            '../utils',
1605            '../keys'
1606        ], function ($, BaseSelection, Utils, KEYS) {
1607            function SingleSelection () {
1608                SingleSelection.__super__.constructor.apply(this, arguments);
1609            }
1610
1611            Utils.Extend(SingleSelection, BaseSelection);
1612
1613            SingleSelection.prototype.render = function () {
1614                var $selection = SingleSelection.__super__.render.call(this);
1615
1616                $selection[0].classList.add('select2-selection--single');
1617
1618                $selection.html(
1619                    '<span class="select2-selection__rendered"></span>' +
1620                    '<span class="select2-selection__arrow" role="presentation">' +
1621                    '<b role="presentation"></b>' +
1622                    '</span>'
1623                );
1624
1625                return $selection;
1626            };
1627
1628            SingleSelection.prototype.bind = function (container, $container) {
1629                var self = this;
1630
1631                SingleSelection.__super__.bind.apply(this, arguments);
1632
1633                var id = container.id + '-container';
1634
1635                this.$selection.find('.select2-selection__rendered')
1636                    .attr('id', id)
1637                    .attr('role', 'textbox')
1638                    .attr('aria-readonly', 'true');
1639                this.$selection.attr('aria-labelledby', id);
1640                this.$selection.attr('aria-controls', id);
1641
1642                this.$selection.on('mousedown', function (evt) {
1643                    // Only respond to left clicks
1644                    if (evt.which !== 1) {
1645                        return;
1646                    }
1647
1648                    self.trigger('toggle', {
1649                        originalEvent: evt
1650                    });
1651                });
1652
1653                this.$selection.on('focus', function (evt) {
1654                    // User focuses on the container
1655                });
1656
1657                this.$selection.on('blur', function (evt) {
1658                    // User exits the container
1659                });
1660
1661                container.on('focus', function (evt) {
1662                    if (!container.isOpen()) {
1663                        self.$selection.trigger('focus');
1664                    }
1665                });
1666            };
1667
1668            SingleSelection.prototype.clear = function () {
1669                var $rendered = this.$selection.find('.select2-selection__rendered');
1670                $rendered.empty();
1671                $rendered.removeAttr('title'); // clear tooltip on empty
1672            };
1673
1674            SingleSelection.prototype.display = function (data, container) {
1675                var template = this.options.get('templateSelection');
1676                var escapeMarkup = this.options.get('escapeMarkup');
1677
1678                return escapeMarkup(template(data, container));
1679            };
1680
1681            SingleSelection.prototype.selectionContainer = function () {
1682                return $('<span></span>');
1683            };
1684
1685            SingleSelection.prototype.update = function (data) {
1686                if (data.length === 0) {
1687                    this.clear();
1688                    return;
1689                }
1690
1691                var selection = data[0];
1692
1693                var $rendered = this.$selection.find('.select2-selection__rendered');
1694                var formatted = this.display(selection, $rendered);
1695
1696                $rendered.empty().append(formatted);
1697
1698                var title = selection.title || selection.text;
1699
1700                if (title) {
1701                    $rendered.attr('title', title);
1702                } else {
1703                    $rendered.removeAttr('title');
1704                }
1705            };
1706
1707            return SingleSelection;
1708        });
1709
1710        S2.define('select2/selection/multiple',[
1711            'jquery',
1712            './base',
1713            '../utils'
1714        ], function ($, BaseSelection, Utils) {
1715            function MultipleSelection ($element, options) {
1716                MultipleSelection.__super__.constructor.apply(this, arguments);
1717            }
1718
1719            Utils.Extend(MultipleSelection, BaseSelection);
1720
1721            MultipleSelection.prototype.render = function () {
1722                var $selection = MultipleSelection.__super__.render.call(this);
1723
1724                $selection[0].classList.add('select2-selection--multiple');
1725
1726                $selection.html(
1727                    '<ul class="select2-selection__rendered"></ul>'
1728                );
1729
1730                return $selection;
1731            };
1732
1733            MultipleSelection.prototype.bind = function (container, $container) {
1734                var self = this;
1735
1736                MultipleSelection.__super__.bind.apply(this, arguments);
1737
1738                var id = container.id + '-container';
1739                this.$selection.find('.select2-selection__rendered').attr('id', id);
1740
1741                this.$selection.on('click', function (evt) {
1742                    self.trigger('toggle', {
1743                        originalEvent: evt
1744                    });
1745                });
1746
1747                this.$selection.on(
1748                    'click',
1749                    '.select2-selection__choice__remove',
1750                    function (evt) {
1751                        // Ignore the event if it is disabled
1752                        if (self.isDisabled()) {
1753                            return;
1754                        }
1755
1756                        var $remove = $(this);
1757                        var $selection = $remove.parent();
1758
1759                        var data = Utils.GetData($selection[0], 'data');
1760
1761                        self.trigger('unselect', {
1762                            originalEvent: evt,
1763                            data: data
1764                        });
1765                    }
1766                );
1767
1768                this.$selection.on(
1769                    'keydown',
1770                    '.select2-selection__choice__remove',
1771                    function (evt) {
1772                        // Ignore the event if it is disabled
1773                        if (self.isDisabled()) {
1774                            return;
1775                        }
1776
1777                        evt.stopPropagation();
1778                    }
1779                );
1780            };
1781
1782            MultipleSelection.prototype.clear = function () {
1783                var $rendered = this.$selection.find('.select2-selection__rendered');
1784                $rendered.empty();
1785                $rendered.removeAttr('title');
1786            };
1787
1788            MultipleSelection.prototype.display = function (data, container) {
1789                var template = this.options.get('templateSelection');
1790                var escapeMarkup = this.options.get('escapeMarkup');
1791
1792                return escapeMarkup(template(data, container));
1793            };
1794
1795            MultipleSelection.prototype.selectionContainer = function () {
1796                var $container = $(
1797                    '<li class="select2-selection__choice">' +
1798                    '<button type="button" class="select2-selection__choice__remove" ' +
1799                    'tabindex="-1">' +
1800                    '<span aria-hidden="true">&times;</span>' +
1801                    '</button>' +
1802                    '<span class="select2-selection__choice__display"></span>' +
1803                    '</li>'
1804                );
1805
1806                return $container;
1807            };
1808
1809            MultipleSelection.prototype.update = function (data) {
1810                this.clear();
1811
1812                if (data.length === 0) {
1813                    return;
1814                }
1815
1816                var $selections = [];
1817
1818                var selectionIdPrefix = this.$selection.find('.select2-selection__rendered')
1819                    .attr('id') + '-choice-';
1820
1821                for (var d = 0; d < data.length; d++) {
1822                    var selection = data[d];
1823
1824                    var $selection = this.selectionContainer();
1825                    var formatted = this.display(selection, $selection);
1826
1827                    var selectionId = selectionIdPrefix + Utils.generateChars(4) + '-';
1828
1829                    if (selection.id) {
1830                        selectionId += selection.id;
1831                    } else {
1832                        selectionId += Utils.generateChars(4);
1833                    }
1834
1835                    $selection.find('.select2-selection__choice__display')
1836                        .append(formatted)
1837                        .attr('id', selectionId);
1838
1839                    var title = selection.title || selection.text;
1840
1841                    if (title) {
1842                        $selection.attr('title', title);
1843                    }
1844
1845                    var removeItem = this.options.get('translations').get('removeItem');
1846
1847                    var $remove = $selection.find('.select2-selection__choice__remove');
1848
1849                    $remove.attr('title', removeItem());
1850                    $remove.attr('aria-label', removeItem());
1851                    $remove.attr('aria-describedby', selectionId);
1852
1853                    Utils.StoreData($selection[0], 'data', selection);
1854
1855                    $selections.push($selection);
1856                }
1857
1858                var $rendered = this.$selection.find('.select2-selection__rendered');
1859
1860                $rendered.append($selections);
1861            };
1862
1863            return MultipleSelection;
1864        });
1865
1866        S2.define('select2/selection/placeholder',[
1867
1868        ], function () {
1869            function Placeholder (decorated, $element, options) {
1870                this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
1871
1872                decorated.call(this, $element, options);
1873            }
1874
1875            Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
1876                if (typeof placeholder === 'string') {
1877                    placeholder = {
1878                        id: '',
1879                        text: placeholder
1880                    };
1881                }
1882
1883                return placeholder;
1884            };
1885
1886            Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
1887                var $placeholder = this.selectionContainer();
1888
1889                $placeholder.html(this.display(placeholder));
1890                $placeholder[0].classList.add('select2-selection__placeholder');
1891                $placeholder[0].classList.remove('select2-selection__choice');
1892
1893                var placeholderTitle = placeholder.title ||
1894                    placeholder.text ||
1895                    $placeholder.text();
1896
1897                this.$selection.find('.select2-selection__rendered').attr(
1898                    'title',
1899                    placeholderTitle
1900                );
1901
1902                return $placeholder;
1903            };
1904
1905            Placeholder.prototype.update = function (decorated, data) {
1906                var singlePlaceholder = (
1907                    data.length == 1 && data[0].id != this.placeholder.id
1908                );
1909                var multipleSelections = data.length > 1;
1910
1911                if (multipleSelections || singlePlaceholder) {
1912                    return decorated.call(this, data);
1913                }
1914
1915                this.clear();
1916
1917                var $placeholder = this.createPlaceholder(this.placeholder);
1918
1919                this.$selection.find('.select2-selection__rendered').append($placeholder);
1920            };
1921
1922            return Placeholder;
1923        });
1924
1925        S2.define('select2/selection/allowClear',[
1926            'jquery',
1927            '../keys',
1928            '../utils'
1929        ], function ($, KEYS, Utils) {
1930            function AllowClear () { }
1931
1932            AllowClear.prototype.bind = function (decorated, container, $container) {
1933                var self = this;
1934
1935                decorated.call(this, container, $container);
1936
1937                if (this.placeholder == null) {
1938                    if (this.options.get('debug') && window.console && console.error) {
1939                        console.error(
1940                            'Select2: The `allowClear` option should be used in combination ' +
1941                            'with the `placeholder` option.'
1942                        );
1943                    }
1944                }
1945
1946                this.$selection.on('mousedown', '.select2-selection__clear',
1947                    function (evt) {
1948                        self._handleClear(evt);
1949                    });
1950
1951                container.on('keypress', function (evt) {
1952                    self._handleKeyboardClear(evt, container);
1953                });
1954            };
1955
1956            AllowClear.prototype._handleClear = function (_, evt) {
1957                // Ignore the event if it is disabled
1958                if (this.isDisabled()) {
1959                    return;
1960                }
1961
1962                var $clear = this.$selection.find('.select2-selection__clear');
1963
1964                // Ignore the event if nothing has been selected
1965                if ($clear.length === 0) {
1966                    return;
1967                }
1968
1969                evt.stopPropagation();
1970
1971                var data = Utils.GetData($clear[0], 'data');
1972
1973                var previousVal = this.$element.val();
1974                this.$element.val(this.placeholder.id);
1975
1976                var unselectData = {
1977                    data: data
1978                };
1979                this.trigger('clear', unselectData);
1980                if (unselectData.prevented) {
1981                    this.$element.val(previousVal);
1982                    return;
1983                }
1984
1985                for (var d = 0; d < data.length; d++) {
1986                    unselectData = {
1987                        data: data[d]
1988                    };
1989
1990                    // Trigger the `unselect` event, so people can prevent it from being
1991                    // cleared.
1992                    this.trigger('unselect', unselectData);
1993
1994                    // If the event was prevented, don't clear it out.
1995                    if (unselectData.prevented) {
1996                        this.$element.val(previousVal);
1997                        return;
1998                    }
1999                }
2000
2001                this.$element.trigger('input').trigger('change');
2002
2003                this.trigger('toggle', {});
2004            };
2005
2006            AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
2007                if (container.isOpen()) {
2008                    return;
2009                }
2010
2011                if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
2012                    this._handleClear(evt);
2013                }
2014            };
2015
2016            AllowClear.prototype.update = function (decorated, data) {
2017                decorated.call(this, data);
2018
2019                this.$selection.find('.select2-selection__clear').remove();
2020                this.$selection[0].classList.remove('select2-selection--clearable');
2021
2022                if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
2023                    data.length === 0) {
2024                    return;
2025                }
2026
2027                var selectionId = this.$selection.find('.select2-selection__rendered')
2028                    .attr('id');
2029
2030                var removeAll = this.options.get('translations').get('removeAllItems');
2031
2032                var $remove = $(
2033                    '<button type="button" class="select2-selection__clear" tabindex="-1">' +
2034                    '<span aria-hidden="true">&times;</span>' +
2035                    '</button>'
2036                );
2037                $remove.attr('title', removeAll());
2038                $remove.attr('aria-label', removeAll());
2039                $remove.attr('aria-describedby', selectionId);
2040                Utils.StoreData($remove[0], 'data', data);
2041
2042                this.$selection.prepend($remove);
2043                this.$selection[0].classList.add('select2-selection--clearable');
2044            };
2045
2046            return AllowClear;
2047        });
2048
2049        S2.define('select2/selection/search',[
2050            'jquery',
2051            '../utils',
2052            '../keys'
2053        ], function ($, Utils, KEYS) {
2054            function Search (decorated, $element, options) {
2055                decorated.call(this, $element, options);
2056            }
2057
2058            Search.prototype.render = function (decorated) {
2059                var searchLabel = this.options.get('translations').get('search');
2060                var $search = $(
2061                    '<span class="select2-search select2-search--inline">' +
2062                    '<textarea class="select2-search__field"'+
2063                    ' type="search" tabindex="-1"' +
2064                    ' autocorrect="off" autocapitalize="none"' +
2065                    ' spellcheck="false" role="searchbox" aria-autocomplete="list" >' +
2066                    '</textarea>' +
2067                    '</span>'
2068                );
2069
2070                this.$searchContainer = $search;
2071                this.$search = $search.find('textarea');
2072
2073                this.$search.prop('autocomplete', this.options.get('autocomplete'));
2074                this.$search.attr('aria-label', searchLabel());
2075
2076                var $rendered = decorated.call(this);
2077
2078                this._transferTabIndex();
2079                $rendered.append(this.$searchContainer);
2080
2081                return $rendered;
2082            };
2083
2084            Search.prototype.bind = function (decorated, container, $container) {
2085                var self = this;
2086
2087                var resultsId = container.id + '-results';
2088                var selectionId = container.id + '-container';
2089
2090                decorated.call(this, container, $container);
2091
2092                self.$search.attr('aria-describedby', selectionId);
2093
2094                container.on('open', function () {
2095                    self.$search.attr('aria-controls', resultsId);
2096                    self.$search.trigger('focus');
2097                });
2098
2099                container.on('close', function () {
2100                    self.$search.val('');
2101                    self.resizeSearch();
2102                    self.$search.removeAttr('aria-controls');
2103                    self.$search.removeAttr('aria-activedescendant');
2104                    self.$search.trigger('focus');
2105                });
2106
2107                container.on('enable', function () {
2108                    self.$search.prop('disabled', false);
2109
2110                    self._transferTabIndex();
2111                });
2112
2113                container.on('disable', function () {
2114                    self.$search.prop('disabled', true);
2115                });
2116
2117                container.on('focus', function (evt) {
2118                    self.$search.trigger('focus');
2119                });
2120
2121                container.on('results:focus', function (params) {
2122                    if (params.data._resultId) {
2123                        self.$search.attr('aria-activedescendant', params.data._resultId);
2124                    } else {
2125                        self.$search.removeAttr('aria-activedescendant');
2126                    }
2127                });
2128
2129                this.$selection.on('focusin', '.select2-search--inline', function (evt) {
2130                    self.trigger('focus', evt);
2131                });
2132
2133                this.$selection.on('focusout', '.select2-search--inline', function (evt) {
2134                    self._handleBlur(evt);
2135                });
2136
2137                this.$selection.on('keydown', '.select2-search--inline', function (evt) {
2138                    evt.stopPropagation();
2139
2140                    self.trigger('keypress', evt);
2141
2142                    self._keyUpPrevented = evt.isDefaultPrevented();
2143
2144                    var key = evt.which;
2145
2146                    if (key === KEYS.BACKSPACE && self.$search.val() === '') {
2147                        var $previousChoice = self.$selection
2148                            .find('.select2-selection__choice').last();
2149
2150                        if ($previousChoice.length > 0) {
2151                            var item = Utils.GetData($previousChoice[0], 'data');
2152
2153                            self.searchRemoveChoice(item);
2154
2155                            evt.preventDefault();
2156                        }
2157                    }
2158                });
2159
2160                this.$selection.on('click', '.select2-search--inline', function (evt) {
2161                    if (self.$search.val()) {
2162                        evt.stopPropagation();
2163                    }
2164                });
2165
2166                // Try to detect the IE version should the `documentMode` property that
2167                // is stored on the document. This is only implemented in IE and is
2168                // slightly cleaner than doing a user agent check.
2169                // This property is not available in Edge, but Edge also doesn't have
2170                // this bug.
2171                var msie = document.documentMode;
2172                var disableInputEvents = msie && msie <= 11;
2173
2174                // Workaround for browsers which do not support the `input` event
2175                // This will prevent double-triggering of events for browsers which support
2176                // both the `keyup` and `input` events.
2177                this.$selection.on(
2178                    'input.searchcheck',
2179                    '.select2-search--inline',
2180                    function (evt) {
2181                        // IE will trigger the `input` event when a placeholder is used on a
2182                        // search box. To get around this issue, we are forced to ignore all
2183                        // `input` events in IE and keep using `keyup`.
2184                        if (disableInputEvents) {
2185                            self.$selection.off('input.search input.searchcheck');
2186                            return;
2187                        }
2188
2189                        // Unbind the duplicated `keyup` event
2190                        self.$selection.off('keyup.search');
2191                    }
2192                );
2193
2194                this.$selection.on(
2195                    'keyup.search input.search',
2196                    '.select2-search--inline',
2197                    function (evt) {
2198                        // IE will trigger the `input` event when a placeholder is used on a
2199                        // search box. To get around this issue, we are forced to ignore all
2200                        // `input` events in IE and keep using `keyup`.
2201                        if (disableInputEvents && evt.type === 'input') {
2202                            self.$selection.off('input.search input.searchcheck');
2203                            return;
2204                        }
2205
2206                        var key = evt.which;
2207
2208                        // We can freely ignore events from modifier keys
2209                        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
2210                            return;
2211                        }
2212
2213                        // Tabbing will be handled during the `keydown` phase
2214                        if (key == KEYS.TAB) {
2215                            return;
2216                        }
2217
2218                        self.handleSearch(evt);
2219                    }
2220                );
2221            };
2222
2223            /**
2224             * This method will transfer the tabindex attribute from the rendered
2225             * selection to the search box. This allows for the search box to be used as
2226             * the primary focus instead of the selection container.
2227             *
2228             * @private
2229             */
2230            Search.prototype._transferTabIndex = function (decorated) {
2231                this.$search.attr('tabindex', this.$selection.attr('tabindex'));
2232                this.$selection.attr('tabindex', '-1');
2233            };
2234
2235            Search.prototype.createPlaceholder = function (decorated, placeholder) {
2236                this.$search.attr('placeholder', placeholder.text);
2237            };
2238
2239            Search.prototype.update = function (decorated, data) {
2240                var searchHadFocus = this.$search[0] == document.activeElement;
2241
2242                this.$search.attr('placeholder', '');
2243
2244                decorated.call(this, data);
2245
2246                this.resizeSearch();
2247                if (searchHadFocus) {
2248                    this.$search.trigger('focus');
2249                }
2250            };
2251
2252            Search.prototype.handleSearch = function () {
2253                this.resizeSearch();
2254
2255                if (!this._keyUpPrevented) {
2256                    var input = this.$search.val();
2257
2258                    this.trigger('query', {
2259                        term: input
2260                    });
2261                }
2262
2263                this._keyUpPrevented = false;
2264            };
2265
2266            Search.prototype.searchRemoveChoice = function (decorated, item) {
2267                this.trigger('unselect', {
2268                    data: item
2269                });
2270
2271                this.$search.val(item.text);
2272                this.handleSearch();
2273            };
2274
2275            Search.prototype.resizeSearch = function () {
2276                this.$search.css('width', '25px');
2277
2278                var width = '100%';
2279
2280                if (this.$search.attr('placeholder') === '') {
2281                    var minimumWidth = this.$search.val().length + 1;
2282
2283                    width = (minimumWidth * 0.75) + 'em';
2284                }
2285
2286                this.$search.css('width', width);
2287            };
2288
2289            return Search;
2290        });
2291
2292        S2.define('select2/selection/selectionCss',[
2293            '../utils'
2294        ], function (Utils) {
2295            function SelectionCSS () { }
2296
2297            SelectionCSS.prototype.render = function (decorated) {
2298                var $selection = decorated.call(this);
2299
2300                var selectionCssClass = this.options.get('selectionCssClass') || '';
2301
2302                if (selectionCssClass.indexOf(':all:') !== -1) {
2303                    selectionCssClass = selectionCssClass.replace(':all:', '');
2304
2305                    Utils.copyNonInternalCssClasses($selection[0], this.$element[0]);
2306                }
2307
2308                $selection.addClass(selectionCssClass);
2309
2310                return $selection;
2311            };
2312
2313            return SelectionCSS;
2314        });
2315
2316        S2.define('select2/selection/eventRelay',[
2317            'jquery'
2318        ], function ($) {
2319            function EventRelay () { }
2320
2321            EventRelay.prototype.bind = function (decorated, container, $container) {
2322                var self = this;
2323                var relayEvents = [
2324                    'open', 'opening',
2325                    'close', 'closing',
2326                    'select', 'selecting',
2327                    'unselect', 'unselecting',
2328                    'clear', 'clearing'
2329                ];
2330
2331                var preventableEvents = [
2332                    'opening', 'closing', 'selecting', 'unselecting', 'clearing'
2333                ];
2334
2335                decorated.call(this, container, $container);
2336
2337                container.on('*', function (name, params) {
2338                    // Ignore events that should not be relayed
2339                    if (relayEvents.indexOf(name) === -1) {
2340                        return;
2341                    }
2342
2343                    // The parameters should always be an object
2344                    params = params || {};
2345
2346                    // Generate the jQuery event for the Select2 event
2347                    var evt = $.Event('select2:' + name, {
2348                        params: params
2349                    });
2350
2351                    self.$element.trigger(evt);
2352
2353                    // Only handle preventable events if it was one
2354                    if (preventableEvents.indexOf(name) === -1) {
2355                        return;
2356                    }
2357
2358                    params.prevented = evt.isDefaultPrevented();
2359                });
2360            };
2361
2362            return EventRelay;
2363        });
2364
2365        S2.define('select2/translation',[
2366            'jquery',
2367            'require'
2368        ], function ($, require) {
2369            function Translation (dict) {
2370                this.dict = dict || {};
2371            }
2372
2373            Translation.prototype.all = function () {
2374                return this.dict;
2375            };
2376
2377            Translation.prototype.get = function (key) {
2378                return this.dict[key];
2379            };
2380
2381            Translation.prototype.extend = function (translation) {
2382                this.dict = $.extend({}, translation.all(), this.dict);
2383            };
2384
2385            // Static functions
2386
2387            Translation._cache = {};
2388
2389            Translation.loadPath = function (path) {
2390                if (!(path in Translation._cache)) {
2391                    var translations = require(path);
2392
2393                    Translation._cache[path] = translations;
2394                }
2395
2396                return new Translation(Translation._cache[path]);
2397            };
2398
2399            return Translation;
2400        });
2401
2402        S2.define('select2/diacritics',[
2403
2404        ], function () {
2405            var diacritics = {
2406                '\u24B6': 'A',
2407                '\uFF21': 'A',
2408                '\u00C0': 'A',
2409                '\u00C1': 'A',
2410                '\u00C2': 'A',
2411                '\u1EA6': 'A',
2412                '\u1EA4': 'A',
2413                '\u1EAA': 'A',
2414                '\u1EA8': 'A',
2415                '\u00C3': 'A',
2416                '\u0100': 'A',
2417                '\u0102': 'A',
2418                '\u1EB0': 'A',
2419                '\u1EAE': 'A',
2420                '\u1EB4': 'A',
2421                '\u1EB2': 'A',
2422                '\u0226': 'A',
2423                '\u01E0': 'A',
2424                '\u00C4': 'A',
2425                '\u01DE': 'A',
2426                '\u1EA2': 'A',
2427                '\u00C5': 'A',
2428                '\u01FA': 'A',
2429                '\u01CD': 'A',
2430                '\u0200': 'A',
2431                '\u0202': 'A',
2432                '\u1EA0': 'A',
2433                '\u1EAC': 'A',
2434                '\u1EB6': 'A',
2435                '\u1E00': 'A',
2436                '\u0104': 'A',
2437                '\u023A': 'A',
2438                '\u2C6F': 'A',
2439                '\uA732': 'AA',
2440                '\u00C6': 'AE',
2441                '\u01FC': 'AE',
2442                '\u01E2': 'AE',
2443                '\uA734': 'AO',
2444                '\uA736': 'AU',
2445                '\uA738': 'AV',
2446                '\uA73A': 'AV',
2447                '\uA73C': 'AY',
2448                '\u24B7': 'B',
2449                '\uFF22': 'B',
2450                '\u1E02': 'B',
2451                '\u1E04': 'B',
2452                '\u1E06': 'B',
2453                '\u0243': 'B',
2454                '\u0182': 'B',
2455                '\u0181': 'B',
2456                '\u24B8': 'C',
2457                '\uFF23': 'C',
2458                '\u0106': 'C',
2459                '\u0108': 'C',
2460                '\u010A': 'C',
2461                '\u010C': 'C',
2462                '\u00C7': 'C',
2463                '\u1E08': 'C',
2464                '\u0187': 'C',
2465                '\u023B': 'C',
2466                '\uA73E': 'C',
2467                '\u24B9': 'D',
2468                '\uFF24': 'D',
2469                '\u1E0A': 'D',
2470                '\u010E': 'D',
2471                '\u1E0C': 'D',
2472                '\u1E10': 'D',
2473                '\u1E12': 'D',
2474                '\u1E0E': 'D',
2475                '\u0110': 'D',
2476                '\u018B': 'D',
2477                '\u018A': 'D',
2478                '\u0189': 'D',
2479                '\uA779': 'D',
2480                '\u01F1': 'DZ',
2481                '\u01C4': 'DZ',
2482                '\u01F2': 'Dz',
2483                '\u01C5': 'Dz',
2484                '\u24BA': 'E',
2485                '\uFF25': 'E',
2486                '\u00C8': 'E',
2487                '\u00C9': 'E',
2488                '\u00CA': 'E',
2489                '\u1EC0': 'E',
2490                '\u1EBE': 'E',
2491                '\u1EC4': 'E',
2492                '\u1EC2': 'E',
2493                '\u1EBC': 'E',
2494                '\u0112': 'E',
2495                '\u1E14': 'E',
2496                '\u1E16': 'E',
2497                '\u0114': 'E',
2498                '\u0116': 'E',
2499                '\u00CB': 'E',
2500                '\u1EBA': 'E',
2501                '\u011A': 'E',
2502                '\u0204': 'E',
2503                '\u0206': 'E',
2504                '\u1EB8': 'E',
2505                '\u1EC6': 'E',
2506                '\u0228': 'E',
2507                '\u1E1C': 'E',
2508                '\u0118': 'E',
2509                '\u1E18': 'E',
2510                '\u1E1A': 'E',
2511                '\u0190': 'E',
2512                '\u018E': 'E',
2513                '\u24BB': 'F',
2514                '\uFF26': 'F',
2515                '\u1E1E': 'F',
2516                '\u0191': 'F',
2517                '\uA77B': 'F',
2518                '\u24BC': 'G',
2519                '\uFF27': 'G',
2520                '\u01F4': 'G',
2521                '\u011C': 'G',
2522                '\u1E20': 'G',
2523                '\u011E': 'G',
2524                '\u0120': 'G',
2525                '\u01E6': 'G',
2526                '\u0122': 'G',
2527                '\u01E4': 'G',
2528                '\u0193': 'G',
2529                '\uA7A0': 'G',
2530                '\uA77D': 'G',
2531                '\uA77E': 'G',
2532                '\u24BD': 'H',
2533                '\uFF28': 'H',
2534                '\u0124': 'H',
2535                '\u1E22': 'H',
2536                '\u1E26': 'H',
2537                '\u021E': 'H',
2538                '\u1E24': 'H',
2539                '\u1E28': 'H',
2540                '\u1E2A': 'H',
2541                '\u0126': 'H',
2542                '\u2C67': 'H',
2543                '\u2C75': 'H',
2544                '\uA78D': 'H',
2545                '\u24BE': 'I',
2546                '\uFF29': 'I',
2547                '\u00CC': 'I',
2548                '\u00CD': 'I',
2549                '\u00CE': 'I',
2550                '\u0128': 'I',
2551                '\u012A': 'I',
2552                '\u012C': 'I',
2553                '\u0130': 'I',
2554                '\u00CF': 'I',
2555                '\u1E2E': 'I',
2556                '\u1EC8': 'I',
2557                '\u01CF': 'I',
2558                '\u0208': 'I',
2559                '\u020A': 'I',
2560                '\u1ECA': 'I',
2561                '\u012E': 'I',
2562                '\u1E2C': 'I',
2563                '\u0197': 'I',
2564                '\u24BF': 'J',
2565                '\uFF2A': 'J',
2566                '\u0134': 'J',
2567                '\u0248': 'J',
2568                '\u24C0': 'K',
2569                '\uFF2B': 'K',
2570                '\u1E30': 'K',
2571                '\u01E8': 'K',
2572                '\u1E32': 'K',
2573                '\u0136': 'K',
2574                '\u1E34': 'K',
2575                '\u0198': 'K',
2576                '\u2C69': 'K',
2577                '\uA740': 'K',
2578                '\uA742': 'K',
2579                '\uA744': 'K',
2580                '\uA7A2': 'K',
2581                '\u24C1': 'L',
2582                '\uFF2C': 'L',
2583                '\u013F': 'L',
2584                '\u0139': 'L',
2585                '\u013D': 'L',
2586                '\u1E36': 'L',
2587                '\u1E38': 'L',
2588                '\u013B': 'L',
2589                '\u1E3C': 'L',
2590                '\u1E3A': 'L',
2591                '\u0141': 'L',
2592                '\u023D': 'L',
2593                '\u2C62': 'L',
2594                '\u2C60': 'L',
2595                '\uA748': 'L',
2596                '\uA746': 'L',
2597                '\uA780': 'L',
2598                '\u01C7': 'LJ',
2599                '\u01C8': 'Lj',
2600                '\u24C2': 'M',
2601                '\uFF2D': 'M',
2602                '\u1E3E': 'M',
2603                '\u1E40': 'M',
2604                '\u1E42': 'M',
2605                '\u2C6E': 'M',
2606                '\u019C': 'M',
2607                '\u24C3': 'N',
2608                '\uFF2E': 'N',
2609                '\u01F8': 'N',
2610                '\u0143': 'N',
2611                '\u00D1': 'N',
2612                '\u1E44': 'N',
2613                '\u0147': 'N',
2614                '\u1E46': 'N',
2615                '\u0145': 'N',
2616                '\u1E4A': 'N',
2617                '\u1E48': 'N',
2618                '\u0220': 'N',
2619                '\u019D': 'N',
2620                '\uA790': 'N',
2621                '\uA7A4': 'N',
2622                '\u01CA': 'NJ',
2623                '\u01CB': 'Nj',
2624                '\u24C4': 'O',
2625                '\uFF2F': 'O',
2626                '\u00D2': 'O',
2627                '\u00D3': 'O',
2628                '\u00D4': 'O',
2629                '\u1ED2': 'O',
2630                '\u1ED0': 'O',
2631                '\u1ED6': 'O',
2632                '\u1ED4': 'O',
2633                '\u00D5': 'O',
2634                '\u1E4C': 'O',
2635                '\u022C': 'O',
2636                '\u1E4E': 'O',
2637                '\u014C': 'O',
2638                '\u1E50': 'O',
2639                '\u1E52': 'O',
2640                '\u014E': 'O',
2641                '\u022E': 'O',
2642                '\u0230': 'O',
2643                '\u00D6': 'O',
2644                '\u022A': 'O',
2645                '\u1ECE': 'O',
2646                '\u0150': 'O',
2647                '\u01D1': 'O',
2648                '\u020C': 'O',
2649                '\u020E': 'O',
2650                '\u01A0': 'O',
2651                '\u1EDC': 'O',
2652                '\u1EDA': 'O',
2653                '\u1EE0': 'O',
2654                '\u1EDE': 'O',
2655                '\u1EE2': 'O',
2656                '\u1ECC': 'O',
2657                '\u1ED8': 'O',
2658                '\u01EA': 'O',
2659                '\u01EC': 'O',
2660                '\u00D8': 'O',
2661                '\u01FE': 'O',
2662                '\u0186': 'O',
2663                '\u019F': 'O',
2664                '\uA74A': 'O',
2665                '\uA74C': 'O',
2666                '\u0152': 'OE',
2667                '\u01A2': 'OI',
2668                '\uA74E': 'OO',
2669                '\u0222': 'OU',
2670                '\u24C5': 'P',
2671                '\uFF30': 'P',
2672                '\u1E54': 'P',
2673                '\u1E56': 'P',
2674                '\u01A4': 'P',
2675                '\u2C63': 'P',
2676                '\uA750': 'P',
2677                '\uA752': 'P',
2678                '\uA754': 'P',
2679                '\u24C6': 'Q',
2680                '\uFF31': 'Q',
2681                '\uA756': 'Q',
2682                '\uA758': 'Q',
2683                '\u024A': 'Q',
2684                '\u24C7': 'R',
2685                '\uFF32': 'R',
2686                '\u0154': 'R',
2687                '\u1E58': 'R',
2688                '\u0158': 'R',
2689                '\u0210': 'R',
2690                '\u0212': 'R',
2691                '\u1E5A': 'R',
2692                '\u1E5C': 'R',
2693                '\u0156': 'R',
2694                '\u1E5E': 'R',
2695                '\u024C': 'R',
2696                '\u2C64': 'R',
2697                '\uA75A': 'R',
2698                '\uA7A6': 'R',
2699                '\uA782': 'R',
2700                '\u24C8': 'S',
2701                '\uFF33': 'S',
2702                '\u1E9E': 'S',
2703                '\u015A': 'S',
2704                '\u1E64': 'S',
2705                '\u015C': 'S',
2706                '\u1E60': 'S',
2707                '\u0160': 'S',
2708                '\u1E66': 'S',
2709                '\u1E62': 'S',
2710                '\u1E68': 'S',
2711                '\u0218': 'S',
2712                '\u015E': 'S',
2713                '\u2C7E': 'S',
2714                '\uA7A8': 'S',
2715                '\uA784': 'S',
2716                '\u24C9': 'T',
2717                '\uFF34': 'T',
2718                '\u1E6A': 'T',
2719                '\u0164': 'T',
2720                '\u1E6C': 'T',
2721                '\u021A': 'T',
2722                '\u0162': 'T',
2723                '\u1E70': 'T',
2724                '\u1E6E': 'T',
2725                '\u0166': 'T',
2726                '\u01AC': 'T',
2727                '\u01AE': 'T',
2728                '\u023E': 'T',
2729                '\uA786': 'T',
2730                '\uA728': 'TZ',
2731                '\u24CA': 'U',
2732                '\uFF35': 'U',
2733                '\u00D9': 'U',
2734                '\u00DA': 'U',
2735                '\u00DB': 'U',
2736                '\u0168': 'U',
2737                '\u1E78': 'U',
2738                '\u016A': 'U',
2739                '\u1E7A': 'U',
2740                '\u016C': 'U',
2741                '\u00DC': 'U',
2742                '\u01DB': 'U',
2743                '\u01D7': 'U',
2744                '\u01D5': 'U',
2745                '\u01D9': 'U',
2746                '\u1EE6': 'U',
2747                '\u016E': 'U',
2748                '\u0170': 'U',
2749                '\u01D3': 'U',
2750                '\u0214': 'U',
2751                '\u0216': 'U',
2752                '\u01AF': 'U',
2753                '\u1EEA': 'U',
2754                '\u1EE8': 'U',
2755                '\u1EEE': 'U',
2756                '\u1EEC': 'U',
2757                '\u1EF0': 'U',
2758                '\u1EE4': 'U',
2759                '\u1E72': 'U',
2760                '\u0172': 'U',
2761                '\u1E76': 'U',
2762                '\u1E74': 'U',
2763                '\u0244': 'U',
2764                '\u24CB': 'V',
2765                '\uFF36': 'V',
2766                '\u1E7C': 'V',
2767                '\u1E7E': 'V',
2768                '\u01B2': 'V',
2769                '\uA75E': 'V',
2770                '\u0245': 'V',
2771                '\uA760': 'VY',
2772                '\u24CC': 'W',
2773                '\uFF37': 'W',
2774                '\u1E80': 'W',
2775                '\u1E82': 'W',
2776                '\u0174': 'W',
2777                '\u1E86': 'W',
2778                '\u1E84': 'W',
2779                '\u1E88': 'W',
2780                '\u2C72': 'W',
2781                '\u24CD': 'X',
2782                '\uFF38': 'X',
2783                '\u1E8A': 'X',
2784                '\u1E8C': 'X',
2785                '\u24CE': 'Y',
2786                '\uFF39': 'Y',
2787                '\u1EF2': 'Y',
2788                '\u00DD': 'Y',
2789                '\u0176': 'Y',
2790                '\u1EF8': 'Y',
2791                '\u0232': 'Y',
2792                '\u1E8E': 'Y',
2793                '\u0178': 'Y',
2794                '\u1EF6': 'Y',
2795                '\u1EF4': 'Y',
2796                '\u01B3': 'Y',
2797                '\u024E': 'Y',
2798                '\u1EFE': 'Y',
2799                '\u24CF': 'Z',
2800                '\uFF3A': 'Z',
2801                '\u0179': 'Z',
2802                '\u1E90': 'Z',
2803                '\u017B': 'Z',
2804                '\u017D': 'Z',
2805                '\u1E92': 'Z',
2806                '\u1E94': 'Z',
2807                '\u01B5': 'Z',
2808                '\u0224': 'Z',
2809                '\u2C7F': 'Z',
2810                '\u2C6B': 'Z',
2811                '\uA762': 'Z',
2812                '\u24D0': 'a',
2813                '\uFF41': 'a',
2814                '\u1E9A': 'a',
2815                '\u00E0': 'a',
2816                '\u00E1': 'a',
2817                '\u00E2': 'a',
2818                '\u1EA7': 'a',
2819                '\u1EA5': 'a',
2820                '\u1EAB': 'a',
2821                '\u1EA9': 'a',
2822                '\u00E3': 'a',
2823                '\u0101': 'a',
2824                '\u0103': 'a',
2825                '\u1EB1': 'a',
2826                '\u1EAF': 'a',
2827                '\u1EB5': 'a',
2828                '\u1EB3': 'a',
2829                '\u0227': 'a',
2830                '\u01E1': 'a',
2831                '\u00E4': 'a',
2832                '\u01DF': 'a',
2833                '\u1EA3': 'a',
2834                '\u00E5': 'a',
2835                '\u01FB': 'a',
2836                '\u01CE': 'a',
2837                '\u0201': 'a',
2838                '\u0203': 'a',
2839                '\u1EA1': 'a',
2840                '\u1EAD': 'a',
2841                '\u1EB7': 'a',
2842                '\u1E01': 'a',
2843                '\u0105': 'a',
2844                '\u2C65': 'a',
2845                '\u0250': 'a',
2846                '\uA733': 'aa',
2847                '\u00E6': 'ae',
2848                '\u01FD': 'ae',
2849                '\u01E3': 'ae',
2850                '\uA735': 'ao',
2851                '\uA737': 'au',
2852                '\uA739': 'av',
2853                '\uA73B': 'av',
2854                '\uA73D': 'ay',
2855                '\u24D1': 'b',
2856                '\uFF42': 'b',
2857                '\u1E03': 'b',
2858                '\u1E05': 'b',
2859                '\u1E07': 'b',
2860                '\u0180': 'b',
2861                '\u0183': 'b',
2862                '\u0253': 'b',
2863                '\u24D2': 'c',
2864                '\uFF43': 'c',
2865                '\u0107': 'c',
2866                '\u0109': 'c',
2867                '\u010B': 'c',
2868                '\u010D': 'c',
2869                '\u00E7': 'c',
2870                '\u1E09': 'c',
2871                '\u0188': 'c',
2872                '\u023C': 'c',
2873                '\uA73F': 'c',
2874                '\u2184': 'c',
2875                '\u24D3': 'd',
2876                '\uFF44': 'd',
2877                '\u1E0B': 'd',
2878                '\u010F': 'd',
2879                '\u1E0D': 'd',
2880                '\u1E11': 'd',
2881                '\u1E13': 'd',
2882                '\u1E0F': 'd',
2883                '\u0111': 'd',
2884                '\u018C': 'd',
2885                '\u0256': 'd',
2886                '\u0257': 'd',
2887                '\uA77A': 'd',
2888                '\u01F3': 'dz',
2889                '\u01C6': 'dz',
2890                '\u24D4': 'e',
2891                '\uFF45': 'e',
2892                '\u00E8': 'e',
2893                '\u00E9': 'e',
2894                '\u00EA': 'e',
2895                '\u1EC1': 'e',
2896                '\u1EBF': 'e',
2897                '\u1EC5': 'e',
2898                '\u1EC3': 'e',
2899                '\u1EBD': 'e',
2900                '\u0113': 'e',
2901                '\u1E15': 'e',
2902                '\u1E17': 'e',
2903                '\u0115': 'e',
2904                '\u0117': 'e',
2905                '\u00EB': 'e',
2906                '\u1EBB': 'e',
2907                '\u011B': 'e',
2908                '\u0205': 'e',
2909                '\u0207': 'e',
2910                '\u1EB9': 'e',
2911                '\u1EC7': 'e',
2912                '\u0229': 'e',
2913                '\u1E1D': 'e',
2914                '\u0119': 'e',
2915                '\u1E19': 'e',
2916                '\u1E1B': 'e',
2917                '\u0247': 'e',
2918                '\u025B': 'e',
2919                '\u01DD': 'e',
2920                '\u24D5': 'f',
2921                '\uFF46': 'f',
2922                '\u1E1F': 'f',
2923                '\u0192': 'f',
2924                '\uA77C': 'f',
2925                '\u24D6': 'g',
2926                '\uFF47': 'g',
2927                '\u01F5': 'g',
2928                '\u011D': 'g',
2929                '\u1E21': 'g',
2930                '\u011F': 'g',
2931                '\u0121': 'g',
2932             
2932   '\u01E7': 'g',
2933                '\u0123': 'g',
2934                '\u01E5': 'g',
2935                '\u0260': 'g',
2936                '\uA7A1': 'g',
2937                '\u1D79': 'g',
2938                '\uA77F': 'g',
2939                '\u24D7': 'h',
2940                '\uFF48': 'h',
2941                '\u0125': 'h',
2942                '\u1E23': 'h',
2943                '\u1E27': 'h',
2944                '\u021F': 'h',
2945                '\u1E25': 'h',
2946                '\u1E29': 'h',
2947                '\u1E2B': 'h',
2948                '\u1E96': 'h',
2949                '\u0127': 'h',
2950                '\u2C68': 'h',
2951                '\u2C76': 'h',
2952                '\u0265': 'h',
2953                '\u0195': 'hv',
2954                '\u24D8': 'i',
2955                '\uFF49': 'i',
2956                '\u00EC': 'i',
2957                '\u00ED': 'i',
2958                '\u00EE': 'i',
2959                '\u0129': 'i',
2960                '\u012B': 'i',
2961                '\u012D': 'i',
2962                '\u00EF': 'i',
2963                '\u1E2F': 'i',
2964                '\u1EC9': 'i',
2965                '\u01D0': 'i',
2966                '\u0209': 'i',
2967                '\u020B': 'i',
2968                '\u1ECB': 'i',
2969                '\u012F': 'i',
2970                '\u1E2D': 'i',
2971                '\u0268': 'i',
2972                '\u0131': 'i',
2973                '\u24D9': 'j',
2974                '\uFF4A': 'j',
2975                '\u0135': 'j',
2976                '\u01F0': 'j',
2977                '\u0249': 'j',
2978                '\u24DA': 'k',
2979                '\uFF4B': 'k',
2980                '\u1E31': 'k',
2981                '\u01E9': 'k',
2982                '\u1E33': 'k',
2983                '\u0137': 'k',
2984                '\u1E35': 'k',
2985                '\u0199': 'k',
2986                '\u2C6A': 'k',
2987                '\uA741': 'k',
2988                '\uA743': 'k',
2989                '\uA745': 'k',
2990                '\uA7A3': 'k',
2991                '\u24DB': 'l',
2992                '\uFF4C': 'l',
2993                '\u0140': 'l',
2994                '\u013A': 'l',
2995                '\u013E': 'l',
2996                '\u1E37': 'l',
2997                '\u1E39': 'l',
2998                '\u013C': 'l',
2999                '\u1E3D': 'l',
3000                '\u1E3B': 'l',
3001                '\u017F': 'l',
3002                '\u0142': 'l',
3003                '\u019A': 'l',
3004                '\u026B': 'l',
3005                '\u2C61': 'l',
3006                '\uA749': 'l',
3007                '\uA781': 'l',
3008                '\uA747': 'l',
3009                '\u01C9': 'lj',
3010                '\u24DC': 'm',
3011                '\uFF4D': 'm',
3012                '\u1E3F': 'm',
3013                '\u1E41': 'm',
3014                '\u1E43': 'm',
3015                '\u0271': 'm',
3016                '\u026F': 'm',
3017                '\u24DD': 'n',
3018                '\uFF4E': 'n',
3019                '\u01F9': 'n',
3020                '\u0144': 'n',
3021                '\u00F1': 'n',
3022                '\u1E45': 'n',
3023                '\u0148': 'n',
3024                '\u1E47': 'n',
3025                '\u0146': 'n',
3026                '\u1E4B': 'n',
3027                '\u1E49': 'n',
3028                '\u019E': 'n',
3029                '\u0272': 'n',
3030                '\u0149': 'n',
3031                '\uA791': 'n',
3032                '\uA7A5': 'n',
3033                '\u01CC': 'nj',
3034                '\u24DE': 'o',
3035                '\uFF4F': 'o',
3036                '\u00F2': 'o',
3037                '\u00F3': 'o',
3038                '\u00F4': 'o',
3039                '\u1ED3': 'o',
3040                '\u1ED1': 'o',
3041                '\u1ED7': 'o',
3042                '\u1ED5': 'o',
3043                '\u00F5': 'o',
3044                '\u1E4D': 'o',
3045                '\u022D': 'o',
3046                '\u1E4F': 'o',
3047                '\u014D': 'o',
3048                '\u1E51': 'o',
3049                '\u1E53': 'o',
3050                '\u014F': 'o',
3051                '\u022F': 'o',
3052                '\u0231': 'o',
3053                '\u00F6': 'o',
3054                '\u022B': 'o',
3055                '\u1ECF': 'o',
3056                '\u0151': 'o',
3057                '\u01D2': 'o',
3058                '\u020D': 'o',
3059                '\u020F': 'o',
3060                '\u01A1': 'o',
3061                '\u1EDD': 'o',
3062                '\u1EDB': 'o',
3063                '\u1EE1': 'o',
3064                '\u1EDF': 'o',
3065                '\u1EE3': 'o',
3066                '\u1ECD': 'o',
3067                '\u1ED9': 'o',
3068                '\u01EB': 'o',
3069                '\u01ED': 'o',
3070                '\u00F8': 'o',
3071                '\u01FF': 'o',
3072                '\u0254': 'o',
3073                '\uA74B': 'o',
3074                '\uA74D': 'o',
3075                '\u0275': 'o',
3076                '\u0153': 'oe',
3077                '\u01A3': 'oi',
3078                '\u0223': 'ou',
3079                '\uA74F': 'oo',
3080                '\u24DF': 'p',
3081                '\uFF50': 'p',
3082                '\u1E55': 'p',
3083                '\u1E57': 'p',
3084                '\u01A5': 'p',
3085                '\u1D7D': 'p',
3086                '\uA751': 'p',
3087                '\uA753': 'p',
3088                '\uA755': 'p',
3089                '\u24E0': 'q',
3090                '\uFF51': 'q',
3091                '\u024B': 'q',
3092                '\uA757': 'q',
3093                '\uA759': 'q',
3094                '\u24E1': 'r',
3095                '\uFF52': 'r',
3096                '\u0155': 'r',
3097                '\u1E59': 'r',
3098                '\u0159': 'r',
3099                '\u0211': 'r',
3100                '\u0213': 'r',
3101                '\u1E5B': 'r',
3102                '\u1E5D': 'r',
3103                '\u0157': 'r',
3104                '\u1E5F': 'r',
3105                '\u024D': 'r',
3106                '\u027D': 'r',
3107                '\uA75B': 'r',
3108                '\uA7A7': 'r',
3109                '\uA783': 'r',
vendor: 96,740 bytes, lines 3110-5887
3110                '\u24E2': 's',
3111                '\uFF53': 's',
3112                '\u00DF': 's',
3113                '\u015B': 's',
3114                '\u1E65': 's',
3115                '\u015D': 's',
3116                '\u1E61': 's',
3117                '\u0161': 's',
3118                '\u1E67': 's',
3119                '\u1E63': 's',
3120                '\u1E69': 's',
3121                '\u0219': 's',
3122                '\u015F': 's',
3123                '\u023F': 's',
3124                '\uA7A9': 's',
3125                '\uA785': 's',
3126                '\u1E9B': 's',
3127                '\u24E3': 't',
3128                '\uFF54': 't',
3129                '\u1E6B': 't',
3130                '\u1E97': 't',
3131                '\u0165': 't',
3132                '\u1E6D': 't',
3133                '\u021B': 't',
3134                '\u0163': 't',
3135                '\u1E71': 't',
3136                '\u1E6F': 't',
3137                '\u0167': 't',
3138                '\u01AD': 't',
3139                '\u0288': 't',
3140                '\u2C66': 't',
3141                '\uA787': 't',
3142                '\uA729': 'tz',
3143                '\u24E4': 'u',
3144                '\uFF55': 'u',
3145                '\u00F9': 'u',
3146                '\u00FA': 'u',
3147                '\u00FB': 'u',
3148                '\u0169': 'u',
3149                '\u1E79': 'u',
3150                '\u016B': 'u',
3151                '\u1E7B': 'u',
3152                '\u016D': 'u',
3153                '\u00FC': 'u',
3154                '\u01DC': 'u',
3155                '\u01D8': 'u',
3156                '\u01D6': 'u',
3157                '\u01DA': 'u',
3158                '\u1EE7': 'u',
3159                '\u016F': 'u',
3160                '\u0171': 'u',
3161                '\u01D4': 'u',
3162                '\u0215': 'u',
3163                '\u0217': 'u',
3164                '\u01B0': 'u',
3165                '\u1EEB': 'u',
3166                '\u1EE9': 'u',
3167                '\u1EEF': 'u',
3168                '\u1EED': 'u',
3169                '\u1EF1': 'u',
3170                '\u1EE5': 'u',
3171                '\u1E73': 'u',
3172                '\u0173': 'u',
3173                '\u1E77': 'u',
3174                '\u1E75': 'u',
3175                '\u0289': 'u',
3176                '\u24E5': 'v',
3177                '\uFF56': 'v',
3178                '\u1E7D': 'v',
3179                '\u1E7F': 'v',
3180                '\u028B': 'v',
3181                '\uA75F': 'v',
3182                '\u028C': 'v',
3183                '\uA761': 'vy',
3184                '\u24E6': 'w',
3185                '\uFF57': 'w',
3186                '\u1E81': 'w',
3187                '\u1E83': 'w',
3188                '\u0175': 'w',
3189                '\u1E87': 'w',
3190                '\u1E85': 'w',
3191                '\u1E98': 'w',
3192                '\u1E89': 'w',
3193                '\u2C73': 'w',
3194                '\u24E7': 'x',
3195                '\uFF58': 'x',
3196                '\u1E8B': 'x',
3197                '\u1E8D': 'x',
3198                '\u24E8': 'y',
3199                '\uFF59': 'y',
3200                '\u1EF3': 'y',
3201                '\u00FD': 'y',
3202                '\u0177': 'y',
3203                '\u1EF9': 'y',
3204                '\u0233': 'y',
3205                '\u1E8F': 'y',
3206                '\u00FF': 'y',
3207                '\u1EF7': 'y',
3208                '\u1E99': 'y',
3209                '\u1EF5': 'y',
3210                '\u01B4': 'y',
3211                '\u024F': 'y',
3212                '\u1EFF': 'y',
3213                '\u24E9': 'z',
3214                '\uFF5A': 'z',
3215                '\u017A': 'z',
3216                '\u1E91': 'z',
3217                '\u017C': 'z',
3218                '\u017E': 'z',
3219                '\u1E93': 'z',
3220                '\u1E95': 'z',
3221                '\u01B6': 'z',
3222                '\u0225': 'z',
3223                '\u0240': 'z',
3224                '\u2C6C': 'z',
3225                '\uA763': 'z',
3226                '\u0386': '\u0391',
3227                '\u0388': '\u0395',
3228                '\u0389': '\u0397',
3229                '\u038A': '\u0399',
3230                '\u03AA': '\u0399',
3231                '\u038C': '\u039F',
3232                '\u038E': '\u03A5',
3233                '\u03AB': '\u03A5',
3234                '\u038F': '\u03A9',
3235                '\u03AC': '\u03B1',
3236                '\u03AD': '\u03B5',
3237                '\u03AE': '\u03B7',
3238                '\u03AF': '\u03B9',
3239                '\u03CA': '\u03B9',
3240                '\u0390': '\u03B9',
3241                '\u03CC': '\u03BF',
3242                '\u03CD': '\u03C5',
3243                '\u03CB': '\u03C5',
3244                '\u03B0': '\u03C5',
3245                '\u03CE': '\u03C9',
3246                '\u03C2': '\u03C3',
3247                '\u2019': '\''
3248            };
3249
3250            return diacritics;
3251        });
3252
3253        S2.define('select2/data/base',[
3254            '../utils'
3255        ], function (Utils) {
3256            function BaseAdapter ($element, options) {
3257                BaseAdapter.__super__.constructor.call(this);
3258            }
3259
3260            Utils.Extend(BaseAdapter, Utils.Observable);
3261
3262            BaseAdapter.prototype.current = function (callback) {
3263                throw new Error('The `current` method must be defined in child classes.');
3264            };
3265
3266            BaseAdapter.prototype.query = function (params, callback) {
3267                throw new Error('The `query` method must be defined in child classes.');
3268            };
3269
3270            BaseAdapter.prototype.bind = function (container, $container) {
3271                // Can be implemented in subclasses
3272            };
3273
3274            BaseAdapter.prototype.destroy = function () {
3275                // Can be implemented in subclasses
3276            };
3277
3278            BaseAdapter.prototype.generateResultId = function (container, data) {
3279                var id = container.id + '-result-';
3280
3281                id += Utils.generateChars(4);
3282
3283                if (data.id != null) {
3284                    id += '-' + data.id.toString();
3285                } else {
3286                    id += '-' + Utils.generateChars(4);
3287                }
3288                return id;
3289            };
3290
3291            return BaseAdapter;
3292        });
3293
3294        S2.define('select2/data/select',[
3295            './base',
3296            '../utils',
3297            'jquery'
3298        ], function (BaseAdapter, Utils, $) {
3299            function SelectAdapter ($element, options) {
3300                this.$element = $element;
3301                this.options = options;
3302
3303                SelectAdapter.__super__.constructor.call(this);
3304            }
3305
3306            Utils.Extend(SelectAdapter, BaseAdapter);
3307
3308            SelectAdapter.prototype.current = function (callback) {
3309                var self = this;
3310
3311                var data = Array.prototype.map.call(
3312                    this.$element[0].querySelectorAll(':checked'),
3313                    function (selectedElement) {
3314                        return self.item($(selectedElement));
3315                    }
3316                );
3317
3318                callback(data);
3319            };
3320
3321            SelectAdapter.prototype.select = function (data) {
3322                var self = this;
3323
3324                data.selected = true;
3325
3326                // If data.element is a DOM node, use it instead
3327                if (
3328                    data.element != null && data.element.tagName.toLowerCase() === 'option'
3329                ) {
3330                    data.element.selected = true;
3331
3332                    this.$element.trigger('input').trigger('change');
3333
3334                    return;
3335                }
3336
3337                if (this.$element.prop('multiple')) {
3338                    this.current(function (currentData) {
3339                        var val = [];
3340
3341                        data = [data];
3342                        data.push.apply(data, currentData);
3343
3344                        for (var d = 0; d < data.length; d++) {
3345                            var id = data[d].id;
3346
3347                            if (val.indexOf(id) === -1) {
3348                                val.push(id);
3349                            }
3350                        }
3351
3352                        self.$element.val(val);
3353                        self.$element.trigger('input').trigger('change');
3354                    });
3355                } else {
3356                    var val = data.id;
3357
3358                    this.$element.val(val);
3359                    this.$element.trigger('input').trigger('change');
3360                }
3361            };
3362
3363            SelectAdapter.prototype.unselect = function (data) {
3364                var self = this;
3365
3366                if (!this.$element.prop('multiple')) {
3367                    return;
3368                }
3369
3370                data.selected = false;
3371
3372                if (
3373                    data.element != null &&
3374                    data.element.tagName.toLowerCase() === 'option'
3375                ) {
3376                    data.element.selected = false;
3377
3378                    this.$element.trigger('input').trigger('change');
3379
3380                    return;
3381                }
3382
3383                this.current(function (currentData) {
3384                    var val = [];
3385
3386                    for (var d = 0; d < currentData.length; d++) {
3387                        var id = currentData[d].id;
3388
3389                        if (id !== data.id && val.indexOf(id) === -1) {
3390                            val.push(id);
3391                        }
3392                    }
3393
3394                    self.$element.val(val);
3395
3396                    self.$element.trigger('input').trigger('change');
3397                });
3398            };
3399
3400            SelectAdapter.prototype.bind = function (container, $container) {
3401                var self = this;
3402
3403                this.container = container;
3404
3405                container.on('select', function (params) {
3406                    self.select(params.data);
3407                });
3408
3409                container.on('unselect', function (params) {
3410                    self.unselect(params.data);
3411                });
3412            };
3413
3414            SelectAdapter.prototype.destroy = function () {
3415                // Remove anything added to child elements
3416                this.$element.find('*').each(function () {
3417                    // Remove any custom data set by Select2
3418                    Utils.RemoveData(this);
3419                });
3420            };
3421
3422            SelectAdapter.prototype.query = function (params, callback) {
3423                var data = [];
3424                var self = this;
3425
3426                var $options = this.$element.children();
3427
3428                $options.each(function () {
3429                    if (
3430                        this.tagName.toLowerCase() !== 'option' &&
3431                        this.tagName.toLowerCase() !== 'optgroup'
3432                    ) {
3433                        return;
3434                    }
3435
3436                    var $option = $(this);
3437
3438                    var option = self.item($option);
3439
3440                    var matches = self.matches(params, option);
3441
3442                    if (matches !== null) {
3443                        data.push(matches);
3444                    }
3445                });
3446
3447                callback({
3448                    results: data
3449                });
3450            };
3451
3452            SelectAdapter.prototype.addOptions = function ($options) {
3453                this.$element.append($options);
3454            };
3455
3456            SelectAdapter.prototype.option = function (data) {
3457                var option;
3458
3459                if (data.children) {
3460                    option = document.createElement('optgroup');
3461                    option.label = data.text;
3462                } else {
3463                    option = document.createElement('option');
3464
3465                    if (option.textContent !== undefined) {
3466                        option.textContent = data.text;
3467                    } else {
3468                        option.innerText = data.text;
3469                    }
3470                }
3471
3472                if (data.id !== undefined) {
3473                    option.value = data.id;
3474                }
3475
3476                if (data.disabled) {
3477                    option.disabled = true;
3478                }
3479
3480                if (data.selected) {
3481                    option.selected = true;
3482                }
3483
3484                if (data.title) {
3485                    option.title = data.title;
3486                }
3487
3488                var normalizedData = this._normalizeItem(data);
3489                normalizedData.element = option;
3490
3491                // Override the option's data with the combined data
3492                Utils.StoreData(option, 'data', normalizedData);
3493
3494                return $(option);
3495            };
3496
3497            SelectAdapter.prototype.item = function ($option) {
3498                var data = {};
3499
3500                data = Utils.GetData($option[0], 'data');
3501
3502                if (data != null) {
3503                    return data;
3504                }
3505
3506                var option = $option[0];
3507
3508                if (option.tagName.toLowerCase() === 'option') {
3509                    data = {
3510                        id: $option.val(),
3511                        text: $option.text(),
3512                        disabled: $option.prop('disabled'),
3513                        selected: $option.prop('selected'),
3514                        title: $option.prop('title')
3515                    };
3516                } else if (option.tagName.toLowerCase() === 'optgroup') {
3517                    data = {
3518                        text: $option.prop('label'),
3519                        children: [],
3520                        title: $option.prop('title')
3521                    };
3522
3523                    var $children = $option.children('option');
3524                    var children = [];
3525
3526                    for (var c = 0; c < $children.length; c++) {
3527                        var $child = $($children[c]);
3528
3529                        var child = this.item($child);
3530
3531                        children.push(child);
3532                    }
3533
3534                    data.children = children;
3535                }
3536
3537                data = this._normalizeItem(data);
3538                data.element = $option[0];
3539
3540                Utils.StoreData($option[0], 'data', data);
3541
3542                return data;
3543            };
3544
3545            SelectAdapter.prototype._normalizeItem = function (item) {
3546                if (item !== Object(item)) {
3547                    item = {
3548                        id: item,
3549                        text: item
3550                    };
3551                }
3552
3553                item = $.extend({}, {
3554                    text: ''
3555                }, item);
3556
3557                var defaults = {
3558                    selected: false,
3559                    disabled: false
3560                };
3561
3562                if (item.id != null) {
3563                    item.id = item.id.toString();
3564                }
3565
3566                if (item.text != null) {
3567                    item.text = item.text.toString();
3568                }
3569
3570                if (item._resultId == null && item.id && this.container != null) {
3571                    item._resultId = this.generateResultId(this.container, item);
3572                }
3573
3574                return $.extend({}, defaults, item);
3575            };
3576
3577            SelectAdapter.prototype.matches = function (params, data) {
3578                var matcher = this.options.get('matcher');
3579
3580                return matcher(params, data);
3581            };
3582
3583            return SelectAdapter;
3584        });
3585
3586        S2.define('select2/data/array',[
3587            './select',
3588            '../utils',
3589            'jquery'
3590        ], function (SelectAdapter, Utils, $) {
3591            function ArrayAdapter ($element, options) {
3592                this._dataToConvert = options.get('data') || [];
3593
3594                ArrayAdapter.__super__.constructor.call(this, $element, options);
3595            }
3596
3597            Utils.Extend(ArrayAdapter, SelectAdapter);
3598
3599            ArrayAdapter.prototype.bind = function (container, $container) {
3600                ArrayAdapter.__super__.bind.call(this, container, $container);
3601
3602                this.addOptions(this.convertToOptions(this._dataToConvert));
3603            };
3604
3605            ArrayAdapter.prototype.select = function (data) {
3606                var $option = this.$element.find('option').filter(function (i, elm) {
3607                    return elm.value == data.id.toString();
3608                });
3609
3610                if ($option.length === 0) {
3611                    $option = this.option(data);
3612
3613                    this.addOptions($option);
3614                }
3615
3616                ArrayAdapter.__super__.select.call(this, data);
3617            };
3618
3619            ArrayAdapter.prototype.convertToOptions = function (data) {
3620                var self = this;
3621
3622                var $existing = this.$element.find('option');
3623                var existingIds = $existing.map(function () {
3624                    return self.item($(this)).id;
3625                }).get();
3626
3627                var $options = [];
3628
3629                // Filter out all items except for the one passed in the argument
3630                function onlyItem (item) {
3631                    return function () {
3632                        return $(this).val() == item.id;
3633                    };
3634                }
3635
3636                for (var d = 0; d < data.length; d++) {
3637                    var item = this._normalizeItem(data[d]);
3638
3639                    // Skip items which were pre-loaded, only merge the data
3640                    if (existingIds.indexOf(item.id) >= 0) {
3641                        var $existingOption = $existing.filter(onlyItem(item));
3642
3643                        var existingData = this.item($existingOption);
3644                        var newData = $.extend(true, {}, item, existingData);
3645
3646                        var $newOption = this.option(newData);
3647
3648                        $existingOption.replaceWith($newOption);
3649
3650                        continue;
3651                    }
3652
3653                    var $option = this.option(item);
3654
3655                    if (item.children) {
3656                        var $children = this.convertToOptions(item.children);
3657
3658                        $option.append($children);
3659                    }
3660
3661                    $options.push($option);
3662                }
3663
3664                return $options;
3665            };
3666
3667            return ArrayAdapter;
3668        });
3669
3670        S2.define('select2/data/ajax',[
3671            './array',
3672            '../utils',
3673            'jquery'
3674        ], function (ArrayAdapter, Utils, $) {
3675            function AjaxAdapter ($element, options) {
3676                this.ajaxOptions = this._applyDefaults(options.get('ajax'));
3677
3678                if (this.ajaxOptions.processResults != null) {
3679                    this.processResults = this.ajaxOptions.processResults;
3680                }
3681
3682                AjaxAdapter.__super__.constructor.call(this, $element, options);
3683            }
3684
3685            Utils.Extend(AjaxAdapter, ArrayAdapter);
3686
3687            AjaxAdapter.prototype._applyDefaults = function (options) {
3688                var defaults = {
3689                    data: function (params) {
3690                        return $.extend({}, params, {
3691                            q: params.term
3692                        });
3693                    },
3694                    transport: function (params, success, failure) {
3695                        var $request = $.ajax(params);
3696
3697                        $request.then(success);
3698                        $request.fail(failure);
3699
3700                        return $request;
3701                    }
3702                };
3703
3704                return $.extend({}, defaults, options, true);
3705            };
3706
3707            AjaxAdapter.prototype.processResults = function (results) {
3708                return results;
3709            };
3710
3711            AjaxAdapter.prototype.query = function (params, callback) {
3712                var matches = [];
3713                var self = this;
3714
3715                if (this._request != null) {
3716                    // JSONP requests cannot always be aborted
3717                    if (typeof this._request.abort === 'function') {
3718                        this._request.abort();
3719                    }
3720
3721                    this._request = null;
3722                }
3723
3724                var options = $.extend({
3725                    type: 'GET'
3726                }, this.ajaxOptions);
3727
3728                if (typeof options.url === 'function') {
3729                    options.url = options.url.call(this.$element, params);
3730                }
3731
3732                if (typeof options.data === 'function') {
3733                    options.data = options.data.call(this.$element, params);
3734                }
3735
3736                function request () {
3737                    var $request = options.transport(options, function (data) {
3738                        var results = self.processResults(data, params);
3739
3740                        if (self.options.get('debug') && window.console && console.error) {
3741                            // Check to make sure that the response included a `results` key.
3742                            if (!results || !results.results || !Array.isArray(results.results)) {
3743                                console.error(
3744                                    'Select2: The AJAX results did not return an array in the ' +
3745                                    '`results` key of the response.'
3746                                );
3747                            }
3748                        }
3749
3750                        callback(results);
3751                    }, function () {
3752                        // Attempt to detect if a request was aborted
3753                        // Only works if the transport exposes a status property
3754                        if ('status' in $request &&
3755                            ($request.status === 0 || $request.status === '0')) {
3756                            return;
3757                        }
3758
3759                        self.trigger('results:message', {
3760                            message: 'errorLoading'
3761                        });
3762                    });
3763
3764                    self._request = $request;
3765                }
3766
3767                if (this.ajaxOptions.delay && params.term != null) {
3768                    if (this._queryTimeout) {
3769                        window.clearTimeout(this._queryTimeout);
3770                    }
3771
3772                    this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
3773                } else {
3774                    request();
3775                }
3776            };
3777
3778            return AjaxAdapter;
3779        });
3780
3781        S2.define('select2/data/tags',[
3782            'jquery'
3783        ], function ($) {
3784            function Tags (decorated, $element, options) {
3785                var tags = options.get('tags');
3786
3787                var createTag = options.get('createTag');
3788
3789                if (createTag !== undefined) {
3790                    this.createTag = createTag;
3791                }
3792
3793                var insertTag = options.get('insertTag');
3794
3795                if (insertTag !== undefined) {
3796                    this.insertTag = insertTag;
3797                }
3798
3799                decorated.call(this, $element, options);
3800
3801                if (Array.isArray(tags)) {
3802                    for (var t = 0; t < tags.length; t++) {
3803                        var tag = tags[t];
3804                        var item = this._normalizeItem(tag);
3805
3806                        var $option = this.option(item);
3807
3808                        this.$element.append($option);
3809                    }
3810                }
3811            }
3812
3813            Tags.prototype.query = function (decorated, params, callback) {
3814                var self = this;
3815
3816                this._removeOldTags();
3817
3818                if (params.term == null || params.page != null) {
3819                    decorated.call(this, params, callback);
3820                    return;
3821                }
3822
3823                function wrapper (obj, child) {
3824                    var data = obj.results;
3825
3826                    for (var i = 0; i < data.length; i++) {
3827                        var option = data[i];
3828
3829                        var checkChildren = (
3830                            option.children != null &&
3831                            !wrapper({
3832                                results: option.children
3833                            }, true)
3834                        );
3835
3836                        var optionText = (option.text || '').toUpperCase();
3837                        var paramsTerm = (params.term || '').toUpperCase();
3838
3839                        var checkText = optionText === paramsTerm;
3840
3841                        if (checkText || checkChildren) {
3842                            if (child) {
3843                                return false;
3844                            }
3845
3846                            obj.data = data;
3847                            callback(obj);
3848
3849                            return;
3850                        }
3851                    }
3852
3853                    if (child) {
3854                        return true;
3855                    }
3856
3857                    var tag = self.createTag(params);
3858
3859                    if (tag != null) {
3860                        var $option = self.option(tag);
3861                        $option.attr('data-select2-tag', 'true');
3862
3863                        self.addOptions([$option]);
3864
3865                        self.insertTag(data, tag);
3866                    }
3867
3868                    obj.results = data;
3869
3870                    callback(obj);
3871                }
3872
3873                decorated.call(this, params, wrapper);
3874            };
3875
3876            Tags.prototype.createTag = function (decorated, params) {
3877                if (params.term == null) {
3878                    return null;
3879                }
3880
3881                var term = params.term.trim();
3882
3883                if (term === '') {
3884                    return null;
3885                }
3886
3887                return {
3888                    id: term,
3889                    text: term
3890                };
3891            };
3892
3893            Tags.prototype.insertTag = function (_, data, tag) {
3894                data.unshift(tag);
3895            };
3896
3897            Tags.prototype._removeOldTags = function (_) {
3898                var $options = this.$element.find('option[data-select2-tag]');
3899
3900                $options.each(function () {
3901                    if (this.selected) {
3902                        return;
3903                    }
3904
3905                    $(this).remove();
3906                });
3907            };
3908
3909            return Tags;
3910        });
3911
3912        S2.define('select2/data/tokenizer',[
3913            'jquery'
3914        ], function ($) {
3915            function Tokenizer (decorated, $element, options) {
3916                var tokenizer = options.get('tokenizer');
3917
3918                if (tokenizer !== undefined) {
3919                    this.tokenizer = tokenizer;
3920                }
3921
3922                decorated.call(this, $element, options);
3923            }
3924
3925            Tokenizer.prototype.bind = function (decorated, container, $container) {
3926                decorated.call(this, container, $container);
3927
3928                this.$search =  container.dropdown.$search || container.selection.$search ||
3929                    $container.find('.select2-search__field');
3930            };
3931
3932            Tokenizer.prototype.query = function (decorated, params, callback) {
3933                var self = this;
3934
3935                function createAndSelect (data) {
3936                    // Normalize the data object so we can use it for checks
3937                    var item = self._normalizeItem(data);
3938
3939                    // Check if the data object already exists as a tag
3940                    // Select it if it doesn't
3941                    var $existingOptions = self.$element.find('option').filter(function () {
3942                        return $(this).val() === item.id;
3943                    });
3944
3945                    // If an existing option wasn't found for it, create the option
3946                    if (!$existingOptions.length) {
3947                        var $option = self.option(item);
3948                        $option.attr('data-select2-tag', true);
3949
3950                        self._removeOldTags();
3951                        self.addOptions([$option]);
3952                    }
3953
3954                    // Select the item, now that we know there is an option for it
3955                    select(item);
3956                }
3957
3958                function select (data) {
3959                    self.trigger('select', {
3960                        data: data
3961                    });
3962                }
3963
3964                params.term = params.term || '';
3965
3966                var tokenData = this.tokenizer(params, this.options, createAndSelect);
3967
3968                if (tokenData.term !== params.term) {
3969                    // Replace the search term if we have the search box
3970                    if (this.$search.length) {
3971                        this.$search.val(tokenData.term);
3972                        this.$search.trigger('focus');
3973                    }
3974
3975                    params.term = tokenData.term;
3976                }
3977
3978                decorated.call(this, params, callback);
3979            };
3980
3981            Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
3982                var separators = options.get('tokenSeparators') || [];
3983                var term = params.term;
3984                var i = 0;
3985
3986                var createTag = this.createTag || function (params) {
3987                    return {
3988                        id: params.term,
3989                        text: params.term
3990                    };
3991                };
3992
3993                while (i < term.length) {
3994                    var termChar = term[i];
3995
3996                    if (separators.indexOf(termChar) === -1) {
3997                        i++;
3998
3999                        continue;
4000                    }
4001
4002                    var part = term.substr(0, i);
4003                    var partParams = $.extend({}, params, {
4004                        term: part
4005                    });
4006
4007                    var data = createTag(partParams);
4008
4009                    if (data == null) {
4010                        i++;
4011                        continue;
4012                    }
4013
4014                    callback(data);
4015
4016                    // Reset the term to not include the tokenized portion
4017                    term = term.substr(i + 1) || '';
4018                    i = 0;
4019                }
4020
4021                return {
4022                    term: term
4023                };
4024            };
4025
4026            return Tokenizer;
4027        });
4028
4029        S2.define('select2/data/minimumInputLength',[
4030
4031        ], function () {
4032            function MinimumInputLength (decorated, $e, options) {
4033                this.minimumInputLength = options.get('minimumInputLength');
4034
4035                decorated.call(this, $e, options);
4036            }
4037
4038            MinimumInputLength.prototype.query = function (decorated, params, callback) {
4039                params.term = params.term || '';
4040
4041                if (params.term.length < this.minimumInputLength) {
4042                    this.trigger('results:message', {
4043                        message: 'inputTooShort',
4044                        args: {
4045                            minimum: this.minimumInputLength,
4046                            input: params.term,
4047                            params: params
4048                        }
4049                    });
4050
4051                    return;
4052                }
4053
4054                decorated.call(this, params, callback);
4055            };
4056
4057            return MinimumInputLength;
4058        });
4059
4060        S2.define('select2/data/maximumInputLength',[
4061
4062        ], function () {
4063            function MaximumInputLength (decorated, $e, options) {
4064                this.maximumInputLength = options.get('maximumInputLength');
4065
4066                decorated.call(this, $e, options);
4067            }
4068
4069            MaximumInputLength.prototype.query = function (decorated, params, callback) {
4070                params.term = params.term || '';
4071
4072                if (this.maximumInputLength > 0 &&
4073                    params.term.length > this.maximumInputLength) {
4074                    this.trigger('results:message', {
4075                        message: 'inputTooLong',
4076                        args: {
4077                            maximum: this.maximumInputLength,
4078                            input: params.term,
4079                            params: params
4080                        }
4081                    });
4082
4083                    return;
4084                }
4085
4086                decorated.call(this, params, callback);
4087            };
4088
4089            return MaximumInputLength;
4090        });
4091
4092        S2.define('select2/data/maximumSelectionLength',[
4093
4094        ], function (){
4095            function MaximumSelectionLength (decorated, $e, options) {
4096                this.maximumSelectionLength = options.get('maximumSelectionLength');
4097
4098                decorated.call(this, $e, options);
4099            }
4100
4101            MaximumSelectionLength.prototype.bind =
4102                function (decorated, container, $container) {
4103                    var self = this;
4104
4105                    decorated.call(this, container, $container);
4106
4107                    container.on('select', function () {
4108                        self._checkIfMaximumSelected();
4109                    });
4110                };
4111
4112            MaximumSelectionLength.prototype.query =
4113                function (decorated, params, callback) {
4114                    var self = this;
4115
4116                    this._checkIfMaximumSelected(function () {
4117                        decorated.call(self, params, callback);
4118                    });
4119                };
4120
4121            MaximumSelectionLength.prototype._checkIfMaximumSelected =
4122                function (_, successCallback) {
4123                    var self = this;
4124
4125                    this.current(function (currentData) {
4126                        var count = currentData != null ? currentData.length : 0;
4127                        if (self.maximumSelectionLength > 0 &&
4128                            count >= self.maximumSelectionLength) {
4129                            self.trigger('results:message', {
4130                                message: 'maximumSelected',
4131                                args: {
4132                                    maximum: self.maximumSelectionLength
4133                                }
4134                            });
4135                            return;
4136                        }
4137
4138                        if (successCallback) {
4139                            successCallback();
4140                        }
4141                    });
4142                };
4143
4144            return MaximumSelectionLength;
4145        });
4146
4147        S2.define('select2/dropdown',[
4148            'jquery',
4149            './utils'
4150        ], function ($, Utils) {
4151            function Dropdown ($element, options) {
4152                this.$element = $element;
4153                this.options = options;
4154
4155                Dropdown.__super__.constructor.call(this);
4156            }
4157
4158            Utils.Extend(Dropdown, Utils.Observable);
4159
4160            Dropdown.prototype.render = function () {
4161                var $dropdown = $(
4162                    '<span class="select2-dropdown">' +
4163                    '<span class="select2-results"></span>' +
4164                    '</span>'
4165                );
4166
4167                $dropdown.attr('dir', this.options.get('dir'));
4168
4169                this.$dropdown = $dropdown;
4170
4171                return $dropdown;
4172            };
4173
4174            Dropdown.prototype.bind = function () {
4175                // Should be implemented in subclasses
4176            };
4177
4178            Dropdown.prototype.position = function ($dropdown, $container) {
4179                // Should be implemented in subclasses
4180            };
4181
4182            Dropdown.prototype.destroy = function () {
4183                // Remove the dropdown from the DOM
4184                this.$dropdown.remove();
4185            };
4186
4187            return Dropdown;
4188        });
4189
4190        S2.define('select2/dropdown/search',[
4191            'jquery'
4192        ], function ($) {
4193            function Search () { }
4194
4195            Search.prototype.render = function (decorated) {
4196                var $rendered = decorated.call(this);
4197                var searchLabel = this.options.get('translations').get('search');
4198
4199                var $search = $(
4200                    '<span class="select2-search select2-search--dropdown">' +
4201                    '<input class="select2-search__field" type="search" tabindex="-1"' +
4202                    ' autocorrect="off" autocapitalize="none"' +
4203                    ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
4204                    '</span>'
4205                );
4206
4207                this.$searchContainer = $search;
4208                this.$search = $search.find('input');
4209
4210                this.$search.prop('autocomplete', this.options.get('autocomplete'));
4211                this.$search.attr('aria-label', searchLabel());
4212
4213                $rendered.prepend($search);
4214
4215                return $rendered;
4216            };
4217
4218            Search.prototype.bind = function (decorated, container, $container) {
4219                var self = this;
4220
4221                var resultsId = container.id + '-results';
4222
4223                decorated.call(this, container, $container);
4224
4225                this.$search.on('keydown', function (evt) {
4226                    self.trigger('keypress', evt);
4227
4228                    self._keyUpPrevented = evt.isDefaultPrevented();
4229                });
4230
4231                // Workaround for browsers which do not support the `input` event
4232                // This will prevent double-triggering of events for browsers which support
4233                // both the `keyup` and `input` events.
4234                this.$search.on('input', function (evt) {
4235                    // Unbind the duplicated `keyup` event
4236                    $(this).off('keyup');
4237                });
4238
4239                this.$search.on('keyup input', function (evt) {
4240                    self.handleSearch(evt);
4241                });
4242
4243                container.on('open', function () {
4244                    self.$search.attr('tabindex', 0);
4245                    self.$search.attr('aria-controls', resultsId);
4246
4247                    self.$search.trigger('focus');
4248
4249                    window.setTimeout(function () {
4250                        self.$search.trigger('focus');
4251                    }, 0);
4252                });
4253
4254                container.on('close', function () {
4255                    self.$search.attr('tabindex', -1);
4256                    self.$search.removeAttr('aria-controls');
4257                    self.$search.removeAttr('aria-activedescendant');
4258
4259                    self.$search.val('');
4260                    self.$search.trigger('blur');
4261                });
4262
4263                container.on('focus', function () {
4264                    if (!container.isOpen()) {
4265                        self.$search.trigger('focus');
4266                    }
4267                });
4268
4269                container.on('results:all', function (params) {
4270                    if (params.query.term == null || params.query.term === '') {
4271                        var showSearch = self.showSearch(params);
4272
4273                        if (showSearch) {
4274                            self.$searchContainer[0].classList.remove('select2-search--hide');
4275                        } else {
4276                            self.$searchContainer[0].classList.add('select2-search--hide');
4277                        }
4278                    }
4279                });
4280
4281                container.on('results:focus', function (params) {
4282                    if (params.data._resultId) {
4283                        self.$search.attr('aria-activedescendant', params.data._resultId);
4284                    } else {
4285                        self.$search.removeAttr('aria-activedescendant');
4286                    }
4287                });
4288            };
4289
4290            Search.prototype.handleSearch = function (evt) {
4291                if (!this._keyUpPrevented) {
4292                    var input = this.$search.val();
4293
4294                    this.trigger('query', {
4295                        term: input
4296                    });
4297                }
4298
4299                this._keyUpPrevented = false;
4300            };
4301
4302            Search.prototype.showSearch = function (_, params) {
4303                return true;
4304            };
4305
4306            return Search;
4307        });
4308
4309        S2.define('select2/dropdown/hidePlaceholder',[
4310
4311        ], function () {
4312            function HidePlaceholder (decorated, $element, options, dataAdapter) {
4313                this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
4314
4315                decorated.call(this, $element, options, dataAdapter);
4316            }
4317
4318            HidePlaceholder.prototype.append = function (decorated, data) {
4319                data.results = this.removePlaceholder(data.results);
4320
4321                decorated.call(this, data);
4322            };
4323
4324            HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
4325                if (typeof placeholder === 'string') {
4326                    placeholder = {
4327                        id: '',
4328                        text: placeholder
4329                    };
4330                }
4331
4332                return placeholder;
4333            };
4334
4335            HidePlaceholder.prototype.removePlaceholder = function (_, data) {
4336                var modifiedData = data.slice(0);
4337
4338                for (var d = data.length - 1; d >= 0; d--) {
4339                    var item = data[d];
4340
4341                    if (this.placeholder.id === item.id) {
4342                        modifiedData.splice(d, 1);
4343                    }
4344                }
4345
4346                return modifiedData;
4347            };
4348
4349            return HidePlaceholder;
4350        });
4351
4352        S2.define('select2/dropdown/infiniteScroll',[
4353            'jquery'
4354        ], function ($) {
4355            function InfiniteScroll (decorated, $element, options, dataAdapter) {
4356                this.lastParams = {};
4357
4358                decorated.call(this, $element, options, dataAdapter);
4359
4360                this.$loadingMore = this.createLoadingMore();
4361                this.loading = false;
4362            }
4363
4364            InfiniteScroll.prototype.append = function (decorated, data) {
4365                this.$loadingMore.remove();
4366                this.loading = false;
4367
4368                decorated.call(this, data);
4369
4370                if (this.showLoadingMore(data)) {
4371                    this.$results.append(this.$loadingMore);
4372                    this.loadMoreIfNeeded();
4373                }
4374            };
4375
4376            InfiniteScroll.prototype.bind = function (decorated, container, $container) {
4377                var self = this;
4378
4379                decorated.call(this, container, $container);
4380
4381                container.on('query', function (params) {
4382                    self.lastParams = params;
4383                    self.loading = true;
4384                });
4385
4386                container.on('query:append', function (params) {
4387                    self.lastParams = params;
4388                    self.loading = true;
4389                });
4390
4391                this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));
4392            };
4393
4394            InfiniteScroll.prototype.loadMoreIfNeeded = function () {
4395                var isLoadMoreVisible = $.contains(
4396                    document.documentElement,
4397                    this.$loadingMore[0]
4398                );
4399
4400                if (this.loading || !isLoadMoreVisible) {
4401                    return;
4402                }
4403
4404                var currentOffset = this.$results.offset().top +
4405                    this.$results.outerHeight(false);
4406                var loadingMoreOffset = this.$loadingMore.offset().top +
4407                    this.$loadingMore.outerHeight(false);
4408
4409                if (currentOffset + 50 >= loadingMoreOffset) {
4410                    this.loadMore();
4411                }
4412            };
4413
4414            InfiniteScroll.prototype.loadMore = function () {
4415                this.loading = true;
4416
4417                var params = $.extend({}, {page: 1}, this.lastParams);
4418
4419                params.page++;
4420
4421                this.trigger('query:append', params);
4422            };
4423
4424            InfiniteScroll.prototype.showLoadingMore = function (_, data) {
4425                return data.pagination && data.pagination.more;
4426            };
4427
4428            InfiniteScroll.prototype.createLoadingMore = function () {
4429                var $option = $(
4430                    '<li ' +
4431                    'class="select2-results__option select2-results__option--load-more"' +
4432                    'role="option" aria-disabled="true"></li>'
4433                );
4434
4435                var message = this.options.get('translations').get('loadingMore');
4436
4437                $option.html(message(this.lastParams));
4438
4439                return $option;
4440            };
4441
4442            return InfiniteScroll;
4443        });
4444
4445        S2.define('select2/dropdown/attachBody',[
4446            'jquery',
4447            '../utils'
4448        ], function ($, Utils) {
4449            function AttachBody (decorated, $element, options) {
4450                this.$dropdownParent = $(options.get('dropdownParent') || document.body);
4451
4452                decorated.call(this, $element, options);
4453            }
4454
4455            AttachBody.prototype.bind = function (decorated, container, $container) {
4456                var self = this;
4457
4458                decorated.call(this, container, $container);
4459
4460                container.on('open', function () {
4461                    self._showDropdown();
4462                    self._attachPositioningHandler(container);
4463
4464                    // Must bind after the results handlers to ensure correct sizing
4465                    self._bindContainerResultHandlers(container);
4466                });
4467
4468                container.on('close', function () {
4469                    self._hideDropdown();
4470                    self._detachPositioningHandler(container);
4471                });
4472
4473                this.$dropdownContainer.on('mousedown', function (evt) {
4474                    evt.stopPropagation();
4475                });
4476            };
4477
4478            AttachBody.prototype.destroy = function (decorated) {
4479                decorated.call(this);
4480
4481                this.$dropdownContainer.remove();
4482            };
4483
4484            AttachBody.prototype.position = function (decorated, $dropdown, $container) {
4485                // Clone all of the container classes
4486                $dropdown.attr('class', $container.attr('class'));
4487
4488                $dropdown[0].classList.remove('select2');
4489                $dropdown[0].classList.add('select2-container--open');
4490
4491                $dropdown.css({
4492                    position: 'absolute',
4493                    // top: -999999
4494                });
4495
4496                this.$container = $container;
4497            };
4498
4499            AttachBody.prototype.render = function (decorated) {
4500                var $container = $('<span></span>');
4501
4502                var $dropdown = decorated.call(this);
4503                $container.append($dropdown);
4504
4505                this.$dropdownContainer = $container;
4506
4507                return $container;
4508            };
4509
4510            AttachBody.prototype._hideDropdown = function (decorated) {
4511                this.$dropdownContainer.detach();
4512            };
4513
4514            AttachBody.prototype._bindContainerResultHandlers =
4515                function (decorated, container) {
4516
4517                    // These should only be bound once
4518                    if (this._containerResultsHandlersBound) {
4519                        return;
4520                    }
4521
4522                    var self = this;
4523
4524                    container.on('results:all', function () {
4525                        self._positionDropdown();
4526                        self._resizeDropdown();
4527                    });
4528
4529                    container.on('results:append', function () {
4530                        self._positionDropdown();
4531                        self._resizeDropdown();
4532                    });
4533
4534                    container.on('results:message', function () {
4535                        self._positionDropdown();
4536                        self._resizeDropdown();
4537                    });
4538
4539                    container.on('select', function () {
4540                        self._positionDropdown();
4541                        self._resizeDropdown();
4542                    });
4543
4544                    container.on('unselect', function () {
4545                        self._positionDropdown();
4546                        self._resizeDropdown();
4547                    });
4548
4549                    this._containerResultsHandlersBound = true;
4550                };
4551
4552            AttachBody.prototype._attachPositioningHandler =
4553                function (decorated, container) {
4554                    var self = this;
4555
4556                    var scrollEvent = 'scroll.select2.' + container.id;
4557                    var resizeEvent = 'resize.select2.' + container.id;
4558                    var orientationEvent = 'orientationchange.select2.' + container.id;
4559
4560                    var $watchers = this.$container.parents().filter(Utils.hasScroll);
4561                    $watchers.each(function () {
4562                        Utils.StoreData(this, 'select2-scroll-position', {
4563                            x: $(this).scrollLeft(),
4564                            y: $(this).scrollTop()
4565                        });
4566                    });
4567
4568                    $watchers.on(scrollEvent, function (ev) {
4569                        var position = Utils.GetData(this, 'select2-scroll-position');
4570                        $(this).scrollTop(position.y);
4571                    });
4572
4573                    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
4574                        function (e) {
4575                            self._positionDropdown();
4576                            self._resizeDropdown();
4577                        });
4578                };
4579
4580            AttachBody.prototype._detachPositioningHandler =
4581                function (decorated, container) {
4582                    var scrollEvent = 'scroll.select2.' + container.id;
4583                    var resizeEvent = 'resize.select2.' + container.id;
4584                    var orientationEvent = 'orientationchange.select2.' + container.id;
4585
4586                    var $watchers = this.$container.parents().filter(Utils.hasScroll);
4587                    $watchers.off(scrollEvent);
4588
4589                    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
4590                };
4591
4592            AttachBody.prototype._positionDropdown = function () {
4593                var $window = $(window);
4594
4595                var isCurrentlyAbove = this.$dropdown[0].classList
4596                    .contains('select2-dropdown--above');
4597                var isCurrentlyBelow = this.$dropdown[0].classList
4598                    .contains('select2-dropdown--below');
4599
4600                var newDirection = null;
4601
4602                var offset = this.$container.offset();
4603
4604                offset.bottom = offset.top + this.$container.outerHeight(false);
4605
4606                var container = {
4607                    height: this.$container.outerHeight(false)
4608                };
4609
4610                container.top = offset.top;
4611                container.bottom = offset.top + container.height;
4612
4613                var dropdown = {
4614                    height: this.$dropdown.outerHeight(false)
4615                };
4616
4617                var viewport = {
4618                    top: $window.scrollTop(),
4619                    bottom: $window.scrollTop() + $window.height()
4620                };
4621
4622                var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
4623                var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
4624
4625                var css = {
4626                    left: offset.left,
4627                    top: container.bottom
4628                };
4629
4630                // Determine what the parent element is to use for calculating the offset
4631                var $offsetParent = this.$dropdownParent;
4632
4633                // For statically positioned elements, we need to get the element
4634                // that is determining the offset
4635                if ($offsetParent.css('position') === 'static') {
4636                    $offsetParent = $offsetParent.offsetParent();
4637                }
4638
4639                var parentOffset = {
4640                    top: 0,
4641                    left: 0
4642                };
4643
4644                if (
4645                    $.contains(document.body, $offsetParent[0]) ||
4646                    $offsetParent[0].isConnected
4647                ) {
4648                    parentOffset = $offsetParent.offset();
4649                }
4650
4651                css.top -= parentOffset.top;
4652                css.left -= parentOffset.left;
4653
4654                if (!isCurrentlyAbove && !isCurrentlyBelow) {
4655                    newDirection = 'below';
4656                }
4657
4658                // if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
4659                //     newDirection = 'above';
4660                // } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
4661                //     newDirection = 'below';
4662                // }
4663
4664                if (newDirection == 'above' ||
4665                    (isCurrentlyAbove && newDirection !== 'below')) {
4666                    css.top = container.top - parentOffset.top - dropdown.height;
4667                }
4668
4669                if (newDirection != null) {
4670                    this.$dropdown[0].classList.remove('select2-dropdown--below');
4671                    this.$dropdown[0].classList.remove('select2-dropdown--above');
4672                    this.$dropdown[0].classList.add('select2-dropdown--' + newDirection);
4673
4674                    this.$container[0].classList.remove('select2-container--below');
4675                    this.$container[0].classList.remove('select2-container--above');
4676                    this.$container[0].classList.add('select2-container--' + newDirection);
4677                }
4678
4679                this.$dropdownContainer.css(css);
4680            };
4681
4682            AttachBody.prototype._resizeDropdown = function () {
4683                var css = {
4684                    width: this.$container.outerWidth(false) + 'px'
4685                };
4686
4687                if (this.options.get('dropdownAutoWidth')) {
4688                    css.minWidth = css.width;
4689                    css.position = 'relative';
4690                    css.width = 'auto';
4691                }
4692
4693                this.$dropdown.css(css);
4694            };
4695
4696            AttachBody.prototype._showDropdown = function (decorated) {
4697                this.$dropdownContainer.appendTo(this.$dropdownParent);
4698
4699                this._positionDropdown();
4700                this._resizeDropdown();
4701            };
4702
4703            return AttachBody;
4704        });
4705
4706        S2.define('select2/dropdown/minimumResultsForSearch',[
4707
4708        ], function () {
4709            function countResults (data) {
4710                var count = 0;
4711
4712                for (var d = 0; d < data.length; d++) {
4713                    var item = data[d];
4714
4715                    if (item.children) {
4716                        count += countResults(item.children);
4717                    } else {
4718                        count++;
4719                    }
4720                }
4721
4722                return count;
4723            }
4724
4725            function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
4726                this.minimumResultsForSearch = options.get('minimumResultsForSearch');
4727
4728                if (this.minimumResultsForSearch < 0) {
4729                    this.minimumResultsForSearch = Infinity;
4730                }
4731
4732                decorated.call(this, $element, options, dataAdapter);
4733            }
4734
4735            MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
4736                if (countResults(params.data.results) < this.minimumResultsForSearch) {
4737                    return false;
4738                }
4739
4740                return decorated.call(this, params);
4741            };
4742
4743            return MinimumResultsForSearch;
4744        });
4745
4746        S2.define('select2/dropdown/selectOnClose',[
4747            '../utils'
4748        ], function (Utils) {
4749            function SelectOnClose () { }
4750
4751            SelectOnClose.prototype.bind = function (decorated, container, $container) {
4752                var self = this;
4753
4754                decorated.call(this, container, $container);
4755
4756                container.on('close', function (params) {
4757                    self._handleSelectOnClose(params);
4758                });
4759            };
4760
4761            SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
4762                if (params && params.originalSelect2Event != null) {
4763                    var event = params.originalSelect2Event;
4764
4765                    // Don't select an item if the close event was triggered from a select or
4766                    // unselect event
4767                    if (event._type === 'select' || event._type === 'unselect') {
4768                        return;
4769                    }
4770                }
4771
4772                var $highlightedResults = this.getHighlightedResults();
4773
4774                // Only select highlighted results
4775                if ($highlightedResults.length < 1) {
4776                    return;
4777                }
4778
4779                var data = Utils.GetData($highlightedResults[0], 'data');
4780
4781                // Don't re-select already selected resulte
4782                if (
4783                    (data.element != null && data.element.selected) ||
4784                    (data.element == null && data.selected)
4785                ) {
4786                    return;
4787                }
4788
4789                this.trigger('select', {
4790                    data: data
4791                });
4792            };
4793
4794            return SelectOnClose;
4795        });
4796
4797        S2.define('select2/dropdown/closeOnSelect',[
4798
4799        ], function () {
4800            function CloseOnSelect () { }
4801
4802            CloseOnSelect.prototype.bind = function (decorated, container, $container) {
4803                var self = this;
4804
4805                decorated.call(this, container, $container);
4806
4807                container.on('select', function (evt) {
4808                    self._selectTriggered(evt);
4809                });
4810
4811                container.on('unselect', function (evt) {
4812                    self._selectTriggered(evt);
4813                });
4814            };
4815
4816            CloseOnSelect.prototype._selectTriggered = function (_, evt) {
4817                var originalEvent = evt.originalEvent;
4818
4819                // Don't close if the control key is being held
4820                if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {
4821                    return;
4822                }
4823
4824                this.trigger('close', {
4825                    originalEvent: originalEvent,
4826                    originalSelect2Event: evt
4827                });
4828            };
4829
4830            return CloseOnSelect;
4831        });
4832
4833        S2.define('select2/dropdown/dropdownCss',[
4834            '../utils'
4835        ], function (Utils) {
4836            function DropdownCSS () { }
4837
4838            DropdownCSS.prototype.render = function (decorated) {
4839                var $dropdown = decorated.call(this);
4840
4841                var dropdownCssClass = this.options.get('dropdownCssClass') || '';
4842
4843                if (dropdownCssClass.indexOf(':all:') !== -1) {
4844                    dropdownCssClass = dropdownCssClass.replace(':all:', '');
4845
4846                    Utils.copyNonInternalCssClasses($dropdown[0], this.$element[0]);
4847                }
4848
4849                $dropdown.addClass(dropdownCssClass);
4850
4851                return $dropdown;
4852            };
4853
4854            return DropdownCSS;
4855        });
4856
4857        S2.define('select2/dropdown/tagsSearchHighlight',[
4858            '../utils'
4859        ], function (Utils) {
4860            function TagsSearchHighlight () { }
4861
4862            TagsSearchHighlight.prototype.highlightFirstItem = function (decorated) {
4863                var $options = this.$results
4864                    .find(
4865                        '.select2-results__option--selectable' +
4866                        ':not(.select2-results__option--selected)'
4867                    );
4868
4869                if ($options.length > 0) {
4870                    var $firstOption = $options.first();
4871                    var data = Utils.GetData($firstOption[0], 'data');
4872                    var firstElement = data.element;
4873
4874                    if (firstElement && firstElement.getAttribute) {
4875                        if (firstElement.getAttribute('data-select2-tag') === 'true') {
4876                            $firstOption.trigger('mouseenter');
4877
4878                            return;
4879                        }
4880                    }
4881                }
4882
4883                decorated.call(this);
4884            };
4885
4886            return TagsSearchHighlight;
4887        });
4888
4889        S2.define('select2/i18n/en',[],function () {
4890            // English
4891            return {
4892                errorLoading: function () {
4893                    return 'The results could not be loaded.';
4894                },
4895                inputTooLong: function (args) {
4896                    var overChars = args.input.length - args.maximum;
4897
4898                    var message = 'Please delete ' + overChars + ' character';
4899
4900                    if (overChars != 1) {
4901                        message += 's';
4902                    }
4903
4904                    return message;
4905                },
4906                inputTooShort: function (args) {
4907                    var remainingChars = args.minimum - args.input.length;
4908
4909                    var message = 'Please enter ' + remainingChars + ' or more characters';
4910
4911                    return message;
4912                },
4913                loadingMore: function () {
4914                    return 'Loading more results…';
4915                },
4916                maximumSelected: function (args) {
4917                    var message = 'You can only select ' + args.maximum + ' item';
4918
4919                    if (args.maximum != 1) {
4920                        message += 's';
4921                    }
4922
4923                    return message;
4924                },
4925                noResults: function () {
4926                    return 'No results found';
4927                },
4928                searching: function () {
4929                    return 'Searching…';
4930                },
4931                removeAllItems: function () {
4932                    return 'Remove all items';
4933                },
4934                removeItem: function () {
4935                    return 'Remove item';
4936                },
4937                search: function() {
4938                    return 'Search';
4939                }
4940            };
4941        });
4942
4943        S2.define('select2/defaults',[
4944            'jquery',
4945
4946            './results',
4947
4948            './selection/single',
4949            './selection/multiple',
4950            './selection/placeholder',
4951            './selection/allowClear',
4952            './selection/search',
4953            './selection/selectionCss',
4954            './selection/eventRelay',
4955
4956            './utils',
4957            './translation',
4958            './diacritics',
4959
4960            './data/select',
4961            './data/array',
4962            './data/ajax',
4963            './data/tags',
4964            './data/tokenizer',
4965            './data/minimumInputLength',
4966            './data/maximumInputLength',
4967            './data/maximumSelectionLength',
4968
4969            './dropdown',
4970            './dropdown/search',
4971            './dropdown/hidePlaceholder',
4972            './dropdown/infiniteScroll',
4973            './dropdown/attachBody',
4974            './dropdown/minimumResultsForSearch',
4975            './dropdown/selectOnClose',
4976            './dropdown/closeOnSelect',
4977            './dropdown/dropdownCss',
4978            './dropdown/tagsSearchHighlight',
4979
4980            './i18n/en'
4981        ], function ($,
4982
4983                     ResultsList,
4984
4985                     SingleSelection, MultipleSelection, Placeholder, AllowClear,
4986                     SelectionSearch, SelectionCSS, EventRelay,
4987
4988                     Utils, Translation, DIACRITICS,
4989
4990                     SelectData, ArrayData, AjaxData, Tags, Tokenizer,
4991                     MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
4992
4993                     Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
4994                     AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
4995                     DropdownCSS, TagsSearchHighlight,
4996
4997                     EnglishTranslation) {
4998            function Defaults () {
4999                this.reset();
5000            }
5001
5002            Defaults.prototype.apply = function (options) {
5003                options = $.extend(true, {}, this.defaults, options);
5004
5005                if (options.dataAdapter == null) {
5006                    if (options.ajax != null) {
5007                        options.dataAdapter = AjaxData;
5008                    } else if (options.data != null) {
5009                        options.dataAdapter = ArrayData;
5010                    } else {
5011                        options.dataAdapter = SelectData;
5012                    }
5013
5014                    if (options.minimumInputLength > 0) {
5015                        options.dataAdapter = Utils.Decorate(
5016                            options.dataAdapter,
5017                            MinimumInputLength
5018                        );
5019                    }
5020
5021                    if (options.maximumInputLength > 0) {
5022                        options.dataAdapter = Utils.Decorate(
5023                            options.dataAdapter,
5024                            MaximumInputLength
5025                        );
5026                    }
5027
5028                    if (options.maximumSelectionLength > 0) {
5029                        options.dataAdapter = Utils.Decorate(
5030                            options.dataAdapter,
5031                            MaximumSelectionLength
5032                        );
5033                    }
5034
5035                    if (options.tags) {
5036                        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
5037                    }
5038
5039                    if (options.tokenSeparators != null || options.tokenizer != null) {
5040                        options.dataAdapter = Utils.Decorate(
5041                            options.dataAdapter,
5042                            Tokenizer
5043                        );
5044                    }
5045                }
5046
5047                if (options.resultsAdapter == null) {
5048                    options.resultsAdapter = ResultsList;
5049
5050                    if (options.ajax != null) {
5051                        options.resultsAdapter = Utils.Decorate(
5052                            options.resultsAdapter,
5053                            InfiniteScroll
5054                        );
5055                    }
5056
5057                    if (options.placeholder != null) {
5058                        options.resultsAdapter = Utils.Decorate(
5059                            options.resultsAdapter,
5060                            HidePlaceholder
5061                        );
5062                    }
5063
5064                    if (options.selectOnClose) {
5065                        options.resultsAdapter = Utils.Decorate(
5066                            options.resultsAdapter,
5067                            SelectOnClose
5068                        );
5069                    }
5070
5071                    if (options.tags) {
5072                        options.resultsAdapter = Utils.Decorate(
5073                            options.resultsAdapter,
5074                            TagsSearchHighlight
5075                        );
5076                    }
5077                }
5078
5079                if (options.dropdownAdapter == null) {
5080                    if (options.multiple) {
5081                        options.dropdownAdapter = Dropdown;
5082                    } else {
5083                        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
5084
5085                        options.dropdownAdapter = SearchableDropdown;
5086                    }
5087
5088                    if (options.minimumResultsForSearch !== 0) {
5089                        options.dropdownAdapter = Utils.Decorate(
5090                            options.dropdownAdapter,
5091                            MinimumResultsForSearch
5092                        );
5093                    }
5094
5095                    if (options.closeOnSelect) {
5096                        options.dropdownAdapter = Utils.Decorate(
5097                            options.dropdownAdapter,
5098                            CloseOnSelect
5099                        );
5100                    }
5101
5102                    if (options.dropdownCssClass != null) {
5103                        options.dropdownAdapter = Utils.Decorate(
5104                            options.dropdownAdapter,
5105                            DropdownCSS
5106                        );
5107                    }
5108
5109                    options.dropdownAdapter = Utils.Decorate(
5110                        options.dropdownAdapter,
5111                        AttachBody
5112                    );
5113                }
5114
5115                if (options.selectionAdapter == null) {
5116                    if (options.multiple) {
5117                        options.selectionAdapter = MultipleSelection;
5118                    } else {
5119                        options.selectionAdapter = SingleSelection;
5120                    }
5121
5122                    // Add the placeholder mixin if a placeholder was specified
5123                    if (options.placeholder != null) {
5124                        options.selectionAdapter = Utils.Decorate(
5125                            options.selectionAdapter,
5126                            Placeholder
5127                        );
5128                    }
5129
5130                    if (options.allowClear) {
5131                        options.selectionAdapter = Utils.Decorate(
5132                            options.selectionAdapter,
5133                            AllowClear
5134                        );
5135                    }
5136
5137                    if (options.multiple) {
5138                        options.selectionAdapter = Utils.Decorate(
5139                            options.selectionAdapter,
5140                            SelectionSearch
5141                        );
5142                    }
5143
5144                    if (options.selectionCssClass != null) {
5145                        options.selectionAdapter = Utils.Decorate(
5146                            options.selectionAdapter,
5147                            SelectionCSS
5148                        );
5149                    }
5150
5151                    options.selectionAdapter = Utils.Decorate(
5152                        options.selectionAdapter,
5153                        EventRelay
5154                    );
5155                }
5156
5157                // If the defaults were not previously applied from an element, it is
5158                // possible for the language option to have not been resolved
5159                options.language = this._resolveLanguage(options.language);
5160
5161                // Always fall back to English since it will always be complete
5162                options.language.push('en');
5163
5164                var uniqueLanguages = [];
5165
5166                for (var l = 0; l < options.language.length; l++) {
5167                    var language = options.language[l];
5168
5169                    if (uniqueLanguages.indexOf(language) === -1) {
5170                        uniqueLanguages.push(language);
5171                    }
5172                }
5173
5174                options.language = uniqueLanguages;
5175
5176                options.translations = this._processTranslations(
5177                    options.language,
5178                    options.debug
5179                );
5180
5181                return options;
5182            };
5183
5184            Defaults.prototype.reset = function () {
5185                function stripDiacritics (text) {
5186                    // Used 'uni range + named function' from http://jsperf.com/diacritics/18
5187                    function match(a) {
5188                        return DIACRITICS[a] || a;
5189                    }
5190
5191                    return text.replace(/[^\u0000-\u007E]/g, match);
5192                }
5193
5194                function matcher (params, data) {
5195                    // Always return the object if there is nothing to compare
5196                    if (params.term == null || params.term.trim() === '') {
5197                        return data;
5198                    }
5199
5200                    // Do a recursive check for options with children
5201                    if (data.children && data.children.length > 0) {
5202                        // Clone the data object if there are children
5203                        // This is required as we modify the object to remove any non-matches
5204                        var match = $.extend(true, {}, data);
5205
5206                        // Check each child of the option
5207                        for (var c = data.children.length - 1; c >= 0; c--) {
5208                            var child = data.children[c];
5209
5210                            var matches = matcher(params, child);
5211
5212                            // If there wasn't a match, remove the object in the array
5213                            if (matches == null) {
5214                                match.children.splice(c, 1);
5215                            }
5216                        }
5217
5218                        // If any children matched, return the new object
5219                        if (match.children.length > 0) {
5220                            return match;
5221                        }
5222
5223                        // If there were no matching children, check just the plain object
5224                        return matcher(params, match);
5225                    }
5226
5227                    var original = stripDiacritics(data.text).toUpperCase();
5228                    var term = stripDiacritics(params.term).toUpperCase();
5229
5230                    // Check if the text contains the term
5231                    if (original.indexOf(term) > -1) {
5232                        return data;
5233                    }
5234
5235                    // If it doesn't contain the term, don't return anything
5236                    return null;
5237                }
5238
5239                this.defaults = {
5240                    amdLanguageBase: './i18n/',
5241                    autocomplete: 'off',
5242                    closeOnSelect: true,
5243                    debug: false,
5244                    dropdownAutoWidth: false,
5245                    escapeMarkup: Utils.escapeMarkup,
5246                    language: {},
5247                    matcher: matcher,
5248                    minimumInputLength: 0,
5249                    maximumInputLength: 0,
5250                    maximumSelectionLength: 0,
5251                    minimumResultsForSearch: 0,
5252                    selectOnClose: false,
5253                    scrollAfterSelect: false,
5254                    sorter: function (data) {
5255                        return data;
5256                    },
5257                    templateResult: function (result) {
5258                        return result.text;
5259                    },
5260                    templateSelection: function (selection) {
5261                        return selection.text;
5262                    },
5263                    theme: 'default',
5264                    width: 'resolve'
5265                };
5266            };
5267
5268            Defaults.prototype.applyFromElement = function (options, $element) {
5269                var optionLanguage = options.language;
5270                var defaultLanguage = this.defaults.language;
5271                var elementLanguage = $element.prop('lang');
5272                var parentLanguage = $element.closest('[lang]').prop('lang');
5273
5274                var languages = Array.prototype.concat.call(
5275                    this._resolveLanguage(elementLanguage),
5276                    this._resolveLanguage(optionLanguage),
5277                    this._resolveLanguage(defaultLanguage),
5278                    this._resolveLanguage(parentLanguage)
5279                );
5280
5281                options.language = languages;
5282
5283                return options;
5284            };
5285
5286            Defaults.prototype._resolveLanguage = function (language) {
5287                if (!language) {
5288                    return [];
5289                }
5290
5291                if ($.isEmptyObject(language)) {
5292                    return [];
5293                }
5294
5295                if ($.isPlainObject(language)) {
5296                    return [language];
5297                }
5298
5299                var languages;
5300
5301                if (!Array.isArray(language)) {
5302                    languages = [language];
5303                } else {
5304                    languages = language;
5305                }
5306
5307                var resolvedLanguages = [];
5308
5309                for (var l = 0; l < languages.length; l++) {
5310                    resolvedLanguages.push(languages[l]);
5311
5312                    if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {
5313                        // Extract the region information if it is included
5314                        var languageParts = languages[l].split('-');
5315                        var baseLanguage = languageParts[0];
5316
5317                        resolvedLanguages.push(baseLanguage);
5318                    }
5319                }
5320
5321                return resolvedLanguages;
5322            };
5323
5324            Defaults.prototype._processTranslations = function (languages, debug) {
5325                var translations = new Translation();
5326
5327                for (var l = 0; l < languages.length; l++) {
5328                    var languageData = new Translation();
5329
5330                    var language = languages[l];
5331
5332                    if (typeof language === 'string') {
5333                        try {
5334                            // Try to load it with the original name
5335                            languageData = Translation.loadPath(language);
5336                        } catch (e) {
5337                            try {
5338                                // If we couldn't load it, check if it wasn't the full path
5339                                language = this.defaults.amdLanguageBase + language;
5340                                languageData = Translation.loadPath(language);
5341                            } catch (ex) {
5342                                // The translation could not be loaded at all. Sometimes this is
5343                                // because of a configuration problem, other times this can be
5344                                // because of how Select2 helps load all possible translation files
5345                                if (debug && window.console && console.warn) {
5346                                    console.warn(
5347                                        'Select2: The language file for "' + language + '" could ' +
5348                                        'not be automatically loaded. A fallback will be used instead.'
5349                                    );
5350                                }
5351                            }
5352                        }
5353                    } else if ($.isPlainObject(language)) {
5354                        languageData = new Translation(language);
5355                    } else {
5356                        languageData = language;
5357                    }
5358
5359                    translations.extend(languageData);
5360                }
5361
5362                return translations;
5363            };
5364
5365            Defaults.prototype.set = function (key, value) {
5366                var camelKey = $.camelCase(key);
5367
5368                var data = {};
5369                data[camelKey] = value;
5370
5371                var convertedData = Utils._convertData(data);
5372
5373                $.extend(true, this.defaults, convertedData);
5374            };
5375
5376            var defaults = new Defaults();
5377
5378            return defaults;
5379        });
5380
5381        S2.define('select2/options',[
5382            'jquery',
5383            './defaults',
5384            './utils'
5385        ], function ($, Defaults, Utils) {
5386            function Options (options, $element) {
5387                this.options = options;
5388
5389                if ($element != null) {
5390                    this.fromElement($element);
5391                }
5392
5393                if ($element != null) {
5394                    this.options = Defaults.applyFromElement(this.options, $element);
5395                }
5396
5397                this.options = Defaults.apply(this.options);
5398            }
5399
5400            Options.prototype.fromElement = function ($e) {
5401                var excludedData = ['select2'];
5402
5403                if (this.options.multiple == null) {
5404                    this.options.multiple = $e.prop('multiple');
5405                }
5406
5407                if (this.options.disabled == null) {
5408                    this.options.disabled = $e.prop('disabled');
5409                }
5410
5411                if (this.options.autocomplete == null && $e.prop('autocomplete')) {
5412                    this.options.autocomplete = $e.prop('autocomplete');
5413                }
5414
5415                if (this.options.dir == null) {
5416                    if ($e.prop('dir')) {
5417                        this.options.dir = $e.prop('dir');
5418                    } else if ($e.closest('[dir]').prop('dir')) {
5419                        this.options.dir = $e.closest('[dir]').prop('dir');
5420                    } else {
5421                        this.options.dir = 'ltr';
5422                    }
5423                }
5424
5425                $e.prop('disabled', this.options.disabled);
5426                $e.prop('multiple', this.options.multiple);
5427
5428                if (Utils.GetData($e[0], 'select2Tags')) {
5429                    if (this.options.debug && window.console && console.warn) {
5430                        console.warn(
5431                            'Select2: The `data-select2-tags` attribute has been changed to ' +
5432                            'use the `data-data` and `data-tags="true"` attributes and will be ' +
5433                            'removed in future versions of Select2.'
5434                        );
5435                    }
5436
5437                    Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
5438                    Utils.StoreData($e[0], 'tags', true);
5439                }
5440
5441                if (Utils.GetData($e[0], 'ajaxUrl')) {
5442                    if (this.options.debug && window.console && console.warn) {
5443                        console.warn(
5444                            'Select2: The `data-ajax-url` attribute has been changed to ' +
5445                            '`data-ajax--url` and support for the old attribute will be removed' +
5446                            ' in future versions of Select2.'
5447                        );
5448                    }
5449
5450                    $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
5451                    Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
5452                }
5453
5454                var dataset = {};
5455
5456                function upperCaseLetter(_, letter) {
5457                    return letter.toUpperCase();
5458                }
5459
5460                // Pre-load all of the attributes which are prefixed with `data-`
5461                for (var attr = 0; attr < $e[0].attributes.length; attr++) {
5462                    var attributeName = $e[0].attributes[attr].name;
5463                    var prefix = 'data-';
5464
5465                    if (attributeName.substr(0, prefix.length) == prefix) {
5466                        // Get the contents of the attribute after `data-`
5467                        var dataName = attributeName.substring(prefix.length);
5468
5469                        // Get the data contents from the consistent source
5470                        // This is more than likely the jQuery data helper
5471                        var dataValue = Utils.GetData($e[0], dataName);
5472
5473                        // camelCase the attribute name to match the spec
5474                        var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);
5475
5476                        // Store the data attribute contents into the dataset since
5477                        dataset[camelDataName] = dataValue;
5478                    }
5479                }
5480
5481                // Prefer the element's `dataset` attribute if it exists
5482                // jQuery 1.x does not correctly handle data attributes with multiple dashes
5483                if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
5484                    dataset = $.extend(true, {}, $e[0].dataset, dataset);
5485                }
5486
5487                // Prefer our internal data cache if it exists
5488                var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);
5489
5490                data = Utils._convertData(data);
5491
5492                for (var key in data) {
5493                    if (excludedData.indexOf(key) > -1) {
5494                        continue;
5495                    }
5496
5497                    if ($.isPlainObject(this.options[key])) {
5498                        $.extend(this.options[key], data[key]);
5499                    } else {
5500                        this.options[key] = data[key];
5501                    }
5502                }
5503
5504                return this;
5505            };
5506
5507            Options.prototype.get = function (key) {
5508                return this.options[key];
5509            };
5510
5511            Options.prototype.set = function (key, val) {
5512                this.options[key] = val;
5513            };
5514
5515            return Options;
5516        });
5517
5518        S2.define('select2/core',[
5519            'jquery',
5520            './options',
5521            './utils',
5522            './keys'
5523        ], function ($, Options, Utils, KEYS) {
5524            var Select2 = function ($element, options) {
5525                if (Utils.GetData($element[0], 'select2') != null) {
5526                    Utils.GetData($element[0], 'select2').destroy();
5527                }
5528
5529                this.$element = $element;
5530
5531                this.id = this._generateId($element);
5532
5533                options = options || {};
5534
5535                this.options = new Options(options, $element);
5536
5537                Select2.__super__.constructor.call(this);
5538
5539                // Set up the tabindex
5540
5541                var tabindex = $element.attr('tabindex') || 0;
5542                Utils.StoreData($element[0], 'old-tabindex', tabindex);
5543                $element.attr('tabindex', '-1');
5544
5545                // Set up containers and adapters
5546
5547                var DataAdapter = this.options.get('dataAdapter');
5548                this.dataAdapter = new DataAdapter($element, this.options);
5549
5550                var $container = this.render();
5551
5552                this._placeContainer($container);
5553
5554                var SelectionAdapter = this.options.get('selectionAdapter');
5555                this.selection = new SelectionAdapter($element, this.options);
5556                this.$selection = this.selection.render();
5557
5558                this.selection.position(this.$selection, $container);
5559
5560                var DropdownAdapter = this.options.get('dropdownAdapter');
5561                this.dropdown = new DropdownAdapter($element, this.options);
5562                this.$dropdown = this.dropdown.render();
5563
5564                this.dropdown.position(this.$dropdown, $container);
5565
5566                var ResultsAdapter = this.options.get('resultsAdapter');
5567                this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
5568                this.$results = this.results.render();
5569
5570                this.results.position(this.$results, this.$dropdown);
5571
5572                // Bind events
5573
5574                var self = this;
5575
5576                // Bind the container to all of the adapters
5577                this._bindAdapters();
5578
5579                // Register any DOM event handlers
5580                this._registerDomEvents();
5581
5582                // Register any internal event handlers
5583                this._registerDataEvents();
5584                this._registerSelectionEvents();
5585                this._registerDropdownEvents();
5586                this._registerResultsEvents();
5587                this._registerEvents();
5588
5589                // Set the initial state
5590                this.dataAdapter.current(function (initialData) {
5591                    self.trigger('selection:update', {
5592                        data: initialData
5593                    });
5594                });
5595
5596                // Hide the original select
5597                $element[0].classList.add('select2-hidden-accessible');
5598                $element.attr('aria-hidden', 'true');
5599
5600                // Synchronize any monitored attributes
5601                this._syncAttributes();
5602
5603                Utils.StoreData($element[0], 'select2', this);
5604
5605                // Ensure backwards compatibility with $element.data('select2').
5606                $element.data('select2', this);
5607            };
5608
5609            Utils.Extend(Select2, Utils.Observable);
5610
5611            Select2.prototype._generateId = function ($element) {
5612                var id = '';
5613
5614                if ($element.attr('id') != null) {
5615                    id = $element.attr('id');
5616                } else if ($element.attr('name') != null) {
5617                    id = $element.attr('name') + '-' + Utils.generateChars(2);
5618                } else {
5619                    id = Utils.generateChars(4);
5620                }
5621
5622                id = id.replace(/(:|\.|\[|\]|,)/g, '');
5623                id = 'select2-' + id;
5624
5625                return id;
5626            };
5627
5628            Select2.prototype._placeContainer = function ($container) {
5629                $container.insertAfter(this.$element);
5630
5631                var width = this._resolveWidth(this.$element, this.options.get('width'));
5632
5633                if (width != null) {
5634                    $container.css('width', width);
5635                }
5636            };
5637
5638            Select2.prototype._resolveWidth = function ($element, method) {
5639                var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
5640
5641                if (method == 'resolve') {
5642                    var styleWidth = this._resolveWidth($element, 'style');
5643
5644                    if (styleWidth != null) {
5645                        return styleWidth;
5646                    }
5647
5648                    return this._resolveWidth($element, 'element');
5649                }
5650
5651                if (method == 'element') {
5652                    var elementWidth = $element.outerWidth(false);
5653
5654                    if (elementWidth <= 0) {
5655                        return 'auto';
5656                    }
5657
5658                    return elementWidth + 'px';
5659                }
5660
5661                if (method == 'style') {
5662                    var style = $element.attr('style');
5663
5664                    if (typeof(style) !== 'string') {
5665                        return null;
5666                    }
5667
5668                    var attrs = style.split(';');
5669
5670                    for (var i = 0, l = attrs.length; i < l; i = i + 1) {
5671                        var attr = attrs[i].replace(/\s/g, '');
5672                        var matches = attr.match(WIDTH);
5673
5674                        if (matches !== null && matches.length >= 1) {
5675                            return matches[1];
5676                        }
5677                    }
5678
5679                    return null;
5680                }
5681
5682                if (method == 'computedstyle') {
5683                    var computedStyle = window.getComputedStyle($element[0]);
5684
5685                    return computedStyle.width;
5686                }
5687
5688                return method;
5689            };
5690
5691            Select2.prototype._bindAdapters = function () {
5692                this.dataAdapter.bind(this, this.$container);
5693                this.selection.bind(this, this.$container);
5694
5695                this.dropdown.bind(this, this.$container);
5696                this.results.bind(this, this.$container);
5697            };
5698
5699            Select2.prototype._registerDomEvents = function () {
5700                var self = this;
5701
5702                this.$element.on('change.select2', function () {
5703                    self.dataAdapter.current(function (data) {
5704                        self.trigger('selection:update', {
5705                            data: data
5706                        });
5707                    });
5708                });
5709
5710                this.$element.on('focus.select2', function (evt) {
5711                    self.trigger('focus', evt);
5712                });
5713
5714                this._syncA = Utils.bind(this._syncAttributes, this);
5715                this._syncS = Utils.bind(this._syncSubtree, this);
5716
5717                this._observer = new window.MutationObserver(function (mutations) {
5718                    self._syncA();
5719                    self._syncS(mutations);
5720                });
5721                this._observer.observe(this.$element[0], {
5722                    attributes: true,
5723                    childList: true,
5724                    subtree: false
5725                });
5726            };
5727
5728            Select2.prototype._registerDataEvents = function () {
5729                var self = this;
5730
5731                this.dataAdapter.on('*', function (name, params) {
5732                    self.trigger(name, params);
5733                });
5734            };
5735
5736            Select2.prototype._registerSelectionEvents = function () {
5737                var self = this;
5738                var nonRelayEvents = ['toggle', 'focus'];
5739
5740                this.selection.on('toggle', function () {
5741                    self.toggleDropdown();
5742                });
5743
5744                this.selection.on('focus', function (params) {
5745                    self.focus(params);
5746                });
5747
5748                this.selection.on('*', function (name, params) {
5749                    if (nonRelayEvents.indexOf(name) !== -1) {
5750                        return;
5751                    }
5752
5753                    self.trigger(name, params);
5754                });
5755            };
5756
5757            Select2.prototype._registerDropdownEvents = function () {
5758                var self = this;
5759
5760                this.dropdown.on('*', function (name, params) {
5761                    self.trigger(name, params);
5762                });
5763            };
5764
5765            Select2.prototype._registerResultsEvents = function () {
5766                var self = this;
5767
5768                this.results.on('*', function (name, params) {
5769                    self.trigger(name, params);
5770                });
5771            };
5772
5773            Select2.prototype._registerEvents = function () {
5774                var self = this;
5775
5776                this.on('open', function () {
5777                    self.$container[0].classList.add('select2-container--open');
5778                });
5779
5780                this.on('close', function () {
5781                    self.$container[0].classList.remove('select2-container--open');
5782                });
5783
5784                this.on('enable', function () {
5785                    self.$container[0].classList.remove('select2-container--disabled');
5786                });
5787
5788                this.on('disable', function () {
5789                    self.$container[0].classList.add('select2-container--disabled');
5790                });
5791
5792                this.on('blur', function () {
5793                    self.$container[0].classList.remove('select2-container--focus');
5794                });
5795
5796                this.on('query', function (params) {
5797                    if (!self.isOpen()) {
5798                        self.trigger('open', {});
5799                    }
5800
5801                    this.dataAdapter.query(params, function (data) {
5802                        self.trigger('results:all', {
5803                            data: data,
5804                            query: params
5805                        });
5806                    });
5807                });
5808
5809                this.on('query:append', function (params) {
5810                    this.dataAdapter.query(params, function (data) {
5811                        self.trigger('results:append', {
5812                            data: data,
5813                            query: params
5814                        });
5815                    });
5816                });
5817
5818                this.on('keypress', function (evt) {
5819                    var key = evt.which;
5820
5821                    if (self.isOpen()) {
5822                        if (key === KEYS.ESC || (key === KEYS.UP && evt.altKey)) {
5823                            self.close(evt);
5824
5825                            evt.preventDefault();
5826                        } else if (key === KEYS.ENTER || key === KEYS.TAB) {
5827                            self.trigger('results:select', {});
5828
5829                            evt.preventDefault();
5830                        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
5831                            self.trigger('results:toggle', {});
5832
5833                            evt.preventDefault();
5834                        } else if (key === KEYS.UP) {
5835                            self.trigger('results:previous', {});
5836
5837                            evt.preventDefault();
5838                        } else if (key === KEYS.DOWN) {
5839                            self.trigger('results:next', {});
5840
5841                            evt.preventDefault();
5842                        }
5843                    } else {
5844                        if (key === KEYS.ENTER || key === KEYS.SPACE ||
5845                            (key === KEYS.DOWN && evt.altKey)) {
5846                            self.open();
5847
5848                            evt.preventDefault();
5849                        }
5850                    }
5851                });
5852            };
5853
5854            Select2.prototype._syncAttributes = function () {
5855                this.options.set('disabled', this.$element.prop('disabled'));
5856
5857                if (this.isDisabled()) {
5858                    if (this.isOpen()) {
5859                        this.close();
5860                    }
5861
5862                    this.trigger('disable', {});
5863                } else {
5864                    this.trigger('enable', {});
5865                }
5866            };
5867
5868            Select2.prototype._isChangeMutation = function (mutations) {
5869                var self = this;
5870
5871                if (mutations.addedNodes && mutations.addedNodes.length > 0) {
5872                    for (var n = 0; n < mutations.addedNodes.length; n++) {
5873                        var node = mutations.addedNodes[n];
5874
5875                        if (node.selected) {
5876                            return true;
5877                        }
5878                    }
5879                } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
5880                    return true;
5881                } else if (Array.isArray(mutations)) {
5882                    return mutations.some(function (mutation) {
5883                        return self._isChangeMutation(mutation);
5884                    });
5885                }
5886
5887                return false;
vendor: 11,068 bytes, lines 5888-6209
5888            };
5889
5890            Select2.prototype._syncSubtree = function (mutations) {
5891                var changed = this._isChangeMutation(mutations);
5892                var self = this;
5893
5894                // Only re-pull the data if we think there is a change
5895                if (changed) {
5896                    this.dataAdapter.current(function (currentData) {
5897                        self.trigger('selection:update', {
5898                            data: currentData
5899                        });
5900                    });
5901                }
5902            };
5903
5904            /**
5905             * Override the trigger method to automatically trigger pre-events when
5906             * there are events that can be prevented.
5907             */
5908            Select2.prototype.trigger = function (name, args) {
5909                var actualTrigger = Select2.__super__.trigger;
5910                var preTriggerMap = {
5911                    'open': 'opening',
5912                    'close': 'closing',
5913                    'select': 'selecting',
5914                    'unselect': 'unselecting',
5915                    'clear': 'clearing'
5916                };
5917
5918                if (args === undefined) {
5919                    args = {};
5920                }
5921
5922                if (name in preTriggerMap) {
5923                    var preTriggerName = preTriggerMap[name];
5924                    var preTriggerArgs = {
5925                        prevented: false,
5926                        name: name,
5927                        args: args
5928                    };
5929
5930                    actualTrigger.call(this, preTriggerName, preTriggerArgs);
5931
5932                    if (preTriggerArgs.prevented) {
5933                        args.prevented = true;
5934
5935                        return;
5936                    }
5937                }
5938
5939                actualTrigger.call(this, name, args);
5940            };
5941
5942            Select2.prototype.toggleDropdown = function () {
5943                if (this.isDisabled()) {
5944                    return;
5945                }
5946
5947                if (this.isOpen()) {
5948                    this.close();
5949                } else {
5950                    this.open();
5951                }
5952            };
5953
5954            Select2.prototype.open = function () {
5955                if (this.isOpen()) {
5956                    return;
5957                }
5958
5959                if (this.isDisabled()) {
5960                    return;
5961                }
5962
5963                this.trigger('query', {});
5964            };
5965
5966            Select2.prototype.close = function (evt) {
5967                if (!this.isOpen()) {
5968                    return;
5969                }
5970
5971                this.trigger('close', { originalEvent : evt });
5972            };
5973
5974            /**
5975             * Helper method to abstract the "enabled" (not "disabled") state of this
5976             * object.
5977             *
5978             * @return {true} if the instance is not disabled.
5979             * @return {false} if the instance is disabled.
5980             */
5981            Select2.prototype.isEnabled = function () {
5982                return !this.isDisabled();
5983            };
5984
5985            /**
5986             * Helper method to abstract the "disabled" state of this object.
5987             *
5988             * @return {true} if the disabled option is true.
5989             * @return {false} if the disabled option is false.
5990             */
5991            Select2.prototype.isDisabled = function () {
5992                return this.options.get('disabled');
5993            };
5994
5995            Select2.prototype.isOpen = function () {
5996                return this.$container[0].classList.contains('select2-container--open');
5997            };
5998
5999            Select2.prototype.hasFocus = function () {
6000                return this.$container[0].classList.contains('select2-container--focus');
6001            };
6002
6003            Select2.prototype.focus = function (data) {
6004                // No need to re-trigger focus events if we are already focused
6005                if (this.hasFocus()) {
6006                    return;
6007                }
6008
6009                this.$container[0].classList.add('select2-container--focus');
6010                this.trigger('focus', {});
6011            };
6012
6013            Select2.prototype.enable = function (args) {
6014                if (this.options.get('debug') && window.console && console.warn) {
6015                    console.warn(
6016                        'Select2: The `select2("enable")` method has been deprecated and will' +
6017                        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
6018                        ' instead.'
6019                    );
6020                }
6021
6022                if (args == null || args.length === 0) {
6023                    args = [true];
6024                }
6025
6026                var disabled = !args[0];
6027
6028                this.$element.prop('disabled', disabled);
6029            };
6030
6031            Select2.prototype.data = function () {
6032                if (this.options.get('debug') &&
6033                    arguments.length > 0 && window.console && console.warn) {
6034                    console.warn(
6035                        'Select2: Data can no longer be set using `select2("data")`. You ' +
6036                        'should consider setting the value instead using `$element.val()`.'
6037                    );
6038                }
6039
6040                var data = [];
6041
6042                this.dataAdapter.current(function (currentData) {
6043                    data = currentData;
6044                });
6045
6046                return data;
6047            };
6048
6049            Select2.prototype.val = function (args) {
6050                if (this.options.get('debug') && window.console && console.warn) {
6051                    console.warn(
6052                        'Select2: The `select2("val")` method has been deprecated and will be' +
6053                        ' removed in later Select2 versions. Use $element.val() instead.'
6054                    );
6055                }
6056
6057                if (args == null || args.length === 0) {
6058                    return this.$element.val();
6059                }
6060
6061                var newVal = args[0];
6062
6063                if (Array.isArray(newVal)) {
6064                    newVal = newVal.map(function (obj) {
6065                        return obj.toString();
6066                    });
6067                }
6068
6069                this.$element.val(newVal).trigger('input').trigger('change');
6070            };
6071
6072            Select2.prototype.destroy = function () {
6073                Utils.RemoveData(this.$container[0]);
6074                this.$container.remove();
6075
6076                this._observer.disconnect();
6077                this._observer = null;
6078
6079                this._syncA = null;
6080                this._syncS = null;
6081
6082                this.$element.off('.select2');
6083                this.$element.attr('tabindex',
6084                    Utils.GetData(this.$element[0], 'old-tabindex'));
6085
6086                this.$element[0].classList.remove('select2-hidden-accessible');
6087                this.$element.attr('aria-hidden', 'false');
6088                Utils.RemoveData(this.$element[0]);
6089                this.$element.removeData('select2');
6090
6091                this.dataAdapter.destroy();
6092                this.selection.destroy();
6093                this.dropdown.destroy();
6094                this.results.destroy();
6095
6096                this.dataAdapter = null;
6097                this.selection = null;
6098                this.dropdown = null;
6099                this.results = null;
6100            };
6101
6102            Select2.prototype.render = function () {
6103                var $container = $(
6104                    '<span class="select2 select2-container">' +
6105                    '<span class="selection"></span>' +
6106                    '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
6107                    '</span>'
6108                );
6109
6110                $container.attr('dir', this.options.get('dir'));
6111
6112                this.$container = $container;
6113
6114                this.$container[0].classList
6115                    .add('select2-container--' + this.options.get('theme'));
6116
6117                Utils.StoreData($container[0], 'element', this.$element);
6118
6119                return $container;
6120            };
6121
6122            return Select2;
6123        });
6124
6125        S2.define('jquery-mousewheel',[
6126            'jquery'
6127        ], function ($) {
6128            // Used to shim jQuery.mousewheel for non-full builds.
6129            return $;
6130        });
6131
6132        S2.define('jquery.select2',[
6133            'jquery',
6134            'jquery-mousewheel',
6135
6136            './select2/core',
6137            './select2/defaults',
6138            './select2/utils'
6139        ], function ($, _, Select2, Defaults, Utils) {
6140            if ($.fn.select2 == null) {
6141                // All methods that should return the element
6142                var thisMethods = ['open', 'close', 'destroy'];
6143
6144                $.fn.select2 = function (options) {
6145                    options = options || {};
6146
6147                    if (typeof options === 'object') {
6148                        this.each(function () {
6149                            var instanceOptions = $.extend(true, {}, options);
6150
6151                            var instance = new Select2($(this), instanceOptions);
6152                        });
6153
6154                        return this;
6155                    } else if (typeof options === 'string') {
6156                        var ret;
6157                        var args = Array.prototype.slice.call(arguments, 1);
6158
6159                        this.each(function () {
6160                            var instance = Utils.GetData(this, 'select2');
6161
6162                            if (instance == null && window.console && console.error) {
6163                                console.error(
6164                                    'The select2(\'' + options + '\') method was called on an ' +
6165                                    'element that is not using Select2.'
6166                                );
6167                            }
6168
6169                            ret = instance[options].apply(instance, args);
6170                        });
6171
6172                        // Check if we should be returning `this`
6173                        if (thisMethods.indexOf(options) > -1) {
6174                            return this;
6175                        }
6176
6177                        return ret;
6178                    } else {
6179                        throw new Error('Invalid arguments for Select2: ' + options);
6180                    }
6181                };
6182            }
6183
6184            if ($.fn.select2.defaults == null) {
6185                $.fn.select2.defaults = Defaults;
6186            }
6187
6188            return Select2;
6189        });
6190
6191        // Return the AMD loader configuration so it can be used outside of this file
6192        return {
6193            define: S2.define,
6194            require: S2.require
6195        };
6196    }());
6197
6198    // Autoload the jQuery bindings
6199    // We know that all of the modules exist above this, so we're safe
6200    var select2 = S2.require('jquery.select2');
6201
6202    // Hold the AMD module references on the jQuery function that was just loaded
6203    // This allows Select2 to use the internal loader outside of this file, such
6204    // as in the language files.
6205    jQuery.fn.select2.amd = S2;
6206
6207    // Return the Select2 instance for anyone who is importing it.
6208    return select2;
6209}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.