PageSourceSearch

https://shinhoglobal.com/js/custom/lyt-cn-careers.js?MMHzV4aty1

js shinhoglobal.com collected 2026-09-25 18:33:48 UTC 425,895 bytes, 14,605 lines download raw bytes

1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// The module cache
3/******/ 	var installedModules = {};
4/******/
5/******/ 	// The require function
6/******/ 	function __webpack_require__(moduleId) {
7/******/
8/******/ 		// Check if module is in cache
9/******/ 		if(installedModules[moduleId]) {
10/******/ 			return installedModules[moduleId].exports;
11/******/ 		}
12/******/ 		// Create a new module (and put it into the cache)
13/******/ 		var module = installedModules[moduleId] = {
14/******/ 			i: moduleId,
15/******/ 			l: false,
16/******/ 			exports: {}
17/******/ 		};
18/******/
19/******/ 		// Execute the module function
20/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21/******/
22/******/ 		// Flag the module as loaded
23/******/ 		module.l = true;
24/******/
25/******/ 		// Return the exports of the module
26/******/ 		return module.exports;
27/******/ 	}
28/******/
29/******/
30/******/ 	// expose the modules object (__webpack_modules__)
31/******/ 	__webpack_require__.m = modules;
32/******/
33/******/ 	// expose the module cache
34/******/ 	__webpack_require__.c = installedModules;
35/******/
36/******/ 	// define getter function for harmony exports
37/******/ 	__webpack_require__.d = function(exports, name, getter) {
38/******/ 		if(!__webpack_require__.o(exports, name)) {
39/******/ 			Object.defineProperty(exports, name, {
40/******/ 				configurable: false,
41/******/ 				enumerable: true,
42/******/ 				get: getter
43/******/ 			});
44/******/ 		}
45/******/ 	};
46/******/
47/******/ 	// getDefaultExport function for compatibility with non-harmony modules
48/******/ 	__webpack_require__.n = function(module) {
49/******/ 		var getter = module && module.__esModule ?
50/******/ 			function getDefault() { return module['default']; } :
51/******/ 			function getModuleExports() { return module; };
52/******/ 		__webpack_require__.d(getter, 'a', getter);
53/******/ 		return getter;
54/******/ 	};
55/******/
56/******/ 	// Object.prototype.hasOwnProperty.call
57/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58/******/
59/******/ 	// __webpack_public_path__
60/******/ 	__webpack_require__.p = "";
61/******/
62/******/ 	// Load entry module and return exports
63/******/ 	return __webpack_require__(__webpack_require__.s = 56);
64/******/ })
65/************************************************************************/
66/******/ ({
67
68/***/ 0:
69/***/ (function(module, exports, __webpack_require__) {
70
71var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
72 * jQuery JavaScript Library v1.12.4
73 * http://jquery.com/
74 *
75 * Includes Sizzle.js
76 * http://sizzlejs.com/
77 *
78 * Copyright jQuery Foundation and other contributors
79 * Released under the MIT license
80 * http://jquery.org/license
81 *
82 * Date: 2016-05-20T17:17Z
83 */
84
85(function (global, factory) {
86
87	if (typeof module === "object" && typeof module.exports === "object") {
88		// For CommonJS and CommonJS-like environments where a proper `window`
89		// is present, execute the factory and get jQuery.
90		// For environments that do not have a `window` with a `document`
91		// (such as Node.js), expose a factory as module.exports.
92		// This accentuates the need for the creation of a real `window`.
93		// e.g. var jQuery = require("jquery")(window);
94		// See ticket #14549 for more info.
95		module.exports = global.document ? factory(global, true) : function (w) {
96			if (!w.document) {
97				throw new Error("jQuery requires a window with a document");
98			}
99			return factory(w);
100		};
101	} else {
102		factory(global);
103	}
104
105	// Pass this if window is not defined yet
106})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
107
108	// Support: Firefox 18+
109	// Can't be in strict mode, several libs including ASP.NET trace
110	// the stack via arguments.caller.callee and Firefox dies if
vendor: 4,159 bytes, lines 111-295
111	// you try to trace through "use strict" call chains. (#13335)
112	//"use strict";
113	var deletedIds = [];
114
115	var document = window.document;
116
117	var slice = deletedIds.slice;
118
119	var concat = deletedIds.concat;
120
121	var push = deletedIds.push;
122
123	var indexOf = deletedIds.indexOf;
124
125	var class2type = {};
126
127	var toString = class2type.toString;
128
129	var hasOwn = class2type.hasOwnProperty;
130
131	var support = {};
132
133	var version = "1.12.4",
134
135
136	// Define a local copy of jQuery
137	jQuery = function (selector, context) {
138
139		// The jQuery object is actually just the init constructor 'enhanced'
140		// Need init if jQuery is called (just allow error to be thrown if not included)
141		return new jQuery.fn.init(selector, context);
142	},
143
144
145	// Support: Android<4.1, IE<9
146	// Make sure we trim BOM and NBSP
147	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
148
149
150	// Matches dashed string for camelizing
151	rmsPrefix = /^-ms-/,
152	    rdashAlpha = /-([\da-z])/gi,
153
154
155	// Used by jQuery.camelCase as callback to replace()
156	fcamelCase = function (all, letter) {
157		return letter.toUpperCase();
158	};
159
160	jQuery.fn = jQuery.prototype = {
161
162		// The current version of jQuery being used
163		jquery: version,
164
165		constructor: jQuery,
166
167		// Start with an empty selector
168		selector: "",
169
170		// The default length of a jQuery object is 0
171		length: 0,
172
173		toArray: function () {
174			return slice.call(this);
175		},
176
177		// Get the Nth element in the matched element set OR
178		// Get the whole matched element set as a clean array
179		get: function (num) {
180			return num != null ?
181
182			// Return just the one element from the set
183			num < 0 ? this[num + this.length] : this[num] :
184
185			// Return all the elements in a clean array
186			slice.call(this);
187		},
188
189		// Take an array of elements and push it onto the stack
190		// (returning the new matched element set)
191		pushStack: function (elems) {
192
193			// Build a new jQuery matched element set
194			var ret = jQuery.merge(this.constructor(), elems);
195
196			// Add the old object onto the stack (as a reference)
197			ret.prevObject = this;
198			ret.context = this.context;
199
200			// Return the newly-formed element set
201			return ret;
202		},
203
204		// Execute a callback for every element in the matched set.
205		each: function (callback) {
206			return jQuery.each(this, callback);
207		},
208
209		map: function (callback) {
210			return this.pushStack(jQuery.map(this, function (elem, i) {
211				return callback.call(elem, i, elem);
212			}));
213		},
214
215		slice: function () {
216			return this.pushStack(slice.apply(this, arguments));
217		},
218
219		first: function () {
220			return this.eq(0);
221		},
222
223		last: function () {
224			return this.eq(-1);
225		},
226
227		eq: function (i) {
228			var len = this.length,
229			    j = +i + (i < 0 ? len : 0);
230			return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
231		},
232
233		end: function () {
234			return this.prevObject || this.constructor();
235		},
236
237		// For internal use only.
238		// Behaves like an Array's method, not like a jQuery method.
239		push: push,
240		sort: deletedIds.sort,
241		splice: deletedIds.splice
242	};
243
244	jQuery.extend = jQuery.fn.extend = function () {
245		var src,
246		    copyIsArray,
247		    copy,
248		    name,
249		    options,
250		    clone,
251		    target = arguments[0] || {},
252		    i = 1,
253		    length = arguments.length,
254		    deep = false;
255
256		// Handle a deep copy situation
257		if (typeof target === "boolean") {
258			deep = target;
259
260			// skip the boolean and the target
261			target = arguments[i] || {};
262			i++;
263		}
264
265		// Handle case when target is a string or something (possible in deep copy)
266		if (typeof target !== "object" && !jQuery.isFunction(target)) {
267			target = {};
268		}
269
270		// extend jQuery itself if only one argument is passed
271		if (i === length) {
272			target = this;
273			i--;
274		}
275
276		for (; i < length; i++) {
277
278			// Only deal with non-null/undefined values
279			if ((options = arguments[i]) != null) {
280
281				// Extend the base object
282				for (name in options) {
283					src = target[name];
284					copy = options[name];
285
286					// Prevent never-ending loop
287					if (target === copy) {
288						continue;
289					}
290
291					// Recurse if we're merging plain objects or arrays
292					if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
293
294						if (copyIsArray) {
295							copyIsArray = false;
vendor: 8,553 bytes, lines 296-637
296							clone = src && jQuery.isArray(src) ? src : [];
297						} else {
298							clone = src && jQuery.isPlainObject(src) ? src : {};
299						}
300
301						// Never move original objects, clone them
302						target[name] = jQuery.extend(deep, clone, copy);
303
304						// Don't bring in undefined values
305					} else if (copy !== undefined) {
306						target[name] = copy;
307					}
308				}
309			}
310		}
311
312		// Return the modified object
313		return target;
314	};
315
316	jQuery.extend({
317
318		// Unique for each copy of jQuery on the page
319		expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
320
321		// Assume jQuery is ready without the ready module
322		isReady: true,
323
324		error: function (msg) {
325			throw new Error(msg);
326		},
327
328		noop: function () {},
329
330		// See test/unit/core.js for details concerning isFunction.
331		// Since version 1.3, DOM methods and functions like alert
332		// aren't supported. They return false on IE (#2968).
333		isFunction: function (obj) {
334			return jQuery.type(obj) === "function";
335		},
336
337		isArray: Array.isArray || function (obj) {
338			return jQuery.type(obj) === "array";
339		},
340
341		isWindow: function (obj) {
342			/* jshint eqeqeq: false */
343			return obj != null && obj == obj.window;
344		},
345
346		isNumeric: function (obj) {
347
348			// parseFloat NaNs numeric-cast false positives (null|true|false|"")
349			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
350			// subtraction forces infinities to NaN
351			// adding 1 corrects loss of precision from parseFloat (#15100)
352			var realStringObj = obj && obj.toString();
353			return !jQuery.isArray(obj) && realStringObj - parseFloat(realStringObj) + 1 >= 0;
354		},
355
356		isEmptyObject: function (obj) {
357			var name;
358			for (name in obj) {
359				return false;
360			}
361			return true;
362		},
363
364		isPlainObject: function (obj) {
365			var key;
366
367			// Must be an Object.
368			// Because of IE, we also have to check the presence of the constructor property.
369			// Make sure that DOM nodes and window objects don't pass through, as well
370			if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
371				return false;
372			}
373
374			try {
375
376				// Not own constructor property must be Object
377				if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
378					return false;
379				}
380			} catch (e) {
381
382				// IE8,9 Will throw exceptions on certain host objects #9897
383				return false;
384			}
385
386			// Support: IE<9
387			// Handle iteration over inherited properties before own properties.
388			if (!support.ownFirst) {
389				for (key in obj) {
390					return hasOwn.call(obj, key);
391				}
392			}
393
394			// Own properties are enumerated firstly, so to speed up,
395			// if last one is own, then all properties are own.
396			for (key in obj) {}
397
398			return key === undefined || hasOwn.call(obj, key);
399		},
400
401		type: function (obj) {
402			if (obj == null) {
403				return obj + "";
404			}
405			return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj;
406		},
407
408		// Workarounds based on findings by Jim Driscoll
409		// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
410		globalEval: function (data) {
411			if (data && jQuery.trim(data)) {
412
413				// We use execScript on Internet Explorer
414				// We use an anonymous function so that context is window
415				// rather than jQuery in Firefox
416				(window.execScript || function (data) {
417					window["eval"].call(window, data); // jscs:ignore requireDotNotation
418				})(data);
419			}
420		},
421
422		// Convert dashed to camelCase; used by the css and data modules
423		// Microsoft forgot to hump their vendor prefix (#9572)
424		camelCase: function (string) {
425			return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
426		},
427
428		nodeName: function (elem, name) {
429			return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
430		},
431
432		each: function (obj, callback) {
433			var length,
434			    i = 0;
435
436			if (isArrayLike(obj)) {
437				length = obj.length;
438				for (; i < length; i++) {
439					if (callback.call(obj[i], i, obj[i]) === false) {
440						break;
441					}
442				}
443			} else {
444				for (i in obj) {
445					if (callback.call(obj[i], i, obj[i]) === false) {
446						break;
447					}
448				}
449			}
450
451			return obj;
452		},
453
454		// Support: Android<4.1, IE<9
455		trim: function (text) {
456			return text == null ? "" : (text + "").replace(rtrim, "");
457		},
458
459		// results is for internal usage only
460		makeArray: function (arr, results) {
461			var ret = results || [];
462
463			if (arr != null) {
464				if (isArrayLike(Object(arr))) {
465					jQuery.merge(ret, typeof arr === "string" ? [arr] : arr);
466				} else {
467					push.call(ret, arr);
468				}
469			}
470
471			return ret;
472		},
473
474		inArray: function (elem, arr, i) {
475			var len;
476
477			if (arr) {
478				if (indexOf) {
479					return indexOf.call(arr, elem, i);
480				}
481
482				len = arr.length;
483				i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
484
485				for (; i < len; i++) {
486
487					// Skip accessing in sparse arrays
488					if (i in arr && arr[i] === elem) {
489						return i;
490					}
491				}
492			}
493
494			return -1;
495		},
496
497		merge: function (first, second) {
498			var len = +second.length,
499			    j = 0,
500			    i = first.length;
501
502			while (j < len) {
503				first[i++] = second[j++];
504			}
505
506			// Support: IE<9
507			// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
508			if (len !== len) {
509				while (second[j] !== undefined) {
510					first[i++] = second[j++];
511				}
512			}
513
514			first.length = i;
515
516			return first;
517		},
518
519		grep: function (elems, callback, invert) {
520			var callbackInverse,
521			    matches = [],
522			    i = 0,
523			    length = elems.length,
524			    callbackExpect = !invert;
525
526			// Go through the array, only saving the items
527			// that pass the validator function
528			for (; i < length; i++) {
529				callbackInverse = !callback(elems[i], i);
530				if (callbackInverse !== callbackExpect) {
531					matches.push(elems[i]);
532				}
533			}
534
535			return matches;
536		},
537
538		// arg is for internal usage only
539		map: function (elems, callback, arg) {
540			var length,
541			    value,
542			    i = 0,
543			    ret = [];
544
545			// Go through the array, translating each of the items to their new values
546			if (isArrayLike(elems)) {
547				length = elems.length;
548				for (; i < length; i++) {
549					value = callback(elems[i], i, arg);
550
551					if (value != null) {
552						ret.push(value);
553					}
554				}
555
556				// Go through every key on the object,
557			} else {
558				for (i in elems) {
559					value = callback(elems[i], i, arg);
560
561					if (value != null) {
562						ret.push(value);
563					}
564				}
565			}
566
567			// Flatten any nested arrays
568			return concat.apply([], ret);
569		},
570
571		// A global GUID counter for objects
572		guid: 1,
573
574		// Bind a function to a context, optionally partially applying any
575		// arguments.
576		proxy: function (fn, context) {
577			var args, proxy, tmp;
578
579			if (typeof context === "string") {
580				tmp = fn[context];
581				context = fn;
582				fn = tmp;
583			}
584
585			// Quick check to determine if target is callable, in the spec
586			// this throws a TypeError, but we will just return undefined.
587			if (!jQuery.isFunction(fn)) {
588				return undefined;
589			}
590
591			// Simulated bind
592			args = slice.call(arguments, 2);
593			proxy = function () {
594				return fn.apply(context || this, args.concat(slice.call(arguments)));
595			};
596
597			// Set the guid of unique handler to the same of original handler, so it can be removed
598			proxy.guid = fn.guid = fn.guid || jQuery.guid++;
599
600			return proxy;
601		},
602
603		now: function () {
604			return +new Date();
605		},
606
607		// jQuery.support is not used in Core but other projects attach their
608		// properties to it so it needs to exist.
609		support: support
610	});
611
612	// JSHint would error on this code due to the Symbol not being defined in ES5.
613	// Defining this global in .jshintrc would create a danger of using the global
614	// unguarded in another place, it seems safer to just disable JSHint for these
615	// three lines.
616	/* jshint ignore: start */
617	if (typeof Symbol === "function") {
618		jQuery.fn[Symbol.iterator] = deletedIds[Symbol.iterator];
619	}
620	/* jshint ignore: end */
621
622	// Populate the class2type map
623	jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (i, name) {
624		class2type["[object " + name + "]"] = name.toLowerCase();
625	});
626
627	function isArrayLike(obj) {
628
629		// Support: iOS 8.2 (not reproducible in simulator)
630		// `in` check used to prevent JIT error (gh-2145)
631		// hasOwn isn't used here due to false negatives
632		// regarding Nodelist length in IE
633		var length = !!obj && "length" in obj && obj.length,
634		    type = jQuery.type(obj);
635
636		if (type === "function" || jQuery.isWindow(obj)) {
637			return false;
vendor: 4,770 bytes, lines 638-783
638		}
639
640		return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
641	}
642	var Sizzle =
643	/*!
644  * Sizzle CSS Selector Engine v2.2.1
645  * http://sizzlejs.com/
646  *
647  * Copyright jQuery Foundation and other contributors
648  * Released under the MIT license
649  * http://jquery.org/license
650  *
651  * Date: 2015-10-17
652  */
653	function (window) {
654
655		var i,
656		    support,
657		    Expr,
658		    getText,
659		    isXML,
660		    tokenize,
661		    compile,
662		    select,
663		    outermostContext,
664		    sortInput,
665		    hasDuplicate,
666
667
668		// Local document vars
669		setDocument,
670		    document,
671		    docElem,
672		    documentIsHTML,
673		    rbuggyQSA,
674		    rbuggyMatches,
675		    matches,
676		    contains,
677
678
679		// Instance-specific data
680		expando = "sizzle" + 1 * new Date(),
681		    preferredDoc = window.document,
682		    dirruns = 0,
683		    done = 0,
684		    classCache = createCache(),
685		    tokenCache = createCache(),
686		    compilerCache = createCache(),
687		    sortOrder = function (a, b) {
688			if (a === b) {
689				hasDuplicate = true;
690			}
691			return 0;
692		},
693
694
695		// General-purpose constants
696		MAX_NEGATIVE = 1 << 31,
697
698
699		// Instance methods
700		hasOwn = {}.hasOwnProperty,
701		    arr = [],
702		    pop = arr.pop,
703		    push_native = arr.push,
704		    push = arr.push,
705		    slice = arr.slice,
706
707		// Use a stripped-down indexOf as it's faster than native
708		// http://jsperf.com/thor-indexof-vs-for/5
709		indexOf = function (list, elem) {
710			var i = 0,
711			    len = list.length;
712			for (; i < len; i++) {
713				if (list[i] === elem) {
714					return i;
715				}
716			}
717			return -1;
718		},
719		    booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
720
721
722		// Regular expressions
723
724		// http://www.w3.org/TR/css3-selectors/#whitespace
725		whitespace = "[\\x20\\t\\r\\n\\f]",
726
727
728		// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
729		identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
730
731
732		// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
733		attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
734		// Operator (capture 2)
735		"*([*^$|!~]?=)" + whitespace +
736		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
737		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]",
738		    pseudos = ":(" + identifier + ")(?:\\((" +
739		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
740		// 1. quoted (capture 3; capture 4 or capture 5)
741		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
742		// 2. simple (capture 6)
743		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
744		// 3. anything else (capture 2)
745		".*" + ")\\)|)",
746
747
748		// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
749		rwhitespace = new RegExp(whitespace + "+", "g"),
750		    rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
751		    rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
752		    rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
753		    rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),
754		    rpseudo = new RegExp(pseudos),
755		    ridentifier = new RegExp("^" + identifier + "$"),
756		    matchExpr = {
757			"ID": new RegExp("^#(" + identifier + ")"),
758			"CLASS": new RegExp("^\\.(" + identifier + ")"),
759			"TAG": new RegExp("^(" + identifier + "|[*])"),
760			"ATTR": new RegExp("^" + attributes),
761			"PSEUDO": new RegExp("^" + pseudos),
762			"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
763			"bool": new RegExp("^(?:" + booleans + ")$", "i"),
764			// For use in libraries implementing .is()
765			// We use this for POS matching in `select`
766			"needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
767		},
768		    rinputs = /^(?:input|select|textarea|button)$/i,
769		    rheader = /^h\d$/i,
770		    rnative = /^[^{]+\{\s*\[native \w/,
771
772
773		// Easily-parseable/retrievable ID or TAG or CLASS selectors
774		rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
775		    rsibling = /[+~]/,
776		    rescape = /'|\\/g,
777
778
779		// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
780		runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),
781		    funescape = function (_, escaped, escapedWhitespace) {
782			var high = "0x" + escaped - 0x10000;
783			// NaN means non-codepoint
784			// Support: Firefox<24
785			// Workaround erroneous numeric interpretation of +"0x"
786			return high !== high || escapedWhitespace ? escaped : high < 0 ?
787			// BMP codepoint
788			String.fromCharCode(high + 0x10000) :
789			// Supplemental Plane codepoint (surrogate pair)
790			String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
791		},
792
793
794		// Used for iframes
795		// See setDocument()
796		// Removing the function wrapper causes a "Permission Denied"
797		// error in IE
798		unloadHandler = function () {
799			setDocument();
800		};
801
802		// Optimize for push.apply( _, NodeList )
803		try {
804			push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);
805			// Support: Android<4.0
806			// Detect silently failing push.apply
807			arr[preferredDoc.childNodes.length].nodeType;
808		} catch (e) {
809			push = { apply: arr.length ?
810
811				// Leverage slice if possible
812				function (target, els) {
813					push_native.apply(target, slice.call(els));
814				} :
815
816				// Support: IE<9
817				// Otherwise append directly
818				function (target, els) {
819					var j = target.length,
820					    i = 0;
821					// Can't trust NodeList.length
822					while (target[j++] = els[i++]) {}
823					target.length = j - 1;
824				}
825			};
826		}
827
828		function Sizzle(selector, context, results, seed) {
829			var m,
830			    i,
831			    elem,
832			    nid,
833			    nidselect,
834			    match,
835			    groups,
836			    newSelector,
837			    newContext = context && context.ownerDocument,
838
839
840			// nodeType defaults to 9, since context defaults to document
841			nodeType = context ? context.nodeType : 9;
842
843			results = results || [];
844
845			// Return early from calls with invalid selector or context
846			if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
847
848				return results;
849			}
850
851			// Try to shortcut find operations (as opposed to filters) in HTML documents
852			if (!seed) {
853
854				if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
855					setDocument(context);
856				}
857				context = context || document;
858
859				if (documentIsHTML) {
860
861					// If the selector is sufficiently simple, try using a "get*By*" DOM method
862					// (excepting DocumentFragment context, where the methods don't exist)
863					if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {
864
865						// ID selector
866						if (m = match[1]) {
867
868							// Document context
869							if (nodeType === 9) {
870								if (elem = context.getElementById(m)) {
871
872									// Support: IE, Opera, Webkit
873									// TODO: identify versions
874									// getElementById can match elements by name instead of ID
875									if (elem.id === m) {
876										results.push(elem);
877										return results;
878									}
879								} else {
880									return results;
881								}
882
883								// Element context
884							} else {
885
886								// Support: IE, Opera, Webkit
887								// TODO: identify versions
888								// getElementById can match elements by name instead of ID
889								if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) {
890
891									results.push(elem);
892									return results;
893								}
894							}
895
896							// Type selector
897						} else if (match[2]) {
898							push.apply(results, context.getElementsByTagName(selector));
899							return results;
900
901							// Class selector
902						} else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) {
903
904							push.apply(results, context.getElementsByClassName(m));
905							return results;
906						}
907					}
908
909					// Take advantage of querySelectorAll
910					if (support.qsa && !compilerCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
911
912						if (nodeType !== 1) {
913							newContext = context;
914							newSelector = selector;
915
916							// qSA looks outside Element context, which is not what we want
917							// Thanks to Andrew Dupont for this workaround technique
918							// Support: IE <=8
919							// Exclude object elements
920						} else if (context.nodeName.toLowerCase() !== "object") {
921
922							// Capture the context ID, setting it first if necessary
923							if (nid = context.getAttribute("id")) {
924								nid = nid.replace(rescape, "\\$&");
925							} else {
926								context.setAttribute("id", nid = expando);
927							}
928
929							// Prefix every selector in the list
930							groups = tokenize(selector);
931							i = groups.length;
932							nidselect = ridentifier.test(nid) ? "#" + nid : "[id='" + nid + "']";
933							while (i--) {
934								groups[i] = nidselect + " " + toSelector(groups[i]);
935							}
936							newSelector = groups.join(",");
937
938							// Expand context for sibling selectors
vendor: 18,442 bytes, lines 939-1533
939							newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
940						}
941
942						if (newSelector) {
943							try {
944								push.apply(results, newContext.querySelectorAll(newSelector));
945								return results;
946							} catch (qsaError) {} finally {
947								if (nid === expando) {
948									context.removeAttribute("id");
949								}
950							}
951						}
952					}
953				}
954			}
955
956			// All others
957			return select(selector.replace(rtrim, "$1"), context, results, seed);
958		}
959
960		/**
961   * Create key-value caches of limited size
962   * @returns {function(string, object)} Returns the Object data after storing it on itself with
963   *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
964   *	deleting the oldest entry
965   */
966		function createCache() {
967			var keys = [];
968
969			function cache(key, value) {
970				// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
971				if (keys.push(key + " ") > Expr.cacheLength) {
972					// Only keep the most recent entries
973					delete cache[keys.shift()];
974				}
975				return cache[key + " "] = value;
976			}
977			return cache;
978		}
979
980		/**
981   * Mark a function for special use by Sizzle
982   * @param {Function} fn The function to mark
983   */
984		function markFunction(fn) {
985			fn[expando] = true;
986			return fn;
987		}
988
989		/**
990   * Support testing using an element
991   * @param {Function} fn Passed the created div and expects a boolean result
992   */
993		function assert(fn) {
994			var div = document.createElement("div");
995
996			try {
997				return !!fn(div);
998			} catch (e) {
999				return false;
1000			} finally {
1001				// Remove from its parent by default
1002				if (div.parentNode) {
1003					div.parentNode.removeChild(div);
1004				}
1005				// release memory in IE
1006				div = null;
1007			}
1008		}
1009
1010		/**
1011   * Adds the same handler for all of the specified attrs
1012   * @param {String} attrs Pipe-separated list of attributes
1013   * @param {Function} handler The method that will be applied
1014   */
1015		function addHandle(attrs, handler) {
1016			var arr = attrs.split("|"),
1017			    i = arr.length;
1018
1019			while (i--) {
1020				Expr.attrHandle[arr[i]] = handler;
1021			}
1022		}
1023
1024		/**
1025   * Checks document order of two siblings
1026   * @param {Element} a
1027   * @param {Element} b
1028   * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1029   */
1030		function siblingCheck(a, b) {
1031			var cur = b && a,
1032			    diff = cur && a.nodeType === 1 && b.nodeType === 1 && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE);
1033
1034			// Use IE sourceIndex if available on both nodes
1035			if (diff) {
1036				return diff;
1037			}
1038
1039			// Check if b follows a
1040			if (cur) {
1041				while (cur = cur.nextSibling) {
1042					if (cur === b) {
1043						return -1;
1044					}
1045				}
1046			}
1047
1048			return a ? 1 : -1;
1049		}
1050
1051		/**
1052   * Returns a function to use in pseudos for input types
1053   * @param {String} type
1054   */
1055		function createInputPseudo(type) {
1056			return function (elem) {
1057				var name = elem.nodeName.toLowerCase();
1058				return name === "input" && elem.type === type;
1059			};
1060		}
1061
1062		/**
1063   * Returns a function to use in pseudos for buttons
1064   * @param {String} type
1065   */
1066		function createButtonPseudo(type) {
1067			return function (elem) {
1068				var name = elem.nodeName.toLowerCase();
1069				return (name === "input" || name === "button") && elem.type === type;
1070			};
1071		}
1072
1073		/**
1074   * Returns a function to use in pseudos for positionals
1075   * @param {Function} fn
1076   */
1077		function createPositionalPseudo(fn) {
1078			return markFunction(function (argument) {
1079				argument = +argument;
1080				return markFunction(function (seed, matches) {
1081					var j,
1082					    matchIndexes = fn([], seed.length, argument),
1083					    i = matchIndexes.length;
1084
1085					// Match elements found at the specified indexes
1086					while (i--) {
1087						if (seed[j = matchIndexes[i]]) {
1088							seed[j] = !(matches[j] = seed[j]);
1089						}
1090					}
1091				});
1092			});
1093		}
1094
1095		/**
1096   * Checks a node for validity as a Sizzle context
1097   * @param {Element|Object=} context
1098   * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1099   */
1100		function testContext(context) {
1101			return context && typeof context.getElementsByTagName !== "undefined" && context;
1102		}
1103
1104		// Expose support vars for convenience
1105		support = Sizzle.support = {};
1106
1107		/**
1108   * Detects XML nodes
1109   * @param {Element|Object} elem An element or a document
1110   * @returns {Boolean} True iff elem is a non-HTML XML node
1111   */
1112		isXML = Sizzle.isXML = function (elem) {
1113			// documentElement is verified for cases where it doesn't yet exist
1114			// (such as loading iframes in IE - #4833)
1115			var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1116			return documentElement ? documentElement.nodeName !== "HTML" : false;
1117		};
1118
1119		/**
1120   * Sets document-related variables once based on the current document
1121   * @param {Element|Object} [doc] An element or document object to use to set the document
1122   * @returns {Object} Returns the current document
1123   */
1124		setDocument = Sizzle.setDocument = function (node) {
1125			var hasCompare,
1126			    parent,
1127			    doc = node ? node.ownerDocument || node : preferredDoc;
1128
1129			// Return early if doc is invalid or already selected
1130			if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
1131				return document;
1132			}
1133
1134			// Update global variables
1135			document = doc;
1136			docElem = document.documentElement;
1137			documentIsHTML = !isXML(document);
1138
1139			// Support: IE 9-11, Edge
1140			// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1141			if ((parent = document.defaultView) && parent.top !== parent) {
1142				// Support: IE 11
1143				if (parent.addEventListener) {
1144					parent.addEventListener("unload", unloadHandler, false);
1145
1146					// Support: IE 9 - 10 only
1147				} else if (parent.attachEvent) {
1148					parent.attachEvent("onunload", unloadHandler);
1149				}
1150			}
1151
1152			/* Attributes
1153   ---------------------------------------------------------------------- */
1154
1155			// Support: IE<8
1156			// Verify that getAttribute really returns attributes and not properties
1157			// (excepting IE8 booleans)
1158			support.attributes = assert(function (div) {
1159				div.className = "i";
1160				return !div.getAttribute("className");
1161			});
1162
1163			/* getElement(s)By*
1164   ---------------------------------------------------------------------- */
1165
1166			// Check if getElementsByTagName("*") returns only elements
1167			support.getElementsByTagName = assert(function (div) {
1168				div.appendChild(document.createComment(""));
1169				return !div.getElementsByTagName("*").length;
1170			});
1171
1172			// Support: IE<9
1173			support.getElementsByClassName = rnative.test(document.getElementsByClassName);
1174
1175			// Support: IE<10
1176			// Check if getElementById returns elements by name
1177			// The broken getElementById methods don't pick up programatically-set names,
1178			// so use a roundabout getElementsByName test
1179			support.getById = assert(function (div) {
1180				docElem.appendChild(div).id = expando;
1181				return !document.getElementsByName || !document.getElementsByName(expando).length;
1182			});
1183
1184			// ID find and filter
1185			if (support.getById) {
1186				Expr.find["ID"] = function (id, context) {
1187					if (typeof context.getElementById !== "undefined" && documentIsHTML) {
1188						var m = context.getElementById(id);
1189						return m ? [m] : [];
1190					}
1191				};
1192				Expr.filter["ID"] = function (id) {
1193					var attrId = id.replace(runescape, funescape);
1194					return function (elem) {
1195						return elem.getAttribute("id") === attrId;
1196					};
1197				};
1198			} else {
1199				// Support: IE6/7
1200				// getElementById is not reliable as a find shortcut
1201				delete Expr.find["ID"];
1202
1203				Expr.filter["ID"] = function (id) {
1204					var attrId = id.replace(runescape, funescape);
1205					return function (elem) {
1206						var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
1207						return node && node.value === attrId;
1208					};
1209				};
1210			}
1211
1212			// Tag
1213			Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) {
1214				if (typeof context.getElementsByTagName !== "undefined") {
1215					return context.getElementsByTagName(tag);
1216
1217					// DocumentFragment nodes don't have gEBTN
1218				} else if (support.qsa) {
1219					return context.querySelectorAll(tag);
1220				}
1221			} : function (tag, context) {
1222				var elem,
1223				    tmp = [],
1224				    i = 0,
1225
1226				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1227				results = context.getElementsByTagName(tag);
1228
1229				// Filter out possible comments
1230				if (tag === "*") {
1231					while (elem = results[i++]) {
1232						if (elem.nodeType === 1) {
1233							tmp.push(elem);
1234						}
1235					}
1236
1237					return tmp;
1238				}
1239				return results;
1240			};
1241
1242			// Class
1243			Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
1244				if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
1245					return context.getElementsByClassName(className);
1246				}
1247			};
1248
1249			/* QSA/matchesSelector
1250   ---------------------------------------------------------------------- */
1251
1252			// QSA and matchesSelector support
1253
1254			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1255			rbuggyMatches = [];
1256
1257			// qSa(:focus) reports false when true (Chrome 21)
1258			// We allow this because of a bug in IE8/9 that throws an error
1259			// whenever `document.activeElement` is accessed on an iframe
1260			// So, we allow :focus to pass through QSA all the time to avoid the IE error
1261			// See http://bugs.jquery.com/ticket/13378
1262			rbuggyQSA = [];
1263
1264			if (support.qsa = rnative.test(document.querySelectorAll)) {
1265				// Build QSA regex
1266				// Regex strategy adopted from Diego Perini
1267				assert(function (div) {
1268					// Select is set to empty string on purpose
1269					// This is to test IE's treatment of not explicitly
1270					// setting a boolean content attribute,
1271					// since its presence should be enough
1272					// http://bugs.jquery.com/ticket/12359
1273					docElem.appendChild(div).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>";
1274
1275					// Support: IE8, Opera 11-12.16
1276					// Nothing should be selected when empty strings follow ^= or $= or *=
1277					// The test attribute must be unknown in Opera but "safe" for WinRT
1278					// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1279					if (div.querySelectorAll("[msallowcapture^='']").length) {
1280						rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
1281					}
1282
1283					// Support: IE8
1284					// Boolean attributes and "value" are not treated correctly
1285					if (!div.querySelectorAll("[selected]").length) {
1286						rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
1287					}
1288
1289					// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1290					if (!div.querySelectorAll("[id~=" + expando + "-]").length) {
1291						rbuggyQSA.push("~=");
1292					}
1293
1294					// Webkit/Opera - :checked should return selected option elements
1295					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1296					// IE8 throws error here and will not see later tests
1297					if (!div.querySelectorAll(":checked").length) {
1298						rbuggyQSA.push(":checked");
1299					}
1300
1301					// Support: Safari 8+, iOS 8+
1302					// https://bugs.webkit.org/show_bug.cgi?id=136851
1303					// In-page `selector#id sibing-combinator selector` fails
1304					if (!div.querySelectorAll("a#" + expando + "+*").length) {
1305						rbuggyQSA.push(".#.+[+~]");
1306					}
1307				});
1308
1309				assert(function (div) {
1310					// Support: Windows 8 Native Apps
1311					// The type and name attributes are restricted during .innerHTML assignment
1312					var input = document.createElement("input");
1313					input.setAttribute("type", "hidden");
1314					div.appendChild(input).setAttribute("name", "D");
1315
1316					// Support: IE8
1317					// Enforce case-sensitivity of name attribute
1318					if (div.querySelectorAll("[name=d]").length) {
1319						rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
1320					}
1321
1322					// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1323					// IE8 throws error here and will not see later tests
1324					if (!div.querySelectorAll(":enabled").length) {
1325						rbuggyQSA.push(":enabled", ":disabled");
1326					}
1327
1328					// Opera 10-11 does not throw on post-comma invalid pseudos
1329					div.querySelectorAll("*,:x");
1330					rbuggyQSA.push(",.*:");
1331				});
1332			}
1333
1334			if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) {
1335
1336				assert(function (div) {
1337					// Check to see if it's possible to do matchesSelector
1338					// on a disconnected node (IE 9)
1339					support.disconnectedMatch = matches.call(div, "div");
1340
1341					// This should fail with an exception
1342					// Gecko does not error, returns false instead
1343					matches.call(div, "[s!='']:x");
1344					rbuggyMatches.push("!=", pseudos);
1345				});
1346			}
1347
1348			rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
1349			rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));
1350
1351			/* Contains
1352   ---------------------------------------------------------------------- */
1353			hasCompare = rnative.test(docElem.compareDocumentPosition);
1354
1355			// Element contains another
1356			// Purposefully self-exclusive
1357			// As in, an element does not contain itself
1358			contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) {
1359				var adown = a.nodeType === 9 ? a.documentElement : a,
1360				    bup = b && b.parentNode;
1361				return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
1362			} : function (a, b) {
1363				if (b) {
1364					while (b = b.parentNode) {
1365						if (b === a) {
1366							return true;
1367						}
1368					}
1369				}
1370				return false;
1371			};
1372
1373			/* Sorting
1374   ---------------------------------------------------------------------- */
1375
1376			// Document order sorting
1377			sortOrder = hasCompare ? function (a, b) {
1378
1379				// Flag for duplicate removal
1380				if (a === b) {
1381					hasDuplicate = true;
1382					return 0;
1383				}
1384
1385				// Sort on method existence if only one input has compareDocumentPosition
1386				var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1387				if (compare) {
1388					return compare;
1389				}
1390
1391				// Calculate position if both inputs belong to the same document
1392				compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) :
1393
1394				// Otherwise we know they are disconnected
1395				1;
1396
1397				// Disconnected nodes
1398				if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {
1399
1400					// Choose the first element that is related to our preferred document
1401					if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {
1402						return -1;
1403					}
1404					if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {
1405						return 1;
1406					}
1407
1408					// Maintain original order
1409					return sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;
1410				}
1411
1412				return compare & 4 ? -1 : 1;
1413			} : function (a, b) {
1414				// Exit early if the nodes are identical
1415				if (a === b) {
1416					hasDuplicate = true;
1417					return 0;
1418				}
1419
1420				var cur,
1421				    i = 0,
1422				    aup = a.parentNode,
1423				    bup = b.parentNode,
1424				    ap = [a],
1425				    bp = [b];
1426
1427				// Parentless nodes are either documents or disconnected
1428				if (!aup || !bup) {
1429					return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;
1430
1431					// If the nodes are siblings, we can do a quick check
1432				} else if (aup === bup) {
1433					return siblingCheck(a, b);
1434				}
1435
1436				// Otherwise we need full lists of their ancestors for comparison
1437				cur = a;
1438				while (cur = cur.parentNode) {
1439					ap.unshift(cur);
1440				}
1441				cur = b;
1442				while (cur = cur.parentNode) {
1443					bp.unshift(cur);
1444				}
1445
1446				// Walk down the tree looking for a discrepancy
1447				while (ap[i] === bp[i]) {
1448					i++;
1449				}
1450
1451				return i ?
1452				// Do a sibling check if the nodes have a common ancestor
1453				siblingCheck(ap[i], bp[i]) :
1454
1455				// Otherwise nodes in our document sort first
1456				ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;
1457			};
1458
1459			return document;
1460		};
1461
1462		Sizzle.matches = function (expr, elements) {
1463			return Sizzle(expr, null, null, elements);
1464		};
1465
1466		Sizzle.matchesSelector = function (elem, expr) {
1467			// Set document vars if needed
1468			if ((elem.ownerDocument || elem) !== document) {
1469				setDocument(elem);
1470			}
1471
1472			// Make sure that attribute selectors are quoted
1473			expr = expr.replace(rattributeQuotes, "='$1']");
1474
1475			if (support.matchesSelector && documentIsHTML && !compilerCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
1476
1477				try {
1478					var ret = matches.call(elem, expr);
1479
1480					// IE 9's matchesSelector returns false on disconnected nodes
1481					if (ret || support.disconnectedMatch ||
1482					// As well, disconnected nodes are said to be in a document
1483					// fragment in IE 9
1484					elem.document && elem.document.nodeType !== 11) {
1485						return ret;
1486					}
1487				} catch (e) {}
1488			}
1489
1490			return Sizzle(expr, document, null, [elem]).length > 0;
1491		};
1492
1493		Sizzle.contains = function (context, elem) {
1494			// Set document vars if needed
1495			if ((context.ownerDocument || context) !== document) {
1496				setDocument(context);
1497			}
1498			return contains(context, elem);
1499		};
1500
1501		Sizzle.attr = function (elem, name) {
1502			// Set document vars if needed
1503			if ((elem.ownerDocument || elem) !== document) {
1504				setDocument(elem);
1505			}
1506
1507			var fn = Expr.attrHandle[name.toLowerCase()],
1508
1509			// Don't get fooled by Object.prototype properties (jQuery #13807)
1510			val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;
1511
1512			return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
1513		};
1514
1515		Sizzle.error = function (msg) {
1516			throw new Error("Syntax error, unrecognized expression: " + msg);
1517		};
1518
1519		/**
1520   * Document sorting and removing duplicates
1521   * @param {ArrayLike} results
1522   */
1523		Sizzle.uniqueSort = function (results) {
1524			var elem,
1525			    duplicates = [],
1526			    j = 0,
1527			    i = 0;
1528
1529			// Unless we *know* we can detect duplicates, assume their presence
1530			hasDuplicate = !support.detectDuplicates;
1531			sortInput = !support.sortStable && results.slice(0);
1532			results.sort(sortOrder);
1533
vendor: 12,805 bytes, lines 1534-1940
1534			if (hasDuplicate) {
1535				while (elem = results[i++]) {
1536					if (elem === results[i]) {
1537						j = duplicates.push(i);
1538					}
1539				}
1540				while (j--) {
1541					results.splice(duplicates[j], 1);
1542				}
1543			}
1544
1545			// Clear input after sorting to release objects
1546			// See https://github.com/jquery/sizzle/pull/225
1547			sortInput = null;
1548
1549			return results;
1550		};
1551
1552		/**
1553   * Utility function for retrieving the text value of an array of DOM nodes
1554   * @param {Array|Element} elem
1555   */
1556		getText = Sizzle.getText = function (elem) {
1557			var node,
1558			    ret = "",
1559			    i = 0,
1560			    nodeType = elem.nodeType;
1561
1562			if (!nodeType) {
1563				// If no nodeType, this is expected to be an array
1564				while (node = elem[i++]) {
1565					// Do not traverse comment nodes
1566					ret += getText(node);
1567				}
1568			} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
1569				// Use textContent for elements
1570				// innerText usage removed for consistency of new lines (jQuery #11153)
1571				if (typeof elem.textContent === "string") {
1572					return elem.textContent;
1573				} else {
1574					// Traverse its children
1575					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
1576						ret += getText(elem);
1577					}
1578				}
1579			} else if (nodeType === 3 || nodeType === 4) {
1580				return elem.nodeValue;
1581			}
1582			// Do not include comment or processing instruction nodes
1583
1584			return ret;
1585		};
1586
1587		Expr = Sizzle.selectors = {
1588
1589			// Can be adjusted by the user
1590			cacheLength: 50,
1591
1592			createPseudo: markFunction,
1593
1594			match: matchExpr,
1595
1596			attrHandle: {},
1597
1598			find: {},
1599
1600			relative: {
1601				">": { dir: "parentNode", first: true },
1602				" ": { dir: "parentNode" },
1603				"+": { dir: "previousSibling", first: true },
1604				"~": { dir: "previousSibling" }
1605			},
1606
1607			preFilter: {
1608				"ATTR": function (match) {
1609					match[1] = match[1].replace(runescape, funescape);
1610
1611					// Move the given value to match[3] whether quoted or unquoted
1612					match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
1613
1614					if (match[2] === "~=") {
1615						match[3] = " " + match[3] + " ";
1616					}
1617
1618					return match.slice(0, 4);
1619				},
1620
1621				"CHILD": function (match) {
1622					/* matches from matchExpr["CHILD"]
1623     	1 type (only|nth|...)
1624     	2 what (child|of-type)
1625     	3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1626     	4 xn-component of xn+y argument ([+-]?\d*n|)
1627     	5 sign of xn-component
1628     	6 x of xn-component
1629     	7 sign of y-component
1630     	8 y of y-component
1631     */
1632					match[1] = match[1].toLowerCase();
1633
1634					if (match[1].slice(0, 3) === "nth") {
1635						// nth-* requires argument
1636						if (!match[3]) {
1637							Sizzle.error(match[0]);
1638						}
1639
1640						// numeric x and y parameters for Expr.filter.CHILD
1641						// remember that false/true cast respectively to 0/1
1642						match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
1643						match[5] = +(match[7] + match[8] || match[3] === "odd");
1644
1645						// other types prohibit arguments
1646					} else if (match[3]) {
1647						Sizzle.error(match[0]);
1648					}
1649
1650					return match;
1651				},
1652
1653				"PSEUDO": function (match) {
1654					var excess,
1655					    unquoted = !match[6] && match[2];
1656
1657					if (matchExpr["CHILD"].test(match[0])) {
1658						return null;
1659					}
1660
1661					// Accept quoted arguments as-is
1662					if (match[3]) {
1663						match[2] = match[4] || match[5] || "";
1664
1665						// Strip excess characters from unquoted arguments
1666					} else if (unquoted && rpseudo.test(unquoted) && (
1667					// Get excess from tokenize (recursively)
1668					excess = tokenize(unquoted, true)) && (
1669					// advance to the next closing parenthesis
1670					excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
1671
1672						// excess is a negative index
1673						match[0] = match[0].slice(0, excess);
1674						match[2] = unquoted.slice(0, excess);
1675					}
1676
1677					// Return only captures needed by the pseudo filter method (type and argument)
1678					return match.slice(0, 3);
1679				}
1680			},
1681
1682			filter: {
1683
1684				"TAG": function (nodeNameSelector) {
1685					var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
1686					return nodeNameSelector === "*" ? function () {
1687						return true;
1688					} : function (elem) {
1689						return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1690					};
1691				},
1692
1693				"CLASS": function (className) {
1694					var pattern = classCache[className + " "];
1695
1696					return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) {
1697						return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
1698					});
1699				},
1700
1701				"ATTR": function (name, operator, check) {
1702					return function (elem) {
1703						var result = Sizzle.attr(elem, name);
1704
1705						if (result == null) {
1706							return operator === "!=";
1707						}
1708						if (!operator) {
1709							return true;
1710						}
1711
1712						result += "";
1713
1714						return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false;
1715					};
1716				},
1717
1718				"CHILD": function (type, what, argument, first, last) {
1719					var simple = type.slice(0, 3) !== "nth",
1720					    forward = type.slice(-4) !== "last",
1721					    ofType = what === "of-type";
1722
1723					return first === 1 && last === 0 ?
1724
1725					// Shortcut for :nth-*(n)
1726					function (elem) {
1727						return !!elem.parentNode;
1728					} : function (elem, context, xml) {
1729						var cache,
1730						    uniqueCache,
1731						    outerCache,
1732						    node,
1733						    nodeIndex,
1734						    start,
1735						    dir = simple !== forward ? "nextSibling" : "previousSibling",
1736						    parent = elem.parentNode,
1737						    name = ofType && elem.nodeName.toLowerCase(),
1738						    useCache = !xml && !ofType,
1739						    diff = false;
1740
1741						if (parent) {
1742
1743							// :(first|last|only)-(child|of-type)
1744							if (simple) {
1745								while (dir) {
1746									node = elem;
1747									while (node = node[dir]) {
1748										if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {
1749
1750											return false;
1751										}
1752									}
1753									// Reverse direction for :only-* (if we haven't yet done so)
1754									start = dir = type === "only" && !start && "nextSibling";
1755								}
1756								return true;
1757							}
1758
1759							start = [forward ? parent.firstChild : parent.lastChild];
1760
1761							// non-xml :nth-child(...) stores cache data on `parent`
1762							if (forward && useCache) {
1763
1764								// Seek `elem` from a previously-cached index
1765
1766								// ...in a gzip-friendly way
1767								node = parent;
1768								outerCache = node[expando] || (node[expando] = {});
1769
1770								// Support: IE <9 only
1771								// Defend against cloned attroperties (jQuery gh-1709)
1772								uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
1773
1774								cache = uniqueCache[type] || [];
1775								nodeIndex = cache[0] === dirruns && cache[1];
1776								diff = nodeIndex && cache[2];
1777								node = nodeIndex && parent.childNodes[nodeIndex];
1778
1779								while (node = ++nodeIndex && node && node[dir] || (
1780
1781								// Fallback to seeking `elem` from the start
1782								diff = nodeIndex = 0) || start.pop()) {
1783
1784									// When found, cache indexes on `parent` and break
1785									if (node.nodeType === 1 && ++diff && node === elem) {
1786										uniqueCache[type] = [dirruns, nodeIndex, diff];
1787										break;
1788									}
1789								}
1790							} else {
1791								// Use previously-cached element index if available
1792								if (useCache) {
1793									// ...in a gzip-friendly way
1794									node = elem;
1795									outerCache = node[expando] || (node[expando] = {});
1796
1797									// Support: IE <9 only
1798									// Defend against cloned attroperties (jQuery gh-1709)
1799									uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
1800
1801									cache = uniqueCache[type] || [];
1802									nodeIndex = cache[0] === dirruns && cache[1];
1803									diff = nodeIndex;
1804								}
1805
1806								// xml :nth-child(...)
1807								// or :nth-last-child(...) or :nth(-last)?-of-type(...)
1808								if (diff === false) {
1809									// Use the same loop as above to seek `elem` from the start
1810									while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {
1811
1812										if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {
1813
1814											// Cache the index of each encountered element
1815											if (useCache) {
1816												outerCache = node[expando] || (node[expando] = {});
1817
1818												// Support: IE <9 only
1819												// Defend against cloned attroperties (jQuery gh-1709)
1820												uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
1821
1822												uniqueCache[type] = [dirruns, diff];
1823											}
1824
1825											if (node === elem) {
1826												break;
1827											}
1828										}
1829									}
1830								}
1831							}
1832
1833							// Incorporate the offset, then check against cycle size
1834							diff -= last;
1835							return diff === first || diff % first === 0 && diff / first >= 0;
1836						}
1837					};
1838				},
1839
1840				"PSEUDO": function (pseudo, argument) {
1841					// pseudo-class names are case-insensitive
1842					// http://www.w3.org/TR/selectors/#pseudo-classes
1843					// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1844					// Remember that setFilters inherits from pseudos
1845					var args,
1846					    fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo);
1847
1848					// The user may use createPseudo to indicate that
1849					// arguments are needed to create the filter function
1850					// just as Sizzle does
1851					if (fn[expando]) {
1852						return fn(argument);
1853					}
1854
1855					// But maintain support for old signatures
1856					if (fn.length > 1) {
1857						args = [pseudo, pseudo, "", argument];
1858						return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {
1859							var idx,
1860							    matched = fn(seed, argument),
1861							    i = matched.length;
1862							while (i--) {
1863								idx = indexOf(seed, matched[i]);
1864								seed[idx] = !(matches[idx] = matched[i]);
1865							}
1866						}) : function (elem) {
1867							return fn(elem, 0, args);
1868						};
1869					}
1870
1871					return fn;
1872				}
1873			},
1874
1875			pseudos: {
1876				// Potentially complex pseudos
1877				"not": markFunction(function (selector) {
1878					// Trim the selector passed to compile
1879					// to avoid treating leading and trailing
1880					// spaces as combinators
1881					var input = [],
1882					    results = [],
1883					    matcher = compile(selector.replace(rtrim, "$1"));
1884
1885					return matcher[expando] ? markFunction(function (seed, matches, context, xml) {
1886						var elem,
1887						    unmatched = matcher(seed, null, xml, []),
1888						    i = seed.length;
1889
1890						// Match elements unmatched by `matcher`
1891						while (i--) {
1892							if (elem = unmatched[i]) {
1893								seed[i] = !(matches[i] = elem);
1894							}
1895						}
1896					}) : function (elem, context, xml) {
1897						input[0] = elem;
1898						matcher(input, null, xml, results);
1899						// Don't keep the element (issue #299)
1900						input[0] = null;
1901						return !results.pop();
1902					};
1903				}),
1904
1905				"has": markFunction(function (selector) {
1906					return function (elem) {
1907						return Sizzle(selector, elem).length > 0;
1908					};
1909				}),
1910
1911				"contains": markFunction(function (text) {
1912					text = text.replace(runescape, funescape);
1913					return function (elem) {
1914						return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
1915					};
1916				}),
1917
1918				// "Whether an element is represented by a :lang() selector
1919				// is based solely on the element's language value
1920				// being equal to the identifier C,
1921				// or beginning with the identifier C immediately followed by "-".
1922				// The matching of C against the element's language value is performed case-insensitively.
1923				// The identifier C does not have to be a valid language name."
1924				// http://www.w3.org/TR/selectors/#lang-pseudo
1925				"lang": markFunction(function (lang) {
1926					// lang value must be a valid identifier
1927					if (!ridentifier.test(lang || "")) {
1928						Sizzle.error("unsupported lang: " + lang);
1929					}
1930					lang = lang.replace(runescape, funescape).toLowerCase();
1931					return function (elem) {
1932						var elemLang;
1933						do {
1934							if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {
1935
1936								elemLang = elemLang.toLowerCase();
1937								return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
1938							}
1939						} while ((elem = elem.parentNode) && elem.nodeType === 1);
1940						return false;
vendor: 4,299 bytes, lines 1941-2094
1941					};
1942				}),
1943
1944				// Miscellaneous
1945				"target": function (elem) {
1946					var hash = window.location && window.location.hash;
1947					return hash && hash.slice(1) === elem.id;
1948				},
1949
1950				"root": function (elem) {
1951					return elem === docElem;
1952				},
1953
1954				"focus": function (elem) {
1955					return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1956				},
1957
1958				// Boolean properties
1959				"enabled": function (elem) {
1960					return elem.disabled === false;
1961				},
1962
1963				"disabled": function (elem) {
1964					return elem.disabled === true;
1965				},
1966
1967				"checked": function (elem) {
1968					// In CSS3, :checked should return both checked and selected elements
1969					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1970					var nodeName = elem.nodeName.toLowerCase();
1971					return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected;
1972				},
1973
1974				"selected": function (elem) {
1975					// Accessing this property makes selected-by-default
1976					// options in Safari work properly
1977					if (elem.parentNode) {
1978						elem.parentNode.selectedIndex;
1979					}
1980
1981					return elem.selected === true;
1982				},
1983
1984				// Contents
1985				"empty": function (elem) {
1986					// http://www.w3.org/TR/selectors/#empty-pseudo
1987					// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1988					//   but not by others (comment: 8; processing instruction: 7; etc.)
1989					// nodeType < 6 works because attributes (2) do not appear as children
1990					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
1991						if (elem.nodeType < 6) {
1992							return false;
1993						}
1994					}
1995					return true;
1996				},
1997
1998				"parent": function (elem) {
1999					return !Expr.pseudos["empty"](elem);
2000				},
2001
2002				// Element/input types
2003				"header": function (elem) {
2004					return rheader.test(elem.nodeName);
2005				},
2006
2007				"input": function (elem) {
2008					return rinputs.test(elem.nodeName);
2009				},
2010
2011				"button": function (elem) {
2012					var name = elem.nodeName.toLowerCase();
2013					return name === "input" && elem.type === "button" || name === "button";
2014				},
2015
2016				"text": function (elem) {
2017					var attr;
2018					return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && (
2019
2020					// Support: IE<8
2021					// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2022					(attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
2023				},
2024
2025				// Position-in-collection
2026				"first": createPositionalPseudo(function () {
2027					return [0];
2028				}),
2029
2030				"last": createPositionalPseudo(function (matchIndexes, length) {
2031					return [length - 1];
2032				}),
2033
2034				"eq": createPositionalPseudo(function (matchIndexes, length, argument) {
2035					return [argument < 0 ? argument + length : argument];
2036				}),
2037
2038				"even": createPositionalPseudo(function (matchIndexes, length) {
2039					var i = 0;
2040					for (; i < length; i += 2) {
2041						matchIndexes.push(i);
2042					}
2043					return matchIndexes;
2044				}),
2045
2046				"odd": createPositionalPseudo(function (matchIndexes, length) {
2047					var i = 1;
2048					for (; i < length; i += 2) {
2049						matchIndexes.push(i);
2050					}
2051					return matchIndexes;
2052				}),
2053
2054				"lt": createPositionalPseudo(function (matchIndexes, length, argument) {
2055					var i = argument < 0 ? argument + length : argument;
2056					for (; --i >= 0;) {
2057						matchIndexes.push(i);
2058					}
2059					return matchIndexes;
2060				}),
2061
2062				"gt": createPositionalPseudo(function (matchIndexes, length, argument) {
2063					var i = argument < 0 ? argument + length : argument;
2064					for (; ++i < length;) {
2065						matchIndexes.push(i);
2066					}
2067					return matchIndexes;
2068				})
2069			}
2070		};
2071
2072		Expr.pseudos["nth"] = Expr.pseudos["eq"];
2073
2074		// Add button/input type pseudos
2075		for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
2076			Expr.pseudos[i] = createInputPseudo(i);
2077		}
2078		for (i in { submit: true, reset: true }) {
2079			Expr.pseudos[i] = createButtonPseudo(i);
2080		}
2081
2082		// Easy API for creating new setFilters
2083		function setFilters() {}
2084		setFilters.prototype = Expr.filters = Expr.pseudos;
2085		Expr.setFilters = new setFilters();
2086
2087		tokenize = Sizzle.tokenize = function (selector, parseOnly) {
2088			var matched,
2089			    match,
2090			    tokens,
2091			    type,
2092			    soFar,
2093			    groups,
2094			    preFilters,
vendor: 7,182 bytes, lines 2095-2360
2095			    cached = tokenCache[selector + " "];
2096
2097			if (cached) {
2098				return parseOnly ? 0 : cached.slice(0);
2099			}
2100
2101			soFar = selector;
2102			groups = [];
2103			preFilters = Expr.preFilter;
2104
2105			while (soFar) {
2106
2107				// Comma and first run
2108				if (!matched || (match = rcomma.exec(soFar))) {
2109					if (match) {
2110						// Don't consume trailing commas as valid
2111						soFar = soFar.slice(match[0].length) || soFar;
2112					}
2113					groups.push(tokens = []);
2114				}
2115
2116				matched = false;
2117
2118				// Combinators
2119				if (match = rcombinators.exec(soFar)) {
2120					matched = match.shift();
2121					tokens.push({
2122						value: matched,
2123						// Cast descendant combinators to space
2124						type: match[0].replace(rtrim, " ")
2125					});
2126					soFar = soFar.slice(matched.length);
2127				}
2128
2129				// Filters
2130				for (type in Expr.filter) {
2131					if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
2132						matched = match.shift();
2133						tokens.push({
2134							value: matched,
2135							type: type,
2136							matches: match
2137						});
2138						soFar = soFar.slice(matched.length);
2139					}
2140				}
2141
2142				if (!matched) {
2143					break;
2144				}
2145			}
2146
2147			// Return the length of the invalid excess
2148			// if we're just parsing
2149			// Otherwise, throw an error or return tokens
2150			return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) :
2151			// Cache the tokens
2152			tokenCache(selector, groups).slice(0);
2153		};
2154
2155		function toSelector(tokens) {
2156			var i = 0,
2157			    len = tokens.length,
2158			    selector = "";
2159			for (; i < len; i++) {
2160				selector += tokens[i].value;
2161			}
2162			return selector;
2163		}
2164
2165		function addCombinator(matcher, combinator, base) {
2166			var dir = combinator.dir,
2167			    checkNonElements = base && dir === "parentNode",
2168			    doneName = done++;
2169
2170			return combinator.first ?
2171			// Check against closest ancestor/preceding element
2172			function (elem, context, xml) {
2173				while (elem = elem[dir]) {
2174					if (elem.nodeType === 1 || checkNonElements) {
2175						return matcher(elem, context, xml);
2176					}
2177				}
2178			} :
2179
2180			// Check against all ancestor/preceding elements
2181			function (elem, context, xml) {
2182				var oldCache,
2183				    uniqueCache,
2184				    outerCache,
2185				    newCache = [dirruns, doneName];
2186
2187				// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2188				if (xml) {
2189					while (elem = elem[dir]) {
2190						if (elem.nodeType === 1 || checkNonElements) {
2191							if (matcher(elem, context, xml)) {
2192								return true;
2193							}
2194						}
2195					}
2196				} else {
2197					while (elem = elem[dir]) {
2198						if (elem.nodeType === 1 || checkNonElements) {
2199							outerCache = elem[expando] || (elem[expando] = {});
2200
2201							// Support: IE <9 only
2202							// Defend against cloned attroperties (jQuery gh-1709)
2203							uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});
2204
2205							if ((oldCache = uniqueCache[dir]) && oldCache[0] === dirruns && oldCache[1] === doneName) {
2206
2207								// Assign to newCache so results back-propagate to previous elements
2208								return newCache[2] = oldCache[2];
2209							} else {
2210								// Reuse newcache so results back-propagate to previous elements
2211								uniqueCache[dir] = newCache;
2212
2213								// A match means we're done; a fail means we have to keep checking
2214								if (newCache[2] = matcher(elem, context, xml)) {
2215									return true;
2216								}
2217							}
2218						}
2219					}
2220				}
2221			};
2222		}
2223
2224		function elementMatcher(matchers) {
2225			return matchers.length > 1 ? function (elem, context, xml) {
2226				var i = matchers.length;
2227				while (i--) {
2228					if (!matchers[i](elem, context, xml)) {
2229						return false;
2230					}
2231				}
2232				return true;
2233			} : matchers[0];
2234		}
2235
2236		function multipleContexts(selector, contexts, results) {
2237			var i = 0,
2238			    len = contexts.length;
2239			for (; i < len; i++) {
2240				Sizzle(selector, contexts[i], results);
2241			}
2242			return results;
2243		}
2244
2245		function condense(unmatched, map, filter, context, xml) {
2246			var elem,
2247			    newUnmatched = [],
2248			    i = 0,
2249			    len = unmatched.length,
2250			    mapped = map != null;
2251
2252			for (; i < len; i++) {
2253				if (elem = unmatched[i]) {
2254					if (!filter || filter(elem, context, xml)) {
2255						newUnmatched.push(elem);
2256						if (mapped) {
2257							map.push(i);
2258						}
2259					}
2260				}
2261			}
2262
2263			return newUnmatched;
2264		}
2265
2266		function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
2267			if (postFilter && !postFilter[expando]) {
2268				postFilter = setMatcher(postFilter);
2269			}
2270			if (postFinder && !postFinder[expando]) {
2271				postFinder = setMatcher(postFinder, postSelector);
2272			}
2273			return markFunction(function (seed, results, context, xml) {
2274				var temp,
2275				    i,
2276				    elem,
2277				    preMap = [],
2278				    postMap = [],
2279				    preexisting = results.length,
2280
2281
2282				// Get initial elements from seed or context
2283				elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),
2284
2285
2286				// Prefilter to get matcher input, preserving a map for seed-results synchronization
2287				matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems,
2288				    matcherOut = matcher ?
2289				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2290				postFinder || (seed ? preFilter : preexisting || postFilter) ?
2291
2292				// ...intermediate processing is necessary
2293				[] :
2294
2295				// ...otherwise use results directly
2296				results : matcherIn;
2297
2298				// Find primary matches
2299				if (matcher) {
2300					matcher(matcherIn, matcherOut, context, xml);
2301				}
2302
2303				// Apply postFilter
2304				if (postFilter) {
2305					temp = condense(matcherOut, postMap);
2306					postFilter(temp, [], context, xml);
2307
2308					// Un-match failing elements by moving them back to matcherIn
2309					i = temp.length;
2310					while (i--) {
2311						if (elem = temp[i]) {
2312							matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
2313						}
2314					}
2315				}
2316
2317				if (seed) {
2318					if (postFinder || preFilter) {
2319						if (postFinder) {
2320							// Get the final matcherOut by condensing this intermediate into postFinder contexts
2321							temp = [];
2322							i = matcherOut.length;
2323							while (i--) {
2324								if (elem = matcherOut[i]) {
2325									// Restore matcherIn since elem is not yet a final match
2326									temp.push(matcherIn[i] = elem);
2327								}
2328							}
2329							postFinder(null, matcherOut = [], temp, xml);
2330						}
2331
2332						// Move matched elements from seed to results to keep them synchronized
2333						i = matcherOut.length;
2334						while (i--) {
2335							if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {
2336
2337								seed[temp] = !(results[temp] = elem);
2338							}
2339						}
2340					}
2341
2342					// Add elements to results, through postFinder if defined
2343				} else {
2344					matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
2345					if (postFinder) {
2346						postFinder(null, results, matcherOut, xml);
2347					} else {
2348						push.apply(results, matcherOut);
2349					}
2350				}
2351			});
2352		}
2353
2354		function matcherFromTokens(tokens) {
2355			var checkContext,
2356			    matcher,
2357			    j,
2358			    len = tokens.length,
2359			    leadingRelative = Expr.relative[tokens[0].type],
2360			    implicitRelative = leadingRelative || Expr.relative[" "],
vendor: 7,952 bytes, lines 2361-2597
2361			    i = leadingRelative ? 1 : 0,
2362
2363
2364			// The foundational matcher ensures that elements are reachable from top-level context(s)
2365			matchContext = addCombinator(function (elem) {
2366				return elem === checkContext;
2367			}, implicitRelative, true),
2368			    matchAnyContext = addCombinator(function (elem) {
2369				return indexOf(checkContext, elem) > -1;
2370			}, implicitRelative, true),
2371			    matchers = [function (elem, context, xml) {
2372				var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
2373				// Avoid hanging onto element (issue #299)
2374				checkContext = null;
2375				return ret;
2376			}];
2377
2378			for (; i < len; i++) {
2379				if (matcher = Expr.relative[tokens[i].type]) {
2380					matchers = [addCombinator(elementMatcher(matchers), matcher)];
2381				} else {
2382					matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);
2383
2384					// Return special upon seeing a positional matcher
2385					if (matcher[expando]) {
2386						// Find the next relative operator (if any) for proper handling
2387						j = ++i;
2388						for (; j < len; j++) {
2389							if (Expr.relative[tokens[j].type]) {
2390								break;
2391							}
2392						}
2393						return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(
2394						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2395						tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === " " ? "*" : "" })).replace(rtrim, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
2396					}
2397					matchers.push(matcher);
2398				}
2399			}
2400
2401			return elementMatcher(matchers);
2402		}
2403
2404		function matcherFromGroupMatchers(elementMatchers, setMatchers) {
2405			var bySet = setMatchers.length > 0,
2406			    byElement = elementMatchers.length > 0,
2407			    superMatcher = function (seed, context, xml, results, outermost) {
2408				var elem,
2409				    j,
2410				    matcher,
2411				    matchedCount = 0,
2412				    i = "0",
2413				    unmatched = seed && [],
2414				    setMatched = [],
2415				    contextBackup = outermostContext,
2416
2417				// We must always have either seed elements or outermost context
2418				elems = seed || byElement && Expr.find["TAG"]("*", outermost),
2419
2420				// Use integer dirruns iff this is the outermost matcher
2421				dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,
2422				    len = elems.length;
2423
2424				if (outermost) {
2425					outermostContext = context === document || context || outermost;
2426				}
2427
2428				// Add elements passing elementMatchers directly to results
2429				// Support: IE<9, Safari
2430				// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2431				for (; i !== len && (elem = elems[i]) != null; i++) {
2432					if (byElement && elem) {
2433						j = 0;
2434						if (!context && elem.ownerDocument !== document) {
2435							setDocument(elem);
2436							xml = !documentIsHTML;
2437						}
2438						while (matcher = elementMatchers[j++]) {
2439							if (matcher(elem, context || document, xml)) {
2440								results.push(elem);
2441								break;
2442							}
2443						}
2444						if (outermost) {
2445							dirruns = dirrunsUnique;
2446						}
2447					}
2448
2449					// Track unmatched elements for set filters
2450					if (bySet) {
2451						// They will have gone through all possible matchers
2452						if (elem = !matcher && elem) {
2453							matchedCount--;
2454						}
2455
2456						// Lengthen the array for every element, matched or not
2457						if (seed) {
2458							unmatched.push(elem);
2459						}
2460					}
2461				}
2462
2463				// `i` is now the count of elements visited above, and adding it to `matchedCount`
2464				// makes the latter nonnegative.
2465				matchedCount += i;
2466
2467				// Apply set filters to unmatched elements
2468				// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2469				// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2470				// no element matchers and no seed.
2471				// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2472				// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2473				// numerically zero.
2474				if (bySet && i !== matchedCount) {
2475					j = 0;
2476					while (matcher = setMatchers[j++]) {
2477						matcher(unmatched, setMatched, context, xml);
2478					}
2479
2480					if (seed) {
2481						// Reintegrate element matches to eliminate the need for sorting
2482						if (matchedCount > 0) {
2483							while (i--) {
2484								if (!(unmatched[i] || setMatched[i])) {
2485									setMatched[i] = pop.call(results);
2486								}
2487							}
2488						}
2489
2490						// Discard index placeholder values to get only actual matches
2491						setMatched = condense(setMatched);
2492					}
2493
2494					// Add matches to results
2495					push.apply(results, setMatched);
2496
2497					// Seedless set matches succeeding multiple successful matchers stipulate sorting
2498					if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
2499
2500						Sizzle.uniqueSort(results);
2501					}
2502				}
2503
2504				// Override manipulation of globals by nested matchers
2505				if (outermost) {
2506					dirruns = dirrunsUnique;
2507					outermostContext = contextBackup;
2508				}
2509
2510				return unmatched;
2511			};
2512
2513			return bySet ? markFunction(superMatcher) : superMatcher;
2514		}
2515
2516		compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {
2517			var i,
2518			    setMatchers = [],
2519			    elementMatchers = [],
2520			    cached = compilerCache[selector + " "];
2521
2522			if (!cached) {
2523				// Generate a function of recursive functions that can be used to check each element
2524				if (!match) {
2525					match = tokenize(selector);
2526				}
2527				i = match.length;
2528				while (i--) {
2529					cached = matcherFromTokens(match[i]);
2530					if (cached[expando]) {
2531						setMatchers.push(cached);
2532					} else {
2533						elementMatchers.push(cached);
2534					}
2535				}
2536
2537				// Cache the compiled function
2538				cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));
2539
2540				// Save selector and tokenization
2541				cached.selector = selector;
2542			}
2543			return cached;
2544		};
2545
2546		/**
2547   * A low-level selection function that works with Sizzle's compiled
2548   *  selector functions
2549   * @param {String|Function} selector A selector or a pre-compiled
2550   *  selector function built with Sizzle.compile
2551   * @param {Element} context
2552   * @param {Array} [results]
2553   * @param {Array} [seed] A set of elements to match against
2554   */
2555		select = Sizzle.select = function (selector, context, results, seed) {
2556			var i,
2557			    tokens,
2558			    token,
2559			    type,
2560			    find,
2561			    compiled = typeof selector === "function" && selector,
2562			    match = !seed && tokenize(selector = compiled.selector || selector);
2563
2564			results = results || [];
2565
2566			// Try to minimize operations if there is only one selector in the list and no seed
2567			// (the latter of which guarantees us context)
2568			if (match.length === 1) {
2569
2570				// Reduce context if the leading compound selector is an ID
2571				tokens = match[0] = match[0].slice(0);
2572				if (tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
2573
2574					context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
2575					if (!context) {
2576						return results;
2577
2578						// Precompiled matchers will still verify ancestry, so step up a level
2579					} else if (compiled) {
2580						context = context.parentNode;
2581					}
2582
2583					selector = selector.slice(tokens.shift().value.length);
2584				}
2585
2586				// Fetch a seed set for right-to-left matching
2587				i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
2588				while (i--) {
2589					token = tokens[i];
2590
2591					// Abort if we hit a combinator
2592					if (Expr.relative[type = token.type]) {
2593						break;
2594					}
2595					if (find = Expr.find[type]) {
2596						// Search, expanding context for leading sibling combinators
2597						if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testC
vendor: 5,935 bytes, lines 2597-2811
2597ontext(context.parentNode) || context)) {
2598
2599							// If seed is empty or no tokens remain, we can return early
2600							tokens.splice(i, 1);
2601							selector = seed.length && toSelector(tokens);
2602							if (!selector) {
2603								push.apply(results, seed);
2604								return results;
2605							}
2606
2607							break;
2608						}
2609					}
2610				}
2611			}
2612
2613			// Compile and execute a filtering function if one is not provided
2614			// Provide `match` to avoid retokenization if we modified the selector above
2615			(compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);
2616			return results;
2617		};
2618
2619		// One-time assignments
2620
2621		// Sort stability
2622		support.sortStable = expando.split("").sort(sortOrder).join("") === expando;
2623
2624		// Support: Chrome 14-35+
2625		// Always assume duplicates if they aren't passed to the comparison function
2626		support.detectDuplicates = !!hasDuplicate;
2627
2628		// Initialize against the default document
2629		setDocument();
2630
2631		// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2632		// Detached nodes confoundingly follow *each other*
2633		support.sortDetached = assert(function (div1) {
2634			// Should return 1, but returns 4 (following)
2635			return div1.compareDocumentPosition(document.createElement("div")) & 1;
2636		});
2637
2638		// Support: IE<8
2639		// Prevent attribute/property "interpolation"
2640		// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2641		if (!assert(function (div) {
2642			div.innerHTML = "<a href='#'></a>";
2643			return div.firstChild.getAttribute("href") === "#";
2644		})) {
2645			addHandle("type|href|height|width", function (elem, name, isXML) {
2646				if (!isXML) {
2647					return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
2648				}
2649			});
2650		}
2651
2652		// Support: IE<9
2653		// Use defaultValue in place of getAttribute("value")
2654		if (!support.attributes || !assert(function (div) {
2655			div.innerHTML = "<input/>";
2656			div.firstChild.setAttribute("value", "");
2657			return div.firstChild.getAttribute("value") === "";
2658		})) {
2659			addHandle("value", function (elem, name, isXML) {
2660				if (!isXML && elem.nodeName.toLowerCase() === "input") {
2661					return elem.defaultValue;
2662				}
2663			});
2664		}
2665
2666		// Support: IE<9
2667		// Use getAttributeNode to fetch booleans when getAttribute lies
2668		if (!assert(function (div) {
2669			return div.getAttribute("disabled") == null;
2670		})) {
2671			addHandle(booleans, function (elem, name, isXML) {
2672				var val;
2673				if (!isXML) {
2674					return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
2675				}
2676			});
2677		}
2678
2679		return Sizzle;
2680	}(window);
2681
2682	jQuery.find = Sizzle;
2683	jQuery.expr = Sizzle.selectors;
2684	jQuery.expr[":"] = jQuery.expr.pseudos;
2685	jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2686	jQuery.text = Sizzle.getText;
2687	jQuery.isXMLDoc = Sizzle.isXML;
2688	jQuery.contains = Sizzle.contains;
2689
2690	var dir = function (elem, dir, until) {
2691		var matched = [],
2692		    truncate = until !== undefined;
2693
2694		while ((elem = elem[dir]) && elem.nodeType !== 9) {
2695			if (elem.nodeType === 1) {
2696				if (truncate && jQuery(elem).is(until)) {
2697					break;
2698				}
2699				matched.push(elem);
2700			}
2701		}
2702		return matched;
2703	};
2704
2705	var siblings = function (n, elem) {
2706		var matched = [];
2707
2708		for (; n; n = n.nextSibling) {
2709			if (n.nodeType === 1 && n !== elem) {
2710				matched.push(n);
2711			}
2712		}
2713
2714		return matched;
2715	};
2716
2717	var rneedsContext = jQuery.expr.match.needsContext;
2718
2719	var rsingleTag = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/;
2720
2721	var risSimple = /^.[^:#\[\.,]*$/;
2722
2723	// Implement the identical functionality for filter and not
2724	function winnow(elements, qualifier, not) {
2725		if (jQuery.isFunction(qualifier)) {
2726			return jQuery.grep(elements, function (elem, i) {
2727				/* jshint -W018 */
2728				return !!qualifier.call(elem, i, elem) !== not;
2729			});
2730		}
2731
2732		if (qualifier.nodeType) {
2733			return jQuery.grep(elements, function (elem) {
2734				return elem === qualifier !== not;
2735			});
2736		}
2737
2738		if (typeof qualifier === "string") {
2739			if (risSimple.test(qualifier)) {
2740				return jQuery.filter(qualifier, elements, not);
2741			}
2742
2743			qualifier = jQuery.filter(qualifier, elements);
2744		}
2745
2746		return jQuery.grep(elements, function (elem) {
2747			return jQuery.inArray(elem, qualifier) > -1 !== not;
2748		});
2749	}
2750
2751	jQuery.filter = function (expr, elems, not) {
2752		var elem = elems[0];
2753
2754		if (not) {
2755			expr = ":not(" + expr + ")";
2756		}
2757
2758		return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
2759			return elem.nodeType === 1;
2760		}));
2761	};
2762
2763	jQuery.fn.extend({
2764		find: function (selector) {
2765			var i,
2766			    ret = [],
2767			    self = this,
2768			    len = self.length;
2769
2770			if (typeof selector !== "string") {
2771				return this.pushStack(jQuery(selector).filter(function () {
2772					for (i = 0; i < len; i++) {
2773						if (jQuery.contains(self[i], this)) {
2774							return true;
2775						}
2776					}
2777				}));
2778			}
2779
2780			for (i = 0; i < len; i++) {
2781				jQuery.find(selector, self[i], ret);
2782			}
2783
2784			// Needed because $( selector, context ) becomes $( context ).find( selector )
2785			ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret);
2786			ret.selector = this.selector ? this.selector + " " + selector : selector;
2787			return ret;
2788		},
2789		filter: function (selector) {
2790			return this.pushStack(winnow(this, selector || [], false));
2791		},
2792		not: function (selector) {
2793			return this.pushStack(winnow(this, selector || [], true));
2794		},
2795		is: function (selector) {
2796			return !!winnow(this,
2797
2798			// If this is a positional/relative selector, check membership in the returned set
2799			// so $("p:first").is("p:last") won't return true for a doc with two "p".
2800			typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
2801		}
2802	});
2803
2804	// Initialize a jQuery object
2805
2806
2807	// A central reference to the root jQuery(document)
2808	var rootjQuery,
2809
2810
2811	// A simple way to check for HTML strings
vendor: 9,553 bytes, lines 2812-3168
2812	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2813	// Strict HTML recognition (#11290: must start with <)
2814	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
2815	    init = jQuery.fn.init = function (selector, context, root) {
2816		var match, elem;
2817
2818		// HANDLE: $(""), $(null), $(undefined), $(false)
2819		if (!selector) {
2820			return this;
2821		}
2822
2823		// init accepts an alternate rootjQuery
2824		// so migrate can support jQuery.sub (gh-2101)
2825		root = root || rootjQuery;
2826
2827		// Handle HTML strings
2828		if (typeof selector === "string") {
2829			if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {
2830
2831				// Assume that strings that start and end with <> are HTML and skip the regex check
2832				match = [null, selector, null];
2833			} else {
2834				match = rquickExpr.exec(selector);
2835			}
2836
2837			// Match html or make sure no context is specified for #id
2838			if (match && (match[1] || !context)) {
2839
2840				// HANDLE: $(html) -> $(array)
2841				if (match[1]) {
2842					context = context instanceof jQuery ? context[0] : context;
2843
2844					// scripts is true for back-compat
2845					// Intentionally let the error be thrown if parseHTML is not present
2846					jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true));
2847
2848					// HANDLE: $(html, props)
2849					if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
2850						for (match in context) {
2851
2852							// Properties of context are called as methods if possible
2853							if (jQuery.isFunction(this[match])) {
2854								this[match](context[match]);
2855
2856								// ...and otherwise set as attributes
2857							} else {
2858								this.attr(match, context[match]);
2859							}
2860						}
2861					}
2862
2863					return this;
2864
2865					// HANDLE: $(#id)
2866				} else {
2867					elem = document.getElementById(match[2]);
2868
2869					// Check parentNode to catch when Blackberry 4.6 returns
2870					// nodes that are no longer in the document #6963
2871					if (elem && elem.parentNode) {
2872
2873						// Handle the case where IE and Opera return items
2874						// by name instead of ID
2875						if (elem.id !== match[2]) {
2876							return rootjQuery.find(selector);
2877						}
2878
2879						// Otherwise, we inject the element directly into the jQuery object
2880						this.length = 1;
2881						this[0] = elem;
2882					}
2883
2884					this.context = document;
2885					this.selector = selector;
2886					return this;
2887				}
2888
2889				// HANDLE: $(expr, $(...))
2890			} else if (!context || context.jquery) {
2891				return (context || root).find(selector);
2892
2893				// HANDLE: $(expr, context)
2894				// (which is just equivalent to: $(context).find(expr)
2895			} else {
2896				return this.constructor(context).find(selector);
2897			}
2898
2899			// HANDLE: $(DOMElement)
2900		} else if (selector.nodeType) {
2901			this.context = this[0] = selector;
2902			this.length = 1;
2903			return this;
2904
2905			// HANDLE: $(function)
2906			// Shortcut for document ready
2907		} else if (jQuery.isFunction(selector)) {
2908			return typeof root.ready !== "undefined" ? root.ready(selector) :
2909
2910			// Execute immediately if ready is not present
2911			selector(jQuery);
2912		}
2913
2914		if (selector.selector !== undefined) {
2915			this.selector = selector.selector;
2916			this.context = selector.context;
2917		}
2918
2919		return jQuery.makeArray(selector, this);
2920	};
2921
2922	// Give the init function the jQuery prototype for later instantiation
2923	init.prototype = jQuery.fn;
2924
2925	// Initialize central reference
2926	rootjQuery = jQuery(document);
2927
2928	var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2929
2930
2931	// methods guaranteed to produce a unique set when starting from a unique set
2932	guaranteedUnique = {
2933		children: true,
2934		contents: true,
2935		next: true,
2936		prev: true
2937	};
2938
2939	jQuery.fn.extend({
2940		has: function (target) {
2941			var i,
2942			    targets = jQuery(target, this),
2943			    len = targets.length;
2944
2945			return this.filter(function () {
2946				for (i = 0; i < len; i++) {
2947					if (jQuery.contains(this, targets[i])) {
2948						return true;
2949					}
2950				}
2951			});
2952		},
2953
2954		closest: function (selectors, context) {
2955			var cur,
2956			    i = 0,
2957			    l = this.length,
2958			    matched = [],
2959			    pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? jQuery(selectors, context || this.context) : 0;
2960
2961			for (; i < l; i++) {
2962				for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
2963
2964					// Always skip document fragments
2965					if (cur.nodeType < 11 && (pos ? pos.index(cur) > -1 :
2966
2967					// Don't pass non-elements to Sizzle
2968					cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {
2969
2970						matched.push(cur);
2971						break;
2972					}
2973				}
2974			}
2975
2976			return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
2977		},
2978
2979		// Determine the position of an element within
2980		// the matched set of elements
2981		index: function (elem) {
2982
2983			// No argument, return index in parent
2984			if (!elem) {
2985				return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
2986			}
2987
2988			// index in selector
2989			if (typeof elem === "string") {
2990				return jQuery.inArray(this[0], jQuery(elem));
2991			}
2992
2993			// Locate the position of the desired element
2994			return jQuery.inArray(
2995
2996			// If it receives a jQuery object, the first element is used
2997			elem.jquery ? elem[0] : elem, this);
2998		},
2999
3000		add: function (selector, context) {
3001			return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));
3002		},
3003
3004		addBack: function (selector) {
3005			return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
3006		}
3007	});
3008
3009	function sibling(cur, dir) {
3010		do {
3011			cur = cur[dir];
3012		} while (cur && cur.nodeType !== 1);
3013
3014		return cur;
3015	}
3016
3017	jQuery.each({
3018		parent: function (elem) {
3019			var parent = elem.parentNode;
3020			return parent && parent.nodeType !== 11 ? parent : null;
3021		},
3022		parents: function (elem) {
3023			return dir(elem, "parentNode");
3024		},
3025		parentsUntil: function (elem, i, until) {
3026			return dir(elem, "parentNode", until);
3027		},
3028		next: function (elem) {
3029			return sibling(elem, "nextSibling");
3030		},
3031		prev: function (elem) {
3032			return sibling(elem, "previousSibling");
3033		},
3034		nextAll: function (elem) {
3035			return dir(elem, "nextSibling");
3036		},
3037		prevAll: function (elem) {
3038			return dir(elem, "previousSibling");
3039		},
3040		nextUntil: function (elem, i, until) {
3041			return dir(elem, "nextSibling", until);
3042		},
3043		prevUntil: function (elem, i, until) {
3044			return dir(elem, "previousSibling", until);
3045		},
3046		siblings: function (elem) {
3047			return siblings((elem.parentNode || {}).firstChild, elem);
3048		},
3049		children: function (elem) {
3050			return siblings(elem.firstChild);
3051		},
3052		contents: function (elem) {
3053			return jQuery.nodeName(elem, "iframe") ? elem.contentDocument || elem.contentWindow.document : jQuery.merge([], elem.childNodes);
3054		}
3055	}, function (name, fn) {
3056		jQuery.fn[name] = function (until, selector) {
3057			var ret = jQuery.map(this, fn, until);
3058
3059			if (name.slice(-5) !== "Until") {
3060				selector = until;
3061			}
3062
3063			if (selector && typeof selector === "string") {
3064				ret = jQuery.filter(selector, ret);
3065			}
3066
3067			if (this.length > 1) {
3068
3069				// Remove duplicates
3070				if (!guaranteedUnique[name]) {
3071					ret = jQuery.uniqueSort(ret);
3072				}
3073
3074				// Reverse order for parents* and prev-derivatives
3075				if (rparentsprev.test(name)) {
3076					ret = ret.reverse();
3077				}
3078			}
3079
3080			return this.pushStack(ret);
3081		};
3082	});
3083	var rnotwhite = /\S+/g;
3084
3085	// Convert String-formatted options into Object-formatted ones
3086	function createOptions(options) {
3087		var object = {};
3088		jQuery.each(options.match(rnotwhite) || [], function (_, flag) {
3089			object[flag] = true;
3090		});
3091		return object;
3092	}
3093
3094	/*
3095  * Create a callback list using the following parameters:
3096  *
3097  *	options: an optional list of space-separated options that will change how
3098  *			the callback list behaves or a more traditional option object
3099  *
3100  * By default a callback list will act like an event callback list and can be
3101  * "fired" multiple times.
3102  *
3103  * Possible options:
3104  *
3105  *	once:			will ensure the callback list can only be fired once (like a Deferred)
3106  *
3107  *	memory:			will keep track of previous values and will call any callback added
3108  *					after the list has been fired right away with the latest "memorized"
3109  *					values (like a Deferred)
3110  *
3111  *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3112  *
3113  *	stopOnFalse:	interrupt callings when a callback returns false
3114  *
3115  */
3116	jQuery.Callbacks = function (options) {
3117
3118		// Convert options from String-formatted to Object-formatted if needed
3119		// (we check in cache first)
3120		options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);
3121
3122		var // Flag to know if list is currently firing
3123		firing,
3124
3125
3126		// Last fire value for non-forgettable lists
3127		memory,
3128
3129
3130		// Flag to know if list was already fired
3131		fired,
3132
3133
3134		// Flag to prevent firing
3135		locked,
3136
3137
3138		// Actual callback list
3139		list = [],
3140
3141
3142		// Queue of execution data for repeatable lists
3143		queue = [],
3144
3145
3146		// Index of currently firing callback (modified by add/remove as needed)
3147		firingIndex = -1,
3148
3149
3150		// Fire callbacks
3151		fire = function () {
3152
3153			// Enforce single-firing
3154			locked = options.once;
3155
3156			// Execute callbacks for all pending executions,
3157			// respecting firingIndex overrides and runtime changes
3158			fired = firing = true;
3159			for (; queue.length; firingIndex = -1) {
3160				memory = queue.shift();
3161				while (++firingIndex < list.length) {
3162
3163					// Run callback and check for early termination
3164					if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {
3165
3166						// Jump to end and forget the data so .add doesn't re-fire
3167						firingIndex = list.length;
3168						memory = false;
vendor: 8,134 bytes, lines 3169-3498
3169					}
3170				}
3171			}
3172
3173			// Forget the data if we're done with it
3174			if (!options.memory) {
3175				memory = false;
3176			}
3177
3178			firing = false;
3179
3180			// Clean up if we're done firing for good
3181			if (locked) {
3182
3183				// Keep an empty list if we have data for future add calls
3184				if (memory) {
3185					list = [];
3186
3187					// Otherwise, this object is spent
3188				} else {
3189					list = "";
3190				}
3191			}
3192		},
3193
3194
3195		// Actual Callbacks object
3196		self = {
3197
3198			// Add a callback or a collection of callbacks to the list
3199			add: function () {
3200				if (list) {
3201
3202					// If we have memory from a past run, we should fire after adding
3203					if (memory && !firing) {
3204						firingIndex = list.length - 1;
3205						queue.push(memory);
3206					}
3207
3208					(function add(args) {
3209						jQuery.each(args, function (_, arg) {
3210							if (jQuery.isFunction(arg)) {
3211								if (!options.unique || !self.has(arg)) {
3212									list.push(arg);
3213								}
3214							} else if (arg && arg.length && jQuery.type(arg) !== "string") {
3215
3216								// Inspect recursively
3217								add(arg);
3218							}
3219						});
3220					})(arguments);
3221
3222					if (memory && !firing) {
3223						fire();
3224					}
3225				}
3226				return this;
3227			},
3228
3229			// Remove a callback from the list
3230			remove: function () {
3231				jQuery.each(arguments, function (_, arg) {
3232					var index;
3233					while ((index = jQuery.inArray(arg, list, index)) > -1) {
3234						list.splice(index, 1);
3235
3236						// Handle firing indexes
3237						if (index <= firingIndex) {
3238							firingIndex--;
3239						}
3240					}
3241				});
3242				return this;
3243			},
3244
3245			// Check if a given callback is in the list.
3246			// If no argument is given, return whether or not list has callbacks attached.
3247			has: function (fn) {
3248				return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;
3249			},
3250
3251			// Remove all callbacks from the list
3252			empty: function () {
3253				if (list) {
3254					list = [];
3255				}
3256				return this;
3257			},
3258
3259			// Disable .fire and .add
3260			// Abort any current/pending executions
3261			// Clear all callbacks and values
3262			disable: function () {
3263				locked = queue = [];
3264				list = memory = "";
3265				return this;
3266			},
3267			disabled: function () {
3268				return !list;
3269			},
3270
3271			// Disable .fire
3272			// Also disable .add unless we have memory (since it would have no effect)
3273			// Abort any pending executions
3274			lock: function () {
3275				locked = true;
3276				if (!memory) {
3277					self.disable();
3278				}
3279				return this;
3280			},
3281			locked: function () {
3282				return !!locked;
3283			},
3284
3285			// Call all callbacks with the given context and arguments
3286			fireWith: function (context, args) {
3287				if (!locked) {
3288					args = args || [];
3289					args = [context, args.slice ? args.slice() : args];
3290					queue.push(args);
3291					if (!firing) {
3292						fire();
3293					}
3294				}
3295				return this;
3296			},
3297
3298			// Call all the callbacks with the given arguments
3299			fire: function () {
3300				self.fireWith(this, arguments);
3301				return this;
3302			},
3303
3304			// To know if the callbacks have already been called at least once
3305			fired: function () {
3306				return !!fired;
3307			}
3308		};
3309
3310		return self;
3311	};
3312
3313	jQuery.extend({
3314
3315		Deferred: function (func) {
3316			var tuples = [
3317
3318			// action, add listener, listener list, final state
3319			["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]],
3320			    state = "pending",
3321			    promise = {
3322				state: function () {
3323					return state;
3324				},
3325				always: function () {
3326					deferred.done(arguments).fail(arguments);
3327					return this;
3328				},
3329				then: function () /* fnDone, fnFail, fnProgress */{
3330					var fns = arguments;
3331					return jQuery.Deferred(function (newDefer) {
3332						jQuery.each(tuples, function (i, tuple) {
3333							var fn = jQuery.isFunction(fns[i]) && fns[i];
3334
3335							// deferred[ done | fail | progress ] for forwarding actions to newDefer
3336							deferred[tuple[1]](function () {
3337								var returned = fn && fn.apply(this, arguments);
3338								if (returned && jQuery.isFunction(returned.promise)) {
3339									returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
3340								} else {
3341									newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments);
3342								}
3343							});
3344						});
3345						fns = null;
3346					}).promise();
3347				},
3348
3349				// Get a promise for this deferred
3350				// If obj is provided, the promise aspect is added to the object
3351				promise: function (obj) {
3352					return obj != null ? jQuery.extend(obj, promise) : promise;
3353				}
3354			},
3355			    deferred = {};
3356
3357			// Keep pipe for back-compat
3358			promise.pipe = promise.then;
3359
3360			// Add list-specific methods
3361			jQuery.each(tuples, function (i, tuple) {
3362				var list = tuple[2],
3363				    stateString = tuple[3];
3364
3365				// promise[ done | fail | progress ] = list.add
3366				promise[tuple[1]] = list.add;
3367
3368				// Handle state
3369				if (stateString) {
3370					list.add(function () {
3371
3372						// state = [ resolved | rejected ]
3373						state = stateString;
3374
3375						// [ reject_list | resolve_list ].disable; progress_list.lock
3376					}, tuples[i ^ 1][2].disable, tuples[2][2].lock);
3377				}
3378
3379				// deferred[ resolve | reject | notify ]
3380				deferred[tuple[0]] = function () {
3381					deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments);
3382					return this;
3383				};
3384				deferred[tuple[0] + "With"] = list.fireWith;
3385			});
3386
3387			// Make the deferred a promise
3388			promise.promise(deferred);
3389
3390			// Call given func if any
3391			if (func) {
3392				func.call(deferred, deferred);
3393			}
3394
3395			// All done!
3396			return deferred;
3397		},
3398
3399		// Deferred helper
3400		when: function (subordinate /* , ..., subordinateN */) {
3401			var i = 0,
3402			    resolveValues = slice.call(arguments),
3403			    length = resolveValues.length,
3404
3405
3406			// the count of uncompleted subordinates
3407			remaining = length !== 1 || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0,
3408
3409
3410			// the master Deferred.
3411			// If resolveValues consist of only a single Deferred, just use that.
3412			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3413
3414
3415			// Update function for both resolve and progress values
3416			updateFunc = function (i, contexts, values) {
3417				return function (value) {
3418					contexts[i] = this;
3419					values[i] = arguments.length > 1 ? slice.call(arguments) : value;
3420					if (values === progressValues) {
3421						deferred.notifyWith(contexts, values);
3422					} else if (! --remaining) {
3423						deferred.resolveWith(contexts, values);
3424					}
3425				};
3426			},
3427			    progressValues,
3428			    progressContexts,
3429			    resolveContexts;
3430
3431			// add listeners to Deferred subordinates; treat others as resolved
3432			if (length > 1) {
3433				progressValues = new Array(length);
3434				progressContexts = new Array(length);
3435				resolveContexts = new Array(length);
3436				for (; i < length; i++) {
3437					if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
3438						resolveValues[i].promise().progress(updateFunc(i, progressContexts, progressValues)).done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject);
3439					} else {
3440						--remaining;
3441					}
3442				}
3443			}
3444
3445			// if we're not waiting on anything, resolve the master
3446			if (!remaining) {
3447				deferred.resolveWith(resolveContexts, resolveValues);
3448			}
3449
3450			return deferred.promise();
3451		}
3452	});
3453
3454	// The deferred used on DOM ready
3455	var readyList;
3456
3457	jQuery.fn.ready = function (fn) {
3458
3459		// Add the callback
3460		jQuery.ready.promise().done(fn);
3461
3462		return this;
3463	};
3464
3465	jQuery.extend({
3466
3467		// Is the DOM ready to be used? Set to true once it occurs.
3468		isReady: false,
3469
3470		// A counter to track how many items to wait for before
3471		// the ready event fires. See #6781
3472		readyWait: 1,
3473
3474		// Hold (or release) the ready event
3475		holdReady: function (hold) {
3476			if (hold) {
3477				jQuery.readyWait++;
3478			} else {
3479				jQuery.ready(true);
3480			}
3481		},
3482
3483		// Handle when the DOM is ready
3484		ready: function (wait) {
3485
3486			// Abort if there are pending holds or we're already ready
3487			if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
3488				return;
3489			}
3490
3491			// Remember that the DOM is ready
3492			jQuery.isReady = true;
3493
3494			// If a normal DOM Ready event fired, decrement, and wait if need be
3495			if (wait !== true && --jQuery.readyWait > 0) {
3496				return;
3497			}
3498
3499			// If there are functions bound, to execute
3500			readyList.resolveWith(document, [jQuery]);
3501
3502			// Trigger any bound ready events
3503			if (jQuery.fn.triggerHandler) {
3504				jQuery(document).triggerHandler("ready");
3505				jQuery(document).off("ready");
3506			}
3507		}
3508	});
3509
3510	/**
3511  * Clean-up method for dom ready events
3512  */
3513	function detach() {
3514		if (document.addEventListener) {
3515			document.removeEventListener("DOMContentLoaded", completed);
3516			window.removeEventListener("load", completed);
3517		} else {
3518			document.detachEvent("onreadystatechange", completed);
3519			window.detachEvent("onload", completed);
3520		}
3521	}
3522
3523	/**
3524  * The ready event handler and self cleanup method
3525  */
3526	function completed() {
3527
3528		// readyState === "complete" is good enough for us to call the dom ready in oldIE
3529		if (document.addEventListener || window.event.type === "load" || document.readyState === "complete") {
3530
3531			detach();
3532			jQuery.ready();
3533		}
3534	}
3535
3536	jQuery.ready.promise = function (obj) {
3537		if (!readyList) {
3538
3539			readyList = jQuery.Deferred();
3540
3541			// Catch cases where $(document).ready() is called
3542			// after the browser event has already occurred.
3543			// Support: IE6-10
3544			// Older IE sometimes signals "interactive" too soon
3545			if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) {
3546
3547				// Handle it asynchronously to allow scripts the opportunity to delay ready
3548				window.setTimeout(jQuery.ready);
3549
3550				// Standards-based browsers support DOMContentLoaded
3551			} else if (document.addEventListener) {
3552
3553				// Use the handy event callback
3554				document.addEventListener("DOMContentLoaded", completed);
3555
3556				// A fallback to window.onload, that will always work
3557				window.addEventListener("load", completed);
3558
3559				// If IE event model is used
3560			} else {
3561
3562				// Ensure firing before onload, maybe late but safe also for iframes
3563				document.attachEvent("onreadystatechange", completed);
3564
3565				// A fallback to window.onload, that will always work
3566				window.attachEvent("onload", completed);
3567
3568				// If IE and not a frame
3569				// continually check to see if the document is ready
3570				var top = false;
3571
3572				try {
3573					top = window.frameElement == null && document.documentElement;
3574				} catch (e) {}
3575
3576				if (top && top.doScroll) {
3577					(function doScrollCheck() {
3578						if (!jQuery.isReady) {
3579
3580							try {
3581
3582								// Use the trick by Diego Perini
3583								// http://javascript.nwbox.com/IEContentLoaded/
3584								top.doScroll("left");
3585							} catch (e) {
3586								return window.setTimeout(doScrollCheck, 50);
3587							}
3588
3589							// detach all dom ready events
3590							detach();
3591
3592							// and execute any waiting functions
3593							jQuery.ready();
3594						}
3595					})();
3596				}
3597			}
3598		}
3599		return readyList.promise(obj);
3600	};
3601
3602	// Kick off the DOM ready check even if the user does not
3603	jQuery.ready.promise();
3604
3605	// Support: IE<9
3606	// Iteration over object's inherited properties before its own
3607	var i;
3608	for (i in jQuery(support)) {
3609		break;
3610	}
3611	support.ownFirst = i === "0";
3612
3613	// Note: most support tests are defined in their respective modules.
3614	// false until the test is run
3615	support.inlineBlockNeedsLayout = false;
3616
3617	// Execute ASAP in case we need to set body.style.zoom
3618	jQuery(function () {
3619
3620		// Minified: var a,b,c,d
3621		var val, div, body, container;
3622
3623		body = document.getElementsByTagName("body")[0];
3624		if (!body || !body.style) {
3625
3626			// Return for frameset docs that don't have a body
3627			return;
3628		}
3629
3630		// Setup
3631		div = document.createElement("div");
3632		container = document.createElement("div");
3633		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
3634		body.appendChild(container).appendChild(div);
3635
3636		if (typeof div.style.zoom !== "undefined") {
3637
3638			// Support: IE<8
3639			// Check if natively block-level elements act like inline-block
3640			// elements when setting their display to 'inline' and giving
3641			// them layout
3642			div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
3643
3644			support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
3645			if (val) {
3646
3647				// Prevent IE 6 from affecting layout for positioned elements #11048
3648				// Prevent IE from shrinking the body in IE 7 mode #12869
vendor: 12,463 bytes, lines 3649-4160
3649				// Support: IE<8
3650				body.style.zoom = 1;
3651			}
3652		}
3653
3654		body.removeChild(container);
3655	});
3656
3657	(function () {
3658		var div = document.createElement("div");
3659
3660		// Support: IE<9
3661		support.deleteExpando = true;
3662		try {
3663			delete div.test;
3664		} catch (e) {
3665			support.deleteExpando = false;
3666		}
3667
3668		// Null elements to avoid leaks in IE.
3669		div = null;
3670	})();
3671	var acceptData = function (elem) {
3672		var noData = jQuery.noData[(elem.nodeName + " ").toLowerCase()],
3673		    nodeType = +elem.nodeType || 1;
3674
3675		// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
3676		return nodeType !== 1 && nodeType !== 9 ? false :
3677
3678		// Nodes accept data unless otherwise specified; rejection can be conditional
3679		!noData || noData !== true && elem.getAttribute("classid") === noData;
3680	};
3681
3682	var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
3683	    rmultiDash = /([A-Z])/g;
3684
3685	function dataAttr(elem, key, data) {
3686
3687		// If nothing was found internally, try to fetch any
3688		// data from the HTML5 data-* attribute
3689		if (data === undefined && elem.nodeType === 1) {
3690
3691			var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase();
3692
3693			data = elem.getAttribute(name);
3694
3695			if (typeof data === "string") {
3696				try {
3697					data = data === "true" ? true : data === "false" ? false : data === "null" ? null :
3698
3699					// Only convert to a number if it doesn't change the string
3700					+data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data;
3701				} catch (e) {}
3702
3703				// Make sure we set the data so it isn't changed later
3704				jQuery.data(elem, key, data);
3705			} else {
3706				data = undefined;
3707			}
3708		}
3709
3710		return data;
3711	}
3712
3713	// checks a cache object for emptiness
3714	function isEmptyDataObject(obj) {
3715		var name;
3716		for (name in obj) {
3717
3718			// if the public data object is empty, the private is still empty
3719			if (name === "data" && jQuery.isEmptyObject(obj[name])) {
3720				continue;
3721			}
3722			if (name !== "toJSON") {
3723				return false;
3724			}
3725		}
3726
3727		return true;
3728	}
3729
3730	function internalData(elem, name, data, pvt /* Internal Use Only */) {
3731		if (!acceptData(elem)) {
3732			return;
3733		}
3734
3735		var ret,
3736		    thisCache,
3737		    internalKey = jQuery.expando,
3738
3739
3740		// We have to handle DOM nodes and JS objects differently because IE6-7
3741		// can't GC object references properly across the DOM-JS boundary
3742		isNode = elem.nodeType,
3743
3744
3745		// Only DOM nodes need the global jQuery cache; JS object data is
3746		// attached directly to the object so GC can occur automatically
3747		cache = isNode ? jQuery.cache : elem,
3748
3749
3750		// Only defining an ID for JS objects if its cache already exists allows
3751		// the code to shortcut on the same path as a DOM node with no cache
3752		id = isNode ? elem[internalKey] : elem[internalKey] && internalKey;
3753
3754		// Avoid doing any more work than we need to when trying to get data on an
3755		// object that has no data at all
3756		if ((!id || !cache[id] || !pvt && !cache[id].data) && data === undefined && typeof name === "string") {
3757			return;
3758		}
3759
3760		if (!id) {
3761
3762			// Only DOM nodes need a new unique ID for each element since their data
3763			// ends up in the global cache
3764			if (isNode) {
3765				id = elem[internalKey] = deletedIds.pop() || jQuery.guid++;
3766			} else {
3767				id = internalKey;
3768			}
3769		}
3770
3771		if (!cache[id]) {
3772
3773			// Avoid exposing jQuery metadata on plain JS objects when the object
3774			// is serialized using JSON.stringify
3775			cache[id] = isNode ? {} : { toJSON: jQuery.noop };
3776		}
3777
3778		// An object can be passed to jQuery.data instead of a key/value pair; this gets
3779		// shallow copied over onto the existing cache
3780		if (typeof name === "object" || typeof name === "function") {
3781			if (pvt) {
3782				cache[id] = jQuery.extend(cache[id], name);
3783			} else {
3784				cache[id].data = jQuery.extend(cache[id].data, name);
3785			}
3786		}
3787
3788		thisCache = cache[id];
3789
3790		// jQuery data() is stored in a separate object inside the object's internal data
3791		// cache in order to avoid key collisions between internal data and user-defined
3792		// data.
3793		if (!pvt) {
3794			if (!thisCache.data) {
3795				thisCache.data = {};
3796			}
3797
3798			thisCache = thisCache.data;
3799		}
3800
3801		if (data !== undefined) {
3802			thisCache[jQuery.camelCase(name)] = data;
3803		}
3804
3805		// Check for both converted-to-camel and non-converted data property names
3806		// If a data property was specified
3807		if (typeof name === "string") {
3808
3809			// First Try to find as-is property data
3810			ret = thisCache[name];
3811
3812			// Test for null|undefined property data
3813			if (ret == null) {
3814
3815				// Try to find the camelCased property
3816				ret = thisCache[jQuery.camelCase(name)];
3817			}
3818		} else {
3819			ret = thisCache;
3820		}
3821
3822		return ret;
3823	}
3824
3825	function internalRemoveData(elem, name, pvt) {
3826		if (!acceptData(elem)) {
3827			return;
3828		}
3829
3830		var thisCache,
3831		    i,
3832		    isNode = elem.nodeType,
3833
3834
3835		// See jQuery.data for more information
3836		cache = isNode ? jQuery.cache : elem,
3837		    id = isNode ? elem[jQuery.expando] : jQuery.expando;
3838
3839		// If there is already no cache entry for this object, there is no
3840		// purpose in continuing
3841		if (!cache[id]) {
3842			return;
3843		}
3844
3845		if (name) {
3846
3847			thisCache = pvt ? cache[id] : cache[id].data;
3848
3849			if (thisCache) {
3850
3851				// Support array or space separated string names for data keys
3852				if (!jQuery.isArray(name)) {
3853
3854					// try the string as a key before any manipulation
3855					if (name in thisCache) {
3856						name = [name];
3857					} else {
3858
3859						// split the camel cased version by spaces unless a key with the spaces exists
3860						name = jQuery.camelCase(name);
3861						if (name in thisCache) {
3862							name = [name];
3863						} else {
3864							name = name.split(" ");
3865						}
3866					}
3867				} else {
3868
3869					// If "name" is an array of keys...
3870					// When data is initially created, via ("key", "val") signature,
3871					// keys will be converted to camelCase.
3872					// Since there is no way to tell _how_ a key was added, remove
3873					// both plain key and camelCase key. #12786
3874					// This will only penalize the array argument path.
3875					name = name.concat(jQuery.map(name, jQuery.camelCase));
3876				}
3877
3878				i = name.length;
3879				while (i--) {
3880					delete thisCache[name[i]];
3881				}
3882
3883				// If there is no data left in the cache, we want to continue
3884				// and let the cache object itself get destroyed
3885				if (pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache)) {
3886					return;
3887				}
3888			}
3889		}
3890
3891		// See jQuery.data for more information
3892		if (!pvt) {
3893			delete cache[id].data;
3894
3895			// Don't destroy the parent cache unless the internal data object
3896			// had been the only thing left in it
3897			if (!isEmptyDataObject(cache[id])) {
3898				return;
3899			}
3900		}
3901
3902		// Destroy the cache
3903		if (isNode) {
3904			jQuery.cleanData([elem], true);
3905
3906			// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
3907			/* jshint eqeqeq: false */
3908		} else if (support.deleteExpando || cache != cache.window) {
3909			/* jshint eqeqeq: true */
3910			delete cache[id];
3911
3912			// When all else fails, undefined
3913		} else {
3914			cache[id] = undefined;
3915		}
3916	}
3917
3918	jQuery.extend({
3919		cache: {},
3920
3921		// The following elements (space-suffixed to avoid Object.prototype collisions)
3922		// throw uncatchable exceptions if you attempt to set expando properties
3923		noData: {
3924			"applet ": true,
3925			"embed ": true,
3926
3927			// ...but Flash objects (which have this classid) *can* handle expandos
3928			"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
3929		},
3930
3931		hasData: function (elem) {
3932			elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando];
3933			return !!elem && !isEmptyDataObject(elem);
3934		},
3935
3936		data: function (elem, name, data) {
3937			return internalData(elem, name, data);
3938		},
3939
3940		removeData: function (elem, name) {
3941			return internalRemoveData(elem, name);
3942		},
3943
3944		// For internal use only.
3945		_data: function (elem, name, data) {
3946			return internalData(elem, name, data, true);
3947		},
3948
3949		_removeData: function (elem, name) {
3950			return internalRemoveData(elem, name, true);
3951		}
3952	});
3953
3954	jQuery.fn.extend({
3955		data: function (key, value) {
3956			var i,
3957			    name,
3958			    data,
3959			    elem = this[0],
3960			    attrs = elem && elem.attributes;
3961
3962			// Special expections of .data basically thwart jQuery.access,
3963			// so implement the relevant behavior ourselves
3964
3965			// Gets all values
3966			if (key === undefined) {
3967				if (this.length) {
3968					data = jQuery.data(elem);
3969
3970					if (elem.nodeType === 1 && !jQuery._data(elem, "parsedAttrs")) {
3971						i = attrs.length;
3972						while (i--) {
3973
3974							// Support: IE11+
3975							// The attrs elements can be null (#14894)
3976							if (attrs[i]) {
3977								name = attrs[i].name;
3978								if (name.indexOf("data-") === 0) {
3979									name = jQuery.camelCase(name.slice(5));
3980									dataAttr(elem, name, data[name]);
3981								}
3982							}
3983						}
3984						jQuery._data(elem, "parsedAttrs", true);
3985					}
3986				}
3987
3988				return data;
3989			}
3990
3991			// Sets multiple values
3992			if (typeof key === "object") {
3993				return this.each(function () {
3994					jQuery.data(this, key);
3995				});
3996			}
3997
3998			return arguments.length > 1 ?
3999
4000			// Sets one value
4001			this.each(function () {
4002				jQuery.data(this, key, value);
4003			}) :
4004
4005			// Gets one value
4006			// Try to fetch any internally stored data first
4007			elem ? dataAttr(elem, key, jQuery.data(elem, key)) : undefined;
4008		},
4009
4010		removeData: function (key) {
4011			return this.each(function () {
4012				jQuery.removeData(this, key);
4013			});
4014		}
4015	});
4016
4017	jQuery.extend({
4018		queue: function (elem, type, data) {
4019			var queue;
4020
4021			if (elem) {
4022				type = (type || "fx") + "queue";
4023				queue = jQuery._data(elem, type);
4024
4025				// Speed up dequeue by getting out quickly if this is just a lookup
4026				if (data) {
4027					if (!queue || jQuery.isArray(data)) {
4028						queue = jQuery._data(elem, type, jQuery.makeArray(data));
4029					} else {
4030						queue.push(data);
4031					}
4032				}
4033				return queue || [];
4034			}
4035		},
4036
4037		dequeue: function (elem, type) {
4038			type = type || "fx";
4039
4040			var queue = jQuery.queue(elem, type),
4041			    startLength = queue.length,
4042			    fn = queue.shift(),
4043			    hooks = jQuery._queueHooks(elem, type),
4044			    next = function () {
4045				jQuery.dequeue(elem, type);
4046			};
4047
4048			// If the fx queue is dequeued, always remove the progress sentinel
4049			if (fn === "inprogress") {
4050				fn = queue.shift();
4051				startLength--;
4052			}
4053
4054			if (fn) {
4055
4056				// Add a progress sentinel to prevent the fx queue from being
4057				// automatically dequeued
4058				if (type === "fx") {
4059					queue.unshift("inprogress");
4060				}
4061
4062				// clear up the last queue stop function
4063				delete hooks.stop;
4064				fn.call(elem, next, hooks);
4065			}
4066
4067			if (!startLength && hooks) {
4068				hooks.empty.fire();
4069			}
4070		},
4071
4072		// not intended for public consumption - generates a queueHooks object,
4073		// or returns the current one
4074		_queueHooks: function (elem, type) {
4075			var key = type + "queueHooks";
4076			return jQuery._data(elem, key) || jQuery._data(elem, key, {
4077				empty: jQuery.Callbacks("once memory").add(function () {
4078					jQuery._removeData(elem, type + "queue");
4079					jQuery._removeData(elem, key);
4080				})
4081			});
4082		}
4083	});
4084
4085	jQuery.fn.extend({
4086		queue: function (type, data) {
4087			var setter = 2;
4088
4089			if (typeof type !== "string") {
4090				data = type;
4091				type = "fx";
4092				setter--;
4093			}
4094
4095			if (arguments.length < setter) {
4096				return jQuery.queue(this[0], type);
4097			}
4098
4099			return data === undefined ? this : this.each(function () {
4100				var queue = jQuery.queue(this, type, data);
4101
4102				// ensure a hooks for this queue
4103				jQuery._queueHooks(this, type);
4104
4105				if (type === "fx" && queue[0] !== "inprogress") {
4106					jQuery.dequeue(this, type);
4107				}
4108			});
4109		},
4110		dequeue: function (type) {
4111			return this.each(function () {
4112				jQuery.dequeue(this, type);
4113			});
4114		},
4115		clearQueue: function (type) {
4116			return this.queue(type || "fx", []);
4117		},
4118
4119		// Get a promise resolved when queues of a certain type
4120		// are emptied (fx is the type by default)
4121		promise: function (type, obj) {
4122			var tmp,
4123			    count = 1,
4124			    defer = jQuery.Deferred(),
4125			    elements = this,
4126			    i = this.length,
4127			    resolve = function () {
4128				if (! --count) {
4129					defer.resolveWith(elements, [elements]);
4130				}
4131			};
4132
4133			if (typeof type !== "string") {
4134				obj = type;
4135				type = undefined;
4136			}
4137			type = type || "fx";
4138
4139			while (i--) {
4140				tmp = jQuery._data(elements[i], type + "queueHooks");
4141				if (tmp && tmp.empty) {
4142					count++;
4143					tmp.empty.add(resolve);
4144				}
4145			}
4146			resolve();
4147			return defer.promise(obj);
4148		}
4149	});
4150
4151	(function () {
4152		var shrinkWrapBlocksVal;
4153
4154		support.shrinkWrapBlocks = function () {
4155			if (shrinkWrapBlocksVal != null) {
4156				return shrinkWrapBlocksVal;
4157			}
4158
4159			// Will be changed later if needed.
4160			shrinkWrapBlocksVal = false;
4161
4162			// Minified: var b,c,d
4163			var div, body, container;
4164
4165			body = document.getElementsByTagName("body")[0];
4166			if (!body || !body.style) {
4167
4168				// Test fired too early or in an unsupported environment, exit.
4169				return;
4170			}
4171
4172			// Setup
4173			div = document.createElement("div");
4174			container = document.createElement("div");
4175			container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
4176			body.appendChild(container).appendChild(div);
4177
4178			// Support: IE6
4179			// Check if elements with layout shrink-wrap their children
4180			if (typeof div.style.zoom !== "undefined") {
4181
4182				// Reset CSS: box-sizing; display; margin; border
4183				div.style.cssText =
4184
4185				// Support: Firefox<29, Android 2.3
4186				// Vendor-prefix box-sizing
4187				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + "box-sizing:content-box;display:block;margin:0;border:0;" + "padding:1px;width:1px;zoom:1";
4188				div.appendChild(document.createElement("div")).style.width = "5px";
4189				shrinkWrapBlocksVal = div.offsetWidth !== 3;
4190			}
4191
4192			body.removeChild(container);
4193
4194			return shrinkWrapBlocksVal;
4195		};
4196	})();
4197	var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
4198
4199	var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
4200
4201	var cssExpand = ["Top", "Right", "Bottom", "Left"];
4202
4203	var isHidden = function (elem, el) {
4204
4205		// isHidden might be called from jQuery#filter function;
4206		// in that case, element will be second argument
4207		elem = el || elem;
4208		return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem);
4209	};
4210
4211	function adjustCSS(elem, prop, valueParts, tween) {
4212		var adjusted,
4213		    scale = 1,
4214		    maxIterations = 20,
4215		    currentValue = tween ? function () {
4216			return tween.cur();
4217		} : function () {
4218			return jQuery.css(elem, prop, "");
4219		},
4220		    initial = currentValue(),
4221		    unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),
4222
4223
4224		// Starting value computation is required for potential unit mismatches
4225		initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));
4226
4227		if (initialInUnit && initialInUnit[3] !== unit) {
4228
4229			// Trust units reported by jQuery.css
4230			unit = unit || initialInUnit[3];
4231
4232			// Make sure we update the tween properties later on
4233			valueParts = valueParts || [];
4234
4235			// Iteratively approximate from a nonzero starting point
4236			initialInUnit = +initial || 1;
4237
4238			do {
4239
4240				// If previous iteration zeroed out, double until we get *something*.
4241				// Use string for doubling so we don't accidentally see scale as unchanged below
4242				scale = scale || ".5";
4243
4244				// Adjust and apply
4245				initialInUnit = initialInUnit / scale;
4246				jQuery.style(elem, prop, initialInUnit + unit);
4247
4248				// Update scale, tolerating zero or NaN from tween.cur()
4249				// Break the loop if scale is unchanged or perfect, or if we've just had enough.
4250			} while (scale !== (scale = currentValue() / initial) && scale !== 1 && --maxIterations);
4251		}
4252
4253		if (valueParts) {
4254			initialInUnit = +initialInUnit || +initial || 0;
4255
4256			// Apply relative offset (+=/-=) if specified
4257			adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
4258			if (tween) {
4259				tween.unit = unit;
4260				tween.start = initialInUnit;
4261				tween.end = adjusted;
4262			}
4263		}
4264		return adjusted;
4265	}
4266
4267	// Multifunctional method to get and set values of a collection
4268	// The value/s can optionally be executed if it's a function
4269	var access = function (elems, fn, key, value, chainable, emptyGet, raw) {
4270		var i = 0,
4271		    length = elems.length,
4272		    bulk = key == null;
4273
4274		// Sets many values
4275		if (jQuery.type(key) === "object") {
4276			chainable = true;
4277			for (i in key) {
4278				access(elems, fn, i, key[i], true, emptyGet, raw);
4279			}
4280
4281			// Sets one value
4282		} else if (value !== undefined) {
4283			chainable = true;
4284
4285			if (!jQuery.isFunction(value)) {
4286				raw = true;
4287			}
4288
4289			if (bulk) {
4290
4291				// Bulk operations run against the entire set
4292				if (raw) {
4293					fn.call(elems, value);
4294					fn = null;
4295
4296					// ...except when executing function values
4297				} else {
4298					bulk = fn;
4299					fn = function (elem, key, value) {
4300						return bulk.call(jQuery(elem), value);
4301					};
4302				}
4303			}
4304
4305			if (fn) {
4306				for (; i < length; i++) {
4307					fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
4308				}
4309			}
4310		}
4311
4312		return chainable ? elems :
4313
4314		// Gets
4315		bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet;
4316	};
4317	var rcheckableType = /^(?:checkbox|radio)$/i;
4318
4319	var rtagName = /<([\w:-]+)/;
4320
4321	var rscriptType = /^$|\/(?:java|ecma)script/i;
4322
4323	var rleadingWhitespace = /^\s+/;
4324
4325	var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + "mark|meter|nav|output|picture|progress|section|summary|template|time|video";
4326
4327	function createSafeFragment(document) {
4328		var list = nodeNames.split("|"),
4329		    safeFrag = document.createDocumentFragment();
4330
4331		if (safeFrag.createElement) {
4332			while (list.length) {
4333				safeFrag.createElement(list.pop());
4334			}
4335		}
4336		return safeFrag;
4337	}
4338
4339	(function () {
4340		var div = document.createElement("div"),
4341		    fragment = document.createDocumentFragment(),
4342		    input = document.createElement("input");
4343
4344		// Setup
4345		div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
4346
4347		// IE strips leading whitespace when .innerHTML is used
4348		support.leadingWhitespace = div.firstChild.nodeType === 3;
4349
4350		// Make sure that tbody elements aren't automatically inserted
4351		// IE will insert them into empty tables
4352		support.tbody = !div.getElementsByTagName("tbody").length;
4353
4354		// Make sure that link elements get serialized correctly by innerHTML
4355		// This requires a wrapper element in IE
4356		support.htmlSerialize = !!div.getElementsByTagName("link").length;
4357
4358		// Makes sure cloning an html5 element does not cause problems
4359		// Where outerHTML is undefined, this still works
4360		support.html5Clone = document.createElement("nav").cloneNode(true).outerHTML !== "<:nav></:nav>";
4361
4362		// Check if a disconnected checkbox will retain its checked
4363		// value of true after appended to the DOM (IE6/7)
4364		input.type = "checkbox";
4365		input.checked = true;
4366		fragment.appendChild(input);
4367		support.appendChecked = input.checked;
4368
4369		// Make sure textarea (and checkbox) defaultValue is properly cloned
4370		// Support: IE6-IE11+
4371		div.innerHTML = "<textarea>x</textarea>";
4372		support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
4373
4374		// #11217 - WebKit loses check when the name is after the checked attribute
4375		fragment.appendChild(div);
4376
4377		// Support: Windows Web Apps (WWA)
4378		// `name` and `type` must use .setAttribute for WWA (#14901)
4379		input = document.createElement("input");
4380		input.setAttribute("type", "radio");
4381		input.setAttribute("checked", "checked");
4382		input.setAttribute("name", "t");
4383
4384		div.appendChild(input);
4385
4386		// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
4387		// old WebKit doesn't clone checked state correctly in fragments
4388		support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;
4389
4390		// Support: IE<9
4391		// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
4392		support.noCloneEvent = !!div.addEventListener;
4393
4394		// Support: IE<9
4395		// Since attributes and properties are the same in IE,
4396		// cleanData must set properties to undefined rather than use removeAttribute
4397		div[jQuery.expando] = 1;
4398		support.attributes = !div.getAttribute(jQuery.expando);
4399	})();
4400
4401	// We have to close these tags to support XHTML (#13200)
4402	var wrapMap = {
4403		option: [1, "<select multiple='multiple'>", "</select>"],
4404		legend: [1, "<fieldset>", "</fieldset>"],
4405		area: [1, "<map>", "</map>"],
4406
4407		// Support: IE8
4408		param: [1, "<object>", "</object>"],
4409		thead: [1, "<table>", "</table>"],
4410		tr: [2, "<table><tbody>", "</tbody></table>"],
4411		col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
4412		td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
4413
4414		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
4415		// unless wrapped in a div with non-breaking characters in front of it.
4416		_default: support.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"]
4417	};
4418
4419	// Support: IE8-IE9
4420	wrapMap.optgroup = wrapMap.option;
4421
4422	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4423	wrapMap.th = wrapMap.td;
4424
4425	function getAll(context, tag) {
4426		var elems,
4427		    elem,
4428		    i = 0,
4429		    found = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName(tag || "*") : typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll(tag || "*") : undefined;
4430
4431		if (!found) {
4432			for (found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++) {
4433				if (!tag || jQuery.nodeName(elem, tag)) {
4434					found.push(elem);
4435				} else {
4436					jQuery.merge(found, getAll(elem, tag));
4437				}
4438			}
4439		}
4440
4441		return tag === undefined || tag && jQuery.nodeName(context, tag) ? jQuery.merge([context], found) : found;
4442	}
4443
4444	// Mark scripts as having already been evaluated
4445	function setGlobalEval(elems, refElements) {
4446		var elem,
4447		    i = 0;
4448		for (; (elem = elems[i]) != null; i++) {
4449			jQuery._data(elem, "globalEval", !refElements || jQuery._data(refElements[i], "globalEval"));
4450		}
4451	}
4452
4453	var rhtml = /<|&#?\w+;/,
4454	    rtbody = /<tbody/i;
4455
4456	function fixDefaultChecked(elem) {
4457		if (rcheckableType.test(elem.type)) {
4458			elem.defaultChecked = elem.checked;
4459		}
4460	}
4461
4462	function buildFragment(elems, context, scripts, selection, ignored) {
4463		var j,
4464		    elem,
4465		    contains,
4466		    tmp,
4467		    tag,
4468		    tbody,
4469		    wrap,
4470		    l = elems.length,
4471
4472
4473		// Ensure a safe fragment
4474		safe = createSafeFragment(context),
4475		    nodes = [],
4476		    i = 0;
4477
4478		for (; i < l; i++) {
4479			elem = elems[i];
4480
4481			if (elem || elem === 0) {
4482
4483				// Add nodes directly
4484				if (jQuery.type(elem) === "object") {
4485					jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
4486
4487					// Convert non-html into a text node
4488				} else if (!rhtml.test(elem)) {
4489					nodes.push(context.createTextNode(elem));
4490
4491					// Convert html into DOM nodes
4492				} else {
4493					tmp = tmp || safe.appendChild(context.createElement("div"));
4494
4495					// Deserialize a standard representation
4496					tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
4497					wrap = wrapMap[tag] || wrapMap._default;
4498
4499					tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];
4500
4501					// Descend through wrappers to the right content
4502					j = wrap[0];
4503					while (j--) {
4504						tmp = tmp.lastChild;
4505					}
4506
4507					// Manually add leading whitespace removed by IE
4508					if (!support.leadingWhitespace && rleadingWhitespace.test(elem)) {
4509						nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0]));
4510					}
4511
4512					// Remove IE's autoinserted <tbody> from table fragments
4513					if (!support.tbody) {
4514
4515						// String was a <table>, *may* have spurious <tbody>
4516						elem = tag === "table" && !rtbody.test(elem) ? tmp.firstChild :
4517
4518						// String was a bare <thead> or <tfoot>
4519						wrap[1] === "<table>" && !rtbody.test(elem) ? tmp : 0;
4520
4521						j = elem && elem.childNodes.length;
4522						while (j--) {
4523							if (jQuery.nodeName(tbody = elem.childNodes[j], "tbody") && !tbody.childNodes.length) {
4524
4525								elem.removeChild(tbody);
4526							}
4527						}
4528					}
4529
4530					jQuery.merge(nodes, tmp.childNodes);
4531
4532					// Fix #12392 for WebKit and IE > 9
4533					tmp.textContent = "";
4534
4535					// Fix #12392 for oldIE
4536					while (tmp.firstChild) {
4537						tmp.removeChild(tmp.firstChild);
4538					}
4539
4540					// Remember the top-level container for proper cleanup
4541					tmp = safe.lastChild;
4542				}
4543			}
4544		}
4545
4546		// Fix #11356: Clear elements from fragment
4547		if (tmp) {
4548			safe.removeChild(tmp);
4549		}
4550
4551		// Reset defaultChecked for any radios and checkboxes
4552		// about to be appended to the DOM in IE 6/7 (#8060)
4553		if (!support.appendChecked) {
4554			jQuery.grep(getAll(nodes, "input"), fixDefaultChecked);
4555		}
4556
4557		i = 0;
4558		while (elem = nodes[i++]) {
4559
4560			// Skip elements already in the context collection (trac-4087)
4561			if (selection && jQuery.inArray(elem, selection) > -1) {
4562				if (ignored) {
4563					ignored.push(elem);
4564				}
4565
4566				continue;
4567			}
4568
4569			contains = jQuery.contains(elem.ownerDocument, elem);
4570
4571			// Append to fragment
4572			tmp = getAll(safe.appendChild(elem), "script");
4573
4574			// Preserve script evaluation history
4575			if (contains) {
4576				setGlobalEval(tmp);
4577			}
4578
4579			// Capture executables
4580			if (scripts) {
4581				j = 0;
4582				while (elem = tmp[j++]) {
4583					if (rscriptType.test(elem.type || "")) {
4584						scripts.push(elem);
4585					}
4586				}
4587			}
4588		}
4589
4590		tmp = null;
4591
4592		return safe;
4593	}
4594
4595	(function () {
4596		var i,
4597		    eventName,
4598		    div = document.createElement("div");
4599
4600		// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
4601		for (i in { submit: true, change: true, focusin: true }) {
4602			eventName = "on" + i;
4603
vendor: 28,100 bytes, lines 4604-5572
4604			if (!(support[i] = eventName in window)) {
4605
4606				// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
4607				div.setAttribute(eventName, "t");
4608				support[i] = div.attributes[eventName].expando === false;
4609			}
4610		}
4611
4612		// Null elements to avoid leaks in IE.
4613		div = null;
4614	})();
4615
4616	var rformElems = /^(?:input|select|textarea)$/i,
4617	    rkeyEvent = /^key/,
4618	    rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4619	    rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4620	    rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4621
4622	function returnTrue() {
4623		return true;
4624	}
4625
4626	function returnFalse() {
4627		return false;
4628	}
4629
4630	// Support: IE9
4631	// See #13393 for more info
4632	function safeActiveElement() {
4633		try {
4634			return document.activeElement;
4635		} catch (err) {}
4636	}
4637
4638	function on(elem, types, selector, data, fn, one) {
4639		var origFn, type;
4640
4641		// Types can be a map of types/handlers
4642		if (typeof types === "object") {
4643
4644			// ( types-Object, selector, data )
4645			if (typeof selector !== "string") {
4646
4647				// ( types-Object, data )
4648				data = data || selector;
4649				selector = undefined;
4650			}
4651			for (type in types) {
4652				on(elem, type, selector, data, types[type], one);
4653			}
4654			return elem;
4655		}
4656
4657		if (data == null && fn == null) {
4658
4659			// ( types, fn )
4660			fn = selector;
4661			data = selector = undefined;
4662		} else if (fn == null) {
4663			if (typeof selector === "string") {
4664
4665				// ( types, selector, fn )
4666				fn = data;
4667				data = undefined;
4668			} else {
4669
4670				// ( types, data, fn )
4671				fn = data;
4672				data = selector;
4673				selector = undefined;
4674			}
4675		}
4676		if (fn === false) {
4677			fn = returnFalse;
4678		} else if (!fn) {
4679			return elem;
4680		}
4681
4682		if (one === 1) {
4683			origFn = fn;
4684			fn = function (event) {
4685
4686				// Can use an empty set, since event contains the info
4687				jQuery().off(event);
4688				return origFn.apply(this, arguments);
4689			};
4690
4691			// Use same guid so caller can remove using origFn
4692			fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
4693		}
4694		return elem.each(function () {
4695			jQuery.event.add(this, types, fn, data, selector);
4696		});
4697	}
4698
4699	/*
4700  * Helper functions for managing events -- not part of the public interface.
4701  * Props to Dean Edwards' addEvent library for many of the ideas.
4702  */
4703	jQuery.event = {
4704
4705		global: {},
4706
4707		add: function (elem, types, handler, data, selector) {
4708			var tmp,
4709			    events,
4710			    t,
4711			    handleObjIn,
4712			    special,
4713			    eventHandle,
4714			    handleObj,
4715			    handlers,
4716			    type,
4717			    namespaces,
4718			    origType,
4719			    elemData = jQuery._data(elem);
4720
4721			// Don't attach events to noData or text/comment nodes (but allow plain objects)
4722			if (!elemData) {
4723				return;
4724			}
4725
4726			// Caller can pass in an object of custom data in lieu of the handler
4727			if (handler.handler) {
4728				handleObjIn = handler;
4729				handler = handleObjIn.handler;
4730				selector = handleObjIn.selector;
4731			}
4732
4733			// Make sure that the handler has a unique ID, used to find/remove it later
4734			if (!handler.guid) {
4735				handler.guid = jQuery.guid++;
4736			}
4737
4738			// Init the element's event structure and main handler, if this is the first
4739			if (!(events = elemData.events)) {
4740				events = elemData.events = {};
4741			}
4742			if (!(eventHandle = elemData.handle)) {
4743				eventHandle = elemData.handle = function (e) {
4744
4745					// Discard the second event of a jQuery.event.trigger() and
4746					// when an event is called after a page has unloaded
4747					return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply(eventHandle.elem, arguments) : undefined;
4748				};
4749
4750				// Add elem as a property of the handle fn to prevent a memory leak
4751				// with IE non-native events
4752				eventHandle.elem = elem;
4753			}
4754
4755			// Handle multiple events separated by a space
4756			types = (types || "").match(rnotwhite) || [""];
4757			t = types.length;
4758			while (t--) {
4759				tmp = rtypenamespace.exec(types[t]) || [];
4760				type = origType = tmp[1];
4761				namespaces = (tmp[2] || "").split(".").sort();
4762
4763				// There *must* be a type, no attaching namespace-only handlers
4764				if (!type) {
4765					continue;
4766				}
4767
4768				// If event changes its type, use the special event handlers for the changed type
4769				special = jQuery.event.special[type] || {};
4770
4771				// If selector defined, determine special event api type, otherwise given type
4772				type = (selector ? special.delegateType : special.bindType) || type;
4773
4774				// Update special based on newly reset type
4775				special = jQuery.event.special[type] || {};
4776
4777				// handleObj is passed to all event handlers
4778				handleObj = jQuery.extend({
4779					type: type,
4780					origType: origType,
4781					data: data,
4782					handler: handler,
4783					guid: handler.guid,
4784					selector: selector,
4785					needsContext: selector && jQuery.expr.match.needsContext.test(selector),
4786					namespace: namespaces.join(".")
4787				}, handleObjIn);
4788
4789				// Init the event handler queue if we're the first
4790				if (!(handlers = events[type])) {
4791					handlers = events[type] = [];
4792					handlers.delegateCount = 0;
4793
4794					// Only use addEventListener/attachEvent if the special events handler returns false
4795					if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
4796
4797						// Bind the global event handler to the element
4798						if (elem.addEventListener) {
4799							elem.addEventListener(type, eventHandle, false);
4800						} else if (elem.attachEvent) {
4801							elem.attachEvent("on" + type, eventHandle);
4802						}
4803					}
4804				}
4805
4806				if (special.add) {
4807					special.add.call(elem, handleObj);
4808
4809					if (!handleObj.handler.guid) {
4810						handleObj.handler.guid = handler.guid;
4811					}
4812				}
4813
4814				// Add to the element's handler list, delegates in front
4815				if (selector) {
4816					handlers.splice(handlers.delegateCount++, 0, handleObj);
4817				} else {
4818					handlers.push(handleObj);
4819				}
4820
4821				// Keep track of which events have ever been used, for event optimization
4822				jQuery.event.global[type] = true;
4823			}
4824
4825			// Nullify elem to prevent memory leaks in IE
4826			elem = null;
4827		},
4828
4829		// Detach an event or set of events from an element
4830		remove: function (elem, types, handler, selector, mappedTypes) {
4831			var j,
4832			    handleObj,
4833			    tmp,
4834			    origCount,
4835			    t,
4836			    events,
4837			    special,
4838			    handlers,
4839			    type,
4840			    namespaces,
4841			    origType,
4842			    elemData = jQuery.hasData(elem) && jQuery._data(elem);
4843
4844			if (!elemData || !(events = elemData.events)) {
4845				return;
4846			}
4847
4848			// Once for each type.namespace in types; type may be omitted
4849			types = (types || "").match(rnotwhite) || [""];
4850			t = types.length;
4851			while (t--) {
4852				tmp = rtypenamespace.exec(types[t]) || [];
4853				type = origType = tmp[1];
4854				namespaces = (tmp[2] || "").split(".").sort();
4855
4856				// Unbind all events (on this namespace, if provided) for the element
4857				if (!type) {
4858					for (type in events) {
4859						jQuery.event.remove(elem, type + types[t], handler, selector, true);
4860					}
4861					continue;
4862				}
4863
4864				special = jQuery.event.special[type] || {};
4865				type = (selector ? special.delegateType : special.bindType) || type;
4866				handlers = events[type] || [];
4867				tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
4868
4869				// Remove matching events
4870				origCount = j = handlers.length;
4871				while (j--) {
4872					handleObj = handlers[j];
4873
4874					if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
4875						handlers.splice(j, 1);
4876
4877						if (handleObj.selector) {
4878							handlers.delegateCount--;
4879						}
4880						if (special.remove) {
4881							special.remove.call(elem, handleObj);
4882						}
4883					}
4884				}
4885
4886				// Remove generic event handler if we removed something and no more handlers exist
4887				// (avoids potential for endless recursion during removal of special event handlers)
4888				if (origCount && !handlers.length) {
4889					if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
4890
4891						jQuery.removeEvent(elem, type, elemData.handle);
4892					}
4893
4894					delete events[type];
4895				}
4896			}
4897
4898			// Remove the expando if it's no longer used
4899			if (jQuery.isEmptyObject(events)) {
4900				delete elemData.handle;
4901
4902				// removeData also checks for emptiness and clears the expando if empty
4903				// so use it instead of delete
4904				jQuery._removeData(elem, "events");
4905			}
4906		},
4907
4908		trigger: function (event, data, elem, onlyHandlers) {
4909			var handle,
4910			    ontype,
4911			    cur,
4912			    bubbleType,
4913			    special,
4914			    tmp,
4915			    i,
4916			    eventPath = [elem || document],
4917			    type = hasOwn.call(event, "type") ? event.type : event,
4918			    namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
4919
4920			cur = tmp = elem = elem || document;
4921
4922			// Don't do events on text and comment nodes
4923			if (elem.nodeType === 3 || elem.nodeType === 8) {
4924				return;
4925			}
4926
4927			// focus/blur morphs to focusin/out; ensure we're not firing them right now
4928			if (rfocusMorph.test(type + jQuery.event.triggered)) {
4929				return;
4930			}
4931
4932			if (type.indexOf(".") > -1) {
4933
4934				// Namespaced trigger; create a regexp to match event type in handle()
4935				namespaces = type.split(".");
4936				type = namespaces.shift();
4937				namespaces.sort();
4938			}
4939			ontype = type.indexOf(":") < 0 && "on" + type;
4940
4941			// Caller can pass in a jQuery.Event object, Object, or just an event type string
4942			event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event);
4943
4944			// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4945			event.isTrigger = onlyHandlers ? 2 : 3;
4946			event.namespace = namespaces.join(".");
4947			event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
4948
4949			// Clean up the event in case it is being reused
4950			event.result = undefined;
4951			if (!event.target) {
4952				event.target = elem;
4953			}
4954
4955			// Clone any incoming data and prepend the event, creating the handler arg list
4956			data = data == null ? [event] : jQuery.makeArray(data, [event]);
4957
4958			// Allow special events to draw outside the lines
4959			special = jQuery.event.special[type] || {};
4960			if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
4961				return;
4962			}
4963
4964			// Determine event propagation path in advance, per W3C events spec (#9951)
4965			// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4966			if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {
4967
4968				bubbleType = special.delegateType || type;
4969				if (!rfocusMorph.test(bubbleType + type)) {
4970					cur = cur.parentNode;
4971				}
4972				for (; cur; cur = cur.parentNode) {
4973					eventPath.push(cur);
4974					tmp = cur;
4975				}
4976
4977				// Only add window if we got to document (e.g., not plain obj or detached DOM)
4978				if (tmp === (elem.ownerDocument || document)) {
4979					eventPath.push(tmp.defaultView || tmp.parentWindow || window);
4980				}
4981			}
4982
4983			// Fire handlers on the event path
4984			i = 0;
4985			while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
4986
4987				event.type = i > 1 ? bubbleType : special.bindType || type;
4988
4989				// jQuery handler
4990				handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle");
4991
4992				if (handle) {
4993					handle.apply(cur, data);
4994				}
4995
4996				// Native handler
4997				handle = ontype && cur[ontype];
4998				if (handle && handle.apply && acceptData(cur)) {
4999					event.result = handle.apply(cur, data);
5000					if (event.result === false) {
5001						event.preventDefault();
5002					}
5003				}
5004			}
5005			event.type = type;
5006
5007			// If nobody prevented the default action, do it now
5008			if (!onlyHandlers && !event.isDefaultPrevented()) {
5009
5010				if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {
5011
5012					// Call a native DOM method on the target with the same name name as the event.
5013					// Can't use an .isFunction() check here because IE6/7 fails that test.
5014					// Don't do default actions on window, that's where global variables be (#6170)
5015					if (ontype && elem[type] && !jQuery.isWindow(elem)) {
5016
5017						// Don't re-trigger an onFOO event when we call its FOO() method
5018						tmp = elem[ontype];
5019
5020						if (tmp) {
5021							elem[ontype] = null;
5022						}
5023
5024						// Prevent re-triggering of the same event, since we already bubbled it above
5025						jQuery.event.triggered = type;
5026						try {
5027							elem[type]();
5028						} catch (e) {
5029
5030							// IE<9 dies on focus/blur to hidden element (#1486,#12518)
5031							// only reproducible on winXP IE8 native, not IE9 in IE8 mode
5032						}
5033						jQuery.event.triggered = undefined;
5034
5035						if (tmp) {
5036							elem[ontype] = tmp;
5037						}
5038					}
5039				}
5040			}
5041
5042			return event.result;
5043		},
5044
5045		dispatch: function (event) {
5046
5047			// Make a writable jQuery.Event from the native event object
5048			event = jQuery.event.fix(event);
5049
5050			var i,
5051			    j,
5052			    ret,
5053			    matched,
5054			    handleObj,
5055			    handlerQueue = [],
5056			    args = slice.call(arguments),
5057			    handlers = (jQuery._data(this, "events") || {})[event.type] || [],
5058			    special = jQuery.event.special[event.type] || {};
5059
5060			// Use the fix-ed jQuery.Event rather than the (read-only) native event
5061			args[0] = event;
5062			event.delegateTarget = this;
5063
5064			// Call the preDispatch hook for the mapped type, and let it bail if desired
5065			if (special.preDispatch && special.preDispatch.call(this, event) === false) {
5066				return;
5067			}
5068
5069			// Determine handlers
5070			handlerQueue = jQuery.event.handlers.call(this, event, handlers);
5071
5072			// Run delegates first; they may want to stop propagation beneath us
5073			i = 0;
5074			while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
5075				event.currentTarget = matched.elem;
5076
5077				j = 0;
5078				while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {
5079
5080					// Triggered event must either 1) have no namespace, or 2) have namespace(s)
5081					// a subset or equal to those in the bound event (both can have no namespace).
5082					if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) {
5083
5084						event.handleObj = handleObj;
5085						event.data = handleObj.data;
5086
5087						ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
5088
5089						if (ret !== undefined) {
5090							if ((event.result = ret) === false) {
5091								event.preventDefault();
5092								event.stopPropagation();
5093							}
5094						}
5095					}
5096				}
5097			}
5098
5099			// Call the postDispatch hook for the mapped type
5100			if (special.postDispatch) {
5101				special.postDispatch.call(this, event);
5102			}
5103
5104			return event.result;
5105		},
5106
5107		handlers: function (event, handlers) {
5108			var i,
5109			    matches,
5110			    sel,
5111			    handleObj,
5112			    handlerQueue = [],
5113			    delegateCount = handlers.delegateCount,
5114			    cur = event.target;
5115
5116			// Support (at least): Chrome, IE9
5117			// Find delegate handlers
5118			// Black-hole SVG <use> instance trees (#13180)
5119			//
5120			// Support: Firefox<=42+
5121			// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
5122			if (delegateCount && cur.nodeType && (event.type !== "click" || isNaN(event.button) || event.button < 1)) {
5123
5124				/* jshint eqeqeq: false */
5125				for (; cur != this; cur = cur.parentNode || this) {
5126					/* jshint eqeqeq: true */
5127
5128					// Don't check non-elements (#13208)
5129					// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5130					if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) {
5131						matches = [];
5132						for (i = 0; i < delegateCount; i++) {
5133							handleObj = handlers[i];
5134
5135							// Don't conflict with Object.prototype properties (#13203)
5136							sel = handleObj.selector + " ";
5137
5138							if (matches[sel] === undefined) {
5139								matches[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
5140							}
5141							if (matches[sel]) {
5142								matches.push(handleObj);
5143							}
5144						}
5145						if (matches.length) {
5146							handlerQueue.push({ elem: cur, handlers: matches });
5147						}
5148					}
5149				}
5150			}
5151
5152			// Add the remaining (directly-bound) handlers
5153			if (delegateCount < handlers.length) {
5154				handlerQueue.push({ elem: this, handlers: handlers.slice(delegateCount) });
5155			}
5156
5157			return handlerQueue;
5158		},
5159
5160		fix: function (event) {
5161			if (event[jQuery.expando]) {
5162				return event;
5163			}
5164
5165			// Create a writable copy of the event object and normalize some properties
5166			var i,
5167			    prop,
5168			    copy,
5169			    type = event.type,
5170			    originalEvent = event,
5171			    fixHook = this.fixHooks[type];
5172
5173			if (!fixHook) {
5174				this.fixHooks[type] = fixHook = rmouseEvent.test(type) ? this.mouseHooks : rkeyEvent.test(type) ? this.keyHooks : {};
5175			}
5176			copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;
5177
5178			event = new jQuery.Event(originalEvent);
5179
5180			i = copy.length;
5181			while (i--) {
5182				prop = copy[i];
5183				event[prop] = originalEvent[prop];
5184			}
5185
5186			// Support: IE<9
5187			// Fix target property (#1925)
5188			if (!event.target) {
5189				event.target = originalEvent.srcElement || document;
5190			}
5191
5192			// Support: Safari 6-8+
5193			// Target should not be a text node (#504, #13143)
5194			if (event.target.nodeType === 3) {
5195				event.target = event.target.parentNode;
5196			}
5197
5198			// Support: IE<9
5199			// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
5200			event.metaKey = !!event.metaKey;
5201
5202			return fixHook.filter ? fixHook.filter(event, originalEvent) : event;
5203		},
5204
5205		// Includes some event props shared by KeyEvent and MouseEvent
5206		props: ("altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + "metaKey relatedTarget shiftKey target timeStamp view which").split(" "),
5207
5208		fixHooks: {},
5209
5210		keyHooks: {
5211			props: "char charCode key keyCode".split(" "),
5212			filter: function (event, original) {
5213
5214				// Add which for key events
5215				if (event.which == null) {
5216					event.which = original.charCode != null ? original.charCode : original.keyCode;
5217				}
5218
5219				return event;
5220			}
5221		},
5222
5223		mouseHooks: {
5224			props: ("button buttons clientX clientY fromElement offsetX offsetY " + "pageX pageY screenX screenY toElement").split(" "),
5225			filter: function (event, original) {
5226				var body,
5227				    eventDoc,
5228				    doc,
5229				    button = original.button,
5230				    fromElement = original.fromElement;
5231
5232				// Calculate pageX/Y if missing and clientX/Y available
5233				if (event.pageX == null && original.clientX != null) {
5234					eventDoc = event.target.ownerDocument || document;
5235					doc = eventDoc.documentElement;
5236					body = eventDoc.body;
5237
5238					event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
5239					event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
5240				}
5241
5242				// Add relatedTarget, if necessary
5243				if (!event.relatedTarget && fromElement) {
5244					event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
5245				}
5246
5247				// Add which for click: 1 === left; 2 === middle; 3 === right
5248				// Note: button is not normalized, so don't use it
5249				if (!event.which && button !== undefined) {
5250					event.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
5251				}
5252
5253				return event;
5254			}
5255		},
5256
5257		special: {
5258			load: {
5259
5260				// Prevent triggered image.load events from bubbling to window.load
5261				noBubble: true
5262			},
5263			focus: {
5264
5265				// Fire native event if possible so blur/focus sequence is correct
5266				trigger: function () {
5267					if (this !== safeActiveElement() && this.focus) {
5268						try {
5269							this.focus();
5270							return false;
5271						} catch (e) {
5272
5273							// Support: IE<9
5274							// If we error on focus to hidden element (#1486, #12518),
5275							// let .trigger() run the handlers
5276						}
5277					}
5278				},
5279				delegateType: "focusin"
5280			},
5281			blur: {
5282				trigger: function () {
5283					if (this === safeActiveElement() && this.blur) {
5284						this.blur();
5285						return false;
5286					}
5287				},
5288				delegateType: "focusout"
5289			},
5290			click: {
5291
5292				// For checkbox, fire native event so checked state will be right
5293				trigger: function () {
5294					if (jQuery.nodeName(this, "input") && this.type === "checkbox" && this.click) {
5295						this.click();
5296						return false;
5297					}
5298				},
5299
5300				// For cross-browser consistency, don't fire native .click() on links
5301				_default: function (event) {
5302					return jQuery.nodeName(event.target, "a");
5303				}
5304			},
5305
5306			beforeunload: {
5307				postDispatch: function (event) {
5308
5309					// Support: Firefox 20+
5310					// Firefox doesn't alert if the returnValue field is not set.
5311					if (event.result !== undefined && event.originalEvent) {
5312						event.originalEvent.returnValue = event.result;
5313					}
5314				}
5315			}
5316		},
5317
5318		// Piggyback on a donor event to simulate a different one
5319		simulate: function (type, elem, event) {
5320			var e = jQuery.extend(new jQuery.Event(), event, {
5321				type: type,
5322				isSimulated: true
5323
5324				// Previously, `originalEvent: {}` was set here, so stopPropagation call
5325				// would not be triggered on donor event, since in our own
5326				// jQuery.event.stopPropagation function we had a check for existence of
5327				// originalEvent.stopPropagation method, so, consequently it would be a noop.
5328				//
5329				// Guard for simulated events was moved to jQuery.event.stopPropagation function
5330				// since `originalEvent` should point to the original event for the
5331				// constancy with other events and for more focused logic
5332			});
5333
5334			jQuery.event.trigger(e, null, elem);
5335
5336			if (e.isDefaultPrevented()) {
5337				event.preventDefault();
5338			}
5339		}
5340	};
5341
5342	jQuery.removeEvent = document.removeEventListener ? function (elem, type, handle) {
5343
5344		// This "if" is needed for plain objects
5345		if (elem.removeEventListener) {
5346			elem.removeEventListener(type, handle);
5347		}
5348	} : function (elem, type, handle) {
5349		var name = "on" + type;
5350
5351		if (elem.detachEvent) {
5352
5353			// #8545, #7054, preventing memory leaks for custom events in IE6-8
5354			// detachEvent needed property on element, by name of that event,
5355			// to properly expose it to GC
5356			if (typeof elem[name] === "undefined") {
5357				elem[name] = null;
5358			}
5359
5360			elem.detachEvent(name, handle);
5361		}
5362	};
5363
5364	jQuery.Event = function (src, props) {
5365
5366		// Allow instantiation without the 'new' keyword
5367		if (!(this instanceof jQuery.Event)) {
5368			return new jQuery.Event(src, props);
5369		}
5370
5371		// Event object
5372		if (src && src.type) {
5373			this.originalEvent = src;
5374			this.type = src.type;
5375
5376			// Events bubbling up the document may have been marked as prevented
5377			// by a handler lower down the tree; reflect the correct value.
5378			this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined &&
5379
5380			// Support: IE < 9, Android < 4.0
5381			src.returnValue === false ? returnTrue : returnFalse;
5382
5383			// Event type
5384		} else {
5385			this.type = src;
5386		}
5387
5388		// Put explicitly provided properties onto the event object
5389		if (props) {
5390			jQuery.extend(this, props);
5391		}
5392
5393		// Create a timestamp if incoming event doesn't have one
5394		this.timeStamp = src && src.timeStamp || jQuery.now();
5395
5396		// Mark it as fixed
5397		this[jQuery.expando] = true;
5398	};
5399
5400	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5401	// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5402	jQuery.Event.prototype = {
5403		constructor: jQuery.Event,
5404		isDefaultPrevented: returnFalse,
5405		isPropagationStopped: returnFalse,
5406		isImmediatePropagationStopped: returnFalse,
5407
5408		preventDefault: function () {
5409			var e = this.originalEvent;
5410
5411			this.isDefaultPrevented = returnTrue;
5412			if (!e) {
5413				return;
5414			}
5415
5416			// If preventDefault exists, run it on the original event
5417			if (e.preventDefault) {
5418				e.preventDefault();
5419
5420				// Support: IE
5421				// Otherwise set the returnValue property of the original event to false
5422			} else {
5423				e.returnValue = false;
5424			}
5425		},
5426		stopPropagation: function () {
5427			var e = this.originalEvent;
5428
5429			this.isPropagationStopped = returnTrue;
5430
5431			if (!e || this.isSimulated) {
5432				return;
5433			}
5434
5435			// If stopPropagation exists, run it on the original event
5436			if (e.stopPropagation) {
5437				e.stopPropagation();
5438			}
5439
5440			// Support: IE
5441			// Set the cancelBubble property of the original event to true
5442			e.cancelBubble = true;
5443		},
5444		stopImmediatePropagation: function () {
5445			var e = this.originalEvent;
5446
5447			this.isImmediatePropagationStopped = returnTrue;
5448
5449			if (e && e.stopImmediatePropagation) {
5450				e.stopImmediatePropagation();
5451			}
5452
5453			this.stopPropagation();
5454		}
5455	};
5456
5457	// Create mouseenter/leave events using mouseover/out and event-time checks
5458	// so that event delegation works in jQuery.
5459	// Do the same for pointerenter/pointerleave and pointerover/pointerout
5460	//
5461	// Support: Safari 7 only
5462	// Safari sends mouseenter too often; see:
5463	// https://code.google.com/p/chromium/issues/detail?id=470258
5464	// for the description of the bug (it existed in older Chrome versions as well).
5465	jQuery.each({
5466		mouseenter: "mouseover",
5467		mouseleave: "mouseout",
5468		pointerenter: "pointerover",
5469		pointerleave: "pointerout"
5470	}, function (orig, fix) {
5471		jQuery.event.special[orig] = {
5472			delegateType: fix,
5473			bindType: fix,
5474
5475			handle: function (event) {
5476				var ret,
5477				    target = this,
5478				    related = event.relatedTarget,
5479				    handleObj = event.handleObj;
5480
5481				// For mouseenter/leave call the handler if related is outside the target.
5482				// NB: No relatedTarget if the mouse left/entered the browser window
5483				if (!related || related !== target && !jQuery.contains(target, related)) {
5484					event.type = handleObj.origType;
5485					ret = handleObj.handler.apply(this, arguments);
5486					event.type = fix;
5487				}
5488				return ret;
5489			}
5490		};
5491	});
5492
5493	// IE submit delegation
5494	if (!support.submit) {
5495
5496		jQuery.event.special.submit = {
5497			setup: function () {
5498
5499				// Only need this for delegated form submit events
5500				if (jQuery.nodeName(this, "form")) {
5501					return false;
5502				}
5503
5504				// Lazy-add a submit handler when a descendant form may potentially be submitted
5505				jQuery.event.add(this, "click._submit keypress._submit", function (e) {
5506
5507					// Node name check avoids a VML-related crash in IE (#9807)
5508					var elem = e.target,
5509					    form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ?
5510
5511					// Support: IE <=8
5512					// We use jQuery.prop instead of elem.form
5513					// to allow fixing the IE8 delegated submit issue (gh-2332)
5514					// by 3rd party polyfills/workarounds.
5515					jQuery.prop(elem, "form") : undefined;
5516
5517					if (form && !jQuery._data(form, "submit")) {
5518						jQuery.event.add(form, "submit._submit", function (event) {
5519							event._submitBubble = true;
5520						});
5521						jQuery._data(form, "submit", true);
5522					}
5523				});
5524
5525				// return undefined since we don't need an event listener
5526			},
5527
5528			postDispatch: function (event) {
5529
5530				// If form was submitted by the user, bubble the event up the tree
5531				if (event._submitBubble) {
5532					delete event._submitBubble;
5533					if (this.parentNode && !event.isTrigger) {
5534						jQuery.event.simulate("submit", this.parentNode, event);
5535					}
5536				}
5537			},
5538
5539			teardown: function () {
5540
5541				// Only need this for delegated form submit events
5542				if (jQuery.nodeName(this, "form")) {
5543					return false;
5544				}
5545
5546				// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
5547				jQuery.event.remove(this, "._submit");
5548			}
5549		};
5550	}
5551
5552	// IE change delegation and checkbox/radio fix
5553	if (!support.change) {
5554
5555		jQuery.event.special.change = {
5556
5557			setup: function () {
5558
5559				if (rformElems.test(this.nodeName)) {
5560
5561					// IE doesn't fire change on a check/radio until blur; trigger it on click
5562					// after a propertychange. Eat the blur-change in special.change.handle.
5563					// This still fires onchange a second time for check/radio after blur.
5564					if (this.type === "checkbox" || this.type === "radio") {
5565						jQuery.event.add(this, "propertychange._change", function (event) {
5566							if (event.originalEvent.propertyName === "checked") {
5567								this._justChanged = true;
5568							}
5569						});
5570						jQuery.event.add(this, "click._change", function (event) {
5571							if (this._justChanged && !event.isTrigger) {
5572								this._justChanged = false;
5573							}
5574
5575							// Allow triggered, simulated change events (#11500)
5576							jQuery.event.simulate("change", this, event);
5577						});
5578					}
5579					return false;
5580				}
5581
5582				// Delegated event; lazy-add a change handler on descendant inputs
5583				jQuery.event.add(this, "beforeactivate._change", function (e) {
5584					var elem = e.target;
5585
5586					if (rformElems.test(elem.nodeName) && !jQuery._data(elem, "change")) {
5587						jQuery.event.add(elem, "change._change", function (event) {
5588							if (this.parentNode && !event.isSimulated && !event.isTrigger) {
5589								jQuery.event.simulate("change", this.parentNode, event);
5590							}
5591						});
5592						jQuery._data(elem, "change", true);
5593					}
5594				});
5595			},
5596
5597			handle: function (event) {
5598				var elem = event.target;
5599
5600				// Swallow native change events from checkbox/radio, we already triggered them above
5601				if (this !== elem || event.isSimulated || event.isTrigger || elem.type !== "radio" && elem.type !== "checkbox") {
5602
5603					return event.handleObj.handler.apply(this, arguments);
5604				}
5605			},
5606
5607			teardown: function () {
5608				jQuery.event.remove(this, "._change");
5609
5610				return !rformElems.test(this.nodeName);
5611			}
5612		};
5613	}
5614
5615	// Support: Firefox
5616	// Firefox doesn't have focus(in | out) events
vendor: 1,180 bytes, lines 5617-5648
5617	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5618	//
5619	// Support: Chrome, Safari
5620	// focus(in | out) events fire after focus & blur events,
5621	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5622	// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
5623	if (!support.focusin) {
5624		jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) {
5625
5626			// Attach a single capturing handler on the document while someone wants focusin/focusout
5627			var handler = function (event) {
5628				jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
5629			};
5630
5631			jQuery.event.special[fix] = {
5632				setup: function () {
5633					var doc = this.ownerDocument || this,
5634					    attaches = jQuery._data(doc, fix);
5635
5636					if (!attaches) {
5637						doc.addEventListener(orig, handler, true);
5638					}
5639					jQuery._data(doc, fix, (attaches || 0) + 1);
5640				},
5641				teardown: function () {
5642					var doc = this.ownerDocument || this,
5643					    attaches = jQuery._data(doc, fix) - 1;
5644
5645					if (!attaches) {
5646						doc.removeEventListener(orig, handler, true);
5647						jQuery._removeData(doc, fix);
5648					} else {
vendor: 11,646 bytes, lines 5649-6058
5649						jQuery._data(doc, fix, attaches);
5650					}
5651				}
5652			};
5653		});
5654	}
5655
5656	jQuery.fn.extend({
5657
5658		on: function (types, selector, data, fn) {
5659			return on(this, types, selector, data, fn);
5660		},
5661		one: function (types, selector, data, fn) {
5662			return on(this, types, selector, data, fn, 1);
5663		},
5664		off: function (types, selector, fn) {
5665			var handleObj, type;
5666			if (types && types.preventDefault && types.handleObj) {
5667
5668				// ( event )  dispatched jQuery.Event
5669				handleObj = types.handleObj;
5670				jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
5671				return this;
5672			}
5673			if (typeof types === "object") {
5674
5675				// ( types-object [, selector] )
5676				for (type in types) {
5677					this.off(type, selector, types[type]);
5678				}
5679				return this;
5680			}
5681			if (selector === false || typeof selector === "function") {
5682
5683				// ( types [, fn] )
5684				fn = selector;
5685				selector = undefined;
5686			}
5687			if (fn === false) {
5688				fn = returnFalse;
5689			}
5690			return this.each(function () {
5691				jQuery.event.remove(this, types, fn, selector);
5692			});
5693		},
5694
5695		trigger: function (type, data) {
5696			return this.each(function () {
5697				jQuery.event.trigger(type, data, this);
5698			});
5699		},
5700		triggerHandler: function (type, data) {
5701			var elem = this[0];
5702			if (elem) {
5703				return jQuery.event.trigger(type, data, elem, true);
5704			}
5705		}
5706	});
5707
5708	var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5709	    rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
5710	    rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
5711
5712
5713	// Support: IE 10-11, Edge 10240+
5714	// In IE/Edge using regex groups here causes severe slowdowns.
5715	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5716	rnoInnerhtml = /<script|<style|<link/i,
5717
5718
5719	// checked="checked" or checked
5720	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5721	    rscriptTypeMasked = /^true\/(.*)/,
5722	    rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
5723	    safeFragment = createSafeFragment(document),
5724	    fragmentDiv = safeFragment.appendChild(document.createElement("div"));
5725
5726	// Support: IE<8
5727	// Manipulating tables requires a tbody
5728	function manipulationTarget(elem, content) {
5729		return jQuery.nodeName(elem, "table") && jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ? elem.getElementsByTagName("tbody")[0] || elem.appendChild(elem.ownerDocument.createElement("tbody")) : elem;
5730	}
5731
5732	// Replace/restore the type attribute of script elements for safe DOM manipulation
5733	function disableScript(elem) {
5734		elem.type = (jQuery.find.attr(elem, "type") !== null) + "/" + elem.type;
5735		return elem;
5736	}
5737	function restoreScript(elem) {
5738		var match = rscriptTypeMasked.exec(elem.type);
5739		if (match) {
5740			elem.type = match[1];
5741		} else {
5742			elem.removeAttribute("type");
5743		}
5744		return elem;
5745	}
5746
5747	function cloneCopyEvent(src, dest) {
5748		if (dest.nodeType !== 1 || !jQuery.hasData(src)) {
5749			return;
5750		}
5751
5752		var type,
5753		    i,
5754		    l,
5755		    oldData = jQuery._data(src),
5756		    curData = jQuery._data(dest, oldData),
5757		    events = oldData.events;
5758
5759		if (events) {
5760			delete curData.handle;
5761			curData.events = {};
5762
5763			for (type in events) {
5764				for (i = 0, l = events[type].length; i < l; i++) {
5765					jQuery.event.add(dest, type, events[type][i]);
5766				}
5767			}
5768		}
5769
5770		// make the cloned public data object a copy from the original
5771		if (curData.data) {
5772			curData.data = jQuery.extend({}, curData.data);
5773		}
5774	}
5775
5776	function fixCloneNodeIssues(src, dest) {
5777		var nodeName, e, data;
5778
5779		// We do not need to do anything for non-Elements
5780		if (dest.nodeType !== 1) {
5781			return;
5782		}
5783
5784		nodeName = dest.nodeName.toLowerCase();
5785
5786		// IE6-8 copies events bound via attachEvent when using cloneNode.
5787		if (!support.noCloneEvent && dest[jQuery.expando]) {
5788			data = jQuery._data(dest);
5789
5790			for (e in data.events) {
5791				jQuery.removeEvent(dest, e, data.handle);
5792			}
5793
5794			// Event data gets referenced instead of copied if the expando gets copied too
5795			dest.removeAttribute(jQuery.expando);
5796		}
5797
5798		// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
5799		if (nodeName === "script" && dest.text !== src.text) {
5800			disableScript(dest).text = src.text;
5801			restoreScript(dest);
5802
5803			// IE6-10 improperly clones children of object elements using classid.
5804			// IE10 throws NoModificationAllowedError if parent is null, #12132.
5805		} else if (nodeName === "object") {
5806			if (dest.parentNode) {
5807				dest.outerHTML = src.outerHTML;
5808			}
5809
5810			// This path appears unavoidable for IE9. When cloning an object
5811			// element in IE9, the outerHTML strategy above is not sufficient.
5812			// If the src has innerHTML and the destination does not,
5813			// copy the src.innerHTML into the dest.innerHTML. #10324
5814			if (support.html5Clone && src.innerHTML && !jQuery.trim(dest.innerHTML)) {
5815				dest.innerHTML = src.innerHTML;
5816			}
5817		} else if (nodeName === "input" && rcheckableType.test(src.type)) {
5818
5819			// IE6-8 fails to persist the checked state of a cloned checkbox
5820			// or radio button. Worse, IE6-7 fail to give the cloned element
5821			// a checked appearance if the defaultChecked value isn't also set
5822
5823			dest.defaultChecked = dest.checked = src.checked;
5824
5825			// IE6-7 get confused and end up setting the value of a cloned
5826			// checkbox/radio button to an empty string instead of "on"
5827			if (dest.value !== src.value) {
5828				dest.value = src.value;
5829			}
5830
5831			// IE6-8 fails to return the selected option to the default selected
5832			// state when cloning options
5833		} else if (nodeName === "option") {
5834			dest.defaultSelected = dest.selected = src.defaultSelected;
5835
5836			// IE6-8 fails to set the defaultValue to the correct value when
5837			// cloning other types of input fields
5838		} else if (nodeName === "input" || nodeName === "textarea") {
5839			dest.defaultValue = src.defaultValue;
5840		}
5841	}
5842
5843	function domManip(collection, args, callback, ignored) {
5844
5845		// Flatten any nested arrays
5846		args = concat.apply([], args);
5847
5848		var first,
5849		    node,
5850		    hasScripts,
5851		    scripts,
5852		    doc,
5853		    fragment,
5854		    i = 0,
5855		    l = collection.length,
5856		    iNoClone = l - 1,
5857		    value = args[0],
5858		    isFunction = jQuery.isFunction(value);
5859
5860		// We can't cloneNode fragments that contain checked, in WebKit
5861		if (isFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
5862			return collection.each(function (index) {
5863				var self = collection.eq(index);
5864				if (isFunction) {
5865					args[0] = value.call(this, index, self.html());
5866				}
5867				domManip(self, args, callback, ignored);
5868			});
5869		}
5870
5871		if (l) {
5872			fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
5873			first = fragment.firstChild;
5874
5875			if (fragment.childNodes.length === 1) {
5876				fragment = first;
5877			}
5878
5879			// Require either new content or an interest in ignored elements to invoke the callback
5880			if (first || ignored) {
5881				scripts = jQuery.map(getAll(fragment, "script"), disableScript);
5882				hasScripts = scripts.length;
5883
5884				// Use the original fragment for the last item
5885				// instead of the first because it can end up
5886				// being emptied incorrectly in certain situations (#8070).
5887				for (; i < l; i++) {
5888					node = fragment;
5889
5890					if (i !== iNoClone) {
5891						node = jQuery.clone(node, true, true);
5892
5893						// Keep references to cloned scripts for later restoration
5894						if (hasScripts) {
5895
5896							// Support: Android<4.1, PhantomJS<2
5897							// push.apply(_, arraylike) throws on ancient WebKit
5898							jQuery.merge(scripts, getAll(node, "script"));
5899						}
5900					}
5901
5902					callback.call(collection[i], node, i);
5903				}
5904
5905				if (hasScripts) {
5906					doc = scripts[scripts.length - 1].ownerDocument;
5907
5908					// Reenable scripts
5909					jQuery.map(scripts, restoreScript);
5910
5911					// Evaluate executable scripts on first document insertion
5912					for (i = 0; i < hasScripts; i++) {
5913						node = scripts[i];
5914						if (rscriptType.test(node.type || "") && !jQuery._data(node, "globalEval") && jQuery.contains(doc, node)) {
5915
5916							if (node.src) {
5917
5918								// Optional AJAX dependency, but won't run scripts if not present
5919								if (jQuery._evalUrl) {
5920									jQuery._evalUrl(node.src);
5921								}
5922							} else {
5923								jQuery.globalEval((node.text || node.textContent || node.innerHTML || "").replace(rcleanScript, ""));
5924							}
5925						}
5926					}
5927				}
5928
5929				// Fix #11809: Avoid leaking memory
5930				fragment = first = null;
5931			}
5932		}
5933
5934		return collection;
5935	}
5936
5937	function remove(elem, selector, keepData) {
5938		var node,
5939		    elems = selector ? jQuery.filter(selector, elem) : elem,
5940		    i = 0;
5941
5942		for (; (node = elems[i]) != null; i++) {
5943
5944			if (!keepData && node.nodeType === 1) {
5945				jQuery.cleanData(getAll(node));
5946			}
5947
5948			if (node.parentNode) {
5949				if (keepData && jQuery.contains(node.ownerDocument, node)) {
5950					setGlobalEval(getAll(node, "script"));
5951				}
5952				node.parentNode.removeChild(node);
5953			}
5954		}
5955
5956		return elem;
5957	}
5958
5959	jQuery.extend({
5960		htmlPrefilter: function (html) {
5961			return html.replace(rxhtmlTag, "<$1></$2>");
5962		},
5963
5964		clone: function (elem, dataAndEvents, deepDataAndEvents) {
5965			var destElements,
5966			    node,
5967			    clone,
5968			    i,
5969			    srcElements,
5970			    inPage = jQuery.contains(elem.ownerDocument, elem);
5971
5972			if (support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">")) {
5973
5974				clone = elem.cloneNode(true);
5975
5976				// IE<=8 does not properly clone detached, unknown element nodes
5977			} else {
5978				fragmentDiv.innerHTML = elem.outerHTML;
5979				fragmentDiv.removeChild(clone = fragmentDiv.firstChild);
5980			}
5981
5982			if ((!support.noCloneEvent || !support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
5983
5984				// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
5985				destElements = getAll(clone);
5986				srcElements = getAll(elem);
5987
5988				// Fix all IE cloning issues
5989				for (i = 0; (node = srcElements[i]) != null; ++i) {
5990
5991					// Ensure that the destination node is not null; Fixes #9587
5992					if (destElements[i]) {
5993						fixCloneNodeIssues(node, destElements[i]);
5994					}
5995				}
5996			}
5997
5998			// Copy the events from the original to the clone
5999			if (dataAndEvents) {
6000				if (deepDataAndEvents) {
6001					srcElements = srcElements || getAll(elem);
6002					destElements = destElements || getAll(clone);
6003
6004					for (i = 0; (node = srcElements[i]) != null; i++) {
6005						cloneCopyEvent(node, destElements[i]);
6006					}
6007				} else {
6008					cloneCopyEvent(elem, clone);
6009				}
6010			}
6011
6012			// Preserve script evaluation history
6013			destElements = getAll(clone, "script");
6014			if (destElements.length > 0) {
6015				setGlobalEval(destElements, !inPage && getAll(elem, "script"));
6016			}
6017
6018			destElements = srcElements = node = null;
6019
6020			// Return the cloned set
6021			return clone;
6022		},
6023
6024		cleanData: function (elems, /* internal */forceAcceptData) {
6025			var elem,
6026			    type,
6027			    id,
6028			    data,
6029			    i = 0,
6030			    internalKey = jQuery.expando,
6031			    cache = jQuery.cache,
6032			    attributes = support.attributes,
6033			    special = jQuery.event.special;
6034
6035			for (; (elem = elems[i]) != null; i++) {
6036				if (forceAcceptData || acceptData(elem)) {
6037
6038					id = elem[internalKey];
6039					data = id && cache[id];
6040
6041					if (data) {
6042						if (data.events) {
6043							for (type in data.events) {
6044								if (special[type]) {
6045									jQuery.event.remove(elem, type);
6046
6047									// This is a shortcut to avoid jQuery.event.remove's overhead
6048								} else {
6049									jQuery.removeEvent(elem, type, data.handle);
6050								}
6051							}
6052						}
6053
6054						// Remove cache only if it was not already removed by jQuery.event.remove
6055						if (cache[id]) {
6056
6057							delete cache[id];
6058
6059							// Support: IE<9
6060							// IE does not allow us to delete expando properties from nodes
6061							// IE creates expando attributes along with the property
6062							// IE does not have a removeAttribute function on Document nodes
6063							if (!attributes && typeof elem.removeAttribute !== "undefined") {
6064								elem.removeAttribute(internalKey);
6065
6066								// Webkit & Blink performance suffers when deleting properties
6067								// from DOM nodes, so set to undefined instead
6068								// https://code.google.com/p/chromium/issues/detail?id=378607
6069							} else {
6070								elem[internalKey] = undefined;
6071							}
6072
6073							deletedIds.push(id);
6074						}
6075					}
6076				}
6077			}
6078		}
6079	});
6080
6081	jQuery.fn.extend({
6082
6083		// Keep domManip exposed until 3.0 (gh-2225)
6084		domManip: domManip,
6085
6086		detach: function (selector) {
6087			return remove(this, selector, true);
6088		},
6089
6090		remove: function (selector) {
6091			return remove(this, selector);
6092		},
6093
6094		text: function (value) {
6095			return access(this, function (value) {
6096				return value === undefined ? jQuery.text(this) : this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(value));
6097			}, null, value, arguments.length);
6098		},
6099
6100		append: function () {
6101			return domManip(this, arguments, function (elem) {
6102				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
6103					var target = manipulationTarget(this, elem);
6104					target.appendChild(elem);
6105				}
6106			});
6107		},
6108
6109		prepend: function () {
6110			return domManip(this, arguments, function (elem) {
6111				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
6112					var target = manipulationTarget(this, elem);
6113					target.insertBefore(elem, target.firstChild);
6114				}
6115			});
6116		},
6117
6118		before: function () {
6119			return domManip(this, arguments, function (elem) {
6120				if (this.parentNode) {
6121					this.parentNode.insertBefore(elem, this);
6122				}
6123			});
6124		},
6125
6126		after: function () {
6127			return domManip(this, arguments, function (elem) {
6128				if (this.parentNode) {
6129					this.parentNode.insertBefore(elem, this.nextSibling);
6130				}
6131			});
6132		},
6133
6134		empty: function () {
6135			var elem,
6136			    i = 0;
6137
6138			for (; (elem = this[i]) != null; i++) {
6139
6140				// Remove element nodes and prevent memory leaks
6141				if (elem.nodeType === 1) {
6142					jQuery.cleanData(getAll(elem, false));
6143				}
6144
6145				// Remove any remaining nodes
6146				while (elem.firstChild) {
6147					elem.removeChild(elem.firstChild);
6148				}
6149
6150				// If this is a select, ensure that it displays empty (#12336)
6151				// Support: IE<9
6152				if (elem.options && jQuery.nodeName(elem, "select")) {
6153					elem.options.length = 0;
6154				}
6155			}
6156
6157			return this;
6158		},
6159
6160		clone: function (dataAndEvents, deepDataAndEvents) {
6161			dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6162			deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6163
6164			return this.map(function () {
6165				return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
6166			});
6167		},
6168
6169		html: function (value) {
6170			return access(this, function (value) {
6171				var elem = this[0] || {},
6172				    i = 0,
6173				    l = this.length;
6174
6175				if (value === undefined) {
6176					return elem.nodeType === 1 ? elem.innerHTML.replace(rinlinejQuery, "") : undefined;
6177				}
6178
6179				// See if we can take a shortcut and just use innerHTML
6180				if (typeof value === "string" && !rnoInnerhtml.test(value) && (support.htmlSerialize || !rnoshimcache.test(value)) && (support.leadingWhitespace || !rleadingWhitespace.test(value)) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
6181
6182					value = jQuery.htmlPrefilter(value);
6183
6184					try {
6185						for (; i < l; i++) {
6186
6187							// Remove element nodes and prevent memory leaks
6188							elem = this[i] || {};
6189							if (elem.nodeType === 1) {
6190								jQuery.cleanData(getAll(elem, false));
6191								elem.innerHTML = value;
6192							}
6193						}
6194
6195						elem = 0;
6196
6197						// If using innerHTML throws an exception, use the fallback method
6198					} catch (e) {}
6199				}
6200
6201				if (elem) {
6202					this.empty().append(value);
6203				}
6204			}, null, value, arguments.length);
6205		},
6206
6207		replaceWith: function () {
6208			var ignored = [];
6209
6210			// Make the changes, replacing each non-ignored context element with the new content
6211			return domManip(this, arguments, function (elem) {
6212				var parent = this.parentNode;
6213
6214				if (jQuery.inArray(this, ignored) < 0) {
6215					jQuery.cleanData(getAll(this));
6216					if (parent) {
6217						parent.replaceChild(elem, this);
6218					}
6219				}
6220
6221				// Force callback invocation
6222			}, ignored);
6223		}
6224	});
6225
6226	jQuery.each({
6227		appendTo: "append",
vendor: 1,203 bytes, lines 6228-6275
6228		prependTo: "prepend",
6229		insertBefore: "before",
6230		insertAfter: "after",
6231		replaceAll: "replaceWith"
6232	}, function (name, original) {
6233		jQuery.fn[name] = function (selector) {
6234			var elems,
6235			    i = 0,
6236			    ret = [],
6237			    insert = jQuery(selector),
6238			    last = insert.length - 1;
6239
6240			for (; i <= last; i++) {
6241				elems = i === last ? this : this.clone(true);
6242				jQuery(insert[i])[original](elems);
6243
6244				// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
6245				push.apply(ret, elems.get());
6246			}
6247
6248			return this.pushStack(ret);
6249		};
6250	});
6251
6252	var iframe,
6253	    elemdisplay = {
6254
6255		// Support: Firefox
6256		// We have to pre-define these values for FF (#10227)
6257		HTML: "block",
6258		BODY: "block"
6259	};
6260
6261	/**
6262  * Retrieve the actual display of a element
6263  * @param {String} name nodeName of the element
6264  * @param {Object} doc Document object
6265  */
6266
6267	// Called only from within defaultDisplay
6268	function actualDisplay(name, doc) {
6269		var elem = jQuery(doc.createElement(name)).appendTo(doc.body),
6270		    display = jQuery.css(elem[0], "display");
6271
6272		// We don't have any data stored on the element,
6273		// so use "detach" method as fast way to get rid of the element
6274		elem.detach();
6275
6276		return display;
6277	}
6278
6279	/**
6280  * Try to determine the default display value of an element
6281  * @param {String} nodeName
6282  */
6283	function defaultDisplay(nodeName) {
6284		var doc = document,
6285		    display = elemdisplay[nodeName];
6286
6287		if (!display) {
6288			display = actualDisplay(nodeName, doc);
6289
6290			// If the simple way fails, read from inside an iframe
6291			if (display === "none" || !display) {
6292
6293				// Use the already-created iframe if possible
6294				iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);
6295
6296				// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
6297				doc = (iframe[0].contentWindow || iframe[0].contentDocument).document;
6298
6299				// Support: IE
6300				doc.write();
6301				doc.close();
6302
6303				display = actualDisplay(nodeName, doc);
6304				iframe.detach();
6305			}
6306
6307			// Store the correct default display
6308			elemdisplay[nodeName] = display;
6309		}
6310
6311		return display;
6312	}
6313	var rmargin = /^margin/;
6314
6315	var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
6316
6317	var swap = function (elem, options, callback, args) {
6318		var ret,
6319		    name,
6320		    old = {};
6321
6322		// Remember the old values, and insert the new ones
6323		for (name in options) {
6324			old[name] = elem.style[name];
6325			elem.style[name] = options[name];
6326		}
6327
6328		ret = callback.apply(elem, args || []);
6329
6330		// Revert the old values
6331		for (name in options) {
6332			elem.style[name] = old[name];
6333		}
6334
6335		return ret;
6336	};
6337
6338	var documentElement = document.documentElement;
6339
6340	(function () {
6341		var pixelPositionVal,
6342		    pixelMarginRightVal,
6343		    boxSizingReliableVal,
6344		    reliableHiddenOffsetsVal,
6345		    reliableMarginRightVal,
6346		    reliableMarginLeftVal,
6347		    container = document.createElement("div"),
6348		    div = document.createElement("div");
6349
6350		// Finish early in limited (non-browser) environments
6351		if (!div.style) {
6352			return;
6353		}
6354
6355		div.style.cssText = "float:left;opacity:.5";
6356
6357		// Support: IE<9
6358		// Make sure that element opacity exists (as opposed to filter)
6359		support.opacity = div.style.opacity === "0.5";
6360
6361		// Verify style float existence
6362		// (IE uses styleFloat instead of cssFloat)
6363		support.cssFloat = !!div.style.cssFloat;
6364
6365		div.style.backgroundClip = "content-box";
6366		div.cloneNode(true).style.backgroundClip = "";
6367		support.clearCloneStyle = div.style.backgroundClip === "content-box";
6368
6369		container = document.createElement("div");
6370		container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + "padding:0;margin-top:1px;position:absolute";
6371		div.innerHTML = "";
6372		container.appendChild(div);
6373
6374		// Support: Firefox<29, Android 2.3
6375		// Vendor-prefix box-sizing
6376		support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" || div.style.WebkitBoxSizing === "";
6377
6378		jQuery.extend(support, {
6379			reliableHiddenOffsets: function () {
6380				if (pixelPositionVal == null) {
6381					computeStyleTests();
6382				}
6383				return reliableHiddenOffsetsVal;
6384			},
6385
6386			boxSizingReliable: function () {
6387
6388				// We're checking for pixelPositionVal here instead of boxSizingReliableVal
6389				// since that compresses better and they're computed together anyway.
6390				if (pixelPositionVal == null) {
6391					computeStyleTests();
6392				}
6393				return boxSizingReliableVal;
6394			},
6395
6396			pixelMarginRight: function () {
6397
6398				// Support: Android 4.0-4.3
6399				if (pixelPositionVal == null) {
6400					computeStyleTests();
6401				}
6402				return pixelMarginRightVal;
6403			},
6404
6405			pixelPosition: function () {
6406				if (pixelPositionVal == null) {
6407					computeStyleTests();
6408				}
6409				return pixelPositionVal;
6410			},
6411
6412			reliableMarginRight: function () {
6413
6414				// Support: Android 2.3
6415				if (pixelPositionVal == null) {
6416					computeStyleTests();
6417				}
6418				return reliableMarginRightVal;
6419			},
6420
6421			reliableMarginLeft: function () {
6422
6423				// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
6424				if (pixelPositionVal == null) {
6425					computeStyleTests();
6426				}
6427				return reliableMarginLeftVal;
6428			}
6429		});
6430
6431		function computeStyleTests() {
6432			var contents,
6433			    divStyle,
6434			    documentElement = document.documentElement;
6435
6436			// Setup
6437			documentElement.appendChild(container);
6438
6439			div.style.cssText =
6440
6441			// Support: Android 2.3
6442			// Vendor-prefix box-sizing
6443			"-webkit-box-sizing:border-box;box-sizing:border-box;" + "position:relative;display:block;" + "margin:auto;border:1px;padding:1px;" + "top:1%;width:50%";
6444
6445			// Support: IE<9
6446			// Assume reasonable values in the absence of getComputedStyle
6447			pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
6448			pixelMarginRightVal = reliableMarginRightVal = true;
6449
6450			// Check for getComputedStyle so that this code is not run in IE<9.
6451			if (window.getComputedStyle) {
6452				divStyle = window.getComputedStyle(div);
6453				pixelPositionVal = (divStyle || {}).top !== "1%";
6454				reliableMarginLeftVal = (divStyle || {}).marginLeft === "2px";
6455				boxSizingReliableVal = (divStyle || { width: "4px" }).width === "4px";
6456
6457				// Support: Android 4.0 - 4.3 only
6458				// Some styles come back with percentage values, even though they shouldn't
6459				div.style.marginRight = "50%";
6460				pixelMarginRightVal = (divStyle || { marginRight: "4px" }).marginRight === "4px";
6461
6462				// Support: Android 2.3 only
6463				// Div with explicit width and no margin-right incorrectly
6464				// gets computed margin-right based on width of container (#3333)
6465				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6466				contents = div.appendChild(document.createElement("div"));
6467
6468				// Reset CSS: box-sizing; display; margin; border; padding
6469				contents.style.cssText = div.style.cssText =
6470
6471				// Support: Android 2.3
6472				// Vendor-prefix box-sizing
6473				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
6474				contents.style.marginRight = contents.style.width = "0";
6475				div.style.width = "1px";
6476
6477				reliableMarginRightVal = !parseFloat((window.getComputedStyle(contents) || {}).marginRight);
6478
6479				div.removeChild(contents);
6480			}
6481
6482			// Support: IE6-8
6483			// First check that getClientRects works as expected
6484			// Check if table cells still have offsetWidth/Height when they are set
6485			// to display:none and there are still other visible table cells in a
6486			// table row; if so, offsetWidth/Height are not reliable for use when
6487			// determining if an element has been hidden directly using
6488			// display:none (it is still safe to use offsets if a parent element is
6489			// hidden; don safety goggles and see bug #4512 for more information).
6490			div.style.display = "none";
6491			reliableHiddenOffsetsVal = div.getClientRects().length === 0;
6492			if (reliableHiddenOffsetsVal) {
6493				div.style.display = "";
6494				div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
6495				div.childNodes[0].style.borderCollapse = "separate";
6496				contents = div.getElementsByTagName("td");
6497				contents[0].style.cssText = "margin:0;border:0;padding:0;display:none";
6498				reliableHiddenOffsetsVal = contents[0].offsetHeight === 0;
6499				if (reliableHiddenOffsetsVal) {
6500					contents[0].style.display = "";
6501					contents[1].style.display = "none";
6502					reliableHiddenOffsetsVal = contents[0].offsetHeight === 0;
6503				}
6504			}
6505
6506			// Teardown
6507			documentElement.removeChild(container);
6508		}
6509	})();
6510
6511	var getStyles,
6512	    curCSS,
6513	    rposition = /^(top|right|bottom|left)$/;
6514
6515	if (window.getComputedStyle) {
6516		getStyles = function (elem) {
6517
6518			// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
6519			// IE throws on elements created in popups
6520			// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6521			var view = elem.ownerDocument.defaultView;
6522
6523			if (!view || !view.opener) {
6524				view = window;
6525			}
6526
6527			return view.getComputedStyle(elem);
6528		};
6529
6530		curCSS = function (elem, name, computed) {
6531			var width,
6532			    minWidth,
6533			    maxWidth,
6534			    ret,
6535			    style = elem.style;
6536
6537			computed = computed || getStyles(elem);
6538
6539			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
6540			ret = computed ? computed.getPropertyValue(name) || computed[name] : undefined;
6541
6542			// Support: Opera 12.1x only
6543			// Fall back to style even without computed
6544			// computed is undefined for elems on document fragments
6545			if ((ret === "" || ret === undefined) && !jQuery.contains(elem.ownerDocument, elem)) {
6546				ret = jQuery.style(elem, name);
6547			}
6548
6549			if (computed) {
6550
6551				// A tribute to the "awesome hack by Dean Edwards"
6552				// Chrome < 17 and Safari 5.0 uses "computed value"
6553				// instead of "used value" for margin-right
6554				// Safari 5.1.7 (at least) returns percentage for a larger set of values,
6555				// but width seems to be reliably pixels
6556				// this is against the CSSOM draft spec:
6557				// http://dev.w3.org/csswg/cssom/#resolved-values
6558				if (!support.pixelMarginRight() && rnumnonpx.test(ret) && rmargin.test(name)) {
6559
6560					// Remember the original values
6561					width = style.width;
6562					minWidth = style.minWidth;
6563					maxWidth = style.maxWidth;
6564
6565					// Put in the new values to get a computed value out
6566					style.minWidth = style.maxWidth = style.width = ret;
6567					ret = computed.width;
6568
6569					// Revert the changed values
6570					style.width = width;
6571					style.minWidth = minWidth;
6572					style.maxWidth = maxWidth;
6573				}
6574			}
6575
vendor: 4,252 bytes, lines 6576-6728
6576			// Support: IE
6577			// IE returns zIndex value as an integer.
6578			return ret === undefined ? ret : ret + "";
6579		};
6580	} else if (documentElement.currentStyle) {
6581		getStyles = function (elem) {
6582			return elem.currentStyle;
6583		};
6584
6585		curCSS = function (elem, name, computed) {
6586			var left,
6587			    rs,
6588			    rsLeft,
6589			    ret,
6590			    style = elem.style;
6591
6592			computed = computed || getStyles(elem);
6593			ret = computed ? computed[name] : undefined;
6594
6595			// Avoid setting ret to empty string here
6596			// so we don't default to auto
6597			if (ret == null && style && style[name]) {
6598				ret = style[name];
6599			}
6600
6601			// From the awesome hack by Dean Edwards
6602			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6603
6604			// If we're not dealing with a regular pixel number
6605			// but a number that has a weird ending, we need to convert it to pixels
6606			// but not position css attributes, as those are
6607			// proportional to the parent element instead
6608			// and we can't measure the parent instead because it
6609			// might trigger a "stacking dolls" problem
6610			if (rnumnonpx.test(ret) && !rposition.test(name)) {
6611
6612				// Remember the original values
6613				left = style.left;
6614				rs = elem.runtimeStyle;
6615				rsLeft = rs && rs.left;
6616
6617				// Put in the new values to get a computed value out
6618				if (rsLeft) {
6619					rs.left = elem.currentStyle.left;
6620				}
6621				style.left = name === "fontSize" ? "1em" : ret;
6622				ret = style.pixelLeft + "px";
6623
6624				// Revert the changed values
6625				style.left = left;
6626				if (rsLeft) {
6627					rs.left = rsLeft;
6628				}
6629			}
6630
6631			// Support: IE
6632			// IE returns zIndex value as an integer.
6633			return ret === undefined ? ret : ret + "" || "auto";
6634		};
6635	}
6636
6637	function addGetHookIf(conditionFn, hookFn) {
6638
6639		// Define the hook, we'll check on the first run if it's really needed.
6640		return {
6641			get: function () {
6642				if (conditionFn()) {
6643
6644					// Hook not needed (or it's not possible to use it due
6645					// to missing dependency), remove it.
6646					delete this.get;
6647					return;
6648				}
6649
6650				// Hook needed; redefine it so that the support test is not executed again.
6651				return (this.get = hookFn).apply(this, arguments);
6652			}
6653		};
6654	}
6655
6656	var ralpha = /alpha\([^)]*\)/i,
6657	    ropacity = /opacity\s*=\s*([^)]*)/i,
6658
6659
6660	// swappable if display is none or starts with table except
6661	// "table", "table-cell", or "table-caption"
6662	// see here for display values:
6663	// https://developer.mozilla.org/en-US/docs/CSS/display
6664	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6665	    rnumsplit = new RegExp("^(" + pnum + ")(.*)$", "i"),
6666	    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6667	    cssNormalTransform = {
6668		letterSpacing: "0",
6669		fontWeight: "400"
6670	},
6671	    cssPrefixes = ["Webkit", "O", "Moz", "ms"],
6672	    emptyStyle = document.createElement("div").style;
6673
6674	// return a css property mapped to a potentially vendor prefixed property
6675	function vendorPropName(name) {
6676
6677		// shortcut for names that are not vendor prefixed
6678		if (name in emptyStyle) {
6679			return name;
6680		}
6681
6682		// check for vendor prefixed names
6683		var capName = name.charAt(0).toUpperCase() + name.slice(1),
6684		    i = cssPrefixes.length;
6685
6686		while (i--) {
6687			name = cssPrefixes[i] + capName;
6688			if (name in emptyStyle) {
6689				return name;
6690			}
6691		}
6692	}
6693
6694	function showHide(elements, show) {
6695		var display,
6696		    elem,
6697		    hidden,
6698		    values = [],
6699		    index = 0,
6700		    length = elements.length;
6701
6702		for (; index < length; index++) {
6703			elem = elements[index];
6704			if (!elem.style) {
6705				continue;
6706			}
6707
6708			values[index] = jQuery._data(elem, "olddisplay");
6709			display = elem.style.display;
6710			if (show) {
6711
6712				// Reset the inline display of this element to learn if it is
6713				// being hidden by cascaded rules or not
6714				if (!values[index] && display === "none") {
6715					elem.style.display = "";
6716				}
6717
6718				// Set elements which have been overridden with display: none
6719				// in a stylesheet to whatever the default browser style is
6720				// for such an element
6721				if (elem.style.display === "" && isHidden(elem)) {
6722					values[index] = jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
6723				}
6724			} else {
6725				hidden = isHidden(elem);
6726
6727				if (display && display !== "none" || !hidden) {
6728					jQuery._data(elem, "olddisplay", hidden ? display : jQuery.css(elem, "dis
vendor: 6,095 bytes, lines 6728-6929
6728play"));
6729				}
6730			}
6731		}
6732
6733		// Set the display of most of the elements in a second loop
6734		// to avoid the constant reflow
6735		for (index = 0; index < length; index++) {
6736			elem = elements[index];
6737			if (!elem.style) {
6738				continue;
6739			}
6740			if (!show || elem.style.display === "none" || elem.style.display === "") {
6741				elem.style.display = show ? values[index] || "" : "none";
6742			}
6743		}
6744
6745		return elements;
6746	}
6747
6748	function setPositiveNumber(elem, value, subtract) {
6749		var matches = rnumsplit.exec(value);
6750		return matches ?
6751
6752		// Guard against undefined "subtract", e.g., when used as in cssHooks
6753		Math.max(0, matches[1] - (subtract || 0)) + (matches[2] || "px") : value;
6754	}
6755
6756	function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {
6757		var i = extra === (isBorderBox ? "border" : "content") ?
6758
6759		// If we already have the right measurement, avoid augmentation
6760		4 :
6761
6762		// Otherwise initialize for horizontal or vertical properties
6763		name === "width" ? 1 : 0,
6764		    val = 0;
6765
6766		for (; i < 4; i += 2) {
6767
6768			// both box models exclude margin, so add it if we want it
6769			if (extra === "margin") {
6770				val += jQuery.css(elem, extra + cssExpand[i], true, styles);
6771			}
6772
6773			if (isBorderBox) {
6774
6775				// border-box includes padding, so remove it if we want content
6776				if (extra === "content") {
6777					val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
6778				}
6779
6780				// at this point, extra isn't border nor margin, so remove border
6781				if (extra !== "margin") {
6782					val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
6783				}
6784			} else {
6785
6786				// at this point, extra isn't content, so add padding
6787				val += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
6788
6789				// at this point, extra isn't content nor padding, so add border
6790				if (extra !== "padding") {
6791					val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
6792				}
6793			}
6794		}
6795
6796		return val;
6797	}
6798
6799	function getWidthOrHeight(elem, name, extra) {
6800
6801		// Start with offset property, which is equivalent to the border-box value
6802		var valueIsBorderBox = true,
6803		    val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6804		    styles = getStyles(elem),
6805		    isBorderBox = support.boxSizing && jQuery.css(elem, "boxSizing", false, styles) === "border-box";
6806
6807		// some non-html elements return undefined for offsetWidth, so check for null/undefined
6808		// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
6809		// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
6810		if (val <= 0 || val == null) {
6811
6812			// Fall back to computed then uncomputed css if necessary
6813			val = curCSS(elem, name, styles);
6814			if (val < 0 || val == null) {
6815				val = elem.style[name];
6816			}
6817
6818			// Computed unit is not pixels. Stop here and return.
6819			if (rnumnonpx.test(val)) {
6820				return val;
6821			}
6822
6823			// we need the check for style in case a browser which returns unreliable values
6824			// for getComputedStyle silently falls back to the reliable elem.style
6825			valueIsBorderBox = isBorderBox && (support.boxSizingReliable() || val === elem.style[name]);
6826
6827			// Normalize "", auto, and prepare for extra
6828			val = parseFloat(val) || 0;
6829		}
6830
6831		// use the active box-sizing model to add/subtract irrelevant styles
6832		return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles) + "px";
6833	}
6834
6835	jQuery.extend({
6836
6837		// Add in style property hooks for overriding the default
6838		// behavior of getting and setting a style property
6839		cssHooks: {
6840			opacity: {
6841				get: function (elem, computed) {
6842					if (computed) {
6843
6844						// We should always get a number back from opacity
6845						var ret = curCSS(elem, "opacity");
6846						return ret === "" ? "1" : ret;
6847					}
6848				}
6849			}
6850		},
6851
6852		// Don't automatically add "px" to these possibly-unitless properties
6853		cssNumber: {
6854			"animationIterationCount": true,
6855			"columnCount": true,
6856			"fillOpacity": true,
6857			"flexGrow": true,
6858			"flexShrink": true,
6859			"fontWeight": true,
6860			"lineHeight": true,
6861			"opacity": true,
6862			"order": true,
6863			"orphans": true,
6864			"widows": true,
6865			"zIndex": true,
6866			"zoom": true
6867		},
6868
6869		// Add in properties whose names you wish to fix before
6870		// setting or getting the value
6871		cssProps: {
6872
6873			// normalize float css property
6874			"float": support.cssFloat ? "cssFloat" : "styleFloat"
6875		},
6876
6877		// Get and set the style property on a DOM Node
6878		style: function (elem, name, value, extra) {
6879
6880			// Don't set styles on text and comment nodes
6881			if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
6882				return;
6883			}
6884
6885			// Make sure that we're working with the right name
6886			var ret,
6887			    type,
6888			    hooks,
6889			    origName = jQuery.camelCase(name),
6890			    style = elem.style;
6891
6892			name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName);
6893
6894			// gets hook for the prefixed version
6895			// followed by the unprefixed version
6896			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
6897
6898			// Check if we're setting a value
6899			if (value !== undefined) {
6900				type = typeof value;
6901
6902				// Convert "+=" or "-=" to relative numbers (#7345)
6903				if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
6904					value = adjustCSS(elem, name, ret);
6905
6906					// Fixes bug #9237
6907					type = "number";
6908				}
6909
6910				// Make sure that null and NaN values aren't set. See: #7116
6911				if (value == null || value !== value) {
6912					return;
6913				}
6914
6915				// If a number was passed in, add the unit (except for certain CSS properties)
6916				if (type === "number") {
6917					value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
6918				}
6919
6920				// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
6921				// but it would mean to define eight
6922				// (for every problematic property) identical functions
6923				if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
6924					style[name] = "inherit";
6925				}
6926
6927				// If a hook was provided, use that value, otherwise just set the specified value
6928				if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {
6929
vendor: 4,360 bytes, lines 6930-7056
6930					// Support: IE
6931					// Swallow errors from 'invalid' CSS values (#5509)
6932					try {
6933						style[name] = value;
6934					} catch (e) {}
6935				}
6936			} else {
6937
6938				// If a hook was provided get the non-computed value from there
6939				if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {
6940
6941					return ret;
6942				}
6943
6944				// Otherwise just get the value from the style object
6945				return style[name];
6946			}
6947		},
6948
6949		css: function (elem, name, extra, styles) {
6950			var num,
6951			    val,
6952			    hooks,
6953			    origName = jQuery.camelCase(name);
6954
6955			// Make sure that we're working with the right name
6956			name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName);
6957
6958			// gets hook for the prefixed version
6959			// followed by the unprefixed version
6960			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
6961
6962			// If a hook was provided get the computed value from there
6963			if (hooks && "get" in hooks) {
6964				val = hooks.get(elem, true, extra);
6965			}
6966
6967			// Otherwise, if a way to get the computed value exists, use that
6968			if (val === undefined) {
6969				val = curCSS(elem, name, styles);
6970			}
6971
6972			//convert "normal" to computed value
6973			if (val === "normal" && name in cssNormalTransform) {
6974				val = cssNormalTransform[name];
6975			}
6976
6977			// Return, converting to number if forced or a qualifier was provided and val looks numeric
6978			if (extra === "" || extra) {
6979				num = parseFloat(val);
6980				return extra === true || isFinite(num) ? num || 0 : val;
6981			}
6982			return val;
6983		}
6984	});
6985
6986	jQuery.each(["height", "width"], function (i, name) {
6987		jQuery.cssHooks[name] = {
6988			get: function (elem, computed, extra) {
6989				if (computed) {
6990
6991					// certain elements can have dimension info if we invisibly show them
6992					// however, it must have a current display style that would benefit from this
6993					return rdisplayswap.test(jQuery.css(elem, "display")) && elem.offsetWidth === 0 ? swap(elem, cssShow, function () {
6994						return getWidthOrHeight(elem, name, extra);
6995					}) : getWidthOrHeight(elem, name, extra);
6996				}
6997			},
6998
6999			set: function (elem, value, extra) {
7000				var styles = extra && getStyles(elem);
7001				return setPositiveNumber(elem, value, extra ? augmentWidthOrHeight(elem, name, extra, support.boxSizing && jQuery.css(elem, "boxSizing", false, styles) === "border-box", styles) : 0);
7002			}
7003		};
7004	});
7005
7006	if (!support.opacity) {
7007		jQuery.cssHooks.opacity = {
7008			get: function (elem, computed) {
7009
7010				// IE uses filters for opacity
7011				return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? 0.01 * parseFloat(RegExp.$1) + "" : computed ? "1" : "";
7012			},
7013
7014			set: function (elem, value) {
7015				var style = elem.style,
7016				    currentStyle = elem.currentStyle,
7017				    opacity = jQuery.isNumeric(value) ? "alpha(opacity=" + value * 100 + ")" : "",
7018				    filter = currentStyle && currentStyle.filter || style.filter || "";
7019
7020				// IE has trouble with opacity if it does not have layout
7021				// Force it by setting the zoom level
7022				style.zoom = 1;
7023
7024				// if setting opacity to 1, and no other filters exist -
7025				// attempt to remove filter attribute #6652
7026				// if value === "", then remove inline opacity #12685
7027				if ((value >= 1 || value === "") && jQuery.trim(filter.replace(ralpha, "")) === "" && style.removeAttribute) {
7028
7029					// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
7030					// if "filter:" is present at all, clearType is disabled, we want to avoid this
7031					// style.removeAttribute is IE Only, but so apparently is this code path...
7032					style.removeAttribute("filter");
7033
7034					// if there is no filter style applied in a css rule
7035					// or unset inline opacity, we are done
7036					if (value === "" || currentStyle && !currentStyle.filter) {
7037						return;
7038					}
7039				}
7040
7041				// otherwise, set new filter values
7042				style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : filter + " " + opacity;
7043			}
7044		};
7045	}
7046
7047	jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight, function (elem, computed) {
7048		if (computed) {
7049			return swap(elem, { "display": "inline-block" }, curCSS, [elem, "marginRight"]);
7050		}
7051	});
7052
7053	jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {
7054		if (computed) {
7055			return (parseFloat(curCSS(elem, "marginLeft")) || (
7056
vendor: 4,554 bytes, lines 7057-7220
7057			// Support: IE<=11+
7058			// Running getBoundingClientRect on a disconnected node in IE throws an error
7059			// Support: IE8 only
7060			// getClientRects() errors on disconnected elems
7061			jQuery.contains(elem.ownerDocument, elem) ? elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function () {
7062				return elem.getBoundingClientRect().left;
7063			}) : 0)) + "px";
7064		}
7065	});
7066
7067	// These hooks are used by animate to expand properties
7068	jQuery.each({
7069		margin: "",
7070		padding: "",
7071		border: "Width"
7072	}, function (prefix, suffix) {
7073		jQuery.cssHooks[prefix + suffix] = {
7074			expand: function (value) {
7075				var i = 0,
7076				    expanded = {},
7077
7078
7079				// assumes a single number if not a string
7080				parts = typeof value === "string" ? value.split(" ") : [value];
7081
7082				for (; i < 4; i++) {
7083					expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
7084				}
7085
7086				return expanded;
7087			}
7088		};
7089
7090		if (!rmargin.test(prefix)) {
7091			jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
7092		}
7093	});
7094
7095	jQuery.fn.extend({
7096		css: function (name, value) {
7097			return access(this, function (elem, name, value) {
7098				var styles,
7099				    len,
7100				    map = {},
7101				    i = 0;
7102
7103				if (jQuery.isArray(name)) {
7104					styles = getStyles(elem);
7105					len = name.length;
7106
7107					for (; i < len; i++) {
7108						map[name[i]] = jQuery.css(elem, name[i], false, styles);
7109					}
7110
7111					return map;
7112				}
7113
7114				return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
7115			}, name, value, arguments.length > 1);
7116		},
7117		show: function () {
7118			return showHide(this, true);
7119		},
7120		hide: function () {
7121			return showHide(this);
7122		},
7123		toggle: function (state) {
7124			if (typeof state === "boolean") {
7125				return state ? this.show() : this.hide();
7126			}
7127
7128			return this.each(function () {
7129				if (isHidden(this)) {
7130					jQuery(this).show();
7131				} else {
7132					jQuery(this).hide();
7133				}
7134			});
7135		}
7136	});
7137
7138	function Tween(elem, options, prop, end, easing) {
7139		return new Tween.prototype.init(elem, options, prop, end, easing);
7140	}
7141	jQuery.Tween = Tween;
7142
7143	Tween.prototype = {
7144		constructor: Tween,
7145		init: function (elem, options, prop, end, easing, unit) {
7146			this.elem = elem;
7147			this.prop = prop;
7148			this.easing = easing || jQuery.easing._default;
7149			this.options = options;
7150			this.start = this.now = this.cur();
7151			this.end = end;
7152			this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
7153		},
7154		cur: function () {
7155			var hooks = Tween.propHooks[this.prop];
7156
7157			return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
7158		},
7159		run: function (percent) {
7160			var eased,
7161			    hooks = Tween.propHooks[this.prop];
7162
7163			if (this.options.duration) {
7164				this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
7165			} else {
7166				this.pos = eased = percent;
7167			}
7168			this.now = (this.end - this.start) * eased + this.start;
7169
7170			if (this.options.step) {
7171				this.options.step.call(this.elem, this.now, this);
7172			}
7173
7174			if (hooks && hooks.set) {
7175				hooks.set(this);
7176			} else {
7177				Tween.propHooks._default.set(this);
7178			}
7179			return this;
7180		}
7181	};
7182
7183	Tween.prototype.init.prototype = Tween.prototype;
7184
7185	Tween.propHooks = {
7186		_default: {
7187			get: function (tween) {
7188				var result;
7189
7190				// Use a property on the element directly when it is not a DOM element,
7191				// or when there is no matching style property that exists.
7192				if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
7193					return tween.elem[tween.prop];
7194				}
7195
7196				// passing an empty string as a 3rd parameter to .css will automatically
7197				// attempt a parseFloat and fallback to a string if the parse fails
7198				// so, simple values such as "10px" are parsed to Float.
7199				// complex values such as "rotate(1rad)" are returned as is.
7200				result = jQuery.css(tween.elem, tween.prop, "");
7201
7202				// Empty strings, null, undefined and "auto" are converted to 0.
7203				return !result || result === "auto" ? 0 : result;
7204			},
7205			set: function (tween) {
7206
7207				// use step hook for back compat - use cssHook if its there - use .style if its
7208				// available and use plain properties where available
7209				if (jQuery.fx.step[tween.prop]) {
7210					jQuery.fx.step[tween.prop](tween);
7211				} else if (tween.elem.nodeType === 1 && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) {
7212					jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
7213				} else {
7214					tween.elem[tween.prop] = tween.now;
7215				}
7216			}
7217		}
7218	};
7219
7220	// Support: IE <=9
vendor: 5,745 bytes, lines 7221-7440
7221	// Panic based approach to setting things on disconnected nodes
7222
7223	Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7224		set: function (tween) {
7225			if (tween.elem.nodeType && tween.elem.parentNode) {
7226				tween.elem[tween.prop] = tween.now;
7227			}
7228		}
7229	};
7230
7231	jQuery.easing = {
7232		linear: function (p) {
7233			return p;
7234		},
7235		swing: function (p) {
7236			return 0.5 - Math.cos(p * Math.PI) / 2;
7237		},
7238		_default: "swing"
7239	};
7240
7241	jQuery.fx = Tween.prototype.init;
7242
7243	// Back Compat <1.8 extension point
7244	jQuery.fx.step = {};
7245
7246	var fxNow,
7247	    timerId,
7248	    rfxtypes = /^(?:toggle|show|hide)$/,
7249	    rrun = /queueHooks$/;
7250
7251	// Animations created synchronously will run synchronously
7252	function createFxNow() {
7253		window.setTimeout(function () {
7254			fxNow = undefined;
7255		});
7256		return fxNow = jQuery.now();
7257	}
7258
7259	// Generate parameters to create a standard animation
7260	function genFx(type, includeWidth) {
7261		var which,
7262		    attrs = { height: type },
7263		    i = 0;
7264
7265		// if we include width, step value is 1 to do all cssExpand values,
7266		// if we don't include width, step value is 2 to skip over Left and Right
7267		includeWidth = includeWidth ? 1 : 0;
7268		for (; i < 4; i += 2 - includeWidth) {
7269			which = cssExpand[i];
7270			attrs["margin" + which] = attrs["padding" + which] = type;
7271		}
7272
7273		if (includeWidth) {
7274			attrs.opacity = attrs.width = type;
7275		}
7276
7277		return attrs;
7278	}
7279
7280	function createTween(value, prop, animation) {
7281		var tween,
7282		    collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
7283		    index = 0,
7284		    length = collection.length;
7285		for (; index < length; index++) {
7286			if (tween = collection[index].call(animation, prop, value)) {
7287
7288				// we're done with this property
7289				return tween;
7290			}
7291		}
7292	}
7293
7294	function defaultPrefilter(elem, props, opts) {
7295		/* jshint validthis: true */
7296		var prop,
7297		    value,
7298		    toggle,
7299		    tween,
7300		    hooks,
7301		    oldfire,
7302		    display,
7303		    checkDisplay,
7304		    anim = this,
7305		    orig = {},
7306		    style = elem.style,
7307		    hidden = elem.nodeType && isHidden(elem),
7308		    dataShow = jQuery._data(elem, "fxshow");
7309
7310		// handle queue: false promises
7311		if (!opts.queue) {
7312			hooks = jQuery._queueHooks(elem, "fx");
7313			if (hooks.unqueued == null) {
7314				hooks.unqueued = 0;
7315				oldfire = hooks.empty.fire;
7316				hooks.empty.fire = function () {
7317					if (!hooks.unqueued) {
7318						oldfire();
7319					}
7320				};
7321			}
7322			hooks.unqueued++;
7323
7324			anim.always(function () {
7325
7326				// doing this makes sure that the complete handler will be called
7327				// before this completes
7328				anim.always(function () {
7329					hooks.unqueued--;
7330					if (!jQuery.queue(elem, "fx").length) {
7331						hooks.empty.fire();
7332					}
7333				});
7334			});
7335		}
7336
7337		// height/width overflow pass
7338		if (elem.nodeType === 1 && ("height" in props || "width" in props)) {
7339
7340			// Make sure that nothing sneaks out
7341			// Record all 3 overflow attributes because IE does not
7342			// change the overflow attribute when overflowX and
7343			// overflowY are set to the same value
7344			opts.overflow = [style.overflow, style.overflowX, style.overflowY];
7345
7346			// Set display property to inline-block for height/width
7347			// animations on inline elements that are having width/height animated
7348			display = jQuery.css(elem, "display");
7349
7350			// Test default display if display is currently "none"
7351			checkDisplay = display === "none" ? jQuery._data(elem, "olddisplay") || defaultDisplay(elem.nodeName) : display;
7352
7353			if (checkDisplay === "inline" && jQuery.css(elem, "float") === "none") {
7354
7355				// inline-level elements accept inline-block;
7356				// block-level elements need to be inline with layout
7357				if (!support.inlineBlockNeedsLayout || defaultDisplay(elem.nodeName) === "inline") {
7358					style.display = "inline-block";
7359				} else {
7360					style.zoom = 1;
7361				}
7362			}
7363		}
7364
7365		if (opts.overflow) {
7366			style.overflow = "hidden";
7367			if (!support.shrinkWrapBlocks()) {
7368				anim.always(function () {
7369					style.overflow = opts.overflow[0];
7370					style.overflowX = opts.overflow[1];
7371					style.overflowY = opts.overflow[2];
7372				});
7373			}
7374		}
7375
7376		// show/hide pass
7377		for (prop in props) {
7378			value = props[prop];
7379			if (rfxtypes.exec(value)) {
7380				delete props[prop];
7381				toggle = toggle || value === "toggle";
7382				if (value === (hidden ? "hide" : "show")) {
7383
7384					// If there is dataShow left over from a stopped hide or show
7385					// and we are going to proceed with show, we should pretend to be hidden
7386					if (value === "show" && dataShow && dataShow[prop] !== undefined) {
7387						hidden = true;
7388					} else {
7389						continue;
7390					}
7391				}
7392				orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
7393
7394				// Any non-fx value stops us from restoring the original display value
7395			} else {
7396				display = undefined;
7397			}
7398		}
7399
7400		if (!jQuery.isEmptyObject(orig)) {
7401			if (dataShow) {
7402				if ("hidden" in dataShow) {
7403					hidden = dataShow.hidden;
7404				}
7405			} else {
7406				dataShow = jQuery._data(elem, "fxshow", {});
7407			}
7408
7409			// store state if its toggle - enables .stop().toggle() to "reverse"
7410			if (toggle) {
7411				dataShow.hidden = !hidden;
7412			}
7413			if (hidden) {
7414				jQuery(elem).show();
7415			} else {
7416				anim.done(function () {
7417					jQuery(elem).hide();
7418				});
7419			}
7420			anim.done(function () {
7421				var prop;
7422				jQuery._removeData(elem, "fxshow");
7423				for (prop in orig) {
7424					jQuery.style(elem, prop, orig[prop]);
7425				}
7426			});
7427			for (prop in orig) {
7428				tween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
7429
7430				if (!(prop in dataShow)) {
7431					dataShow[prop] = tween.start;
7432					if (hidden) {
7433						tween.end = tween.start;
7434						tween.start = prop === "width" || prop === "height" ? 1 : 0;
7435					}
7436				}
7437			}
7438
7439			// If this is a noop like .hide().hide(), restore an overwritten display value
7440		} else if ((display === "none" ? defaultDisplay(elem.nodeName) : dis
vendor: 5,869 bytes, lines 7440-7666
7440play) === "inline") {
7441			style.display = display;
7442		}
7443	}
7444
7445	function propFilter(props, specialEasing) {
7446		var index, name, easing, value, hooks;
7447
7448		// camelCase, specialEasing and expand cssHook pass
7449		for (index in props) {
7450			name = jQuery.camelCase(index);
7451			easing = specialEasing[name];
7452			value = props[index];
7453			if (jQuery.isArray(value)) {
7454				easing = value[1];
7455				value = props[index] = value[0];
7456			}
7457
7458			if (index !== name) {
7459				props[name] = value;
7460				delete props[index];
7461			}
7462
7463			hooks = jQuery.cssHooks[name];
7464			if (hooks && "expand" in hooks) {
7465				value = hooks.expand(value);
7466				delete props[name];
7467
7468				// not quite $.extend, this wont overwrite keys already present.
7469				// also - reusing 'index' from above because we have the correct "name"
7470				for (index in value) {
7471					if (!(index in props)) {
7472						props[index] = value[index];
7473						specialEasing[index] = easing;
7474					}
7475				}
7476			} else {
7477				specialEasing[name] = easing;
7478			}
7479		}
7480	}
7481
7482	function Animation(elem, properties, options) {
7483		var result,
7484		    stopped,
7485		    index = 0,
7486		    length = Animation.prefilters.length,
7487		    deferred = jQuery.Deferred().always(function () {
7488
7489			// don't match elem in the :animated selector
7490			delete tick.elem;
7491		}),
7492		    tick = function () {
7493			if (stopped) {
7494				return false;
7495			}
7496			var currentTime = fxNow || createFxNow(),
7497			    remaining = Math.max(0, animation.startTime + animation.duration - currentTime),
7498
7499
7500			// Support: Android 2.3
7501			// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7502			temp = remaining / animation.duration || 0,
7503			    percent = 1 - temp,
7504			    index = 0,
7505			    length = animation.tweens.length;
7506
7507			for (; index < length; index++) {
7508				animation.tweens[index].run(percent);
7509			}
7510
7511			deferred.notifyWith(elem, [animation, percent, remaining]);
7512
7513			if (percent < 1 && length) {
7514				return remaining;
7515			} else {
7516				deferred.resolveWith(elem, [animation]);
7517				return false;
7518			}
7519		},
7520		    animation = deferred.promise({
7521			elem: elem,
7522			props: jQuery.extend({}, properties),
7523			opts: jQuery.extend(true, {
7524				specialEasing: {},
7525				easing: jQuery.easing._default
7526			}, options),
7527			originalProperties: properties,
7528			originalOptions: options,
7529			startTime: fxNow || createFxNow(),
7530			duration: options.duration,
7531			tweens: [],
7532			createTween: function (prop, end) {
7533				var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
7534				animation.tweens.push(tween);
7535				return tween;
7536			},
7537			stop: function (gotoEnd) {
7538				var index = 0,
7539
7540
7541				// if we are going to the end, we want to run all the tweens
7542				// otherwise we skip this part
7543				length = gotoEnd ? animation.tweens.length : 0;
7544				if (stopped) {
7545					return this;
7546				}
7547				stopped = true;
7548				for (; index < length; index++) {
7549					animation.tweens[index].run(1);
7550				}
7551
7552				// resolve when we played the last frame
7553				// otherwise, reject
7554				if (gotoEnd) {
7555					deferred.notifyWith(elem, [animation, 1, 0]);
7556					deferred.resolveWith(elem, [animation, gotoEnd]);
7557				} else {
7558					deferred.rejectWith(elem, [animation, gotoEnd]);
7559				}
7560				return this;
7561			}
7562		}),
7563		    props = animation.props;
7564
7565		propFilter(props, animation.opts.specialEasing);
7566
7567		for (; index < length; index++) {
7568			result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
7569			if (result) {
7570				if (jQuery.isFunction(result.stop)) {
7571					jQuery._queueHooks(animation.elem, animation.opts.queue).stop = jQuery.proxy(result.stop, result);
7572				}
7573				return result;
7574			}
7575		}
7576
7577		jQuery.map(props, createTween, animation);
7578
7579		if (jQuery.isFunction(animation.opts.start)) {
7580			animation.opts.start.call(elem, animation);
7581		}
7582
7583		jQuery.fx.timer(jQuery.extend(tick, {
7584			elem: elem,
7585			anim: animation,
7586			queue: animation.opts.queue
7587		}));
7588
7589		// attach callbacks from options
7590		return animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
7591	}
7592
7593	jQuery.Animation = jQuery.extend(Animation, {
7594
7595		tweeners: {
7596			"*": [function (prop, value) {
7597				var tween = this.createTween(prop, value);
7598				adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
7599				return tween;
7600			}]
7601		},
7602
7603		tweener: function (props, callback) {
7604			if (jQuery.isFunction(props)) {
7605				callback = props;
7606				props = ["*"];
7607			} else {
7608				props = props.match(rnotwhite);
7609			}
7610
7611			var prop,
7612			    index = 0,
7613			    length = props.length;
7614
7615			for (; index < length; index++) {
7616				prop = props[index];
7617				Animation.tweeners[prop] = Animation.tweeners[prop] || [];
7618				Animation.tweeners[prop].unshift(callback);
7619			}
7620		},
7621
7622		prefilters: [defaultPrefilter],
7623
7624		prefilter: function (callback, prepend) {
7625			if (prepend) {
7626				Animation.prefilters.unshift(callback);
7627			} else {
7628				Animation.prefilters.push(callback);
7629			}
7630		}
7631	});
7632
7633	jQuery.speed = function (speed, easing, fn) {
7634		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
7635			complete: fn || !fn && easing || jQuery.isFunction(speed) && speed,
7636			duration: speed,
7637			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
7638		};
7639
7640		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
7641
7642		// normalize opt.queue - true/undefined/null -> "fx"
7643		if (opt.queue == null || opt.queue === true) {
7644			opt.queue = "fx";
7645		}
7646
7647		// Queueing
7648		opt.old = opt.complete;
7649
7650		opt.complete = function () {
7651			if (jQuery.isFunction(opt.old)) {
7652				opt.old.call(this);
7653			}
7654
7655			if (opt.queue) {
7656				jQuery.dequeue(this, opt.queue);
7657			}
7658		};
7659
7660		return opt;
7661	};
7662
7663	jQuery.fn.extend({
7664		fadeTo: function (speed, to, easing, callback) {
7665
7666			// show any hidden elements after setting opacity to 0
vendor: 8,995 bytes, lines 7667-8007
7667			return this.filter(isHidden).css("opacity", 0).show()
7668
7669			// animate to the value specified
7670			.end().animate({ opacity: to }, speed, easing, callback);
7671		},
7672		animate: function (prop, speed, easing, callback) {
7673			var empty = jQuery.isEmptyObject(prop),
7674			    optall = jQuery.speed(speed, easing, callback),
7675			    doAnimation = function () {
7676
7677				// Operate on a copy of prop so per-property easing won't be lost
7678				var anim = Animation(this, jQuery.extend({}, prop), optall);
7679
7680				// Empty animations, or finishing resolves immediately
7681				if (empty || jQuery._data(this, "finish")) {
7682					anim.stop(true);
7683				}
7684			};
7685			doAnimation.finish = doAnimation;
7686
7687			return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
7688		},
7689		stop: function (type, clearQueue, gotoEnd) {
7690			var stopQueue = function (hooks) {
7691				var stop = hooks.stop;
7692				delete hooks.stop;
7693				stop(gotoEnd);
7694			};
7695
7696			if (typeof type !== "string") {
7697				gotoEnd = clearQueue;
7698				clearQueue = type;
7699				type = undefined;
7700			}
7701			if (clearQueue && type !== false) {
7702				this.queue(type || "fx", []);
7703			}
7704
7705			return this.each(function () {
7706				var dequeue = true,
7707				    index = type != null && type + "queueHooks",
7708				    timers = jQuery.timers,
7709				    data = jQuery._data(this);
7710
7711				if (index) {
7712					if (data[index] && data[index].stop) {
7713						stopQueue(data[index]);
7714					}
7715				} else {
7716					for (index in data) {
7717						if (data[index] && data[index].stop && rrun.test(index)) {
7718							stopQueue(data[index]);
7719						}
7720					}
7721				}
7722
7723				for (index = timers.length; index--;) {
7724					if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
7725
7726						timers[index].anim.stop(gotoEnd);
7727						dequeue = false;
7728						timers.splice(index, 1);
7729					}
7730				}
7731
7732				// start the next in the queue if the last step wasn't forced
7733				// timers currently will call their complete callbacks, which will dequeue
7734				// but only if they were gotoEnd
7735				if (dequeue || !gotoEnd) {
7736					jQuery.dequeue(this, type);
7737				}
7738			});
7739		},
7740		finish: function (type) {
7741			if (type !== false) {
7742				type = type || "fx";
7743			}
7744			return this.each(function () {
7745				var index,
7746				    data = jQuery._data(this),
7747				    queue = data[type + "queue"],
7748				    hooks = data[type + "queueHooks"],
7749				    timers = jQuery.timers,
7750				    length = queue ? queue.length : 0;
7751
7752				// enable finishing flag on private data
7753				data.finish = true;
7754
7755				// empty the queue first
7756				jQuery.queue(this, type, []);
7757
7758				if (hooks && hooks.stop) {
7759					hooks.stop.call(this, true);
7760				}
7761
7762				// look for any active animations, and finish them
7763				for (index = timers.length; index--;) {
7764					if (timers[index].elem === this && timers[index].queue === type) {
7765						timers[index].anim.stop(true);
7766						timers.splice(index, 1);
7767					}
7768				}
7769
7770				// look for any animations in the old queue and finish them
7771				for (index = 0; index < length; index++) {
7772					if (queue[index] && queue[index].finish) {
7773						queue[index].finish.call(this);
7774					}
7775				}
7776
7777				// turn off finishing flag
7778				delete data.finish;
7779			});
7780		}
7781	});
7782
7783	jQuery.each(["toggle", "show", "hide"], function (i, name) {
7784		var cssFn = jQuery.fn[name];
7785		jQuery.fn[name] = function (speed, easing, callback) {
7786			return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
7787		};
7788	});
7789
7790	// Generate shortcuts for custom animations
7791	jQuery.each({
7792		slideDown: genFx("show"),
7793		slideUp: genFx("hide"),
7794		slideToggle: genFx("toggle"),
7795		fadeIn: { opacity: "show" },
7796		fadeOut: { opacity: "hide" },
7797		fadeToggle: { opacity: "toggle" }
7798	}, function (name, props) {
7799		jQuery.fn[name] = function (speed, easing, callback) {
7800			return this.animate(props, speed, easing, callback);
7801		};
7802	});
7803
7804	jQuery.timers = [];
7805	jQuery.fx.tick = function () {
7806		var timer,
7807		    timers = jQuery.timers,
7808		    i = 0;
7809
7810		fxNow = jQuery.now();
7811
7812		for (; i < timers.length; i++) {
7813			timer = timers[i];
7814
7815			// Checks the timer has not already been removed
7816			if (!timer() && timers[i] === timer) {
7817				timers.splice(i--, 1);
7818			}
7819		}
7820
7821		if (!timers.length) {
7822			jQuery.fx.stop();
7823		}
7824		fxNow = undefined;
7825	};
7826
7827	jQuery.fx.timer = function (timer) {
7828		jQuery.timers.push(timer);
7829		if (timer()) {
7830			jQuery.fx.start();
7831		} else {
7832			jQuery.timers.pop();
7833		}
7834	};
7835
7836	jQuery.fx.interval = 13;
7837
7838	jQuery.fx.start = function () {
7839		if (!timerId) {
7840			timerId = window.setInterval(jQuery.fx.tick, jQuery.fx.interval);
7841		}
7842	};
7843
7844	jQuery.fx.stop = function () {
7845		window.clearInterval(timerId);
7846		timerId = null;
7847	};
7848
7849	jQuery.fx.speeds = {
7850		slow: 600,
7851		fast: 200,
7852
7853		// Default speed
7854		_default: 400
7855	};
7856
7857	// Based off of the plugin by Clint Helfers, with permission.
7858	// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7859	jQuery.fn.delay = function (time, type) {
7860		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
7861		type = type || "fx";
7862
7863		return this.queue(type, function (next, hooks) {
7864			var timeout = window.setTimeout(next, time);
7865			hooks.stop = function () {
7866				window.clearTimeout(timeout);
7867			};
7868		});
7869	};
7870
7871	(function () {
7872		var a,
7873		    input = document.createElement("input"),
7874		    div = document.createElement("div"),
7875		    select = document.createElement("select"),
7876		    opt = select.appendChild(document.createElement("option"));
7877
7878		// Setup
7879		div = document.createElement("div");
7880		div.setAttribute("className", "t");
7881		div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
7882		a = div.getElementsByTagName("a")[0];
7883
7884		// Support: Windows Web Apps (WWA)
7885		// `type` must use .setAttribute for WWA (#14901)
7886		input.setAttribute("type", "checkbox");
7887		div.appendChild(input);
7888
7889		a = div.getElementsByTagName("a")[0];
7890
7891		// First batch of tests.
7892		a.style.cssText = "top:1px";
7893
7894		// Test setAttribute on camelCase class.
7895		// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
7896		support.getSetAttribute = div.className !== "t";
7897
7898		// Get the style information from getAttribute
7899		// (IE uses .cssText instead)
7900		support.style = /top/.test(a.getAttribute("style"));
7901
7902		// Make sure that URLs aren't manipulated
7903		// (IE normalizes it by default)
7904		support.hrefNormalized = a.getAttribute("href") === "/a";
7905
7906		// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
7907		support.checkOn = !!input.value;
7908
7909		// Make sure that a selected-by-default option has a working selected property.
7910		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
7911		support.optSelected = opt.selected;
7912
7913		// Tests for enctype support on a form (#6743)
7914		support.enctype = !!document.createElement("form").enctype;
7915
7916		// Make sure that the options inside disabled selects aren't marked as disabled
7917		// (WebKit marks them as disabled)
7918		select.disabled = true;
7919		support.optDisabled = !opt.disabled;
7920
7921		// Support: IE8 only
7922		// Check if we can trust getAttribute("value")
7923		input = document.createElement("input");
7924		input.setAttribute("value", "");
7925		support.input = input.getAttribute("value") === "";
7926
7927		// Check if an input maintains its value after becoming a radio
7928		input.value = "t";
7929		input.setAttribute("type", "radio");
7930		support.radioValue = input.value === "t";
7931	})();
7932
7933	var rreturn = /\r/g,
7934	    rspaces = /[\x20\t\r\n\f]+/g;
7935
7936	jQuery.fn.extend({
7937		val: function (value) {
7938			var hooks,
7939			    ret,
7940			    isFunction,
7941			    elem = this[0];
7942
7943			if (!arguments.length) {
7944				if (elem) {
7945					hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
7946
7947					if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
7948						return ret;
7949					}
7950
7951					ret = elem.value;
7952
7953					return typeof ret === "string" ?
7954
7955					// handle most common string cases
7956					ret.replace(rreturn, "") :
7957
7958					// handle cases where value is null/undef or number
7959					ret == null ? "" : ret;
7960				}
7961
7962				return;
7963			}
7964
7965			isFunction = jQuery.isFunction(value);
7966
7967			return this.each(function (i) {
7968				var val;
7969
7970				if (this.nodeType !== 1) {
7971					return;
7972				}
7973
7974				if (isFunction) {
7975					val = value.call(this, i, jQuery(this).val());
7976				} else {
7977					val = value;
7978				}
7979
7980				// Treat null/undefined as ""; convert numbers to string
7981				if (val == null) {
7982					val = "";
7983				} else if (typeof val === "number") {
7984					val += "";
7985				} else if (jQuery.isArray(val)) {
7986					val = jQuery.map(val, function (value) {
7987						return value == null ? "" : value + "";
7988					});
7989				}
7990
7991				hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
7992
7993				// If set returns undefined, fall back to normal setting
7994				if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
7995					this.value = val;
7996				}
7997			});
7998		}
7999	});
8000
8001	jQuery.extend({
8002		valHooks: {
8003			option: {
8004				get: function (elem) {
8005					var val = jQuery.find.attr(elem, "value");
8006					return val != null ? val :
8007
vendor: 4,966 bytes, lines 8008-8196
8008					// Support: IE10-11+
8009					// option.text throws exceptions (#14686, #14858)
8010					// Strip and collapse whitespace
8011					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8012					jQuery.trim(jQuery.text(elem)).replace(rspaces, " ");
8013				}
8014			},
8015			select: {
8016				get: function (elem) {
8017					var value,
8018					    option,
8019					    options = elem.options,
8020					    index = elem.selectedIndex,
8021					    one = elem.type === "select-one" || index < 0,
8022					    values = one ? null : [],
8023					    max = one ? index + 1 : options.length,
8024					    i = index < 0 ? max : one ? index : 0;
8025
8026					// Loop through all the selected options
8027					for (; i < max; i++) {
8028						option = options[i];
8029
8030						// oldIE doesn't update selected after form reset (#2551)
8031						if ((option.selected || i === index) && (
8032
8033						// Don't return options that are disabled or in a disabled optgroup
8034						support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) {
8035
8036							// Get the specific value for the option
8037							value = jQuery(option).val();
8038
8039							// We don't need an array for one selects
8040							if (one) {
8041								return value;
8042							}
8043
8044							// Multi-Selects return an array
8045							values.push(value);
8046						}
8047					}
8048
8049					return values;
8050				},
8051
8052				set: function (elem, value) {
8053					var optionSet,
8054					    option,
8055					    options = elem.options,
8056					    values = jQuery.makeArray(value),
8057					    i = options.length;
8058
8059					while (i--) {
8060						option = options[i];
8061
8062						if (jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
8063
8064							// Support: IE6
8065							// When new option element is added to select box we need to
8066							// force reflow of newly added node in order to workaround delay
8067							// of initialization properties
8068							try {
8069								option.selected = optionSet = true;
8070							} catch (_) {
8071
8072								// Will be executed only in IE6
8073								option.scrollHeight;
8074							}
8075						} else {
8076							option.selected = false;
8077						}
8078					}
8079
8080					// Force browsers to behave consistently when non-matching value is set
8081					if (!optionSet) {
8082						elem.selectedIndex = -1;
8083					}
8084
8085					return options;
8086				}
8087			}
8088		}
8089	});
8090
8091	// Radios and checkboxes getter/setter
8092	jQuery.each(["radio", "checkbox"], function () {
8093		jQuery.valHooks[this] = {
8094			set: function (elem, value) {
8095				if (jQuery.isArray(value)) {
8096					return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
8097				}
8098			}
8099		};
8100		if (!support.checkOn) {
8101			jQuery.valHooks[this].get = function (elem) {
8102				return elem.getAttribute("value") === null ? "on" : elem.value;
8103			};
8104		}
8105	});
8106
8107	var nodeHook,
8108	    boolHook,
8109	    attrHandle = jQuery.expr.attrHandle,
8110	    ruseDefault = /^(?:checked|selected)$/i,
8111	    getSetAttribute = support.getSetAttribute,
8112	    getSetInput = support.input;
8113
8114	jQuery.fn.extend({
8115		attr: function (name, value) {
8116			return access(this, jQuery.attr, name, value, arguments.length > 1);
8117		},
8118
8119		removeAttr: function (name) {
8120			return this.each(function () {
8121				jQuery.removeAttr(this, name);
8122			});
8123		}
8124	});
8125
8126	jQuery.extend({
8127		attr: function (elem, name, value) {
8128			var ret,
8129			    hooks,
8130			    nType = elem.nodeType;
8131
8132			// Don't get/set attributes on text, comment and attribute nodes
8133			if (nType === 3 || nType === 8 || nType === 2) {
8134				return;
8135			}
8136
8137			// Fallback to prop when attributes are not supported
8138			if (typeof elem.getAttribute === "undefined") {
8139				return jQuery.prop(elem, name, value);
8140			}
8141
8142			// All attributes are lowercase
8143			// Grab necessary hook if one is defined
8144			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
8145				name = name.toLowerCase();
8146				hooks = jQuery.attrHooks[name] || (jQuery.expr.match.bool.test(name) ? boolHook : nodeHook);
8147			}
8148
8149			if (value !== undefined) {
8150				if (value === null) {
8151					jQuery.removeAttr(elem, name);
8152					return;
8153				}
8154
8155				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
8156					return ret;
8157				}
8158
8159				elem.setAttribute(name, value + "");
8160				return value;
8161			}
8162
8163			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
8164				return ret;
8165			}
8166
8167			ret = jQuery.find.attr(elem, name);
8168
8169			// Non-existent attributes return null, we normalize to undefined
8170			return ret == null ? undefined : ret;
8171		},
8172
8173		attrHooks: {
8174			type: {
8175				set: function (elem, value) {
8176					if (!support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) {
8177
8178						// Setting the type on a radio button after the value resets the value in IE8-9
8179						// Reset value to default in case type is set after value during creation
8180						var val = elem.value;
8181						elem.setAttribute("type", value);
8182						if (val) {
8183							elem.value = val;
8184						}
8185						return value;
8186					}
8187				}
8188			}
8189		},
8190
8191		removeAttr: function (elem, value) {
8192			var name,
8193			    propName,
8194			    i = 0,
8195			    attrNames = value && value.match(rnotwhite);
8196
vendor: 4,714 bytes, lines 8197-8360
8197			if (attrNames && elem.nodeType === 1) {
8198				while (name = attrNames[i++]) {
8199					propName = jQuery.propFix[name] || name;
8200
8201					// Boolean attributes get special treatment (#10870)
8202					if (jQuery.expr.match.bool.test(name)) {
8203
8204						// Set corresponding property to false
8205						if (getSetInput && getSetAttribute || !ruseDefault.test(name)) {
8206							elem[propName] = false;
8207
8208							// Support: IE<9
8209							// Also clear defaultChecked/defaultSelected (if appropriate)
8210						} else {
8211							elem[jQuery.camelCase("default-" + name)] = elem[propName] = false;
8212						}
8213
8214						// See #9699 for explanation of this approach (setting first, then removal)
8215					} else {
8216						jQuery.attr(elem, name, "");
8217					}
8218
8219					elem.removeAttribute(getSetAttribute ? name : propName);
8220				}
8221			}
8222		}
8223	});
8224
8225	// Hooks for boolean attributes
8226	boolHook = {
8227		set: function (elem, value, name) {
8228			if (value === false) {
8229
8230				// Remove boolean attributes when set to false
8231				jQuery.removeAttr(elem, name);
8232			} else if (getSetInput && getSetAttribute || !ruseDefault.test(name)) {
8233
8234				// IE<8 needs the *property* name
8235				elem.setAttribute(!getSetAttribute && jQuery.propFix[name] || name, name);
8236			} else {
8237
8238				// Support: IE<9
8239				// Use defaultChecked and defaultSelected for oldIE
8240				elem[jQuery.camelCase("default-" + name)] = elem[name] = true;
8241			}
8242			return name;
8243		}
8244	};
8245
8246	jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) {
8247		var getter = attrHandle[name] || jQuery.find.attr;
8248
8249		if (getSetInput && getSetAttribute || !ruseDefault.test(name)) {
8250			attrHandle[name] = function (elem, name, isXML) {
8251				var ret, handle;
8252				if (!isXML) {
8253
8254					// Avoid an infinite loop by temporarily removing this function from the getter
8255					handle = attrHandle[name];
8256					attrHandle[name] = ret;
8257					ret = getter(elem, name, isXML) != null ? name.toLowerCase() : null;
8258					attrHandle[name] = handle;
8259				}
8260				return ret;
8261			};
8262		} else {
8263			attrHandle[name] = function (elem, name, isXML) {
8264				if (!isXML) {
8265					return elem[jQuery.camelCase("default-" + name)] ? name.toLowerCase() : null;
8266				}
8267			};
8268		}
8269	});
8270
8271	// fix oldIE attroperties
8272	if (!getSetInput || !getSetAttribute) {
8273		jQuery.attrHooks.value = {
8274			set: function (elem, value, name) {
8275				if (jQuery.nodeName(elem, "input")) {
8276
8277					// Does not return so that setAttribute is also used
8278					elem.defaultValue = value;
8279				} else {
8280
8281					// Use nodeHook if defined (#1954); otherwise setAttribute is fine
8282					return nodeHook && nodeHook.set(elem, value, name);
8283				}
8284			}
8285		};
8286	}
8287
8288	// IE6/7 do not support getting/setting some attributes with get/setAttribute
8289	if (!getSetAttribute) {
8290
8291		// Use this for any attribute in IE6/7
8292		// This fixes almost every IE6/7 issue
8293		nodeHook = {
8294			set: function (elem, value, name) {
8295
8296				// Set the existing or create a new attribute node
8297				var ret = elem.getAttributeNode(name);
8298				if (!ret) {
8299					elem.setAttributeNode(ret = elem.ownerDocument.createAttribute(name));
8300				}
8301
8302				ret.value = value += "";
8303
8304				// Break association with cloned elements by also using setAttribute (#9646)
8305				if (name === "value" || value === elem.getAttribute(name)) {
8306					return value;
8307				}
8308			}
8309		};
8310
8311		// Some attributes are constructed with empty-string values when not defined
8312		attrHandle.id = attrHandle.name = attrHandle.coords = function (elem, name, isXML) {
8313			var ret;
8314			if (!isXML) {
8315				return (ret = elem.getAttributeNode(name)) && ret.value !== "" ? ret.value : null;
8316			}
8317		};
8318
8319		// Fixing value retrieval on a button requires this module
8320		jQuery.valHooks.button = {
8321			get: function (elem, name) {
8322				var ret = elem.getAttributeNode(name);
8323				if (ret && ret.specified) {
8324					return ret.value;
8325				}
8326			},
8327			set: nodeHook.set
8328		};
8329
8330		// Set contenteditable to false on removals(#10429)
8331		// Setting to empty string throws an error as an invalid value
8332		jQuery.attrHooks.contenteditable = {
8333			set: function (elem, value, name) {
8334				nodeHook.set(elem, value === "" ? false : value, name);
8335			}
8336		};
8337
8338		// Set width and height to auto instead of 0 on empty string( Bug #8150 )
8339		// This is for removals
8340		jQuery.each(["width", "height"], function (i, name) {
8341			jQuery.attrHooks[name] = {
8342				set: function (elem, value) {
8343					if (value === "") {
8344						elem.setAttribute(name, "auto");
8345						return value;
8346					}
8347				}
8348			};
8349		});
8350	}
8351
8352	if (!support.style) {
8353		jQuery.attrHooks.style = {
8354			get: function (elem) {
8355
8356				// Return undefined in the case of empty string
8357				// Note: IE uppercases css property names, but if we were to .toLowerCase()
8358				// .cssText, that would destroy case sensitivity in URL's, like in "background"
8359				return elem.style.cssText || undefined;
8360			},
8361			set: function (elem, value) {
8362				return elem.style.cssText = value + "";
8363			}
8364		};
8365	}
8366
8367	var rfocusable = /^(?:input|select|textarea|button|object)$/i,
8368	    rclickable = /^(?:a|area)$/i;
8369
8370	jQuery.fn.extend({
8371		prop: function (name, value) {
8372			return access(this, jQuery.prop, name, value, arguments.length > 1);
8373		},
8374
8375		removeProp: function (name) {
8376			name = jQuery.propFix[name] || name;
8377			return this.each(function () {
8378
8379				// try/catch handles cases where IE balks (such as removing a property on window)
8380				try {
8381					this[name] = undefined;
8382					delete this[name];
8383				} catch (e) {}
8384			});
8385		}
8386	});
8387
8388	jQuery.extend({
8389		prop: function (elem, name, value) {
8390			var ret,
8391			    hooks,
8392			    nType = elem.nodeType;
8393
8394			// Don't get/set properties on text, comment and attribute nodes
8395			if (nType === 3 || nType === 8 || nType === 2) {
8396				return;
8397			}
8398
8399			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
8400
8401				// Fix name and attach hooks
8402				name = jQuery.propFix[name] || name;
8403				hooks = jQuery.propHooks[name];
8404			}
8405
8406			if (value !== undefined) {
8407				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
8408					return ret;
8409				}
8410
8411				return elem[name] = value;
8412			}
8413
8414			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
8415				return ret;
8416			}
8417
8418			return elem[name];
8419		},
8420
8421		propHooks: {
8422			tabIndex: {
8423				get: function (elem) {
8424
8425					// elem.tabIndex doesn't always return the
8426					// correct value when it hasn't been explicitly set
8427					// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8428					// Use proper attribute retrieval(#12072)
8429					var tabindex = jQuery.find.attr(elem, "tabindex");
8430
8431					return tabindex ? parseInt(tabindex, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : -1;
8432				}
8433			}
8434		},
8435
8436		propFix: {
8437			"for": "htmlFor",
8438			"class": "className"
8439		}
8440	});
8441
8442	// Some attributes require a special call on IE
8443	// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
8444	if (!support.hrefNormalized) {
8445
8446		// href/src property should get the full normalized URL (#10299/#12915)
8447		jQuery.each(["href", "src"], function (i, name) {
8448			jQuery.propHooks[name] = {
8449				get: function (elem) {
8450					return elem.getAttribute(name, 4);
8451				}
8452			};
8453		});
8454	}
8455
8456	// Support: Safari, IE9+
8457	// Accessing the selectedIndex property
8458	// forces the browser to respect setting selected
8459	// on the option
8460	// The getter ensures a default option is selected
8461	// when in an optgroup
8462	if (!support.optSelected) {
8463		jQuery.propHooks.selected = {
8464			get: function (elem) {
8465				var parent = elem.parentNode;
8466
8467				if (parent) {
8468					parent.selectedIndex;
8469
8470					// Make sure that it also works with optgroups, see #5701
8471					if (parent.parentNode) {
8472						parent.parentNode.selectedIndex;
8473					}
8474				}
8475				return null;
8476			},
8477			set: function (elem) {
8478				var parent = elem.parentNode;
8479				if (parent) {
8480					parent.selectedIndex;
8481
8482					if (parent.parentNode) {
8483						parent.parentNode.selectedIndex;
8484					}
8485				}
8486			}
8487		};
8488	}
8489
8490	jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () {
8491		jQuery.propFix[this.toLowerCase()] = this;
8492	});
8493
8494	// IE6/7 call enctype encoding
8495	if (!support.enctype) {
8496		jQuery.propFix.enctype = "encoding";
8497	}
8498
8499	var rclass = /[\t\r\n\f]/g;
8500
8501	function getClass(elem) {
8502		return jQuery.attr(elem, "class") || "";
8503	}
8504
8505	jQuery.fn.extend({
8506		addClass: function (value) {
8507			var classes,
8508			    elem,
8509			    cur,
8510			    curValue,
8511			    clazz,
8512			    j,
8513			    finalValue,
8514			    i = 0;
8515
8516			if (jQuery.isFunction(value)) {
8517				return this.each(function (j) {
8518					jQuery(this).addClass(value.call(this, j, getClass(this)));
8519				});
8520			}
8521
8522			if (typeof value === "string" && value) {
8523				classes = value.match(rnotwhite) || [];
8524
8525				while (elem = this[i++]) {
8526					curValue = getClass(elem);
8527					cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " ");
8528
8529					if (cur) {
8530						j = 0;
8531						while (clazz = classes[j++]) {
8532							if (cur.indexOf(" " + clazz + " ") < 0) {
8533								cur += clazz + " ";
8534							}
8535						}
8536
8537						// only assign if different to avoid unneeded rendering.
8538						finalValue = jQuery.trim(cur);
8539						if (curValue !== finalValue) {
8540							jQuery.attr(elem, "class", finalValue);
8541						}
8542					}
8543				}
8544			}
8545
8546			return this;
8547		},
8548
8549		removeClass: function (value) {
8550			var classes,
8551			    elem,
8552			    cur,
8553			    curValue,
8554			    clazz,
8555			    j,
8556			    finalValue,
8557			    i = 0;
8558
8559			if (jQuery.isFunction(value)) {
8560				return this.each(function (j) {
8561					jQuery(this).removeClass(value.call(this, j, getClass(this)));
8562				});
8563			}
8564
8565			if (!arguments.length) {
8566				return this.attr("class", "");
8567			}
8568
8569			if (typeof value === "string" && value) {
8570				classes = value.match(rnotwhite) || [];
8571
8572				while (elem = this[i++]) {
8573					curValue = getClass(elem);
8574
8575					// This expression is here for better compressibility (see addClass)
8576					cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " ");
8577
8578					if (cur) {
8579						j = 0;
8580						while (clazz = classes[j++]) {
8581
8582							// Remove *all* instances
8583							while (cur.indexOf(" " + clazz + " ") > -1) {
8584								cur = cur.replace(" " + clazz + " ", " ");
8585							}
8586						}
8587
8588						// Only assign if different to avoid unneeded rendering.
8589						finalValue = jQuery.trim(cur);
8590						if (curValue !== finalValue) {
8591							jQuery.attr(elem, "class", finalValue);
8592						}
8593					}
8594				}
8595			}
8596
8597			return this;
8598		},
8599
8600		toggleClass: function (value, stateVal) {
8601			var type = typeof value;
8602
8603			if (typeof stateVal === "boolean" && type === "string") {
8604				return stateVal ? this.addClass(value) : this.removeClass(value);
8605			}
8606
8607			if (jQuery.isFunction(value)) {
8608				return this.each(function (i) {
8609					jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);
8610				});
8611			}
8612
8613			return this.each(function () {
8614				var className, i, self, classNames;
8615
8616				if (type === "string") {
8617
8618					// Toggle individual class names
8619					i = 0;
8620					self = jQuery(this);
8621					classNames = value.match(rnotwhite) || [];
8622
8623					while (className = classNames[i++]) {
8624
8625						// Check each className given, space separated list
8626						if (self.hasClass(className)) {
8627							self.removeClass(className);
8628						} else {
8629							self.addClass(className);
8630						}
8631					}
8632
8633					// Toggle whole class name
8634				} else if (value === undefined || type === "boolean") {
8635					className = getClass(this);
8636					if (className) {
8637
8638						// store className if set
8639						jQuery._data(this, "__className__", className);
8640					}
8641
8642					// If the element has a class name or if we're passed "false",
8643					// then remove the whole classname (if there was one, the above saved it).
8644					// Otherwise bring back whatever was previously saved (if anything),
8645					// falling back to the empty string if nothing was stored.
8646					jQuery.attr(this, "class", className || value === false ? "" : jQuery._data(this, "__className__") || "");
8647				}
8648			});
8649		},
8650
8651		hasClass: function (selector) {
8652			var className,
8653			    elem,
8654			    i = 0;
8655
8656			className = " " + selector + " ";
8657			while (elem = this[i++]) {
8658				if (elem.nodeType === 1 && (" " + getClass(elem) + " ").replace(rclass, " ").indexOf(className) > -1) {
8659					return true;
8660				}
8661			}
8662
8663			return false;
8664		}
8665	});
8666
8667	// Return jQuery for attributes-only inclusion
8668
8669
8670	jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) {
8671
8672		// Handle event binding
8673		jQuery.fn[name] = function (data, fn) {
8674			return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
8675		};
8676	});
8677
8678	jQuery.fn.extend({
8679		hover: function (fnOver, fnOut) {
8680			return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
8681		}
8682	});
8683
8684	var location = window.location;
8685
8686	var nonce = jQuery.now();
8687
8688	var rquery = /\?/;
8689
8690	var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
8691
8692	jQuery.parseJSON = function (data) {
8693
8694		// Attempt to parse using the native JSON parser first
8695		if (window.JSON && window.JSON.parse) {
8696
8697			// Support: Android 2.3
8698			// Workaround failure to string-cast null input
8699			return window.JSON.parse(data + "");
8700		}
8701
8702		var requireNonComma,
8703		    depth = null,
8704		    str = jQuery.trim(data + "");
8705
8706		// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
8707		// after removing valid tokens
8708		return str && !jQuery.trim(str.replace(rvalidtokens, function (token, comma, open, close) {
8709
8710			// Force termination if we see a misplaced comma
8711			if (requireNonComma && comma) {
8712				depth = 0;
8713			}
8714
8715			// Perform no more replacements after returning to outermost depth
8716			if (depth === 0) {
8717				return token;
8718			}
8719
8720			// Commas must not follow "[", "{", or ","
8721			requireNonComma = open || comma;
8722
8723			// Determine new depth
8724			// array/object open ("[" or "{"): depth += true - false (increment)
8725			// array/object close ("]" or "}"): depth += false - true (decrement)
8726			// other cases ("," or primitive): depth += true - true (numeric cast)
8727			depth += !close - !open;
8728
8729			// Remove this token
8730			return "";
8731		})) ? Function("return " + str)() : jQuery.error("Invalid JSON: " + data);
8732	};
8733
8734	// Cross-browser xml parsing
8735	jQuery.parseXML = function (data) {
8736		var xml, tmp;
8737		if (!data || typeof data !== "string") {
8738			return null;
8739		}
8740		try {
8741			if (window.DOMParser) {
8742				// Standard
8743				tmp = new window.DOMParser();
8744				xml = tmp.parseFromString(data, "text/xml");
8745			} else {
8746				// IE
8747				xml = new window.ActiveXObject("Microsoft.XMLDOM");
8748				xml.async = "false";
8749				xml.loadXML(data);
8750			}
8751		} catch (e) {
8752			xml = undefined;
8753		}
8754		if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) {
8755			jQuery.error("Invalid XML: " + data);
8756		}
8757		return xml;
8758	};
8759
8760	var rhash = /#.*$/,
8761	    rts = /([?&])_=[^&]*/,
8762
8763
8764	// IE leaves an \r character at EOL
8765	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
8766
8767
vendor: 13,733 bytes, lines 8768-9312
8768	// #7653, #8125, #8152: local protocol detection
8769	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8770	    rnoContent = /^(?:GET|HEAD)$/,
8771	    rprotocol = /^\/\//,
8772	    rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
8773
8774
8775	/* Prefilters
8776  * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8777  * 2) These are called:
8778  *    - BEFORE asking for a transport
8779  *    - AFTER param serialization (s.data is a string if s.processData is true)
8780  * 3) key is the dataType
8781  * 4) the catchall symbol "*" can be used
8782  * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8783  */
8784	prefilters = {},
8785
8786
8787	/* Transports bindings
8788  * 1) key is the dataType
8789  * 2) the catchall symbol "*" can be used
8790  * 3) selection will start with transport dataType and THEN go to "*" if needed
8791  */
8792	transports = {},
8793
8794
8795	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8796	allTypes = "*/".concat("*"),
8797
8798
8799	// Document location
8800	ajaxLocation = location.href,
8801
8802
8803	// Segment location into parts
8804	ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || [];
8805
8806	// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8807	function addToPrefiltersOrTransports(structure) {
8808
8809		// dataTypeExpression is optional and defaults to "*"
8810		return function (dataTypeExpression, func) {
8811
8812			if (typeof dataTypeExpression !== "string") {
8813				func = dataTypeExpression;
8814				dataTypeExpression = "*";
8815			}
8816
8817			var dataType,
8818			    i = 0,
8819			    dataTypes = dataTypeExpression.toLowerCase().match(rnotwhite) || [];
8820
8821			if (jQuery.isFunction(func)) {
8822
8823				// For each dataType in the dataTypeExpression
8824				while (dataType = dataTypes[i++]) {
8825
8826					// Prepend if requested
8827					if (dataType.charAt(0) === "+") {
8828						dataType = dataType.slice(1) || "*";
8829						(structure[dataType] = structure[dataType] || []).unshift(func);
8830
8831						// Otherwise append
8832					} else {
8833						(structure[dataType] = structure[dataType] || []).push(func);
8834					}
8835				}
8836			}
8837		};
8838	}
8839
8840	// Base inspection function for prefilters and transports
8841	function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
8842
8843		var inspected = {},
8844		    seekingTransport = structure === transports;
8845
8846		function inspect(dataType) {
8847			var selected;
8848			inspected[dataType] = true;
8849			jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
8850				var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
8851				if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {
8852
8853					options.dataTypes.unshift(dataTypeOrTransport);
8854					inspect(dataTypeOrTransport);
8855					return false;
8856				} else if (seekingTransport) {
8857					return !(selected = dataTypeOrTransport);
8858				}
8859			});
8860			return selected;
8861		}
8862
8863		return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
8864	}
8865
8866	// A special extend for ajax options
8867	// that takes "flat" options (not to be deep extended)
8868	// Fixes #9887
8869	function ajaxExtend(target, src) {
8870		var deep,
8871		    key,
8872		    flatOptions = jQuery.ajaxSettings.flatOptions || {};
8873
8874		for (key in src) {
8875			if (src[key] !== undefined) {
8876				(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
8877			}
8878		}
8879		if (deep) {
8880			jQuery.extend(true, target, deep);
8881		}
8882
8883		return target;
8884	}
8885
8886	/* Handles responses to an ajax request:
8887  * - finds the right dataType (mediates between content-type and expected dataType)
8888  * - returns the corresponding response
8889  */
8890	function ajaxHandleResponses(s, jqXHR, responses) {
8891		var firstDataType,
8892		    ct,
8893		    finalDataType,
8894		    type,
8895		    contents = s.contents,
8896		    dataTypes = s.dataTypes;
8897
8898		// Remove auto dataType and get content-type in the process
8899		while (dataTypes[0] === "*") {
8900			dataTypes.shift();
8901			if (ct === undefined) {
8902				ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
8903			}
8904		}
8905
8906		// Check if we're dealing with a known content-type
8907		if (ct) {
8908			for (type in contents) {
8909				if (contents[type] && contents[type].test(ct)) {
8910					dataTypes.unshift(type);
8911					break;
8912				}
8913			}
8914		}
8915
8916		// Check to see if we have a response for the expected dataType
8917		if (dataTypes[0] in responses) {
8918			finalDataType = dataTypes[0];
8919		} else {
8920
8921			// Try convertible dataTypes
8922			for (type in responses) {
8923				if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
8924					finalDataType = type;
8925					break;
8926				}
8927				if (!firstDataType) {
8928					firstDataType = type;
8929				}
8930			}
8931
8932			// Or just use first one
8933			finalDataType = finalDataType || firstDataType;
8934		}
8935
8936		// If we found a dataType
8937		// We add the dataType to the list if needed
8938		// and return the corresponding response
8939		if (finalDataType) {
8940			if (finalDataType !== dataTypes[0]) {
8941				dataTypes.unshift(finalDataType);
8942			}
8943			return responses[finalDataType];
8944		}
8945	}
8946
8947	/* Chain conversions given the request and the original response
8948  * Also sets the responseXXX fields on the jqXHR instance
8949  */
8950	function ajaxConvert(s, response, jqXHR, isSuccess) {
8951		var conv2,
8952		    current,
8953		    conv,
8954		    tmp,
8955		    prev,
8956		    converters = {},
8957
8958
8959		// Work with a copy of dataTypes in case we need to modify it for conversion
8960		dataTypes = s.dataTypes.slice();
8961
8962		// Create converters map with lowercased keys
8963		if (dataTypes[1]) {
8964			for (conv in s.converters) {
8965				converters[conv.toLowerCase()] = s.converters[conv];
8966			}
8967		}
8968
8969		current = dataTypes.shift();
8970
8971		// Convert to each sequential dataType
8972		while (current) {
8973
8974			if (s.responseFields[current]) {
8975				jqXHR[s.responseFields[current]] = response;
8976			}
8977
8978			// Apply the dataFilter if provided
8979			if (!prev && isSuccess && s.dataFilter) {
8980				response = s.dataFilter(response, s.dataType);
8981			}
8982
8983			prev = current;
8984			current = dataTypes.shift();
8985
8986			if (current) {
8987
8988				// There's only work to do if current dataType is non-auto
8989				if (current === "*") {
8990
8991					current = prev;
8992
8993					// Convert response if prev dataType is non-auto and differs from current
8994				} else if (prev !== "*" && prev !== current) {
8995
8996					// Seek a direct converter
8997					conv = converters[prev + " " + current] || converters["* " + current];
8998
8999					// If none found, seek a pair
9000					if (!conv) {
9001						for (conv2 in converters) {
9002
9003							// If conv2 outputs current
9004							tmp = conv2.split(" ");
9005							if (tmp[1] === current) {
9006
9007								// If prev can be converted to accepted input
9008								conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
9009								if (conv) {
9010
9011									// Condense equivalence converters
9012									if (conv === true) {
9013										conv = converters[conv2];
9014
9015										// Otherwise, insert the intermediate dataType
9016									} else if (converters[conv2] !== true) {
9017										current = tmp[0];
9018										dataTypes.unshift(tmp[1]);
9019									}
9020									break;
9021								}
9022							}
9023						}
9024					}
9025
9026					// Apply converter (if not an equivalence)
9027					if (conv !== true) {
9028
9029						// Unless errors are allowed to bubble, catch and return them
9030						if (conv && s["throws"]) {
9031							// jscs:ignore requireDotNotation
9032							response = conv(response);
9033						} else {
9034							try {
9035								response = conv(response);
9036							} catch (e) {
9037								return {
9038									state: "parsererror",
9039									error: conv ? e : "No conversion from " + prev + " to " + current
9040								};
9041							}
9042						}
9043					}
9044				}
9045			}
9046		}
9047
9048		return { state: "success", data: response };
9049	}
9050
9051	jQuery.extend({
9052
9053		// Counter for holding the number of active queries
9054		active: 0,
9055
9056		// Last-Modified header cache for next request
9057		lastModified: {},
9058		etag: {},
9059
9060		ajaxSettings: {
9061			url: ajaxLocation,
9062			type: "GET",
9063			isLocal: rlocalProtocol.test(ajaxLocParts[1]),
9064			global: true,
9065			processData: true,
9066			async: true,
9067			contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9068			/*
9069   timeout: 0,
9070   data: null,
9071   dataType: null,
9072   username: null,
9073   password: null,
9074   cache: null,
9075   throws: false,
9076   traditional: false,
9077   headers: {},
9078   */
9079
9080			accepts: {
9081				"*": allTypes,
9082				text: "text/plain",
9083				html: "text/html",
9084				xml: "application/xml, text/xml",
9085				json: "application/json, text/javascript"
9086			},
9087
9088			contents: {
9089				xml: /\bxml\b/,
9090				html: /\bhtml/,
9091				json: /\bjson\b/
9092			},
9093
9094			responseFields: {
9095				xml: "responseXML",
9096				text: "responseText",
9097				json: "responseJSON"
9098			},
9099
9100			// Data converters
9101			// Keys separate source (or catchall "*") and destination types with a single space
9102			converters: {
9103
9104				// Convert anything to text
9105				"* text": String,
9106
9107				// Text to html (true = no transformation)
9108				"text html": true,
9109
9110				// Evaluate text as a json expression
9111				"text json": jQuery.parseJSON,
9112
9113				// Parse text as xml
9114				"text xml": jQuery.parseXML
9115			},
9116
9117			// For options that shouldn't be deep extended:
9118			// you can add your own custom options here if
9119			// and when you create one that shouldn't be
9120			// deep extended (see ajaxExtend)
9121			flatOptions: {
9122				url: true,
9123				context: true
9124			}
9125		},
9126
9127		// Creates a full fledged settings object into target
9128		// with both ajaxSettings and settings fields.
9129		// If target is omitted, writes into ajaxSettings.
9130		ajaxSetup: function (target, settings) {
9131			return settings ?
9132
9133			// Building a settings object
9134			ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :
9135
9136			// Extending ajaxSettings
9137			ajaxExtend(jQuery.ajaxSettings, target);
9138		},
9139
9140		ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
9141		ajaxTransport: addToPrefiltersOrTransports(transports),
9142
9143		// Main method
9144		ajax: function (url, options) {
9145
9146			// If url is an object, simulate pre-1.5 signature
9147			if (typeof url === "object") {
9148				options = url;
9149				url = undefined;
9150			}
9151
9152			// Force options to be an object
9153			options = options || {};
9154
9155			var
9156
9157			// Cross-domain detection vars
9158			parts,
9159
9160
9161			// Loop variable
9162			i,
9163
9164
9165			// URL without anti-cache param
9166			cacheURL,
9167
9168
9169			// Response headers as string
9170			responseHeadersString,
9171
9172
9173			// timeout handle
9174			timeoutTimer,
9175
9176
9177			// To know if global events are to be dispatched
9178			fireGlobals,
9179			    transport,
9180
9181
9182			// Response headers
9183			responseHeaders,
9184
9185
9186			// Create the final options object
9187			s = jQuery.ajaxSetup({}, options),
9188
9189
9190			// Callbacks context
9191			callbackContext = s.context || s,
9192
9193
9194			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9195			globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,
9196
9197
9198			// Deferreds
9199			deferred = jQuery.Deferred(),
9200			    completeDeferred = jQuery.Callbacks("once memory"),
9201
9202
9203			// Status-dependent callbacks
9204			statusCode = s.statusCode || {},
9205
9206
9207			// Headers (they are sent all at once)
9208			requestHeaders = {},
9209			    requestHeadersNames = {},
9210
9211
9212			// The jqXHR state
9213			state = 0,
9214
9215
9216			// Default abort message
9217			strAbort = "canceled",
9218
9219
9220			// Fake xhr
9221			jqXHR = {
9222				readyState: 0,
9223
9224				// Builds headers hashtable if needed
9225				getResponseHeader: function (key) {
9226					var match;
9227					if (state === 2) {
9228						if (!responseHeaders) {
9229							responseHeaders = {};
9230							while (match = rheaders.exec(responseHeadersString)) {
9231								responseHeaders[match[1].toLowerCase()] = match[2];
9232							}
9233						}
9234						match = responseHeaders[key.toLowerCase()];
9235					}
9236					return match == null ? null : match;
9237				},
9238
9239				// Raw string
9240				getAllResponseHeaders: function () {
9241					return state === 2 ? responseHeadersString : null;
9242				},
9243
9244				// Caches the header
9245				setRequestHeader: function (name, value) {
9246					var lname = name.toLowerCase();
9247					if (!state) {
9248						name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;
9249						requestHeaders[name] = value;
9250					}
9251					return this;
9252				},
9253
9254				// Overrides response content-type header
9255				overrideMimeType: function (type) {
9256					if (!state) {
9257						s.mimeType = type;
9258					}
9259					return this;
9260				},
9261
9262				// Status-dependent callbacks
9263				statusCode: function (map) {
9264					var code;
9265					if (map) {
9266						if (state < 2) {
9267							for (code in map) {
9268
9269								// Lazy-add the new callback in a way that preserves old ones
9270								statusCode[code] = [statusCode[code], map[code]];
9271							}
9272						} else {
9273
9274							// Execute the appropriate callbacks
9275							jqXHR.always(map[jqXHR.status]);
9276						}
9277					}
9278					return this;
9279				},
9280
9281				// Cancel the request
9282				abort: function (statusText) {
9283					var finalText = statusText || strAbort;
9284					if (transport) {
9285						transport.abort(finalText);
9286					}
9287					done(0, finalText);
9288					return this;
9289				}
9290			};
9291
9292			// Attach deferreds
9293			deferred.promise(jqXHR).complete = completeDeferred.add;
9294			jqXHR.success = jqXHR.done;
9295			jqXHR.error = jqXHR.fail;
9296
9297			// Remove hash character (#7531: and string promotion)
9298			// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
9299			// Handle falsy url in the settings object (#10093: consistency with old signature)
9300			// We also use the url parameter if available
9301			s.url = ((url || s.url || ajaxLocation) + "").replace(rhash, "").replace(rprotocol, ajaxLocParts[1] + "//");
9302
9303			// Alias method option to type as per ticket #12004
9304			s.type = options.method || options.type || s.method || s.type;
9305
9306			// Extract dataTypes list
9307			s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(rnotwhite) || [""];
9308
9309			// A cross-domain request is in order when we have a protocol:host:port mismatch
9310			if (s.crossDomain == null) {
9311				parts = rurl.exec(s.url.toLowerCase());
9312				s.crossDomain = !!(parts && (parts[1] !== ajaxLocParts[1] || parts[2] !== ajaxLocParts[2] || (parts[3] || (parts[1] === "http:" ? "80" : "443")) !== (ajaxLocParts[3] || (ajaxLocParts[1] === "http:" ? "80" : "443")))
vendor: 9,321 bytes, lines 9312-9683
9312);
9313			}
9314
9315			// Convert data if not already a string
9316			if (s.data && s.processData && typeof s.data !== "string") {
9317				s.data = jQuery.param(s.data, s.traditional);
9318			}
9319
9320			// Apply prefilters
9321			inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
9322
9323			// If request was aborted inside a prefilter, stop there
9324			if (state === 2) {
9325				return jqXHR;
9326			}
9327
9328			// We can fire global events as of now if asked to
9329			// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9330			fireGlobals = jQuery.event && s.global;
9331
9332			// Watch for a new set of requests
9333			if (fireGlobals && jQuery.active++ === 0) {
9334				jQuery.event.trigger("ajaxStart");
9335			}
9336
9337			// Uppercase the type
9338			s.type = s.type.toUpperCase();
9339
9340			// Determine if request has content
9341			s.hasContent = !rnoContent.test(s.type);
9342
9343			// Save the URL in case we're toying with the If-Modified-Since
9344			// and/or If-None-Match header later on
9345			cacheURL = s.url;
9346
9347			// More options handling for requests with no content
9348			if (!s.hasContent) {
9349
9350				// If data is available, append data to url
9351				if (s.data) {
9352					cacheURL = s.url += (rquery.test(cacheURL) ? "&" : "?") + s.data;
9353
9354					// #9682: remove data so that it's not used in an eventual retry
9355					delete s.data;
9356				}
9357
9358				// Add anti-cache in url if needed
9359				if (s.cache === false) {
9360					s.url = rts.test(cacheURL) ?
9361
9362					// If there is already a '_' parameter, set its value
9363					cacheURL.replace(rts, "$1_=" + nonce++) :
9364
9365					// Otherwise add one to the end
9366					cacheURL + (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce++;
9367				}
9368			}
9369
9370			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9371			if (s.ifModified) {
9372				if (jQuery.lastModified[cacheURL]) {
9373					jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
9374				}
9375				if (jQuery.etag[cacheURL]) {
9376					jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
9377				}
9378			}
9379
9380			// Set the correct header, if data is being sent
9381			if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
9382				jqXHR.setRequestHeader("Content-Type", s.contentType);
9383			}
9384
9385			// Set the Accepts header for the server, depending on the dataType
9386			jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]);
9387
9388			// Check for headers option
9389			for (i in s.headers) {
9390				jqXHR.setRequestHeader(i, s.headers[i]);
9391			}
9392
9393			// Allow custom headers/mimetypes and early abort
9394			if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) {
9395
9396				// Abort if not done already and return
9397				return jqXHR.abort();
9398			}
9399
9400			// aborting is no longer a cancellation
9401			strAbort = "abort";
9402
9403			// Install callbacks on deferreds
9404			for (i in { success: 1, error: 1, complete: 1 }) {
9405				jqXHR[i](s[i]);
9406			}
9407
9408			// Get transport
9409			transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);
9410
9411			// If no transport, we auto-abort
9412			if (!transport) {
9413				done(-1, "No Transport");
9414			} else {
9415				jqXHR.readyState = 1;
9416
9417				// Send global event
9418				if (fireGlobals) {
9419					globalEventContext.trigger("ajaxSend", [jqXHR, s]);
9420				}
9421
9422				// If request was aborted inside ajaxSend, stop there
9423				if (state === 2) {
9424					return jqXHR;
9425				}
9426
9427				// Timeout
9428				if (s.async && s.timeout > 0) {
9429					timeoutTimer = window.setTimeout(function () {
9430						jqXHR.abort("timeout");
9431					}, s.timeout);
9432				}
9433
9434				try {
9435					state = 1;
9436					transport.send(requestHeaders, done);
9437				} catch (e) {
9438
9439					// Propagate exception as error if not done
9440					if (state < 2) {
9441						done(-1, e);
9442
9443						// Simply rethrow otherwise
9444					} else {
9445						throw e;
9446					}
9447				}
9448			}
9449
9450			// Callback for when everything is done
9451			function done(status, nativeStatusText, responses, headers) {
9452				var isSuccess,
9453				    success,
9454				    error,
9455				    response,
9456				    modified,
9457				    statusText = nativeStatusText;
9458
9459				// Called once
9460				if (state === 2) {
9461					return;
9462				}
9463
9464				// State is "done" now
9465				state = 2;
9466
9467				// Clear timeout if it exists
9468				if (timeoutTimer) {
9469					window.clearTimeout(timeoutTimer);
9470				}
9471
9472				// Dereference transport for early garbage collection
9473				// (no matter how long the jqXHR object will be used)
9474				transport = undefined;
9475
9476				// Cache response headers
9477				responseHeadersString = headers || "";
9478
9479				// Set readyState
9480				jqXHR.readyState = status > 0 ? 4 : 0;
9481
9482				// Determine if successful
9483				isSuccess = status >= 200 && status < 300 || status === 304;
9484
9485				// Get response data
9486				if (responses) {
9487					response = ajaxHandleResponses(s, jqXHR, responses);
9488				}
9489
9490				// Convert no matter what (that way responseXXX fields are always set)
9491				response = ajaxConvert(s, response, jqXHR, isSuccess);
9492
9493				// If successful, handle type chaining
9494				if (isSuccess) {
9495
9496					// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9497					if (s.ifModified) {
9498						modified = jqXHR.getResponseHeader("Last-Modified");
9499						if (modified) {
9500							jQuery.lastModified[cacheURL] = modified;
9501						}
9502						modified = jqXHR.getResponseHeader("etag");
9503						if (modified) {
9504							jQuery.etag[cacheURL] = modified;
9505						}
9506					}
9507
9508					// if no content
9509					if (status === 204 || s.type === "HEAD") {
9510						statusText = "nocontent";
9511
9512						// if not modified
9513					} else if (status === 304) {
9514						statusText = "notmodified";
9515
9516						// If we have data, let's convert it
9517					} else {
9518						statusText = response.state;
9519						success = response.data;
9520						error = response.error;
9521						isSuccess = !error;
9522					}
9523				} else {
9524
9525					// We extract error from statusText
9526					// then normalize statusText and status for non-aborts
9527					error = statusText;
9528					if (status || !statusText) {
9529						statusText = "error";
9530						if (status < 0) {
9531							status = 0;
9532						}
9533					}
9534				}
9535
9536				// Set data for the fake xhr object
9537				jqXHR.status = status;
9538				jqXHR.statusText = (nativeStatusText || statusText) + "";
9539
9540				// Success/Error
9541				if (isSuccess) {
9542					deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
9543				} else {
9544					deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
9545				}
9546
9547				// Status-dependent callbacks
9548				jqXHR.statusCode(statusCode);
9549				statusCode = undefined;
9550
9551				if (fireGlobals) {
9552					globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
9553				}
9554
9555				// Complete
9556				completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
9557
9558				if (fireGlobals) {
9559					globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
9560
9561					// Handle the global AJAX counter
9562					if (! --jQuery.active) {
9563						jQuery.event.trigger("ajaxStop");
9564					}
9565				}
9566			}
9567
9568			return jqXHR;
9569		},
9570
9571		getJSON: function (url, data, callback) {
9572			return jQuery.get(url, data, callback, "json");
9573		},
9574
9575		getScript: function (url, callback) {
9576			return jQuery.get(url, undefined, callback, "script");
9577		}
9578	});
9579
9580	jQuery.each(["get", "post"], function (i, method) {
9581		jQuery[method] = function (url, data, callback, type) {
9582
9583			// shift arguments if data argument was omitted
9584			if (jQuery.isFunction(data)) {
9585				type = type || callback;
9586				callback = data;
9587				data = undefined;
9588			}
9589
9590			// The url can be an options object (which then must have .url)
9591			return jQuery.ajax(jQuery.extend({
9592				url: url,
9593				type: method,
9594				dataType: type,
9595				data: data,
9596				success: callback
9597			}, jQuery.isPlainObject(url) && url));
9598		};
9599	});
9600
9601	jQuery._evalUrl = function (url) {
9602		return jQuery.ajax({
9603			url: url,
9604
9605			// Make this explicit, since user can override this through ajaxSetup (#11264)
9606			type: "GET",
9607			dataType: "script",
9608			cache: true,
9609			async: false,
9610			global: false,
9611			"throws": true
9612		});
9613	};
9614
9615	jQuery.fn.extend({
9616		wrapAll: function (html) {
9617			if (jQuery.isFunction(html)) {
9618				return this.each(function (i) {
9619					jQuery(this).wrapAll(html.call(this, i));
9620				});
9621			}
9622
9623			if (this[0]) {
9624
9625				// The elements to wrap the target around
9626				var wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
9627
9628				if (this[0].parentNode) {
9629					wrap.insertBefore(this[0]);
9630				}
9631
9632				wrap.map(function () {
9633					var elem = this;
9634
9635					while (elem.firstChild && elem.firstChild.nodeType === 1) {
9636						elem = elem.firstChild;
9637					}
9638
9639					return elem;
9640				}).append(this);
9641			}
9642
9643			return this;
9644		},
9645
9646		wrapInner: function (html) {
9647			if (jQuery.isFunction(html)) {
9648				return this.each(function (i) {
9649					jQuery(this).wrapInner(html.call(this, i));
9650				});
9651			}
9652
9653			return this.each(function () {
9654				var self = jQuery(this),
9655				    contents = self.contents();
9656
9657				if (contents.length) {
9658					contents.wrapAll(html);
9659				} else {
9660					self.append(html);
9661				}
9662			});
9663		},
9664
9665		wrap: function (html) {
9666			var isFunction = jQuery.isFunction(html);
9667
9668			return this.each(function (i) {
9669				jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
9670			});
9671		},
9672
9673		unwrap: function () {
9674			return this.parent().each(function () {
9675				if (!jQuery.nodeName(this, "body")) {
9676					jQuery(this).replaceWith(this.childNodes);
9677				}
9678			}).end();
9679		}
9680	});
9681
9682	function getDisplay(elem) {
9683		return elem.style && elem.style.display || jQuery.css(elem, "dis
9683play");
9684	}
9685
9686	function filterHidden(elem) {
9687
9688		// Disconnected elements are considered hidden
9689		if (!jQuery.contains(elem.ownerDocument || document, elem)) {
9690			return true;
9691		}
9692		while (elem && elem.nodeType === 1) {
9693			if (getDisplay(elem) === "none" || elem.type === "hidden") {
9694				return true;
9695			}
9696			elem = elem.parentNode;
9697		}
9698		return false;
9699	}
9700
9701	jQuery.expr.filters.hidden = function (elem) {
9702
9703		// Support: Opera <= 12.12
9704		// Opera reports offsetWidths and offsetHeights less than zero on some elements
9705		return support.reliableHiddenOffsets() ? elem.offsetWidth <= 0 && elem.offsetHeight <= 0 && !elem.getClientRects().length : filterHidden(elem);
9706	};
9707
9708	jQuery.expr.filters.visible = function (elem) {
9709		return !jQuery.expr.filters.hidden(elem);
9710	};
9711
9712	var r20 = /%20/g,
9713	    rbracket = /\[\]$/,
9714	    rCRLF = /\r?\n/g,
9715	    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
9716	    rsubmittable = /^(?:input|select|textarea|keygen)/i;
9717
9718	function buildParams(prefix, obj, traditional, add) {
9719		var name;
9720
9721		if (jQuery.isArray(obj)) {
9722
9723			// Serialize array item.
9724			jQuery.each(obj, function (i, v) {
9725				if (traditional || rbracket.test(prefix)) {
9726
9727					// Treat each array item as a scalar.
9728					add(prefix, v);
9729				} else {
9730
9731					// Item is non-scalar (array or object), encode its numeric index.
9732					buildParams(prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", v, traditional, add);
9733				}
9734			});
9735		} else if (!traditional && jQuery.type(obj) === "object") {
9736
9737			// Serialize object item.
9738			for (name in obj) {
9739				buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
9740			}
9741		} else {
9742
9743			// Serialize scalar item.
9744			add(prefix, obj);
9745		}
9746	}
9747
9748	// Serialize an array of form elements or a set of
9749	// key/values into a query string
9750	jQuery.param = function (a, traditional) {
9751		var prefix,
9752		    s = [],
9753		    add = function (key, value) {
9754
9755			// If value is a function, invoke it and return its value
9756			value = jQuery.isFunction(value) ? value() : value == null ? "" : value;
9757			s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
9758		};
9759
9760		// Set traditional to true for jQuery <= 1.3.2 behavior.
9761		if (traditional === undefined) {
9762			traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
9763		}
9764
9765		// If an array was passed in, assume that it is an array of form elements.
9766		if (jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
9767
9768			// Serialize the form elements
9769			jQuery.each(a, function () {
9770				add(this.name, this.value);
9771			});
9772		} else {
9773
9774			// If traditional, encode the "old" way (the way 1.3.2 or older
9775			// did it), otherwise encode params recursively.
9776			for (prefix in a) {
9777				buildParams(prefix, a[prefix], traditional, add);
9778			}
9779		}
9780
9781		// Return the resulting serialization
9782		return s.join("&").replace(r20, "+");
9783	};
9784
9785	jQuery.fn.extend({
9786		serialize: function () {
9787			return jQuery.param(this.serializeArray());
9788		},
9789		serializeArray: function () {
9790			return this.map(function () {
9791
9792				// Can add propHook for "elements" to filter or add form elements
9793				var elements = jQuery.prop(this, "elements");
9794				return elements ? jQuery.makeArray(elements) : this;
9795			}).filter(function () {
9796				var type = this.type;
9797
9798				// Use .is(":disabled") so that fieldset[disabled] works
9799				return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
9800			}).map(function (i, elem) {
9801				var val = jQuery(this).val();
9802
9803				return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val) {
9804					return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
9805				}) : { name: elem.name, value: val.replace(rCRLF, "\r\n") };
9806			}).get();
9807		}
9808	});
9809
9810	// Create the request object
9811	// (This is still attached to ajaxSettings for backward compatibility)
9812	jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
9813
9814	// Support: IE6-IE8
9815	function () {
9816
9817		// XHR cannot access local files, always use ActiveX for that case
9818		if (this.isLocal) {
9819			return createActiveXHR();
9820		}
9821
9822		// Support: IE 9-11
9823		// IE seems to error on cross-domain PATCH requests when ActiveX XHR
9824		// is used. In IE 9+ always use the native XHR.
9825		// Note: this condition won't catch Edge as it doesn't define
9826		// document.documentMode but it also doesn't support ActiveX so it won't
9827		// reach this code.
9828		if (document.documentMode > 8) {
9829			return createStandardXHR();
9830		}
9831
9832		// Support: IE<9
9833		// oldIE XHR does not support non-RFC2616 methods (#13240)
9834		// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
9835		// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
9836		// Although this check for six methods instead of eight
9837		// since IE also does not support "trace" and "connect"
9838		return (/^(get|post|head|put|delete|options)$/i.test(this.type) && createStandardXHR() || createActiveXHR()
9839		);
9840	} :
9841
9842	// For all other browsers, use the standard XMLHttpRequest object
9843	createStandardXHR;
9844
9845	var xhrId = 0,
9846	    xhrCallbacks = {},
9847	    xhrSupported = jQuery.ajaxSettings.xhr();
9848
9849	// Support: IE<10
9850	// Open requests must be manually aborted on unload (#5280)
9851	// See https://support.microsoft.com/kb/2856746 for more info
9852	if (window.attachEvent) {
9853		window.attachEvent("onunload", function () {
9854			for (var key in xhrCallbacks) {
9855				xhrCallbacks[key](undefined, true);
9856			}
9857		});
9858	}
9859
9860	// Determine support properties
9861	support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
9862	xhrSupported = support.ajax = !!xhrSupported;
9863
9864	// Create transport if the browser can provide an xhr
9865	if (xhrSupported) {
9866
9867		jQuery.ajaxTransport(function (options) {
9868
9869			// Cross domain only allowed if supported through XMLHttpRequest
9870			if (!options.crossDomain || support.cors) {
9871
9872				var callback;
9873
9874				return {
9875					send: function (headers, complete) {
9876						var i,
9877						    xhr = options.xhr(),
9878						    id = ++xhrId;
9879
9880						// Open the socket
9881						xhr.open(options.type, options.url, options.async, options.username, options.password);
9882
9883						// Apply custom fields if provided
9884						if (options.xhrFields) {
9885							for (i in options.xhrFields) {
9886								xhr[i] = options.xhrFields[i];
9887							}
9888						}
9889
9890						// Override mime type if needed
9891						if (options.mimeType && xhr.overrideMimeType) {
9892							xhr.overrideMimeType(options.mimeType);
9893						}
9894
9895						// X-Requested-With header
9896						// For cross-domain requests, seeing as conditions for a preflight are
9897						// akin to a jigsaw puzzle, we simply never set it to be sure.
9898						// (it can always be set on a per-request basis or even using ajaxSetup)
vendor: 8,552 bytes, lines 9899-10208
9899						// For same-domain requests, won't change header if already provided.
9900						if (!options.crossDomain && !headers["X-Requested-With"]) {
9901							headers["X-Requested-With"] = "XMLHttpRequest";
9902						}
9903
9904						// Set headers
9905						for (i in headers) {
9906
9907							// Support: IE<9
9908							// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
9909							// request header to a null-value.
9910							//
9911							// To keep consistent with other XHR implementations, cast the value
9912							// to string and ignore `undefined`.
9913							if (headers[i] !== undefined) {
9914								xhr.setRequestHeader(i, headers[i] + "");
9915							}
9916						}
9917
9918						// Do send the request
9919						// This may raise an exception which is actually
9920						// handled in jQuery.ajax (so no try/catch here)
9921						xhr.send(options.hasContent && options.data || null);
9922
9923						// Listener
9924						callback = function (_, isAbort) {
9925							var status, statusText, responses;
9926
9927							// Was never called and is aborted or complete
9928							if (callback && (isAbort || xhr.readyState === 4)) {
9929
9930								// Clean up
9931								delete xhrCallbacks[id];
9932								callback = undefined;
9933								xhr.onreadystatechange = jQuery.noop;
9934
9935								// Abort manually if needed
9936								if (isAbort) {
9937									if (xhr.readyState !== 4) {
9938										xhr.abort();
9939									}
9940								} else {
9941									responses = {};
9942									status = xhr.status;
9943
9944									// Support: IE<10
9945									// Accessing binary-data responseText throws an exception
9946									// (#11426)
9947									if (typeof xhr.responseText === "string") {
9948										responses.text = xhr.responseText;
9949									}
9950
9951									// Firefox throws an exception when accessing
9952									// statusText for faulty cross-domain requests
9953									try {
9954										statusText = xhr.statusText;
9955									} catch (e) {
9956
9957										// We normalize with Webkit giving an empty statusText
9958										statusText = "";
9959									}
9960
9961									// Filter status for non standard behaviors
9962
9963									// If the request is local and we have data: assume a success
9964									// (success with no data won't get notified, that's the best we
9965									// can do given current implementations)
9966									if (!status && options.isLocal && !options.crossDomain) {
9967										status = responses.text ? 200 : 404;
9968
9969										// IE - #1450: sometimes returns 1223 when it should be 204
9970									} else if (status === 1223) {
9971										status = 204;
9972									}
9973								}
9974							}
9975
9976							// Call complete if needed
9977							if (responses) {
9978								complete(status, statusText, responses, xhr.getAllResponseHeaders());
9979							}
9980						};
9981
9982						// Do send the request
9983						// `xhr.send` may raise an exception, but it will be
9984						// handled in jQuery.ajax (so no try/catch here)
9985						if (!options.async) {
9986
9987							// If we're in sync mode we fire the callback
9988							callback();
9989						} else if (xhr.readyState === 4) {
9990
9991							// (IE6 & IE7) if it's in cache and has been
9992							// retrieved directly we need to fire the callback
9993							window.setTimeout(callback);
9994						} else {
9995
9996							// Register the callback, but delay it in case `xhr.send` throws
9997							// Add to the list of active xhr callbacks
9998							xhr.onreadystatechange = xhrCallbacks[id] = callback;
9999						}
10000					},
10001
10002					abort: function () {
10003						if (callback) {
10004							callback(undefined, true);
10005						}
10006					}
10007				};
10008			}
10009		});
10010	}
10011
10012	// Functions to create xhrs
10013	function createStandardXHR() {
10014		try {
10015			return new window.XMLHttpRequest();
10016		} catch (e) {}
10017	}
10018
10019	function createActiveXHR() {
10020		try {
10021			return new window.ActiveXObject("Microsoft.XMLHTTP");
10022		} catch (e) {}
10023	}
10024
10025	// Install script dataType
10026	jQuery.ajaxSetup({
10027		accepts: {
10028			script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript"
10029		},
10030		contents: {
10031			script: /\b(?:java|ecma)script\b/
10032		},
10033		converters: {
10034			"text script": function (text) {
10035				jQuery.globalEval(text);
10036				return text;
10037			}
10038		}
10039	});
10040
10041	// Handle cache's special case and global
10042	jQuery.ajaxPrefilter("script", function (s) {
10043		if (s.cache === undefined) {
10044			s.cache = false;
10045		}
10046		if (s.crossDomain) {
10047			s.type = "GET";
10048			s.global = false;
10049		}
10050	});
10051
10052	// Bind script tag hack transport
10053	jQuery.ajaxTransport("script", function (s) {
10054
10055		// This transport only deals with cross domain requests
10056		if (s.crossDomain) {
10057
10058			var script,
10059			    head = document.head || jQuery("head")[0] || document.documentElement;
10060
10061			return {
10062
10063				send: function (_, callback) {
10064
10065					script = document.createElement("script");
10066
10067					script.async = true;
10068
10069					if (s.scriptCharset) {
10070						script.charset = s.scriptCharset;
10071					}
10072
10073					script.src = s.url;
10074
10075					// Attach handlers for all browsers
10076					script.onload = script.onreadystatechange = function (_, isAbort) {
10077
10078						if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
10079
10080							// Handle memory leak in IE
10081							script.onload = script.onreadystatechange = null;
10082
10083							// Remove the script
10084							if (script.parentNode) {
10085								script.parentNode.removeChild(script);
10086							}
10087
10088							// Dereference the script
10089							script = null;
10090
10091							// Callback if not abort
10092							if (!isAbort) {
10093								callback(200, "success");
10094							}
10095						}
10096					};
10097
10098					// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
10099					// Use native DOM manipulation to avoid our domManip AJAX trickery
10100					head.insertBefore(script, head.firstChild);
10101				},
10102
10103				abort: function () {
10104					if (script) {
10105						script.onload(undefined, true);
10106					}
10107				}
10108			};
10109		}
10110	});
10111
10112	var oldCallbacks = [],
10113	    rjsonp = /(=)\?(?=&|$)|\?\?/;
10114
10115	// Default jsonp settings
10116	jQuery.ajaxSetup({
10117		jsonp: "callback",
10118		jsonpCallback: function () {
10119			var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++;
10120			this[callback] = true;
10121			return callback;
10122		}
10123	});
10124
10125	// Detect, normalize options and install callbacks for jsonp requests
10126	jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {
10127
10128		var callbackName,
10129		    overwritten,
10130		    responseContainer,
10131		    jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");
10132
10133		// Handle iff the expected data type is "jsonp" or we have a parameter to set
10134		if (jsonProp || s.dataTypes[0] === "jsonp") {
10135
10136			// Get callback name, remembering preexisting value associated with it
10137			callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;
10138
10139			// Insert callback into url or form data
10140			if (jsonProp) {
10141				s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
10142			} else if (s.jsonp !== false) {
10143				s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
10144			}
10145
10146			// Use data converter to retrieve json after script execution
10147			s.converters["script json"] = function () {
10148				if (!responseContainer) {
10149					jQuery.error(callbackName + " was not called");
10150				}
10151				return responseContainer[0];
10152			};
10153
10154			// force json dataType
10155			s.dataTypes[0] = "json";
10156
10157			// Install callback
10158			overwritten = window[callbackName];
10159			window[callbackName] = function () {
10160				responseContainer = arguments;
10161			};
10162
10163			// Clean-up function (fires after converters)
10164			jqXHR.always(function () {
10165
10166				// If previous value didn't exist - remove it
10167				if (overwritten === undefined) {
10168					jQuery(window).removeProp(callbackName);
10169
10170					// Otherwise restore preexisting value
10171				} else {
10172					window[callbackName] = overwritten;
10173				}
10174
10175				// Save back as free
10176				if (s[callbackName]) {
10177
10178					// make sure that re-using the options doesn't screw things around
10179					s.jsonpCallback = originalSettings.jsonpCallback;
10180
10181					// save the callback name for future use
10182					oldCallbacks.push(callbackName);
10183				}
10184
10185				// Call if it was a function and we have a response
10186				if (responseContainer && jQuery.isFunction(overwritten)) {
10187					overwritten(responseContainer[0]);
10188				}
10189
10190				responseContainer = overwritten = undefined;
10191			});
10192
10193			// Delegate to script
10194			return "script";
10195		}
10196	});
10197
10198	// data: string of html
10199	// context (optional): If specified, the fragment will be created in this context,
10200	// defaults to document
10201	// keepScripts (optional): If true, will include scripts passed in the html string
10202	jQuery.parseHTML = function (data, context, keepScripts) {
10203		if (!data || typeof data !== "string") {
10204			return null;
10205		}
10206		if (typeof context === "boolean") {
10207			keepScripts = context;
10208			context = false;
10209		}
10210		context = context || document;
10211
10212		var parsed = rsingleTag.exec(data),
10213		    scripts = !keepScripts && [];
10214
10215		// Single tag
10216		if (parsed) {
10217			return [context.createElement(parsed[1])];
10218		}
10219
10220		parsed = buildFragment([data], context, scripts);
10221
10222		if (scripts && scripts.length) {
10223			jQuery(scripts).remove();
10224		}
10225
10226		return jQuery.merge([], parsed.childNodes);
10227	};
10228
10229	// Keep a copy of the old load method
10230	var _load = jQuery.fn.load;
10231
10232	/**
10233  * Load a url into a page
10234  */
10235	jQuery.fn.load = function (url, params, callback) {
10236		if (typeof url !== "string" && _load) {
10237			return _load.apply(this, arguments);
10238		}
10239
10240		var selector,
10241		    type,
10242		    response,
10243		    self = this,
10244		    off = url.indexOf(" ");
10245
10246		if (off > -1) {
10247			selector = jQuery.trim(url.slice(off, url.length));
10248			url = url.slice(0, off);
10249		}
10250
10251		// If it's a function
10252		if (jQuery.isFunction(params)) {
10253
10254			// We assume that it's the callback
10255			callback = params;
10256			params = undefined;
10257
10258			// Otherwise, build a param string
10259		} else if (params && typeof params === "object") {
10260			type = "POST";
10261		}
10262
10263		// If we have elements to modify, make the request
10264		if (self.length > 0) {
10265			jQuery.ajax({
10266				url: url,
10267
10268				// If "type" variable is undefined, then "GET" method will be used.
10269				// Make value of this field explicit since
10270				// user can override it through ajaxSetup method
10271				type: type || "GET",
10272				dataType: "html",
10273				data: params
10274			}).done(function (responseText) {
10275
10276				// Save response for use in complete callback
10277				response = arguments;
10278
10279				self.html(selector ?
10280
10281				// If a selector was specified, locate the right elements in a dummy div
10282				// Exclude scripts to avoid IE 'Permission Denied' errors
10283				jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :
10284
10285				// Otherwise use the full result
10286				responseText);
10287
10288				// If the request succeeds, this function gets "data", "status", "jqXHR"
10289				// but they are ignored because response was set above.
10290				// If it fails, this function gets "jqXHR", "status", "error"
10291			}).always(callback && function (jqXHR, status) {
10292				self.each(function () {
10293					callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
10294				});
10295			});
10296		}
10297
10298		return this;
10299	};
10300
10301	// Attach a bunch of functions for handling common AJAX events
10302	jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (i, type) {
10303		jQuery.fn[type] = function (fn) {
10304			return this.on(type, fn);
10305		};
10306	});
10307
10308	jQuery.expr.filters.animated = function (elem) {
10309		return jQuery.grep(jQuery.timers, function (fn) {
10310			return elem === fn.elem;
10311		}).length;
10312	};
10313
10314	/**
10315  * Gets a window from an element
10316  */
10317	function getWindow(elem) {
10318		return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false;
10319	}
10320
10321	jQuery.offset = {
10322		setOffset: function (elem, options, i) {
10323			var curPosition,
10324			    curLeft,
10325			    curCSSTop,
10326			    curTop,
10327			    curOffset,
10328			    curCSSLeft,
10329			    calculatePosition,
10330			    position = jQuery.css(elem, "position"),
10331			    curElem = jQuery(elem),
10332			    props = {};
10333
10334			// set position first, in-case top/left are set even on static elem
10335			if (position === "static") {
10336				elem.style.position = "relative";
10337			}
10338
10339			curOffset = curElem.offset();
10340			curCSSTop = jQuery.css(elem, "top");
10341			curCSSLeft = jQuery.css(elem, "left");
10342			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1;
10343
10344			// need to be able to calculate position if either top or left
10345			// is auto and position is either absolute or fixed
10346			if (calculatePosition) {
10347				curPosition = curElem.position();
10348				curTop = curPosition.top;
10349				curLeft = curPosition.left;
10350			} else {
10351				curTop = parseFloat(curCSSTop) || 0;
10352				curLeft = parseFloat(curCSSLeft) || 0;
10353			}
10354
10355			if (jQuery.isFunction(options)) {
10356
10357				// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10358				options = options.call(elem, i, jQuery.extend({}, curOffset));
10359			}
10360
10361			if (options.top != null) {
10362				props.top = options.top - curOffset.top + curTop;
10363			}
10364			if (options.left != null) {
10365				props.left = options.left - curOffset.left + curLeft;
10366			}
10367
10368			if ("using" in options) {
10369				options.using.call(elem, props);
10370			} else {
10371				curElem.css(props);
10372			}
10373		}
10374	};
10375
10376	jQuery.fn.extend({
10377		offset: function (options) {
10378			if (arguments.length) {
vendor: 7,956 bytes, lines 10379-10625
10379				return options === undefined ? this : this.each(function (i) {
10380					jQuery.offset.setOffset(this, options, i);
10381				});
10382			}
10383
10384			var docElem,
10385			    win,
10386			    box = { top: 0, left: 0 },
10387			    elem = this[0],
10388			    doc = elem && elem.ownerDocument;
10389
10390			if (!doc) {
10391				return;
10392			}
10393
10394			docElem = doc.documentElement;
10395
10396			// Make sure it's not a disconnected DOM node
10397			if (!jQuery.contains(docElem, elem)) {
10398				return box;
10399			}
10400
10401			// If we don't have gBCR, just use 0,0 rather than error
10402			// BlackBerry 5, iOS 3 (original iPhone)
10403			if (typeof elem.getBoundingClientRect !== "undefined") {
10404				box = elem.getBoundingClientRect();
10405			}
10406			win = getWindow(doc);
10407			return {
10408				top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0),
10409				left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)
10410			};
10411		},
10412
10413		position: function () {
10414			if (!this[0]) {
10415				return;
10416			}
10417
10418			var offsetParent,
10419			    offset,
10420			    parentOffset = { top: 0, left: 0 },
10421			    elem = this[0];
10422
10423			// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10424			// because it is its only offset parent
10425			if (jQuery.css(elem, "position") === "fixed") {
10426
10427				// we assume that getBoundingClientRect is available when computed position is fixed
10428				offset = elem.getBoundingClientRect();
10429			} else {
10430
10431				// Get *real* offsetParent
10432				offsetParent = this.offsetParent();
10433
10434				// Get correct offsets
10435				offset = this.offset();
10436				if (!jQuery.nodeName(offsetParent[0], "html")) {
10437					parentOffset = offsetParent.offset();
10438				}
10439
10440				// Add offsetParent borders
10441				parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", true);
10442				parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", true);
10443			}
10444
10445			// Subtract parent offsets and element margins
10446			// note: when an element has margin: auto the offsetLeft and marginLeft
10447			// are the same in Safari causing offset.left to incorrectly be 0
10448			return {
10449				top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
10450				left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
10451			};
10452		},
10453
10454		offsetParent: function () {
10455			return this.map(function () {
10456				var offsetParent = this.offsetParent;
10457
10458				while (offsetParent && !jQuery.nodeName(offsetParent, "html") && jQuery.css(offsetParent, "position") === "static") {
10459					offsetParent = offsetParent.offsetParent;
10460				}
10461				return offsetParent || documentElement;
10462			});
10463		}
10464	});
10465
10466	// Create scrollLeft and scrollTop methods
10467	jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (method, prop) {
10468		var top = /Y/.test(prop);
10469
10470		jQuery.fn[method] = function (val) {
10471			return access(this, function (elem, method, val) {
10472				var win = getWindow(elem);
10473
10474				if (val === undefined) {
10475					return win ? prop in win ? win[prop] : win.document.documentElement[method] : elem[method];
10476				}
10477
10478				if (win) {
10479					win.scrollTo(!top ? val : jQuery(win).scrollLeft(), top ? val : jQuery(win).scrollTop());
10480				} else {
10481					elem[method] = val;
10482				}
10483			}, method, val, arguments.length, null);
10484		};
10485	});
10486
10487	// Support: Safari<7-8+, Chrome<37-44+
10488	// Add the top/left cssHooks using jQuery.fn.position
10489	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10490	// getComputedStyle returns percent when specified for top/left/bottom/right
10491	// rather than make the css module depend on the offset module, we just check for it here
10492	jQuery.each(["top", "left"], function (i, prop) {
10493		jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {
10494			if (computed) {
10495				computed = curCSS(elem, prop);
10496
10497				// if curCSS returns percentage, fallback to offset
10498				return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
10499			}
10500		});
10501	});
10502
10503	// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10504	jQuery.each({ Height: "height", Width: "width" }, function (name, type) {
10505		jQuery.each({ padding: "inner" + name, content: type, "": "outer" + name }, function (defaultExtra, funcName) {
10506
10507			// margin is only for outerHeight, outerWidth
10508			jQuery.fn[funcName] = function (margin, value) {
10509				var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
10510				    extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
10511
10512				return access(this, function (elem, type, value) {
10513					var doc;
10514
10515					if (jQuery.isWindow(elem)) {
10516
10517						// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
10518						// isn't a whole lot we can do. See pull request at this URL for discussion:
10519						// https://github.com/jquery/jquery/pull/764
10520						return elem.document.documentElement["client" + name];
10521					}
10522
10523					// Get document width or height
10524					if (elem.nodeType === 9) {
10525						doc = elem.documentElement;
10526
10527						// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10528						// whichever is greatest
10529						// unfortunately, this causes bug #3838 in IE6/8 only,
10530						// but there is currently no good, small way to fix it.
10531						return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
10532					}
10533
10534					return value === undefined ?
10535
10536					// Get width or height on the element, requesting but not forcing parseFloat
10537					jQuery.css(elem, type, extra) :
10538
10539					// Set width or height on the element
10540					jQuery.style(elem, type, value, extra);
10541				}, type, chainable ? margin : undefined, chainable, null);
10542			};
10543		});
10544	});
10545
10546	jQuery.fn.extend({
10547
10548		bind: function (types, data, fn) {
10549			return this.on(types, null, data, fn);
10550		},
10551		unbind: function (types, fn) {
10552			return this.off(types, null, fn);
10553		},
10554
10555		delegate: function (selector, types, data, fn) {
10556			return this.on(types, selector, data, fn);
10557		},
10558		undelegate: function (selector, types, fn) {
10559
10560			// ( namespace ) or ( selector, types [, fn] )
10561			return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
10562		}
10563	});
10564
10565	// The number of elements contained in the matched element set
10566	jQuery.fn.size = function () {
10567		return this.length;
10568	};
10569
10570	jQuery.fn.andSelf = jQuery.fn.addBack;
10571
10572	// Register as a named AMD module, since jQuery can be concatenated with other
10573	// files that may use define, but not via a proper concatenation script that
10574	// understands anonymous AMD modules. A named AMD is safest and most robust
10575	// way to register. Lowercase jquery is used because AMD module names are
10576	// derived from file names, and jQuery is normally delivered in a lowercase
10577	// file name. Do this after creating the global so that if an AMD module wants
10578	// to call noConflict to hide this version of jQuery, it will work.
10579
10580	// Note that for maximum portability, libraries that are not jQuery should
10581	// declare themselves as anonymous modules, and avoid setting a global if an
10582	// AMD loader is present. jQuery is a special case. For more information, see
10583	// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10584
10585	if (true) {
10586		!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
10587			return jQuery;
10588		}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
10589				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
10590	}
10591
10592	var
10593
10594	// Map over jQuery in case of overwrite
10595	_jQuery = window.jQuery,
10596
10597
10598	// Map over the $ in case of overwrite
10599	_$ = window.$;
10600
10601	jQuery.noConflict = function (deep) {
10602		if (window.$ === jQuery) {
10603			window.$ = _$;
10604		}
10605
10606		if (deep && window.jQuery === jQuery) {
10607			window.jQuery = _jQuery;
10608		}
10609
10610		return jQuery;
10611	};
10612
10613	// Expose jQuery and $ identifiers, even in
10614	// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10615	// and CommonJS for browser emulators (#13566)
10616	if (!noGlobal) {
10617		window.jQuery = window.$ = jQuery;
10618	}
10619
10620	return jQuery;
10621});
10622
10623/***/ }),
10624
10625/***/ 11:
vendor: 3,374 bytes, lines 10626-10728
10626/***/ (function(module, exports) {
10627
10628
10629/**
10630 * When source maps are enabled, `style-loader` uses a link element with a data-uri to
10631 * embed the css on the page. This breaks all relative urls because now they are relative to a
10632 * bundle instead of the current page.
10633 *
10634 * One solution is to only use full urls, but that may be impossible.
10635 *
10636 * Instead, this function "fixes" the relative urls to be absolute according to the current page location.
10637 *
10638 * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.
10639 *
10640 */
10641
10642module.exports = function (css) {
10643	// get current location
10644	var location = typeof window !== "undefined" && window.location;
10645
10646	if (!location) {
10647		throw new Error("fixUrls requires window.location");
10648	}
10649
10650	// blank or null?
10651	if (!css || typeof css !== "string") {
10652		return css;
10653	}
10654
10655	var baseUrl = location.protocol + "//" + location.host;
10656	var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/");
10657
10658	// convert each url(...)
10659	/*
10660 This regular expression is just a way to recursively match brackets within
10661 a string.
10662 	 /url\s*\(  = Match on the word "url" with any whitespace after it and then a parens
10663    (  = Start a capturing group
10664      (?:  = Start a non-capturing group
10665          [^)(]  = Match anything that isn't a parentheses
10666          |  = OR
10667          \(  = Match a start parentheses
10668              (?:  = Start another non-capturing groups
10669                  [^)(]+  = Match anything that isn't a parentheses
10670                  |  = OR
10671                  \(  = Match a start parentheses
10672                      [^)(]*  = Match anything that isn't a parentheses
10673                  \)  = Match a end parentheses
10674              )  = End Group
10675              *\) = Match anything and then a close parens
10676          )  = Close non-capturing group
10677          *  = Match anything
10678       )  = Close capturing group
10679  \)  = Match a close parens
10680 	 /gi  = Get all matches, not the first.  Be case insensitive.
10681  */
10682	var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function (fullMatch, origUrl) {
10683		// strip quotes (if they exist)
10684		var unquotedOrigUrl = origUrl.trim().replace(/^"(.*)"$/, function (o, $1) {
10685			return $1;
10686		}).replace(/^'(.*)'$/, function (o, $1) {
10687			return $1;
10688		});
10689
10690		// already a full url? no change
10691		if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) {
10692			return fullMatch;
10693		}
10694
10695		// convert the url to a full url
10696		var newUrl;
10697
10698		if (unquotedOrigUrl.indexOf("//") === 0) {
10699			//TODO: should we add protocol?
10700			newUrl = unquotedOrigUrl;
10701		} else if (unquotedOrigUrl.indexOf("/") === 0) {
10702			// path should be relative to the base url
10703			newUrl = baseUrl + unquotedOrigUrl; // already starts with '/'
10704		} else {
10705			// path should be relative to current directory
10706			newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './'
10707		}
10708
10709		// send back the fixed url(...)
10710		return "url(" + JSON.stringify(newUrl) + ")";
10711	});
10712
10713	// send back the fixed css
10714	return fixedCss;
10715};
10716
10717/***/ }),
10718
10719/***/ 12:
10720/***/ (function(module, exports, __webpack_require__) {
10721
10722/* WEBPACK VAR INJECTION */(function(__webpack_provided_window_dot_jQuery, jQuery) {/**
10723 * Owl Carousel v2.2.0
10724 * Copyright 2013-2016 David Deutsch
10725 * Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
10726 */
10727/**
10728 * Owl carousel
vendor: 32,275 bytes, lines 10729-11983
10729 * @version 2.1.6
10730 * @author Bartosz Wojciechowski
10731 * @author David Deutsch
10732 * @license The MIT License (MIT)
10733 * @todo Lazy Load Icon
10734 * @todo prevent animationend bubling
10735 * @todo itemsScaleUp
10736 * @todo Test Zepto
10737 * @todo stagePadding calculate wrong active classes
10738 */
10739;(function ($, window, document, undefined) {
10740
10741	/**
10742  * Creates a carousel.
10743  * @class The Owl Carousel.
10744  * @public
10745  * @param {HTMLElement|jQuery} element - The element to create the carousel for.
10746  * @param {Object} [options] - The options
10747  */
10748	function Owl(element, options) {
10749
10750		/**
10751   * Current settings for the carousel.
10752   * @public
10753   */
10754		this.settings = null;
10755
10756		/**
10757   * Current options set by the caller including defaults.
10758   * @public
10759   */
10760		this.options = $.extend({}, Owl.Defaults, options);
10761
10762		/**
10763   * Plugin element.
10764   * @public
10765   */
10766		this.$element = $(element);
10767
10768		/**
10769   * Proxied event handlers.
10770   * @protected
10771   */
10772		this._handlers = {};
10773
10774		/**
10775   * References to the running plugins of this carousel.
10776   * @protected
10777   */
10778		this._plugins = {};
10779
10780		/**
10781   * Currently suppressed events to prevent them from beeing retriggered.
10782   * @protected
10783   */
10784		this._supress = {};
10785
10786		/**
10787   * Absolute current position.
10788   * @protected
10789   */
10790		this._current = null;
10791
10792		/**
10793   * Animation speed in milliseconds.
10794   * @protected
10795   */
10796		this._speed = null;
10797
10798		/**
10799   * Coordinates of all items in pixel.
10800   * @todo The name of this member is missleading.
10801   * @protected
10802   */
10803		this._coordinates = [];
10804
10805		/**
10806   * Current breakpoint.
10807   * @todo Real media queries would be nice.
10808   * @protected
10809   */
10810		this._breakpoint = null;
10811
10812		/**
10813   * Current width of the plugin element.
10814   */
10815		this._width = null;
10816
10817		/**
10818   * All real items.
10819   * @protected
10820   */
10821		this._items = [];
10822
10823		/**
10824   * All cloned items.
10825   * @protected
10826   */
10827		this._clones = [];
10828
10829		/**
10830   * Merge values of all items.
10831   * @todo Maybe this could be part of a plugin.
10832   * @protected
10833   */
10834		this._mergers = [];
10835
10836		/**
10837   * Widths of all items.
10838   */
10839		this._widths = [];
10840
10841		/**
10842   * Invalidated parts within the update process.
10843   * @protected
10844   */
10845		this._invalidated = {};
10846
10847		/**
10848   * Ordered list of workers for the update process.
10849   * @protected
10850   */
10851		this._pipe = [];
10852
10853		/**
10854   * Current state information for the drag operation.
10855   * @todo #261
10856   * @protected
10857   */
10858		this._drag = {
10859			time: null,
10860			target: null,
10861			pointer: null,
10862			stage: {
10863				start: null,
10864				current: null
10865			},
10866			direction: null
10867		};
10868
10869		/**
10870   * Current state information and their tags.
10871   * @type {Object}
10872   * @protected
10873   */
10874		this._states = {
10875			current: {},
10876			tags: {
10877				'initializing': ['busy'],
10878				'animating': ['busy'],
10879				'dragging': ['interacting']
10880			}
10881		};
10882
10883		$.each(['onResize', 'onThrottledResize'], $.proxy(function (i, handler) {
10884			this._handlers[handler] = $.proxy(this[handler], this);
10885		}, this));
10886
10887		$.each(Owl.Plugins, $.proxy(function (key, plugin) {
10888			this._plugins[key.charAt(0).toLowerCase() + key.slice(1)] = new plugin(this);
10889		}, this));
10890
10891		$.each(Owl.Workers, $.proxy(function (priority, worker) {
10892			this._pipe.push({
10893				'filter': worker.filter,
10894				'run': $.proxy(worker.run, this)
10895			});
10896		}, this));
10897
10898		this.setup();
10899		this.initialize();
10900	}
10901
10902	/**
10903  * Default options for the carousel.
10904  * @public
10905  */
10906	Owl.Defaults = {
10907		items: 3,
10908		loop: false,
10909		center: false,
10910		rewind: false,
10911
10912		mouseDrag: true,
10913		touchDrag: true,
10914		pullDrag: true,
10915		freeDrag: false,
10916
10917		margin: 0,
10918		stagePadding: 0,
10919
10920		merge: false,
10921		mergeFit: true,
10922		autoWidth: false,
10923
10924		startPosition: 0,
10925		rtl: false,
10926
10927		smartSpeed: 250,
10928		fluidSpeed: false,
10929		dragEndSpeed: false,
10930
10931		responsive: {},
10932		responsiveRefreshRate: 200,
10933		responsiveBaseElement: window,
10934
10935		fallbackEasing: 'swing',
10936
10937		info: false,
10938
10939		nestedItemSelector: false,
10940		itemElement: 'div',
10941		stageElement: 'div',
10942
10943		refreshClass: 'owl-refresh',
10944		loadedClass: 'owl-loaded',
10945		loadingClass: 'owl-loading',
10946		rtlClass: 'owl-rtl',
10947		responsiveClass: 'owl-responsive',
10948		dragClass: 'owl-drag',
10949		itemClass: 'owl-item',
10950		stageClass: 'owl-stage',
10951		stageOuterClass: 'owl-stage-outer',
10952		grabClass: 'owl-grab'
10953	};
10954
10955	/**
10956  * Enumeration for width.
10957  * @public
10958  * @readonly
10959  * @enum {String}
10960  */
10961	Owl.Width = {
10962		Default: 'default',
10963		Inner: 'inner',
10964		Outer: 'outer'
10965	};
10966
10967	/**
10968  * Enumeration for types.
10969  * @public
10970  * @readonly
10971  * @enum {String}
10972  */
10973	Owl.Type = {
10974		Event: 'event',
10975		State: 'state'
10976	};
10977
10978	/**
10979  * Contains all registered plugins.
10980  * @public
10981  */
10982	Owl.Plugins = {};
10983
10984	/**
10985  * List of workers involved in the update process.
10986  */
10987	Owl.Workers = [{
10988		filter: ['width', 'settings'],
10989		run: function () {
10990			this._width = this.$element.width();
10991		}
10992	}, {
10993		filter: ['width', 'items', 'settings'],
10994		run: function (cache) {
10995			cache.current = this._items && this._items[this.relative(this._current)];
10996		}
10997	}, {
10998		filter: ['items', 'settings'],
10999		run: function () {
11000			this.$stage.children('.cloned').remove();
11001		}
11002	}, {
11003		filter: ['width', 'items', 'settings'],
11004		run: function (cache) {
11005			var margin = this.settings.margin || '',
11006			    grid = !this.settings.autoWidth,
11007			    rtl = this.settings.rtl,
11008			    css = {
11009				'width': 'auto',
11010				'margin-left': rtl ? margin : '',
11011				'margin-right': rtl ? '' : margin
11012			};
11013
11014			!grid && this.$stage.children().css(css);
11015
11016			cache.css = css;
11017		}
11018	}, {
11019		filter: ['width', 'items', 'settings'],
11020		run: function (cache) {
11021			var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
11022			    merge = null,
11023			    iterator = this._items.length,
11024			    grid = !this.settings.autoWidth,
11025			    widths = [];
11026
11027			cache.items = {
11028				merge: false,
11029				width: width
11030			};
11031
11032			while (iterator--) {
11033				merge = this._mergers[iterator];
11034				merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;
11035
11036				cache.items.merge = merge > 1 || cache.items.merge;
11037
11038				widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
11039			}
11040
11041			this._widths = widths;
11042		}
11043	}, {
11044		filter: ['items', 'settings'],
11045		run: function () {
11046			var clones = [],
11047			    items = this._items,
11048			    settings = this.settings,
11049			    view = Math.max(settings.items * 2, 4),
11050			    size = Math.ceil(items.length / 2) * 2,
11051			    repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
11052			    append = '',
11053			    prepend = '';
11054
11055			repeat /= 2;
11056
11057			while (repeat--) {
11058				clones.push(this.normalize(clones.length / 2, true));
11059				append = append + items[clones[clones.length - 1]][0].outerHTML;
11060				clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
11061				prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
11062			}
11063
11064			this._clones = clones;
11065
11066			$(append).addClass('cloned').appendTo(this.$stage);
11067			$(prepend).addClass('cloned').prependTo(this.$stage);
11068		}
11069	}, {
11070		filter: ['width', 'items', 'settings'],
11071		run: function () {
11072			var rtl = this.settings.rtl ? 1 : -1,
11073			    size = this._clones.length + this._items.length,
11074			    iterator = -1,
11075			    previous = 0,
11076			    current = 0,
11077			    coordinates = [];
11078
11079			while (++iterator < size) {
11080				previous = coordinates[iterator - 1] || 0;
11081				current = this._widths[this.relative(iterator)] + this.settings.margin;
11082				coordinates.push(previous + current * rtl);
11083			}
11084
11085			this._coordinates = coordinates;
11086		}
11087	}, {
11088		filter: ['width', 'items', 'settings'],
11089		run: function () {
11090			var padding = this.settings.stagePadding,
11091			    coordinates = this._coordinates,
11092			    css = {
11093				'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
11094				'padding-left': padding || '',
11095				'padding-right': padding || ''
11096			};
11097
11098			this.$stage.css(css);
11099		}
11100	}, {
11101		filter: ['width', 'items', 'settings'],
11102		run: function (cache) {
11103			var iterator = this._coordinates.length,
11104			    grid = !this.settings.autoWidth,
11105			    items = this.$stage.children();
11106
11107			if (grid && cache.items.merge) {
11108				while (iterator--) {
11109					cache.css.width = this._widths[this.relative(iterator)];
11110					items.eq(iterator).css(cache.css);
11111				}
11112			} else if (grid) {
11113				cache.css.width = cache.items.width;
11114				items.css(cache.css);
11115			}
11116		}
11117	}, {
11118		filter: ['items'],
11119		run: function () {
11120			this._coordinates.length < 1 && this.$stage.removeAttr('style');
11121		}
11122	}, {
11123		filter: ['width', 'items', 'settings'],
11124		run: function (cache) {
11125			cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
11126			cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
11127			this.reset(cache.current);
11128		}
11129	}, {
11130		filter: ['position'],
11131		run: function () {
11132			this.animate(this.coordinates(this._current));
11133		}
11134	}, {
11135		filter: ['width', 'position', 'items', 'settings'],
11136		run: function () {
11137			var rtl = this.settings.rtl ? 1 : -1,
11138			    padding = this.settings.stagePadding * 2,
11139			    begin = this.coordinates(this.current()) + padding,
11140			    end = begin + this.width() * rtl,
11141			    inner,
11142			    outer,
11143			    matches = [],
11144			    i,
11145			    n;
11146
11147			for (i = 0, n = this._coordinates.length; i < n; i++) {
11148				inner = this._coordinates[i - 1] || 0;
11149				outer = Math.abs(this._coordinates[i]) + padding * rtl;
11150
11151				if (this.op(inner, '<=', begin) && this.op(inner, '>', end) || this.op(outer, '<', begin) && this.op(outer, '>', end)) {
11152					matches.push(i);
11153				}
11154			}
11155
11156			this.$stage.children('.active').removeClass('active');
11157			this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');
11158
11159			if (this.settings.center) {
11160				this.$stage.children('.center').removeClass('center');
11161				this.$stage.children().eq(this.current()).addClass('center');
11162			}
11163		}
11164	}];
11165
11166	/**
11167  * Initializes the carousel.
11168  * @protected
11169  */
11170	Owl.prototype.initialize = function () {
11171		this.enter('initializing');
11172		this.trigger('initialize');
11173
11174		this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);
11175
11176		if (this.settings.autoWidth && !this.is('pre-loading')) {
11177			var imgs, nestedSelector, width;
11178			imgs = this.$element.find('img');
11179			nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
11180			width = this.$element.children(nestedSelector).width();
11181
11182			if (imgs.length && width <= 0) {
11183				this.preloadAutoWidthImages(imgs);
11184			}
11185		}
11186
11187		this.$element.addClass(this.options.loadingClass);
11188
11189		// create stage
11190		this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>').wrap('<div class="' + this.settings.stageOuterClass + '"/>');
11191
11192		// append stage
11193		this.$element.append(this.$stage.parent());
11194
11195		// append content
11196		this.replace(this.$element.children().not(this.$stage.parent()));
11197
11198		// check visibility
11199		if (this.$element.is(':visible')) {
11200			// update view
11201			this.refresh();
11202		} else {
11203			// invalidate width
11204			this.invalidate('width');
11205		}
11206
11207		this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass);
11208
11209		// register event handlers
11210		this.registerEventHandlers();
11211
11212		this.leave('initializing');
11213		this.trigger('initialized');
11214	};
11215
11216	/**
11217  * Setups the current settings.
11218  * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
11219  * @todo Support for media queries by using `matchMedia` would be nice.
11220  * @public
11221  */
11222	Owl.prototype.setup = function () {
11223		var viewport = this.viewport(),
11224		    overwrites = this.options.responsive,
11225		    match = -1,
11226		    settings = null;
11227
11228		if (!overwrites) {
11229			settings = $.extend({}, this.options);
11230		} else {
11231			$.each(overwrites, function (breakpoint) {
11232				if (breakpoint <= viewport && breakpoint > match) {
11233					match = Number(breakpoint);
11234				}
11235			});
11236
11237			settings = $.extend({}, this.options, overwrites[match]);
11238			if (typeof settings.stagePadding === 'function') {
11239				settings.stagePadding = settings.stagePadding();
11240			}
11241			delete settings.responsive;
11242
11243			// responsive class
11244			if (settings.responsiveClass) {
11245				this.$element.attr('class', this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match));
11246			}
11247		}
11248
11249		this.trigger('change', { property: { name: 'settings', value: settings } });
11250		this._breakpoint = match;
11251		this.settings = settings;
11252		this.invalidate('settings');
11253		this.trigger('changed', { property: { name: 'settings', value: this.settings } });
11254	};
11255
11256	/**
11257  * Updates option logic if necessery.
11258  * @protected
11259  */
11260	Owl.prototype.optionsLogic = function () {
11261		if (this.settings.autoWidth) {
11262			this.settings.stagePadding = false;
11263			this.settings.merge = false;
11264		}
11265	};
11266
11267	/**
11268  * Prepares an item before add.
11269  * @todo Rename event parameter `content` to `item`.
11270  * @protected
11271  * @returns {jQuery|HTMLElement} - The item container.
11272  */
11273	Owl.prototype.prepare = function (item) {
11274		var event = this.trigger('prepare', { content: item });
11275
11276		if (!event.data) {
11277			event.data = $('<' + this.settings.itemElement + '/>').addClass(this.options.itemClass).append(item);
11278		}
11279
11280		this.trigger('prepared', { content: event.data });
11281
11282		return event.data;
11283	};
11284
11285	/**
11286  * Updates the view.
11287  * @public
11288  */
11289	Owl.prototype.update = function () {
11290		var i = 0,
11291		    n = this._pipe.length,
11292		    filter = $.proxy(function (p) {
11293			return this[p];
11294		}, this._invalidated),
11295		    cache = {};
11296
11297		while (i < n) {
11298			if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
11299				this._pipe[i].run(cache);
11300			}
11301			i++;
11302		}
11303
11304		this._invalidated = {};
11305
11306		!this.is('valid') && this.enter('valid');
11307	};
11308
11309	/**
11310  * Gets the width of the view.
11311  * @public
11312  * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
11313  * @returns {Number} - The width of the view in pixel.
11314  */
11315	Owl.prototype.width = function (dimension) {
11316		dimension = dimension || Owl.Width.Default;
11317		switch (dimension) {
11318			case Owl.Width.Inner:
11319			case Owl.Width.Outer:
11320				return this._width;
11321			default:
11322				return this._width - this.settings.stagePadding * 2 + this.settings.margin;
11323		}
11324	};
11325
11326	/**
11327  * Refreshes the carousel primarily for adaptive purposes.
11328  * @public
11329  */
11330	Owl.prototype.refresh = function () {
11331		this.enter('refreshing');
11332		this.trigger('refresh');
11333
11334		this.setup();
11335
11336		this.optionsLogic();
11337
11338		this.$element.addClass(this.options.refreshClass);
11339
11340		this.update();
11341
11342		this.$element.removeClass(this.options.refreshClass);
11343
11344		this.leave('refreshing');
11345		this.trigger('refreshed');
11346	};
11347
11348	/**
11349  * Checks window `resize` event.
11350  * @protected
11351  */
11352	Owl.prototype.onThrottledResize = function () {
11353		window.clearTimeout(this.resizeTimer);
11354		this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
11355	};
11356
11357	/**
11358  * Checks window `resize` event.
11359  * @protected
11360  */
11361	Owl.prototype.onResize = function () {
11362		if (!this._items.length) {
11363			return false;
11364		}
11365
11366		if (this._width === this.$element.width()) {
11367			return false;
11368		}
11369
11370		if (!this.$element.is(':visible')) {
11371			return false;
11372		}
11373
11374		this.enter('resizing');
11375
11376		if (this.trigger('resize').isDefaultPrevented()) {
11377			this.leave('resizing');
11378			return false;
11379		}
11380
11381		this.invalidate('width');
11382
11383		this.refresh();
11384
11385		this.leave('resizing');
11386		this.trigger('resized');
11387	};
11388
11389	/**
11390  * Registers event handlers.
11391  * @todo Check `msPointerEnabled`
11392  * @todo #261
11393  * @protected
11394  */
11395	Owl.prototype.registerEventHandlers = function () {
11396		if ($.support.transition) {
11397			this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
11398		}
11399
11400		if (this.settings.responsive !== false) {
11401			this.on(window, 'resize', this._handlers.onThrottledResize);
11402		}
11403
11404		if (this.settings.mouseDrag) {
11405			this.$element.addClass(this.options.dragClass);
11406			this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
11407			this.$stage.on('dragstart.owl.core selectstart.owl.core', function () {
11408				return false;
11409			});
11410		}
11411
11412		if (this.settings.touchDrag) {
11413			this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
11414			this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
11415		}
11416	};
11417
11418	/**
11419  * Handles `touchstart` and `mousedown` events.
11420  * @todo Horizontal swipe threshold as option
11421  * @todo #261
11422  * @protected
11423  * @param {Event} event - The event arguments.
11424  */
11425	Owl.prototype.onDragStart = function (event) {
11426		var stage = null;
11427
11428		if (event.which === 3) {
11429			return;
11430		}
11431
11432		if ($.support.transform) {
11433			stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
11434			stage = {
11435				x: stage[stage.length === 16 ? 12 : 4],
11436				y: stage[stage.length === 16 ? 13 : 5]
11437			};
11438		} else {
11439			stage = this.$stage.position();
11440			stage = {
11441				x: this.settings.rtl ? stage.left + this.$stage.width() - this.width() + this.settings.margin : stage.left,
11442				y: stage.top
11443			};
11444		}
11445
11446		if (this.is('animating')) {
11447			$.support.transform ? this.animate(stage.x) : this.$stage.stop();
11448			this.invalidate('position');
11449		}
11450
11451		this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');
11452
11453		this.speed(0);
11454
11455		this._drag.time = new Date().getTime();
11456		this._drag.target = $(event.target);
11457		this._drag.stage.start = stage;
11458		this._drag.stage.current = stage;
11459		this._drag.pointer = this.pointer(event);
11460
11461		$(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));
11462
11463		$(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function (event) {
11464			var delta = this.difference(this._drag.pointer, this.pointer(event));
11465
11466			$(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));
11467
11468			if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
11469				return;
11470			}
11471
11472			event.preventDefault();
11473
11474			this.enter('dragging');
11475			this.trigger('drag');
11476		}, this));
11477	};
11478
11479	/**
11480  * Handles the `touchmove` and `mousemove` events.
11481  * @todo #261
11482  * @protected
11483  * @param {Event} event - The event arguments.
11484  */
11485	Owl.prototype.onDragMove = function (event) {
11486		var minimum = null,
11487		    maximum = null,
11488		    pull = null,
11489		    delta = this.difference(this._drag.pointer, this.pointer(event)),
11490		    stage = this.difference(this._drag.stage.start, delta);
11491
11492		if (!this.is('dragging')) {
11493			return;
11494		}
11495
11496		event.preventDefault();
11497
11498		if (this.settings.loop) {
11499			minimum = this.coordinates(this.minimum());
11500			maximum = this.coordinates(this.maximum() + 1) - minimum;
11501			stage.x = ((stage.x - minimum) % maximum + maximum) % maximum + minimum;
11502		} else {
11503			minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
11504			maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
11505			pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
11506			stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
11507		}
11508
11509		this._drag.stage.current = stage;
11510
11511		this.animate(stage.x);
11512	};
11513
11514	/**
11515  * Handles the `touchend` and `mouseup` events.
11516  * @todo #261
11517  * @todo Threshold for click event
11518  * @protected
11519  * @param {Event} event - The event arguments.
11520  */
11521	Owl.prototype.onDragEnd = function (event) {
11522		var delta = this.difference(this._drag.pointer, this.pointer(event)),
11523		    stage = this._drag.stage.current,
11524		    direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';
11525
11526		$(document).off('.owl.core');
11527
11528		this.$element.removeClass(this.options.grabClass);
11529
11530		if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
11531			this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
11532			this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
11533			this.invalidate('position');
11534			this.update();
11535
11536			this._drag.direction = direction;
11537
11538			if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
11539				this._drag.target.one('click.owl.core', function () {
11540					return false;
11541				});
11542			}
11543		}
11544
11545		if (!this.is('dragging')) {
11546			return;
11547		}
11548
11549		this.leave('dragging');
11550		this.trigger('dragged');
11551	};
11552
11553	/**
11554  * Gets absolute position of the closest item for a coordinate.
11555  * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
11556  * @protected
11557  * @param {Number} coordinate - The coordinate in pixel.
11558  * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
11559  * @return {Number} - The absolute position of the closest item.
11560  */
11561	Owl.prototype.closest = function (coordinate, direction) {
11562		var position = -1,
11563		    pull = 30,
11564		    width = this.width(),
11565		    coordinates = this.coordinates();
11566
11567		if (!this.settings.freeDrag) {
11568			// check closest item
11569			$.each(coordinates, $.proxy(function (index, value) {
11570				// on a left pull, check on current index
11571				if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
11572					position = index;
11573					// on a right pull, check on previous index
11574					// to do so, subtract width from value and set position = index + 1
11575				} else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
11576					position = index + 1;
11577				} else if (this.op(coordinate, '<', value) && this.op(coordinate, '>', coordinates[index + 1] || value - width)) {
11578					position = direction === 'left' ? index + 1 : index;
11579				}
11580				return position === -1;
11581			}, this));
11582		}
11583
11584		if (!this.settings.loop) {
11585			// non loop boundries
11586			if (this.op(coordinate, '>', coordinates[this.minimum()])) {
11587				position = coordinate = this.minimum();
11588			} else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
11589				position = coordinate = this.maximum();
11590			}
11591		}
11592
11593		return position;
11594	};
11595
11596	/**
11597  * Animates the stage.
11598  * @todo #270
11599  * @public
11600  * @param {Number} coordinate - The coordinate in pixels.
11601  */
11602	Owl.prototype.animate = function (coordinate) {
11603		var animate = this.speed() > 0;
11604
11605		this.is('animating') && this.onTransitionEnd();
11606
11607		if (animate) {
11608			this.enter('animating');
11609			this.trigger('translate');
11610		}
11611
11612		if ($.support.transform3d && $.support.transition) {
11613			this.$stage.css({
11614				transform: 'translate3d(' + coordinate + 'px,0px,0px)',
11615				transition: this.speed() / 1000 + 's'
11616			});
11617		} else if (animate) {
11618			this.$stage.animate({
11619				left: coordinate + 'px'
11620			}, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
11621		} else {
11622			this.$stage.css({
11623				left: coordinate + 'px'
11624			});
11625		}
11626	};
11627
11628	/**
11629  * Checks whether the carousel is in a specific state or not.
11630  * @param {String} state - The state to check.
11631  * @returns {Boolean} - The flag which indicates if the carousel is busy.
11632  */
11633	Owl.prototype.is = function (state) {
11634		return this._states.current[state] && this._states.current[state] > 0;
11635	};
11636
11637	/**
11638  * Sets the absolute position of the current item.
11639  * @public
11640  * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
11641  * @returns {Number} - The absolute position of the current item.
11642  */
11643	Owl.prototype.current = function (position) {
11644		if (position === undefined) {
11645			return this._current;
11646		}
11647
11648		if (this._items.length === 0) {
11649			return undefined;
11650		}
11651
11652		position = this.normalize(position);
11653
11654		if (this._current !== position) {
11655			var event = this.trigger('change', { property: { name: 'position', value: position } });
11656
11657			if (event.data !== undefined) {
11658				position = this.normalize(event.data);
11659			}
11660
11661			this._current = position;
11662
11663			this.invalidate('position');
11664
11665			this.trigger('changed', { property: { name: 'position', value: this._current } });
11666		}
11667
11668		return this._current;
11669	};
11670
11671	/**
11672  * Invalidates the given part of the update routine.
11673  * @param {String} [part] - The part to invalidate.
11674  * @returns {Array.<String>} - The invalidated parts.
11675  */
11676	Owl.prototype.invalidate = function (part) {
11677		if ($.type(part) === 'string') {
11678			this._invalidated[part] = true;
11679			this.is('valid') && this.leave('valid');
11680		}
11681		return $.map(this._invalidated, function (v, i) {
11682			return i;
11683		});
11684	};
11685
11686	/**
11687  * Resets the absolute position of the current item.
11688  * @public
11689  * @param {Number} position - The absolute position of the new item.
11690  */
11691	Owl.prototype.reset = function (position) {
11692		position = this.normalize(position);
11693
11694		if (position === undefined) {
11695			return;
11696		}
11697
11698		this._speed = 0;
11699		this._current = position;
11700
11701		this.suppress(['translate', 'translated']);
11702
11703		this.animate(this.coordinates(position));
11704
11705		this.release(['translate', 'translated']);
11706	};
11707
11708	/**
11709  * Normalizes an absolute or a relative position of an item.
11710  * @public
11711  * @param {Number} position - The absolute or relative position to normalize.
11712  * @param {Boolean} [relative=false] - Whether the given position is relative or not.
11713  * @returns {Number} - The normalized position.
11714  */
11715	Owl.prototype.normalize = function (position, relative) {
11716		var n = this._items.length,
11717		    m = relative ? 0 : this._clones.length;
11718
11719		if (!this.isNumeric(position) || n < 1) {
11720			position = undefined;
11721		} else if (position < 0 || position >= n + m) {
11722			position = ((position - m / 2) % n + n) % n + m / 2;
11723		}
11724
11725		return position;
11726	};
11727
11728	/**
11729  * Converts an absolute position of an item into a relative one.
11730  * @public
11731  * @param {Number} position - The absolute position to convert.
11732  * @returns {Number} - The converted position.
11733  */
11734	Owl.prototype.relative = function (position) {
11735		position -= this._clones.length / 2;
11736		return this.normalize(position, true);
11737	};
11738
11739	/**
11740  * Gets the maximum position for the current item.
11741  * @public
11742  * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
11743  * @returns {Number}
11744  */
11745	Owl.prototype.maximum = function (relative) {
11746		var settings = this.settings,
11747		    maximum = this._coordinates.length,
11748		    iterator,
11749		    reciprocalItemsWidth,
11750		    elementWidth;
11751
11752		if (settings.loop) {
11753			maximum = this._clones.length / 2 + this._items.length - 1;
11754		} else if (settings.autoWidth || settings.merge) {
11755			iterator = this._items.length;
11756			reciprocalItemsWidth = this._items[--iterator].width();
11757			elementWidth = this.$element.width();
11758			while (iterator--) {
11759				reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin;
11760				if (reciprocalItemsWidth > elementWidth) {
11761					break;
11762				}
11763			}
11764			maximum = iterator + 1;
11765		} else if (settings.center) {
11766			maximum = this._items.length - 1;
11767		} else {
11768			maximum = this._items.length - settings.items;
11769		}
11770
11771		if (relative) {
11772			maximum -= this._clones.length / 2;
11773		}
11774
11775		return Math.max(maximum, 0);
11776	};
11777
11778	/**
11779  * Gets the minimum position for the current item.
11780  * @public
11781  * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
11782  * @returns {Number}
11783  */
11784	Owl.prototype.minimum = function (relative) {
11785		return relative ? 0 : this._clones.length / 2;
11786	};
11787
11788	/**
11789  * Gets an item at the specified relative position.
11790  * @public
11791  * @param {Number} [position] - The relative position of the item.
11792  * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
11793  */
11794	Owl.prototype.items = function (position) {
11795		if (position === undefined) {
11796			return this._items.slice();
11797		}
11798
11799		position = this.normalize(position, true);
11800		return this._items[position];
11801	};
11802
11803	/**
11804  * Gets an item at the specified relative position.
11805  * @public
11806  * @param {Number} [position] - The relative position of the item.
11807  * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
11808  */
11809	Owl.prototype.mergers = function (position) {
11810		if (position === undefined) {
11811			return this._mergers.slice();
11812		}
11813
11814		position = this.normalize(position, true);
11815		return this._mergers[position];
11816	};
11817
11818	/**
11819  * Gets the absolute positions of clones for an item.
11820  * @public
11821  * @param {Number} [position] - The relative position of the item.
11822  * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.
11823  */
11824	Owl.prototype.clones = function (position) {
11825		var odd = this._clones.length / 2,
11826		    even = odd + this._items.length,
11827		    map = function (index) {
11828			return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2;
11829		};
11830
11831		if (position === undefined) {
11832			return $.map(this._clones, function (v, i) {
11833				return map(i);
11834			});
11835		}
11836
11837		return $.map(this._clones, function (v, i) {
11838			return v === position ? map(i) : null;
11839		});
11840	};
11841
11842	/**
11843  * Sets the current animation speed.
11844  * @public
11845  * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
11846  * @returns {Number} - The current animation speed in milliseconds.
11847  */
11848	Owl.prototype.speed = function (speed) {
11849		if (speed !== undefined) {
11850			this._speed = speed;
11851		}
11852
11853		return this._speed;
11854	};
11855
11856	/**
11857  * Gets the coordinate of an item.
11858  * @todo The name of this method is missleanding.
11859  * @public
11860  * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
11861  * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.
11862  */
11863	Owl.prototype.coordinates = function (position) {
11864		var multiplier = 1,
11865		    newPosition = position - 1,
11866		    coordinate;
11867
11868		if (position === undefined) {
11869			return $.map(this._coordinates, $.proxy(function (coordinate, index) {
11870				return this.coordinates(index);
11871			}, this));
11872		}
11873
11874		if (this.settings.center) {
11875			if (this.settings.rtl) {
11876				multiplier = -1;
11877				newPosition = position + 1;
11878			}
11879
11880			coordinate = this._coordinates[position];
11881			coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
11882		} else {
11883			coordinate = this._coordinates[newPosition] || 0;
11884		}
11885
11886		coordinate = Math.ceil(coordinate);
11887
11888		return coordinate;
11889	};
11890
11891	/**
11892  * Calculates the speed for a translation.
11893  * @protected
11894  * @param {Number} from - The absolute position of the start item.
11895  * @param {Number} to - The absolute position of the target item.
11896  * @param {Number} [factor=undefined] - The time factor in milliseconds.
11897  * @returns {Number} - The time in milliseconds for the translation.
11898  */
11899	Owl.prototype.duration = function (from, to, factor) {
11900		if (factor === 0) {
11901			return 0;
11902		}
11903
11904		return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs(factor || this.settings.smartSpeed);
11905	};
11906
11907	/**
11908  * Slides to the specified item.
11909  * @public
11910  * @param {Number} position - The position of the item.
11911  * @param {Number} [speed] - The time in milliseconds for the transition.
11912  */
11913	Owl.prototype.to = function (position, speed) {
11914		var current = this.current(),
11915		    revert = null,
11916		    distance = position - this.relative(current),
11917		    direction = (distance > 0) - (distance < 0),
11918		    items = this._items.length,
11919		    minimum = this.minimum(),
11920		    maximum = this.maximum();
11921
11922		if (this.settings.loop) {
11923			if (!this.settings.rewind && Math.abs(distance) > items / 2) {
11924				distance += direction * -1 * items;
11925			}
11926
11927			position = current + distance;
11928			revert = ((position - minimum) % items + items) % items + minimum;
11929
11930			if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
11931				current = revert - distance;
11932				position = revert;
11933				this.reset(current);
11934			}
11935		} else if (this.settings.rewind) {
11936			maximum += 1;
11937			position = (position % maximum + maximum) % maximum;
11938		} else {
11939			position = Math.max(minimum, Math.min(maximum, position));
11940		}
11941
11942		this.speed(this.duration(current, position, speed));
11943		this.current(position);
11944
11945		if (this.$element.is(':visible')) {
11946			this.update();
11947		}
11948	};
11949
11950	/**
11951  * Slides to the next item.
11952  * @public
11953  * @param {Number} [speed] - The time in milliseconds for the transition.
11954  */
11955	Owl.prototype.next = function (speed) {
11956		speed = speed || false;
11957		this.to(this.relative(this.current()) + 1, speed);
11958	};
11959
11960	/**
11961  * Slides to the previous item.
11962  * @public
11963  * @param {Number} [speed] - The time in milliseconds for the transition.
11964  */
11965	Owl.prototype.prev = function (speed) {
11966		speed = speed || false;
11967		this.to(this.relative(this.current()) - 1, speed);
11968	};
11969
11970	/**
11971  * Handles the end of an animation.
11972  * @protected
11973  * @param {Event} event - The event arguments.
11974  */
11975	Owl.prototype.onTransitionEnd = function (event) {
11976
11977		// if css2 animation then event object is undefined
11978		if (event !== undefined) {
11979			event.stopPropagation();
11980
11981			// Catch only owl-stage transitionEnd event
11982			if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
11983				return false;
vendor: 11,744 bytes, lines 11984-12370
11984			}
11985		}
11986
11987		this.leave('animating');
11988		this.trigger('translated');
11989	};
11990
11991	/**
11992  * Gets viewport width.
11993  * @protected
11994  * @return {Number} - The width in pixel.
11995  */
11996	Owl.prototype.viewport = function () {
11997		var width;
11998		if (this.options.responsiveBaseElement !== window) {
11999			width = $(this.options.responsiveBaseElement).width();
12000		} else if (window.innerWidth) {
12001			width = window.innerWidth;
12002		} else if (document.documentElement && document.documentElement.clientWidth) {
12003			width = document.documentElement.clientWidth;
12004		} else {
12005			throw 'Can not detect viewport width.';
12006		}
12007		return width;
12008	};
12009
12010	/**
12011  * Replaces the current content.
12012  * @public
12013  * @param {HTMLElement|jQuery|String} content - The new content.
12014  */
12015	Owl.prototype.replace = function (content) {
12016		this.$stage.empty();
12017		this._items = [];
12018
12019		if (content) {
12020			content = content instanceof jQuery ? content : $(content);
12021		}
12022
12023		if (this.settings.nestedItemSelector) {
12024			content = content.find('.' + this.settings.nestedItemSelector);
12025		}
12026
12027		content.filter(function () {
12028			return this.nodeType === 1;
12029		}).each($.proxy(function (index, item) {
12030			item = this.prepare(item);
12031			this.$stage.append(item);
12032			this._items.push(item);
12033			this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
12034		}, this));
12035
12036		this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);
12037
12038		this.invalidate('items');
12039	};
12040
12041	/**
12042  * Adds an item.
12043  * @todo Use `item` instead of `content` for the event arguments.
12044  * @public
12045  * @param {HTMLElement|jQuery|String} content - The item content to add.
12046  * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
12047  */
12048	Owl.prototype.add = function (content, position) {
12049		var current = this.relative(this._current);
12050
12051		position = position === undefined ? this._items.length : this.normalize(position, true);
12052		content = content instanceof jQuery ? content : $(content);
12053
12054		this.trigger('add', { content: content, position: position });
12055
12056		content = this.prepare(content);
12057
12058		if (this._items.length === 0 || position === this._items.length) {
12059			this._items.length === 0 && this.$stage.append(content);
12060			this._items.length !== 0 && this._items[position - 1].after(content);
12061			this._items.push(content);
12062			this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
12063		} else {
12064			this._items[position].before(content);
12065			this._items.splice(position, 0, content);
12066			this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
12067		}
12068
12069		this._items[current] && this.reset(this._items[current].index());
12070
12071		this.invalidate('items');
12072
12073		this.trigger('added', { content: content, position: position });
12074	};
12075
12076	/**
12077  * Removes an item by its position.
12078  * @todo Use `item` instead of `content` for the event arguments.
12079  * @public
12080  * @param {Number} position - The relative position of the item to remove.
12081  */
12082	Owl.prototype.remove = function (position) {
12083		position = this.normalize(position, true);
12084
12085		if (position === undefined) {
12086			return;
12087		}
12088
12089		this.trigger('remove', { content: this._items[position], position: position });
12090
12091		this._items[position].remove();
12092		this._items.splice(position, 1);
12093		this._mergers.splice(position, 1);
12094
12095		this.invalidate('items');
12096
12097		this.trigger('removed', { content: null, position: position });
12098	};
12099
12100	/**
12101  * Preloads images with auto width.
12102  * @todo Replace by a more generic approach
12103  * @protected
12104  */
12105	Owl.prototype.preloadAutoWidthImages = function (images) {
12106		images.each($.proxy(function (i, element) {
12107			this.enter('pre-loading');
12108			element = $(element);
12109			$(new Image()).one('load', $.proxy(function (e) {
12110				element.attr('src', e.target.src);
12111				element.css('opacity', 1);
12112				this.leave('pre-loading');
12113				!this.is('pre-loading') && !this.is('initializing') && this.refresh();
12114			}, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
12115		}, this));
12116	};
12117
12118	/**
12119  * Destroys the carousel.
12120  * @public
12121  */
12122	Owl.prototype.destroy = function () {
12123
12124		this.$element.off('.owl.core');
12125		this.$stage.off('.owl.core');
12126		$(document).off('.owl.core');
12127
12128		if (this.settings.responsive !== false) {
12129			window.clearTimeout(this.resizeTimer);
12130			this.off(window, 'resize', this._handlers.onThrottledResize);
12131		}
12132
12133		for (var i in this._plugins) {
12134			this._plugins[i].destroy();
12135		}
12136
12137		this.$stage.children('.cloned').remove();
12138
12139		this.$stage.unwrap();
12140		this.$stage.children().contents().unwrap();
12141		this.$stage.children().unwrap();
12142
12143		this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), '')).removeData('owl.carousel');
12144	};
12145
12146	/**
12147  * Operators to calculate right-to-left and left-to-right.
12148  * @protected
12149  * @param {Number} [a] - The left side operand.
12150  * @param {String} [o] - The operator.
12151  * @param {Number} [b] - The right side operand.
12152  */
12153	Owl.prototype.op = function (a, o, b) {
12154		var rtl = this.settings.rtl;
12155		switch (o) {
12156			case '<':
12157				return rtl ? a > b : a < b;
12158			case '>':
12159				return rtl ? a < b : a > b;
12160			case '>=':
12161				return rtl ? a <= b : a >= b;
12162			case '<=':
12163				return rtl ? a >= b : a <= b;
12164			default:
12165				break;
12166		}
12167	};
12168
12169	/**
12170  * Attaches to an internal event.
12171  * @protected
12172  * @param {HTMLElement} element - The event source.
12173  * @param {String} event - The event name.
12174  * @param {Function} listener - The event handler to attach.
12175  * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
12176  */
12177	Owl.prototype.on = function (element, event, listener, capture) {
12178		if (element.addEventListener) {
12179			element.addEventListener(event, listener, capture);
12180		} else if (element.attachEvent) {
12181			element.attachEvent('on' + event, listener);
12182		}
12183	};
12184
12185	/**
12186  * Detaches from an internal event.
12187  * @protected
12188  * @param {HTMLElement} element - The event source.
12189  * @param {String} event - The event name.
12190  * @param {Function} listener - The attached event handler to detach.
12191  * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
12192  */
12193	Owl.prototype.off = function (element, event, listener, capture) {
12194		if (element.removeEventListener) {
12195			element.removeEventListener(event, listener, capture);
12196		} else if (element.detachEvent) {
12197			element.detachEvent('on' + event, listener);
12198		}
12199	};
12200
12201	/**
12202  * Triggers a public event.
12203  * @todo Remove `status`, `relatedTarget` should be used instead.
12204  * @protected
12205  * @param {String} name - The event name.
12206  * @param {*} [data=null] - The event data.
12207  * @param {String} [namespace=carousel] - The event namespace.
12208  * @param {String} [state] - The state which is associated with the event.
12209  * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
12210  * @returns {Event} - The event arguments.
12211  */
12212	Owl.prototype.trigger = function (name, data, namespace, state, enter) {
12213		var status = {
12214			item: { count: this._items.length, index: this.current() }
12215		},
12216		    handler = $.camelCase($.grep(['on', name, namespace], function (v) {
12217			return v;
12218		}).join('-').toLowerCase()),
12219		    event = $.Event([name, 'owl', namespace || 'carousel'].join('.').toLowerCase(), $.extend({ relatedTarget: this }, status, data));
12220
12221		if (!this._supress[name]) {
12222			$.each(this._plugins, function (name, plugin) {
12223				if (plugin.onTrigger) {
12224					plugin.onTrigger(event);
12225				}
12226			});
12227
12228			this.register({ type: Owl.Type.Event, name: name });
12229			this.$element.trigger(event);
12230
12231			if (this.settings && typeof this.settings[handler] === 'function') {
12232				this.settings[handler].call(this, event);
12233			}
12234		}
12235
12236		return event;
12237	};
12238
12239	/**
12240  * Enters a state.
12241  * @param name - The state name.
12242  */
12243	Owl.prototype.enter = function (name) {
12244		$.each([name].concat(this._states.tags[name] || []), $.proxy(function (i, name) {
12245			if (this._states.current[name] === undefined) {
12246				this._states.current[name] = 0;
12247			}
12248
12249			this._states.current[name]++;
12250		}, this));
12251	};
12252
12253	/**
12254  * Leaves a state.
12255  * @param name - The state name.
12256  */
12257	Owl.prototype.leave = function (name) {
12258		$.each([name].concat(this._states.tags[name] || []), $.proxy(function (i, name) {
12259			this._states.current[name]--;
12260		}, this));
12261	};
12262
12263	/**
12264  * Registers an event or state.
12265  * @public
12266  * @param {Object} object - The event or state to register.
12267  */
12268	Owl.prototype.register = function (object) {
12269		if (object.type === Owl.Type.Event) {
12270			if (!$.event.special[object.name]) {
12271				$.event.special[object.name] = {};
12272			}
12273
12274			if (!$.event.special[object.name].owl) {
12275				var _default = $.event.special[object.name]._default;
12276				$.event.special[object.name]._default = function (e) {
12277					if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
12278						return _default.apply(this, arguments);
12279					}
12280					return e.namespace && e.namespace.indexOf('owl') > -1;
12281				};
12282				$.event.special[object.name].owl = true;
12283			}
12284		} else if (object.type === Owl.Type.State) {
12285			if (!this._states.tags[object.name]) {
12286				this._states.tags[object.name] = object.tags;
12287			} else {
12288				this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
12289			}
12290
12291			this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function (tag, i) {
12292				return $.inArray(tag, this._states.tags[object.name]) === i;
12293			}, this));
12294		}
12295	};
12296
12297	/**
12298  * Suppresses events.
12299  * @protected
12300  * @param {Array.<String>} events - The events to suppress.
12301  */
12302	Owl.prototype.suppress = function (events) {
12303		$.each(events, $.proxy(function (index, event) {
12304			this._supress[event] = true;
12305		}, this));
12306	};
12307
12308	/**
12309  * Releases suppressed events.
12310  * @protected
12311  * @param {Array.<String>} events - The events to release.
12312  */
12313	Owl.prototype.release = function (events) {
12314		$.each(events, $.proxy(function (index, event) {
12315			delete this._supress[event];
12316		}, this));
12317	};
12318
12319	/**
12320  * Gets unified pointer coordinates from event.
12321  * @todo #261
12322  * @protected
12323  * @param {Event} - The `mousedown` or `touchstart` event.
12324  * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
12325  */
12326	Owl.prototype.pointer = function (event) {
12327		var result = { x: null, y: null };
12328
12329		event = event.originalEvent || event || window.event;
12330
12331		event = event.touches && event.touches.length ? event.touches[0] : event.changedTouches && event.changedTouches.length ? event.changedTouches[0] : event;
12332
12333		if (event.pageX) {
12334			result.x = event.pageX;
12335			result.y = event.pageY;
12336		} else {
12337			result.x = event.clientX;
12338			result.y = event.clientY;
12339		}
12340
12341		return result;
12342	};
12343
12344	/**
12345  * Determines if the input is a Number or something that can be coerced to a Number
12346  * @protected
12347  * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
12348  * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
12349  */
12350	Owl.prototype.isNumeric = function (number) {
12351		return !isNaN(parseFloat(number));
12352	};
12353
12354	/**
12355  * Gets the difference of two vectors.
12356  * @todo #261
12357  * @protected
12358  * @param {Object} - The first vector.
12359  * @param {Object} - The second vector.
12360  * @returns {Object} - The difference.
12361  */
12362	Owl.prototype.difference = function (first, second) {
12363		return {
12364			x: first.x - second.x,
12365			y: first.y - second.y
12366		};
12367	};
12368
12369	/**
12370  * The jQuery Plugin for the Owl Carousel
vendor: 34,247 bytes, lines 12371-13666
12371  * @todo Navigation plugin `next` and `prev`
12372  * @public
12373  */
12374	$.fn.owlCarousel = function (option) {
12375		var args = Array.prototype.slice.call(arguments, 1);
12376
12377		return this.each(function () {
12378			var $this = $(this),
12379			    data = $this.data('owl.carousel');
12380
12381			if (!data) {
12382				data = new Owl(this, typeof option == 'object' && option);
12383				$this.data('owl.carousel', data);
12384
12385				$.each(['next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'], function (i, event) {
12386					data.register({ type: Owl.Type.Event, name: event });
12387					data.$element.on(event + '.owl.carousel.core', $.proxy(function (e) {
12388						if (e.namespace && e.relatedTarget !== this) {
12389							this.suppress([event]);
12390							data[event].apply(this, [].slice.call(arguments, 1));
12391							this.release([event]);
12392						}
12393					}, data));
12394				});
12395			}
12396
12397			if (typeof option == 'string' && option.charAt(0) !== '_') {
12398				data[option].apply(data, args);
12399			}
12400		});
12401	};
12402
12403	/**
12404  * The constructor for the jQuery Plugin
12405  * @public
12406  */
12407	$.fn.owlCarousel.Constructor = Owl;
12408})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
12409
12410/**
12411 * AutoRefresh Plugin
12412 * @version 2.1.0
12413 * @author Artus Kolanowski
12414 * @author David Deutsch
12415 * @license The MIT License (MIT)
12416 */
12417;(function ($, window, document, undefined) {
12418
12419	/**
12420  * Creates the auto refresh plugin.
12421  * @class The Auto Refresh Plugin
12422  * @param {Owl} carousel - The Owl Carousel
12423  */
12424	var AutoRefresh = function (carousel) {
12425		/**
12426   * Reference to the core.
12427   * @protected
12428   * @type {Owl}
12429   */
12430		this._core = carousel;
12431
12432		/**
12433   * Refresh interval.
12434   * @protected
12435   * @type {number}
12436   */
12437		this._interval = null;
12438
12439		/**
12440   * Whether the element is currently visible or not.
12441   * @protected
12442   * @type {Boolean}
12443   */
12444		this._visible = null;
12445
12446		/**
12447   * All event handlers.
12448   * @protected
12449   * @type {Object}
12450   */
12451		this._handlers = {
12452			'initialized.owl.carousel': $.proxy(function (e) {
12453				if (e.namespace && this._core.settings.autoRefresh) {
12454					this.watch();
12455				}
12456			}, this)
12457		};
12458
12459		// set default options
12460		this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);
12461
12462		// register event handlers
12463		this._core.$element.on(this._handlers);
12464	};
12465
12466	/**
12467  * Default options.
12468  * @public
12469  */
12470	AutoRefresh.Defaults = {
12471		autoRefresh: true,
12472		autoRefreshInterval: 500
12473	};
12474
12475	/**
12476  * Watches the element.
12477  */
12478	AutoRefresh.prototype.watch = function () {
12479		if (this._interval) {
12480			return;
12481		}
12482
12483		this._visible = this._core.$element.is(':visible');
12484		this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
12485	};
12486
12487	/**
12488  * Refreshes the element.
12489  */
12490	AutoRefresh.prototype.refresh = function () {
12491		if (this._core.$element.is(':visible') === this._visible) {
12492			return;
12493		}
12494
12495		this._visible = !this._visible;
12496
12497		this._core.$element.toggleClass('owl-hidden', !this._visible);
12498
12499		this._visible && this._core.invalidate('width') && this._core.refresh();
12500	};
12501
12502	/**
12503  * Destroys the plugin.
12504  */
12505	AutoRefresh.prototype.destroy = function () {
12506		var handler, property;
12507
12508		window.clearInterval(this._interval);
12509
12510		for (handler in this._handlers) {
12511			this._core.$element.off(handler, this._handlers[handler]);
12512		}
12513		for (property in Object.getOwnPropertyNames(this)) {
12514			typeof this[property] != 'function' && (this[property] = null);
12515		}
12516	};
12517
12518	$.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
12519})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
12520
12521/**
12522 * Lazy Plugin
12523 * @version 2.1.0
12524 * @author Bartosz Wojciechowski
12525 * @author David Deutsch
12526 * @license The MIT License (MIT)
12527 */
12528;(function ($, window, document, undefined) {
12529
12530	/**
12531  * Creates the lazy plugin.
12532  * @class The Lazy Plugin
12533  * @param {Owl} carousel - The Owl Carousel
12534  */
12535	var Lazy = function (carousel) {
12536
12537		/**
12538   * Reference to the core.
12539   * @protected
12540   * @type {Owl}
12541   */
12542		this._core = carousel;
12543
12544		/**
12545   * Already loaded items.
12546   * @protected
12547   * @type {Array.<jQuery>}
12548   */
12549		this._loaded = [];
12550
12551		/**
12552   * Event handlers.
12553   * @protected
12554   * @type {Object}
12555   */
12556		this._handlers = {
12557			'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function (e) {
12558				if (!e.namespace) {
12559					return;
12560				}
12561
12562				if (!this._core.settings || !this._core.settings.lazyLoad) {
12563					return;
12564				}
12565
12566				if (e.property && e.property.name == 'position' || e.type == 'initialized') {
12567					var settings = this._core.settings,
12568					    n = settings.center && Math.ceil(settings.items / 2) || settings.items,
12569					    i = settings.center && n * -1 || 0,
12570					    position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
12571					    clones = this._core.clones().length,
12572					    load = $.proxy(function (i, v) {
12573						this.load(v);
12574					}, this);
12575
12576					while (i++ < n) {
12577						this.load(clones / 2 + this._core.relative(position));
12578						clones && $.each(this._core.clones(this._core.relative(position)), load);
12579						position++;
12580					}
12581				}
12582			}, this)
12583		};
12584
12585		// set the default options
12586		this._core.options = $.extend({}, Lazy.Defaults, this._core.options);
12587
12588		// register event handler
12589		this._core.$element.on(this._handlers);
12590	};
12591
12592	/**
12593  * Default options.
12594  * @public
12595  */
12596	Lazy.Defaults = {
12597		lazyLoad: false
12598	};
12599
12600	/**
12601  * Loads all resources of an item at the specified position.
12602  * @param {Number} position - The absolute position of the item.
12603  * @protected
12604  */
12605	Lazy.prototype.load = function (position) {
12606		var $item = this._core.$stage.children().eq(position),
12607		    $elements = $item && $item.find('.owl-lazy');
12608
12609		if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
12610			return;
12611		}
12612
12613		$elements.each($.proxy(function (index, element) {
12614			var $element = $(element),
12615			    image,
12616			    url = window.devicePixelRatio > 1 && $element.attr('data-src-retina') || $element.attr('data-src');
12617
12618			this._core.trigger('load', { element: $element, url: url }, 'lazy');
12619
12620			if ($element.is('img')) {
12621				$element.one('load.owl.lazy', $.proxy(function () {
12622					$element.css('opacity', 1);
12623					this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
12624				}, this)).attr('src', url);
12625			} else {
12626				image = new Image();
12627				image.onload = $.proxy(function () {
12628					$element.css({
12629						'background-image': 'url(' + url + ')',
12630						'opacity': '1'
12631					});
12632					this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
12633				}, this);
12634				image.src = url;
12635			}
12636		}, this));
12637
12638		this._loaded.push($item.get(0));
12639	};
12640
12641	/**
12642  * Destroys the plugin.
12643  * @public
12644  */
12645	Lazy.prototype.destroy = function () {
12646		var handler, property;
12647
12648		for (handler in this.handlers) {
12649			this._core.$element.off(handler, this.handlers[handler]);
12650		}
12651		for (property in Object.getOwnPropertyNames(this)) {
12652			typeof this[property] != 'function' && (this[property] = null);
12653		}
12654	};
12655
12656	$.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
12657})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
12658
12659/**
12660 * AutoHeight Plugin
12661 * @version 2.1.0
12662 * @author Bartosz Wojciechowski
12663 * @author David Deutsch
12664 * @license The MIT License (MIT)
12665 */
12666;(function ($, window, document, undefined) {
12667
12668	/**
12669  * Creates the auto height plugin.
12670  * @class The Auto Height Plugin
12671  * @param {Owl} carousel - The Owl Carousel
12672  */
12673	var AutoHeight = function (carousel) {
12674		/**
12675   * Reference to the core.
12676   * @protected
12677   * @type {Owl}
12678   */
12679		this._core = carousel;
12680
12681		/**
12682   * All event handlers.
12683   * @protected
12684   * @type {Object}
12685   */
12686		this._handlers = {
12687			'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function (e) {
12688				if (e.namespace && this._core.settings.autoHeight) {
12689					this.update();
12690				}
12691			}, this),
12692			'changed.owl.carousel': $.proxy(function (e) {
12693				if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position') {
12694					this.update();
12695				}
12696			}, this),
12697			'loaded.owl.lazy': $.proxy(function (e) {
12698				if (e.namespace && this._core.settings.autoHeight && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
12699					this.update();
12700				}
12701			}, this)
12702		};
12703
12704		// set default options
12705		this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);
12706
12707		// register event handlers
12708		this._core.$element.on(this._handlers);
12709	};
12710
12711	/**
12712  * Default options.
12713  * @public
12714  */
12715	AutoHeight.Defaults = {
12716		autoHeight: false,
12717		autoHeightClass: 'owl-height'
12718	};
12719
12720	/**
12721  * Updates the view.
12722  */
12723	AutoHeight.prototype.update = function () {
12724		var start = this._core._current,
12725		    end = start + this._core.settings.items,
12726		    visible = this._core.$stage.children().toArray().slice(start, end),
12727		    heights = [],
12728		    maxheight = 0;
12729
12730		$.each(visible, function (index, item) {
12731			heights.push($(item).height());
12732		});
12733
12734		maxheight = Math.max.apply(null, heights);
12735
12736		this._core.$stage.parent().height(maxheight).addClass(this._core.settings.autoHeightClass);
12737	};
12738
12739	AutoHeight.prototype.destroy = function () {
12740		var handler, property;
12741
12742		for (handler in this._handlers) {
12743			this._core.$element.off(handler, this._handlers[handler]);
12744		}
12745		for (property in Object.getOwnPropertyNames(this)) {
12746			typeof this[property] != 'function' && (this[property] = null);
12747		}
12748	};
12749
12750	$.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
12751})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
12752
12753/**
12754 * Video Plugin
12755 * @version 2.1.0
12756 * @author Bartosz Wojciechowski
12757 * @author David Deutsch
12758 * @license The MIT License (MIT)
12759 */
12760;(function ($, window, document, undefined) {
12761
12762	/**
12763  * Creates the video plugin.
12764  * @class The Video Plugin
12765  * @param {Owl} carousel - The Owl Carousel
12766  */
12767	var Video = function (carousel) {
12768		/**
12769   * Reference to the core.
12770   * @protected
12771   * @type {Owl}
12772   */
12773		this._core = carousel;
12774
12775		/**
12776   * Cache all video URLs.
12777   * @protected
12778   * @type {Object}
12779   */
12780		this._videos = {};
12781
12782		/**
12783   * Current playing item.
12784   * @protected
12785   * @type {jQuery}
12786   */
12787		this._playing = null;
12788
12789		/**
12790   * All event handlers.
12791   * @todo The cloned content removale is too late
12792   * @protected
12793   * @type {Object}
12794   */
12795		this._handlers = {
12796			'initialized.owl.carousel': $.proxy(function (e) {
12797				if (e.namespace) {
12798					this._core.register({ type: 'state', name: 'playing', tags: ['interacting'] });
12799				}
12800			}, this),
12801			'resize.owl.carousel': $.proxy(function (e) {
12802				if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
12803					e.preventDefault();
12804				}
12805			}, this),
12806			'refreshed.owl.carousel': $.proxy(function (e) {
12807				if (e.namespace && this._core.is('resizing')) {
12808					this._core.$stage.find('.cloned .owl-video-frame').remove();
12809				}
12810			}, this),
12811			'changed.owl.carousel': $.proxy(function (e) {
12812				if (e.namespace && e.property.name === 'position' && this._playing) {
12813					this.stop();
12814				}
12815			}, this),
12816			'prepared.owl.carousel': $.proxy(function (e) {
12817				if (!e.namespace) {
12818					return;
12819				}
12820
12821				var $element = $(e.content).find('.owl-video');
12822
12823				if ($element.length) {
12824					$element.css('display', 'none');
12825					this.fetch($element, $(e.content));
12826				}
12827			}, this)
12828		};
12829
12830		// set default options
12831		this._core.options = $.extend({}, Video.Defaults, this._core.options);
12832
12833		// register event handlers
12834		this._core.$element.on(this._handlers);
12835
12836		this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function (e) {
12837			this.play(e);
12838		}, this));
12839	};
12840
12841	/**
12842  * Default options.
12843  * @public
12844  */
12845	Video.Defaults = {
12846		video: false,
12847		videoHeight: false,
12848		videoWidth: false
12849	};
12850
12851	/**
12852  * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
12853  * @protected
12854  * @param {jQuery} target - The target containing the video data.
12855  * @param {jQuery} item - The item containing the video.
12856  */
12857	Video.prototype.fetch = function (target, item) {
12858		var type = function () {
12859			if (target.attr('data-vimeo-id')) {
12860				return 'vimeo';
12861			} else if (target.attr('data-vzaar-id')) {
12862				return 'vzaar';
12863			} else {
12864				return 'youtube';
12865			}
12866		}(),
12867		    id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
12868		    width = target.attr('data-width') || this._core.settings.videoWidth,
12869		    height = target.attr('data-height') || this._core.settings.videoHeight,
12870		    url = target.attr('href');
12871
12872		if (url) {
12873
12874			/*
12875   		Parses the id's out of the following urls (and probably more):
12876   		https://www.youtube.com/watch?v=:id
12877   		https://youtu.be/:id
12878   		https://vimeo.com/:id
12879   		https://vimeo.com/channels/:channel/:id
12880   		https://vimeo.com/groups/:group/videos/:id
12881   		https://app.vzaar.com/videos/:id
12882   				Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
12883   */
12884
12885			id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);
12886
12887			if (id[3].indexOf('youtu') > -1) {
12888				type = 'youtube';
12889			} else if (id[3].indexOf('vimeo') > -1) {
12890				type = 'vimeo';
12891			} else if (id[3].indexOf('vzaar') > -1) {
12892				type = 'vzaar';
12893			} else {
12894				throw new Error('Video URL not supported.');
12895			}
12896			id = id[6];
12897		} else {
12898			throw new Error('Missing video URL.');
12899		}
12900
12901		this._videos[url] = {
12902			type: type,
12903			id: id,
12904			width: width,
12905			height: height
12906		};
12907
12908		item.attr('data-video', url);
12909
12910		this.thumbnail(target, this._videos[url]);
12911	};
12912
12913	/**
12914  * Creates video thumbnail.
12915  * @protected
12916  * @param {jQuery} target - The target containing the video data.
12917  * @param {Object} info - The video info object.
12918  * @see `fetch`
12919  */
12920	Video.prototype.thumbnail = function (target, video) {
12921		var tnLink,
12922		    icon,
12923		    path,
12924		    dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '',
12925		    customTn = target.find('img'),
12926		    srcType = 'src',
12927		    lazyClass = '',
12928		    settings = this._core.settings,
12929		    create = function (path) {
12930			icon = '<div class="owl-video-play-icon"></div>';
12931
12932			if (settings.lazyLoad) {
12933				tnLink = '<div class="owl-video-tn ' + lazyClass + '" ' + srcType + '="' + path + '"></div>';
12934			} else {
12935				tnLink = '<div class="owl-video-tn" style="opacity:1;background-image:url(' + path + ')"></div>';
12936			}
12937			target.after(tnLink);
12938			target.after(icon);
12939		};
12940
12941		// wrap video content into owl-video-wrapper div
12942		target.wrap('<div class="owl-video-wrapper"' + dimensions + '></div>');
12943
12944		if (this._core.settings.lazyLoad) {
12945			srcType = 'data-src';
12946			lazyClass = 'owl-lazy';
12947		}
12948
12949		// custom thumbnail
12950		if (customTn.length) {
12951			create(customTn.attr(srcType));
12952			customTn.remove();
12953			return false;
12954		}
12955
12956		if (video.type === 'youtube') {
12957			path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
12958			create(path);
12959		} else if (video.type === 'vimeo') {
12960			$.ajax({
12961				type: 'GET',
12962				url: '//vimeo.com/api/v2/video/' + video.id + '.json',
12963				jsonp: 'callback',
12964				dataType: 'jsonp',
12965				success: function (data) {
12966					path = data[0].thumbnail_large;
12967					create(path);
12968				}
12969			});
12970		} else if (video.type === 'vzaar') {
12971			$.ajax({
12972				type: 'GET',
12973				url: '//vzaar.com/api/videos/' + video.id + '.json',
12974				jsonp: 'callback',
12975				dataType: 'jsonp',
12976				success: function (data) {
12977					path = data.framegrab_url;
12978					create(path);
12979				}
12980			});
12981		}
12982	};
12983
12984	/**
12985  * Stops the current video.
12986  * @public
12987  */
12988	Video.prototype.stop = function () {
12989		this._core.trigger('stop', null, 'video');
12990		this._playing.find('.owl-video-frame').remove();
12991		this._playing.removeClass('owl-video-playing');
12992		this._playing = null;
12993		this._core.leave('playing');
12994		this._core.trigger('stopped', null, 'video');
12995	};
12996
12997	/**
12998  * Starts the current video.
12999  * @public
13000  * @param {Event} event - The event arguments.
13001  */
13002	Video.prototype.play = function (event) {
13003		var target = $(event.target),
13004		    item = target.closest('.' + this._core.settings.itemClass),
13005		    video = this._videos[item.attr('data-video')],
13006		    width = video.width || '100%',
13007		    height = video.height || this._core.$stage.height(),
13008		    html;
13009
13010		if (this._playing) {
13011			return;
13012		}
13013
13014		this._core.enter('playing');
13015		this._core.trigger('play', null, 'video');
13016
13017		item = this._core.items(this._core.relative(item.index()));
13018
13019		this._core.reset(item.index());
13020
13021		if (video.type === 'youtube') {
13022			html = '<iframe width="' + width + '" height="' + height + '" src="//www.youtube.com/embed/' + video.id + '?autoplay=1&v=' + video.id + '" frameborder="0" allowfullscreen></iframe>';
13023		} else if (video.type === 'vimeo') {
13024			html = '<iframe src="//player.vimeo.com/video/' + video.id + '?autoplay=1" width="' + width + '" height="' + height + '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
13025		} else if (video.type === 'vzaar') {
13026			html = '<iframe frameborder="0"' + 'height="' + height + '"' + 'width="' + width + '" allowfullscreen mozallowfullscreen webkitAllowFullScreen ' + 'src="//view.vzaar.com/' + video.id + '/player?autoplay=true"></iframe>';
13027		}
13028
13029		$('<div class="owl-video-frame">' + html + '</div>').insertAfter(item.find('.owl-video'));
13030
13031		this._playing = item.addClass('owl-video-playing');
13032	};
13033
13034	/**
13035  * Checks whether an video is currently in full screen mode or not.
13036  * @todo Bad style because looks like a readonly method but changes members.
13037  * @protected
13038  * @returns {Boolean}
13039  */
13040	Video.prototype.isInFullScreen = function () {
13041		var element = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement;
13042
13043		return element && $(element).parent().hasClass('owl-video-frame');
13044	};
13045
13046	/**
13047  * Destroys the plugin.
13048  */
13049	Video.prototype.destroy = function () {
13050		var handler, property;
13051
13052		this._core.$element.off('click.owl.video');
13053
13054		for (handler in this._handlers) {
13055			this._core.$element.off(handler, this._handlers[handler]);
13056		}
13057		for (property in Object.getOwnPropertyNames(this)) {
13058			typeof this[property] != 'function' && (this[property] = null);
13059		}
13060	};
13061
13062	$.fn.owlCarousel.Constructor.Plugins.Video = Video;
13063})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
13064
13065/**
13066 * Animate Plugin
13067 * @version 2.1.0
13068 * @author Bartosz Wojciechowski
13069 * @author David Deutsch
13070 * @license The MIT License (MIT)
13071 */
13072;(function ($, window, document, undefined) {
13073
13074	/**
13075  * Creates the animate plugin.
13076  * @class The Navigation Plugin
13077  * @param {Owl} scope - The Owl Carousel
13078  */
13079	var Animate = function (scope) {
13080		this.core = scope;
13081		this.core.options = $.extend({}, Animate.Defaults, this.core.options);
13082		this.swapping = true;
13083		this.previous = undefined;
13084		this.next = undefined;
13085
13086		this.handlers = {
13087			'change.owl.carousel': $.proxy(function (e) {
13088				if (e.namespace && e.property.name == 'position') {
13089					this.previous = this.core.current();
13090					this.next = e.property.value;
13091				}
13092			}, this),
13093			'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function (e) {
13094				if (e.namespace) {
13095					this.swapping = e.type == 'translated';
13096				}
13097			}, this),
13098			'translate.owl.carousel': $.proxy(function (e) {
13099				if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
13100					this.swap();
13101				}
13102			}, this)
13103		};
13104
13105		this.core.$element.on(this.handlers);
13106	};
13107
13108	/**
13109  * Default options.
13110  * @public
13111  */
13112	Animate.Defaults = {
13113		animateOut: false,
13114		animateIn: false
13115	};
13116
13117	/**
13118  * Toggles the animation classes whenever an translations starts.
13119  * @protected
13120  * @returns {Boolean|undefined}
13121  */
13122	Animate.prototype.swap = function () {
13123
13124		if (this.core.settings.items !== 1) {
13125			return;
13126		}
13127
13128		if (!$.support.animation || !$.support.transition) {
13129			return;
13130		}
13131
13132		this.core.speed(0);
13133
13134		var left,
13135		    clear = $.proxy(this.clear, this),
13136		    previous = this.core.$stage.children().eq(this.previous),
13137		    next = this.core.$stage.children().eq(this.next),
13138		    incoming = this.core.settings.animateIn,
13139		    outgoing = this.core.settings.animateOut;
13140
13141		if (this.core.current() === this.previous) {
13142			return;
13143		}
13144
13145		if (outgoing) {
13146			left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
13147			previous.one($.support.animation.end, clear).css({ 'left': left + 'px' }).addClass('animated owl-animated-out').addClass(outgoing);
13148		}
13149
13150		if (incoming) {
13151			next.one($.support.animation.end, clear).addClass('animated owl-animated-in').addClass(incoming);
13152		}
13153	};
13154
13155	Animate.prototype.clear = function (e) {
13156		$(e.target).css({ 'left': '' }).removeClass('animated owl-animated-out owl-animated-in').removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut);
13157		this.core.onTransitionEnd();
13158	};
13159
13160	/**
13161  * Destroys the plugin.
13162  * @public
13163  */
13164	Animate.prototype.destroy = function () {
13165		var handler, property;
13166
13167		for (handler in this.handlers) {
13168			this.core.$element.off(handler, this.handlers[handler]);
13169		}
13170		for (property in Object.getOwnPropertyNames(this)) {
13171			typeof this[property] != 'function' && (this[property] = null);
13172		}
13173	};
13174
13175	$.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
13176})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
13177
13178/**
13179 * Autoplay Plugin
13180 * @version 2.1.0
13181 * @author Bartosz Wojciechowski
13182 * @author Artus Kolanowski
13183 * @author David Deutsch
13184 * @license The MIT License (MIT)
13185 */
13186;(function ($, window, document, undefined) {
13187
13188	/**
13189  * Creates the autoplay plugin.
13190  * @class The Autoplay Plugin
13191  * @param {Owl} scope - The Owl Carousel
13192  */
13193	var Autoplay = function (carousel) {
13194		/**
13195   * Reference to the core.
13196   * @protected
13197   * @type {Owl}
13198   */
13199		this._core = carousel;
13200
13201		/**
13202   * The autoplay timeout.
13203   * @type {Timeout}
13204   */
13205		this._timeout = null;
13206
13207		/**
13208   * Indicates whenever the autoplay is paused.
13209   * @type {Boolean}
13210   */
13211		this._paused = false;
13212
13213		/**
13214   * All event handlers.
13215   * @protected
13216   * @type {Object}
13217   */
13218		this._handlers = {
13219			'changed.owl.carousel': $.proxy(function (e) {
13220				if (e.namespace && e.property.name === 'settings') {
13221					if (this._core.settings.autoplay) {
13222						this.play();
13223					} else {
13224						this.stop();
13225					}
13226				} else if (e.namespace && e.property.name === 'position') {
13227					//console.log('play?', e);
13228					if (this._core.settings.autoplay) {
13229						this._setAutoPlayInterval();
13230					}
13231				}
13232			}, this),
13233			'initialized.owl.carousel': $.proxy(function (e) {
13234				if (e.namespace && this._core.settings.autoplay) {
13235					this.play();
13236				}
13237			}, this),
13238			'play.owl.autoplay': $.proxy(function (e, t, s) {
13239				if (e.namespace) {
13240					this.play(t, s);
13241				}
13242			}, this),
13243			'stop.owl.autoplay': $.proxy(function (e) {
13244				if (e.namespace) {
13245					this.stop();
13246				}
13247			}, this),
13248			'mouseover.owl.autoplay': $.proxy(function () {
13249				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
13250					this.pause();
13251				}
13252			}, this),
13253			'mouseleave.owl.autoplay': $.proxy(function () {
13254				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
13255					this.play();
13256				}
13257			}, this),
13258			'touchstart.owl.core': $.proxy(function () {
13259				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
13260					this.pause();
13261				}
13262			}, this),
13263			'touchend.owl.core': $.proxy(function () {
13264				if (this._core.settings.autoplayHoverPause) {
13265					this.play();
13266				}
13267			}, this)
13268		};
13269
13270		// register event handlers
13271		this._core.$element.on(this._handlers);
13272
13273		// set default options
13274		this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
13275	};
13276
13277	/**
13278  * Default options.
13279  * @public
13280  */
13281	Autoplay.Defaults = {
13282		autoplay: false,
13283		autoplayTimeout: 5000,
13284		autoplayHoverPause: false,
13285		autoplaySpeed: false
13286	};
13287
13288	/**
13289  * Starts the autoplay.
13290  * @public
13291  * @param {Number} [timeout] - The interval before the next animation starts.
13292  * @param {Number} [speed] - The animation speed for the animations.
13293  */
13294	Autoplay.prototype.play = function (timeout, speed) {
13295		this._paused = false;
13296
13297		if (this._core.is('rotating')) {
13298			return;
13299		}
13300
13301		this._core.enter('rotating');
13302
13303		this._setAutoPlayInterval();
13304	};
13305
13306	/**
13307  * Gets a new timeout
13308  * @private
13309  * @param {Number} [timeout] - The interval before the next animation starts.
13310  * @param {Number} [speed] - The animation speed for the animations.
13311  * @return {Timeout}
13312  */
13313	Autoplay.prototype._getNextTimeout = function (timeout, speed) {
13314		if (this._timeout) {
13315			window.clearTimeout(this._timeout);
13316		}
13317		return window.setTimeout($.proxy(function () {
13318			if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) {
13319				return;
13320			}
13321			this._core.next(speed || this._core.settings.autoplaySpeed);
13322		}, this), timeout || this._core.settings.autoplayTimeout);
13323	};
13324
13325	/**
13326  * Sets autoplay in motion.
13327  * @private
13328  */
13329	Autoplay.prototype._setAutoPlayInterval = function () {
13330		this._timeout = this._getNextTimeout();
13331	};
13332
13333	/**
13334  * Stops the autoplay.
13335  * @public
13336  */
13337	Autoplay.prototype.stop = function () {
13338		if (!this._core.is('rotating')) {
13339			return;
13340		}
13341
13342		window.clearTimeout(this._timeout);
13343		this._core.leave('rotating');
13344	};
13345
13346	/**
13347  * Stops the autoplay.
13348  * @public
13349  */
13350	Autoplay.prototype.pause = function () {
13351		if (!this._core.is('rotating')) {
13352			return;
13353		}
13354
13355		this._paused = true;
13356	};
13357
13358	/**
13359  * Destroys the plugin.
13360  */
13361	Autoplay.prototype.destroy = function () {
13362		var handler, property;
13363
13364		this.stop();
13365
13366		for (handler in this._handlers) {
13367			this._core.$element.off(handler, this._handlers[handler]);
13368		}
13369		for (property in Object.getOwnPropertyNames(this)) {
13370			typeof this[property] != 'function' && (this[property] = null);
13371		}
13372	};
13373
13374	$.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
13375})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
13376
13377/**
13378 * Navigation Plugin
13379 * @version 2.1.0
13380 * @author Artus Kolanowski
13381 * @author David Deutsch
13382 * @license The MIT License (MIT)
13383 */
13384;(function ($, window, document, undefined) {
13385	'use strict';
13386
13387	/**
13388  * Creates the navigation plugin.
13389  * @class The Navigation Plugin
13390  * @param {Owl} carousel - The Owl Carousel.
13391  */
13392
13393	var Navigation = function (carousel) {
13394		/**
13395   * Reference to the core.
13396   * @protected
13397   * @type {Owl}
13398   */
13399		this._core = carousel;
13400
13401		/**
13402   * Indicates whether the plugin is initialized or not.
13403   * @protected
13404   * @type {Boolean}
13405   */
13406		this._initialized = false;
13407
13408		/**
13409   * The current paging indexes.
13410   * @protected
13411   * @type {Array}
13412   */
13413		this._pages = [];
13414
13415		/**
13416   * All DOM elements of the user interface.
13417   * @protected
13418   * @type {Object}
13419   */
13420		this._controls = {};
13421
13422		/**
13423   * Markup for an indicator.
13424   * @protected
13425   * @type {Array.<String>}
13426   */
13427		this._templates = [];
13428
13429		/**
13430   * The carousel element.
13431   * @type {jQuery}
13432   */
13433		this.$element = this._core.$element;
13434
13435		/**
13436   * Overridden methods of the carousel.
13437   * @protected
13438   * @type {Object}
13439   */
13440		this._overrides = {
13441			next: this._core.next,
13442			prev: this._core.prev,
13443			to: this._core.to
13444		};
13445
13446		/**
13447   * All event handlers.
13448   * @protected
13449   * @type {Object}
13450   */
13451		this._handlers = {
13452			'prepared.owl.carousel': $.proxy(function (e) {
13453				if (e.namespace && this._core.settings.dotsData) {
13454					this._templates.push('<div class="' + this._core.settings.dotClass + '">' + $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');
13455				}
13456			}, this),
13457			'added.owl.carousel': $.proxy(function (e) {
13458				if (e.namespace && this._core.settings.dotsData) {
13459					this._templates.splice(e.position, 0, this._templates.pop());
13460				}
13461			}, this),
13462			'remove.owl.carousel': $.proxy(function (e) {
13463				if (e.namespace && this._core.settings.dotsData) {
13464					this._templates.splice(e.position, 1);
13465				}
13466			}, this),
13467			'changed.owl.carousel': $.proxy(function (e) {
13468				if (e.namespace && e.property.name == 'position') {
13469					this.draw();
13470				}
13471			}, this),
13472			'initialized.owl.carousel': $.proxy(function (e) {
13473				if (e.namespace && !this._initialized) {
13474					this._core.trigger('initialize', null, 'navigation');
13475					this.initialize();
13476					this.update();
13477					this.draw();
13478					this._initialized = true;
13479					this._core.trigger('initialized', null, 'navigation');
13480				}
13481			}, this),
13482			'refreshed.owl.carousel': $.proxy(function (e) {
13483				if (e.namespace && this._initialized) {
13484					this._core.trigger('refresh', null, 'navigation');
13485					this.update();
13486					this.draw();
13487					this._core.trigger('refreshed', null, 'navigation');
13488				}
13489			}, this)
13490		};
13491
13492		// set default options
13493		this._core.options = $.extend({}, Navigation.Defaults, this._core.options);
13494
13495		// register event handlers
13496		this.$element.on(this._handlers);
13497	};
13498
13499	/**
13500  * Default options.
13501  * @public
13502  * @todo Rename `slideBy` to `navBy`
13503  */
13504	Navigation.Defaults = {
13505		nav: false,
13506		navText: ['<i class="icon-arrow-left"></i>', '<i class="icon-arrow-right"></i>'],
13507		navSpeed: false,
13508		navElement: 'div',
13509		navContainer: false,
13510		navContainerClass: 'owl-nav',
13511		navClass: ['owl-prev', 'owl-next'],
13512		slideBy: 1,
13513		dotClass: 'owl-dot',
13514		dotsClass: 'owl-dots',
13515		dots: true,
13516		dotsEach: false,
13517		dotsData: false,
13518		dotsSpeed: false,
13519		dotsContainer: false
13520	};
13521
13522	/**
13523  * Initializes the layout of the plugin and extends the carousel.
13524  * @protected
13525  */
13526	Navigation.prototype.initialize = function () {
13527		var override,
13528		    settings = this._core.settings;
13529
13530		// create DOM structure for relative navigation
13531		this._controls.$relative = (settings.navContainer ? $(settings.navContainer) : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');
13532
13533		this._controls.$previous = $('<' + settings.navElement + '>').addClass(settings.navClass[0]).html(settings.navText[0]).prependTo(this._controls.$relative).on('click', $.proxy(function (e) {
13534			this.prev(settings.navSpeed);
13535		}, this));
13536		this._controls.$next = $('<' + settings.navElement + '>').addClass(settings.navClass[1]).html(settings.navText[1]).appendTo(this._controls.$relative).on('click', $.proxy(function (e) {
13537			this.next(settings.navSpeed);
13538		}, this));
13539
13540		// create DOM structure for absolute navigation
13541		if (!settings.dotsData) {
13542			this._templates = [$('<div>').addClass(settings.dotClass).append($('<span>')).prop('outerHTML')];
13543		}
13544
13545		this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer) : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');
13546
13547		this._controls.$absolute.on('click', 'div', $.proxy(function (e) {
13548			var index = $(e.target).parent().is(this._controls.$absolute) ? $(e.target).index() : $(e.target).parent().index();
13549
13550			e.preventDefault();
13551
13552			this.to(index, settings.dotsSpeed);
13553		}, this));
13554
13555		// override public methods of the carousel
13556		for (override in this._overrides) {
13557			this._core[override] = $.proxy(this[override], this);
13558		}
13559	};
13560
13561	/**
13562  * Destroys the plugin.
13563  * @protected
13564  */
13565	Navigation.prototype.destroy = function () {
13566		var handler, control, property, override;
13567
13568		for (handler in this._handlers) {
13569			this.$element.off(handler, this._handlers[handler]);
13570		}
13571		for (control in this._controls) {
13572			this._controls[control].remove();
13573		}
13574		for (override in this.overides) {
13575			this._core[override] = this._overrides[override];
13576		}
13577		for (property in Object.getOwnPropertyNames(this)) {
13578			typeof this[property] != 'function' && (this[property] = null);
13579		}
13580	};
13581
13582	/**
13583  * Updates the internal state.
13584  * @protected
13585  */
13586	Navigation.prototype.update = function () {
13587		var i,
13588		    j,
13589		    k,
13590		    lower = this._core.clones().length / 2,
13591		    upper = lower + this._core.items().length,
13592		    maximum = this._core.maximum(true),
13593		    settings = this._core.settings,
13594		    size = settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items;
13595
13596		if (settings.slideBy !== 'page') {
13597			settings.slideBy = Math.min(settings.slideBy, settings.items);
13598		}
13599
13600		if (settings.dots || settings.slideBy == 'page') {
13601			this._pages = [];
13602
13603			for (i = lower, j = 0, k = 0; i < upper; i++) {
13604				if (j >= size || j === 0) {
13605					this._pages.push({
13606						start: Math.min(maximum, i - lower),
13607						end: i - lower + size - 1
13608					});
13609					if (Math.min(maximum, i - lower) === maximum) {
13610						break;
13611					}
13612					j = 0, ++k;
13613				}
13614				j += this._core.mergers(this._core.relative(i));
13615			}
13616		}
13617	};
13618
13619	/**
13620  * Draws the user interface.
13621  * @todo The option `dotsData` wont work.
13622  * @protected
13623  */
13624	Navigation.prototype.draw = function () {
13625		var difference,
13626		    settings = this._core.settings,
13627		    disabled = this._core.items().length <= settings.items,
13628		    index = this._core.relative(this._core.current()),
13629		    loop = settings.loop || settings.rewind;
13630
13631		this._controls.$relative.toggleClass('disabled', !settings.nav || disabled);
13632
13633		if (settings.nav) {
13634			this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));
13635			this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));
13636		}
13637
13638		this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);
13639
13640		if (settings.dots) {
13641			difference = this._pages.length - this._controls.$absolute.children().length;
13642
13643			if (settings.dotsData && difference !== 0) {
13644				this._controls.$absolute.html(this._templates.join(''));
13645			} else if (difference > 0) {
13646				this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));
13647			} else if (difference < 0) {
13648				this._controls.$absolute.children().slice(difference).remove();
13649			}
13650
13651			this._controls.$absolute.find('.active').removeClass('active');
13652			this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');
13653		}
13654	};
13655
13656	/**
13657  * Extends event data.
13658  * @protected
13659  * @param {Event} event - The event object which gets thrown.
13660  */
13661	Navigation.prototype.onTrigger = function (event) {
13662		var settings = this._core.settings;
13663
13664		event.page = {
13665			index: $.inArray(this.current(), this._pages),
13666			count: this._pages.length,
vendor: 6,644 bytes, lines 13667-13922
13667			size: settings && (settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items)
13668		};
13669	};
13670
13671	/**
13672  * Gets the current page position of the carousel.
13673  * @protected
13674  * @returns {Number}
13675  */
13676	Navigation.prototype.current = function () {
13677		var current = this._core.relative(this._core.current());
13678		return $.grep(this._pages, $.proxy(function (page, index) {
13679			return page.start <= current && page.end >= current;
13680		}, this)).pop();
13681	};
13682
13683	/**
13684  * Gets the current succesor/predecessor position.
13685  * @protected
13686  * @returns {Number}
13687  */
13688	Navigation.prototype.getPosition = function (successor) {
13689		var position,
13690		    length,
13691		    settings = this._core.settings;
13692
13693		if (settings.slideBy == 'page') {
13694			position = $.inArray(this.current(), this._pages);
13695			length = this._pages.length;
13696			successor ? ++position : --position;
13697			position = this._pages[(position % length + length) % length].start;
13698		} else {
13699			position = this._core.relative(this._core.current());
13700			length = this._core.items().length;
13701			successor ? position += settings.slideBy : position -= settings.slideBy;
13702		}
13703
13704		return position;
13705	};
13706
13707	/**
13708  * Slides to the next item or page.
13709  * @public
13710  * @param {Number} [speed=false] - The time in milliseconds for the transition.
13711  */
13712	Navigation.prototype.next = function (speed) {
13713		$.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);
13714	};
13715
13716	/**
13717  * Slides to the previous item or page.
13718  * @public
13719  * @param {Number} [speed=false] - The time in milliseconds for the transition.
13720  */
13721	Navigation.prototype.prev = function (speed) {
13722		$.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);
13723	};
13724
13725	/**
13726  * Slides to the specified item or page.
13727  * @public
13728  * @param {Number} position - The position of the item or page.
13729  * @param {Number} [speed] - The time in milliseconds for the transition.
13730  * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.
13731  */
13732	Navigation.prototype.to = function (position, speed, standard) {
13733		var length;
13734
13735		if (!standard && this._pages.length) {
13736			length = this._pages.length;
13737			$.proxy(this._overrides.to, this._core)(this._pages[(position % length + length) % length].start, speed);
13738		} else {
13739			$.proxy(this._overrides.to, this._core)(position, speed);
13740		}
13741	};
13742
13743	$.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;
13744})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
13745
13746/**
13747 * Hash Plugin
13748 * @version 2.1.0
13749 * @author Artus Kolanowski
13750 * @author David Deutsch
13751 * @license The MIT License (MIT)
13752 */
13753;(function ($, window, document, undefined) {
13754	'use strict';
13755
13756	/**
13757  * Creates the hash plugin.
13758  * @class The Hash Plugin
13759  * @param {Owl} carousel - The Owl Carousel
13760  */
13761
13762	var Hash = function (carousel) {
13763		/**
13764   * Reference to the core.
13765   * @protected
13766   * @type {Owl}
13767   */
13768		this._core = carousel;
13769
13770		/**
13771   * Hash index for the items.
13772   * @protected
13773   * @type {Object}
13774   */
13775		this._hashes = {};
13776
13777		/**
13778   * The carousel element.
13779   * @type {jQuery}
13780   */
13781		this.$element = this._core.$element;
13782
13783		/**
13784   * All event handlers.
13785   * @protected
13786   * @type {Object}
13787   */
13788		this._handlers = {
13789			'initialized.owl.carousel': $.proxy(function (e) {
13790				if (e.namespace && this._core.settings.startPosition === 'URLHash') {
13791					$(window).trigger('hashchange.owl.navigation');
13792				}
13793			}, this),
13794			'prepared.owl.carousel': $.proxy(function (e) {
13795				if (e.namespace) {
13796					var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');
13797
13798					if (!hash) {
13799						return;
13800					}
13801
13802					this._hashes[hash] = e.content;
13803				}
13804			}, this),
13805			'changed.owl.carousel': $.proxy(function (e) {
13806				if (e.namespace && e.property.name === 'position') {
13807					var current = this._core.items(this._core.relative(this._core.current())),
13808					    hash = $.map(this._hashes, function (item, hash) {
13809						return item === current ? hash : null;
13810					}).join();
13811
13812					if (!hash || window.location.hash.slice(1) === hash) {
13813						return;
13814					}
13815
13816					window.location.hash = hash;
13817				}
13818			}, this)
13819		};
13820
13821		// set default options
13822		this._core.options = $.extend({}, Hash.Defaults, this._core.options);
13823
13824		// register the event handlers
13825		this.$element.on(this._handlers);
13826
13827		// register event listener for hash navigation
13828		$(window).on('hashchange.owl.navigation', $.proxy(function (e) {
13829			var hash = window.location.hash.substring(1),
13830			    items = this._core.$stage.children(),
13831			    position = this._hashes[hash] && items.index(this._hashes[hash]);
13832
13833			if (position === undefined || position === this._core.current()) {
13834				return;
13835			}
13836
13837			this._core.to(this._core.relative(position), false, true);
13838		}, this));
13839	};
13840
13841	/**
13842  * Default options.
13843  * @public
13844  */
13845	Hash.Defaults = {
13846		URLhashListener: false
13847	};
13848
13849	/**
13850  * Destroys the plugin.
13851  * @public
13852  */
13853	Hash.prototype.destroy = function () {
13854		var handler, property;
13855
13856		$(window).off('hashchange.owl.navigation');
13857
13858		for (handler in this._handlers) {
13859			this._core.$element.off(handler, this._handlers[handler]);
13860		}
13861		for (property in Object.getOwnPropertyNames(this)) {
13862			typeof this[property] != 'function' && (this[property] = null);
13863		}
13864	};
13865
13866	$.fn.owlCarousel.Constructor.Plugins.Hash = Hash;
13867})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
13868
13869/**
13870 * Support Plugin
13871 *
13872 * @version 2.1.0
13873 * @author Vivid Planet Software GmbH
13874 * @author Artus Kolanowski
13875 * @author David Deutsch
13876 * @license The MIT License (MIT)
13877 */
13878;(function ($, window, document, undefined) {
13879
13880	var style = $('<support>').get(0).style,
13881	    prefixes = 'Webkit Moz O ms'.split(' '),
13882	    events = {
13883		transition: {
13884			end: {
13885				WebkitTransition: 'webkitTransitionEnd',
13886				MozTransition: 'transitionend',
13887				OTransition: 'oTransitionEnd',
13888				transition: 'transitionend'
13889			}
13890		},
13891		animation: {
13892			end: {
13893				WebkitAnimation: 'webkitAnimationEnd',
13894				MozAnimation: 'animationend',
13895				OAnimation: 'oAnimationEnd',
13896				animation: 'animationend'
13897			}
13898		}
13899	},
13900	    tests = {
13901		csstransforms: function () {
13902			return !!test('transform');
13903		},
13904		csstransforms3d: function () {
13905			return !!test('perspective');
13906		},
13907		csstransitions: function () {
13908			return !!test('transition');
13909		},
13910		cssanimations: function () {
13911			return !!test('animation');
13912		}
13913	};
13914
13915	function test(property, prefixed) {
13916		var result = false,
13917		    upper = property.charAt(0).toUpperCase() + property.slice(1);
13918
13919		$.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function (i, property) {
13920			if (style[property] !== undefined) {
13921				result = prefixed ? property : true;
13922				return false;
13923			}
13924		});
13925
13926		return result;
13927	}
13928
13929	function prefixed(property) {
13930		return test(property, true);
13931	}
13932
13933	if (tests.csstransitions()) {
13934		/* jshint -W053 */
13935		$.support.transition = new String(prefixed('transition'));
13936		$.support.transition.end = events.transition.end[$.support.transition];
13937	}
13938
13939	if (tests.cssanimations()) {
13940		/* jshint -W053 */
13941		$.support.animation = new String(prefixed('animation'));
13942		$.support.animation.end = events.animation.end[$.support.animation];
13943	}
13944
13945	if (tests.csstransforms()) {
13946		/* jshint -W053 */
13947		$.support.transform = new String(prefixed('transform'));
13948		$.support.transform3d = tests.csstransforms3d();
13949	}
13950})(window.Zepto || __webpack_provided_window_dot_jQuery, window, document);
13951/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(0)))
13952
13953/***/ }),
13954
13955/***/ 14:
13956/***/ (function(module, exports, __webpack_require__) {
13957
13958// style-loader: Adds some css to the DOM by adding a <style> tag
13959
13960// load the styles
13961var content = __webpack_require__(15);
13962if(typeof content === 'string') content = [[module.i, content, '']];
13963// Prepare cssTransformation
13964var transform;
13965
13966var options = {}
13967options.transform = transform
13968// add the styles to the DOM
13969var update = __webpack_require__(4)(content, options);
13970if(content.locals) module.exports = content.locals;
13971// Hot Module Replacement
13972if(false) {
13973	// When the styles change, update the <style> tags
13974	if(!content.locals) {
13975		module.hot.accept("!!../../../../node_modules/css-loader/index.js!./owl.carousel.min.css", function() {
13976			var newContent = require("!!../../../../node_modules/css-loader/index.js!./owl.carousel.min.css");
13977			if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
13978			update(newContent);
13979		});
13980	}
13981	// When the module is disposed, remove the <style> tags
13982	module.hot.dispose(function() { update(); });
13983}
13984
13985/***/ }),
13986
13987/***/ 15:
13988/***/ (function(module, exports, __webpack_require__) {
13989
13990exports = module.exports = __webpack_require__(3)(undefined);
13991// imports
13992
13993
13994// module
13995exports.push([module.i, ".owl-carousel{display:none;width:100%;-webkit-tap-highlight-color:transparent;position:relative;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y}.owl-carousel .owl-stage:after{content:\".\";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0px, 0px, 0px)}.owl-carousel .owl-item{position:relative;min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%;-webkit-transform-style:preserve-3d}.owl-carousel .owl-nav.disabled,.owl-carousel .owl-dots.disabled{display:none}.owl-carousel .owl-nav .owl-prev,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-dot{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-loaded{display:block}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}
13995.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.no-js .owl-carousel{display:block}.owl-carousel .animated{animation-duration:1000ms;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height 500ms ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity 400ms ease}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(" + __webpack_require__(16) + ") no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform 100ms ease}.owl-carousel .owl-video-play-icon:hover{transform:scale(1.3, 1.3)}.owl-carousel .owl-video-playing .owl-video-tn,.owl-carousel .owl-video-playing .owl-video-play-icon{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity 400ms ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}", ""]);
13996
13997// exports
13998
13999
14000/***/ }),
14001
14002/***/ 16:
14003/***/ (function(module, exports, __webpack_require__) {
14004
14005module.exports = __webpack_require__.p + "4a37f8008959c75f619bf0a3a4e2d7a2.png";
14006
14007/***/ }),
14008
14009/***/ 17:
14010/***/ (function(module, exports, __webpack_require__) {
14011
14012// style-loader: Adds some css to the DOM by adding a <style> tag
14013
14014// load the styles
14015var content = __webpack_require__(18);
14016if(typeof content === 'string') content = [[module.i, content, '']];
14017// Prepare cssTransformation
14018var transform;
14019
14020var options = {}
14021options.transform = transform
14022// add the styles to the DOM
14023var update = __webpack_require__(4)(content, options);
14024if(content.locals) module.exports = content.locals;
14025// Hot Module Replacement
14026if(false) {
14027	// When the styles change, update the <style> tags
14028	if(!content.locals) {
14029		module.hot.accept("!!../../../../node_modules/css-loader/index.js!./owl.theme.default.min.css", function() {
14030			var newContent = require("!!../../../../node_modules/css-loader/index.js!./owl.theme.default.min.css");
14031			if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
14032			update(newContent);
14033		});
14034	}
14035	// When the module is disposed, remove the <style> tags
14036	module.hot.dispose(function() { update(); });
14037}
14038
14039/***/ }),
14040
14041/***/ 18:
14042/***/ (function(module, exports, __webpack_require__) {
14043
14044exports = module.exports = __webpack_require__(3)(undefined);
14045// imports
14046
14047
14048// module
14049exports.push([module.i, ".owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav [class*='owl-']{position:absolute;color:#FFF;font-size:22px;margin:0;padding:8px;background:rgba(0,0,0,0.3);background:url(/img/mask-30.png) \\9;display:inline-block;cursor:pointer;height:34px;width:34px;border-radius:50%;top:50%;margin-top:-34px}.owl-theme .owl-nav [class*='owl-']:hover{background:rgba(0,0,0,0.2);background:url(/img/mask-20.png) \\9;color:#FFF;text-decoration:none}.owl-theme .owl-nav .owl-prev{left:30px}.owl-theme .owl-nav .owl-next{right:30px}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots{margin-top:25px;text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1;*display:inline}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#ebebeb;display:block;-webkit-backface-visibility:visible;transition:opacity 200ms ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#ef4632}.owl-theme.status-nav-outside .owl-nav .owl-prev{left:-80px}.owl-theme.status-nav-outside .owl-nav .owl-next{right:-80px}", ""]);
14050
14051// exports
14052
14053
14054/***/ }),
14055
14056/***/ 19:
14057/***/ (function(module, exports, __webpack_require__) {
14058
14059// style-loader: Adds some css to the DOM by adding a <style> tag
14060
14061// load the styles
14062var content = __webpack_require__(20);
14063if(typeof content === 'string') content = [[module.i, content, '']];
14064// Prepare cssTransformation
14065var transform;
14066
14067var options = {}
14068options.transform = transform
14069// add the styles to the DOM
14070var update = __webpack_require__(4)(content, options);
14071if(content.locals) module.exports = content.locals;
14072// Hot Module Replacement
14073if(false) {
14074	// When the styles change, update the <style> tags
14075	if(!content.locals) {
14076		module.hot.accept("!!../../../../node_modules/css-loader/index.js!./animate.css", function() {
14077			var newContent = require("!!../../../../node_modules/css-loader/index.js!./animate.css");
14078			if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
14079			update(newContent);
14080		});
14081	}
14082	// When the module is disposed, remove the <style> tags
14083	module.hot.dispose(function() { update(); });
14084}
14085
14086/***/ }),
14087
14088/***/ 20:
14089/***/ (function(module, exports, __webpack_require__) {
14090
14091exports = module.exports = __webpack_require__(3)(undefined);
14092// imports
14093
14094
14095// module
14096exports.push([module.i, "@charset \"UTF-8\";/*!\r\n * animate.css -http://daneden.me/animate\r\n * Version - 3.5.2\r\n * Licensed under the MIT license - http://opensource.org/licenses/MIT\r\n *\r\n * Copyright (c) 2017 Daniel Eden\r\n */.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.flipOutX,.animated.flipOutY,.animated.bounceIn,.animated.bounceOut{animation-duration:.75s}@keyframes bounce{from,20%,53%,80%,to{animation-timing-function:cubic-bezier(0.215, .610, .355, 1.000);transform:translate3d(0,0,0)}40%,43%{animation-timing-function:cubic-bezier(0.755, .050, .855, .060);transform:translate3d(0, -30px, 0)}70%{animation-timing-function:cubic-bezier(0.755, .050, .855, .060);transform:translate3d(0, -15px, 0)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{from,50%,to{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{from{transform:scale3d(1, 1, 1)}50%{transform:scale3d(1.05, 1.05, 1.05)}to{transform:scale3d(1, 1, 1)}}.pulse{animation-name:pulse}@keyframes rubberBand{from{transform:scale3d(1, 1, 1)}30%{transform:scale3d(1.25, .75, 1)}40%{transform:scale3d(0.75, 1.25, 1)}50%{transform:scale3d(1.15, .85, 1)}65%{transform:scale3d(.95, 1.05, 1)}75%{transform:scale3d(1.05, .95, 1)}to{transform:scale3d(1, 1, 1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{from,to{transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{transform:translate3d(10px, 0, 0)}}.shake{animation-name:shake}@keyframes headShake{0%{transform:translateX(0)}6.5%{transform:translateX(-6px) rotateY(-9deg)}18.5%{transform:translateX(5px) rotateY(7deg)}31.5%{transform:translateX(-3px) rotateY(-5deg)}43.5%{transform:translateX(2px) rotateY(3deg)}50%{transform:translateX(0)}}.headShake{animation-timing-function:ease-in-out;animation-name:headShake}@keyframes swing{20%{transform:rotate3d(0, 0, 1, 15deg)}40%{transform:rotate3d(0, 0, 1, -10deg)}60%{transform:rotate3d(0, 0, 1, 5deg)}80%{transform:rotate3d(0, 0, 1, -5deg)}to{transform:rotate3d(0, 0, 1, 0deg)}}.swing{transform-origin:top center;animation-name:swing}@keyframes tada{from{transform:scale3d(1, 1, 1)}10%,20%{transform:scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)}30%,50%,70%,90%{transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)}40%,60%,80%{transform:scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)}to{transform:scale3d(1, 1, 1)}}.tada{animation-name:tada}@keyframes wobble{from{transform:none}15%{transform:translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg)}30%{transform:translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)}45%{transform:translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)}60%{transform:translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)}75%{transform:translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)}to{transform:none}}.wobble{animation-name:wobble}@keyframes jello{from,11.1%,to{transform:none}22.2%{transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{transform:skewX(6.25deg) skewY(6.25deg)}44.4%{transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{transform:skewX(-0.78125deg) skewY(-0.78125deg)}77.7%{transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{transform:skewX(-0.1953125deg) skewY(-0.1953125deg)}}.jello{animation-name:jello;transform-origin:center}@keyframes bounceIn{from,20%,40%,60%,80%,to{animation-timing-function:cubic-bezier(0.215, .610, .355, 1.000)}0%{opacity:0;transform:scale3d(.3, .3, .3)}20%{transform:scale3d(1.1, 1.1, 1.1)}40%{transform:scale3d(.9, .9, .9)}60%{opacity:1;transform:scale3d(1.03, 1.03, 1.03)}80%{transform:scale3d(.97, .97, .97)}to{opacity:1;transform:scale3d(1, 1, 1)}}.bounceIn{animation-name:bounceIn}@keyframes bounceInDown{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215, .610, .355, 1.000)}0%{opacity:0;transform:translate3d(0, -3000px, 0)}60%{opacity:1;transform:translate3d(0, 25px, 0)}75%{transform:translate3d(0, -10px, 0)}90%{transform:translate3d(0, 5px, 0)}to{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215, .610, .355, 1.000)}0%{opacity:0;transform:translate3d(-3000px, 0, 0)}60%{opacity:1;transform:translate3d(25px, 0, 0)}75%{transform:translate3d(-10px, 0, 0)}90%{transform:translate3d(5px, 0, 0)}to{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215, .610, .355, 1.000)}from{opacity:0;transform:translate3d(3000px, 0, 0)}60%{opacity:1;transform:translate3d(-25px, 0, 0)}75%{transform:translate3d(10px, 0, 0)}90%{transform:translate3d(-5px, 0, 0)}to{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215, .610, .355, 1.000)}from{opacity:0;transform:translate3d(0, 3000px, 0)}60%{opacity:1;
14096transform:translate3d(0, -20px, 0)}75%{transform:translate3d(0, 10px, 0)}90%{transform:translate3d(0, -5px, 0)}to{transform:translate3d(0, 0, 0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(.9, .9, .9)}50%,55%{opacity:1;transform:scale3d(1.1, 1.1, 1.1)}to{opacity:0;transform:scale3d(.3, .3, .3)}}.bounceOut{animation-name:bounceOut}@keyframes bounceOutDown{20%{transform:translate3d(0, 10px, 0)}40%,45%{opacity:1;transform:translate3d(0, -20px, 0)}to{opacity:0;transform:translate3d(0, 2000px, 0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px, 0, 0)}to{opacity:0;transform:translate3d(-2000px, 0, 0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px, 0, 0)}to{opacity:0;transform:translate3d(2000px, 0, 0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0, -10px, 0)}40%,45%{opacity:1;transform:translate3d(0, 20px, 0)}to{opacity:0;transform:translate3d(0, -2000px, 0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{from{opacity:0}to{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{from{opacity:0;transform:translate3d(0, -100%, 0)}to{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{from{opacity:0;transform:translate3d(0, -2000px, 0)}to{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{from{opacity:0;transform:translate3d(-100%, 0, 0)}to{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{from{opacity:0;transform:translate3d(-2000px, 0, 0)}to{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{from{opacity:0;transform:translate3d(100%, 0, 0)}to{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{from{opacity:0;transform:translate3d(2000px, 0, 0)}to{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{from{opacity:0;transform:translate3d(0, 100%, 0)}to{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{from{opacity:0;transform:translate3d(0, 2000px, 0)}to{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{from{opacity:1}to{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{from{opacity:1}to{opacity:0;transform:translate3d(0, 100%, 0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{from{opacity:1}to{opacity:0;transform:translate3d(0, 2000px, 0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{from{opacity:1}to{opacity:0;transform:translate3d(-100%, 0, 0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{from{opacity:1}\r\nto{opacity:0;transform:translate3d(-2000px, 0, 0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{from{opacity:1}to{opacity:0;transform:translate3d(100%, 0, 0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{from{opacity:1}to{opacity:0;transform:translate3d(2000px, 0, 0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{from{opacity:1}to{opacity:0;transform:translate3d(0, -100%, 0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{from{opacity:1}to{opacity:0;transform:translate3d(0, -2000px, 0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{from{transform:perspective(400px) rotate3d(0, 1, 0, -360deg);animation-timing-function:ease-out}40%{transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(.95, .95, .95);animation-timing-function:ease-in}to{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;animation-name:flip}@keyframes flipInX{from{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);animation-timing-function:ease-in;opacity:0}
1409640%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}to{transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;animation-name:flipInX}@keyframes flipInY{from{transform:perspective(400px) rotate3d(0, 1, 0, 90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(0, 1, 0, -20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(0, 1, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(0, 1, 0, -5deg)}to{transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;animation-name:flipInY}@keyframes flipOutX{from{transform:perspective(400px)}30%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);opacity:1}to{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);opacity:0}
14096}.flipOutX{animation-name:flipOutX;-webkit-backface-visibility:visible !important;backface-visibility:visible !important}@keyframes flipOutY{from{transform:perspective(400px)}30%{transform:perspective(400px) rotate3d(0, 1, 0, -15deg);opacity:1}to{transform:perspective(400px) rotate3d(0, 1, 0, 90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;animation-name:flipOutY}@keyframes lightSpeedIn{from{transform:translate3d(100%, 0, 0) skewX(-30deg);opacity:0}60%{transform:skewX(20deg);opacity:1}80%{transform:skewX(-5deg);opacity:1}to{transform:none;opacity:1}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{from{opacity:1}to{transform:translate3d(100%, 0, 0) skewX(30deg);opacity:0}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{from{transform-origin:center;transform:rotate3d(0, 0, 1, -200deg);opacity:0}to{transform-origin:center;transform:none;opacity:1}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{from{transform-origin:left bottom;transform:rotate3d(0, 0, 1, -45deg);opacity:0}
14096to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{from{transform-origin:right bottom;transform:rotate3d(0, 0, 1, 45deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{from{transform-origin:left bottom;transform:rotate3d(0, 0, 1, 45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{from{transform-origin:right bottom;transform:rotate3d(0, 0, 1, -90deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{from{transform-origin:center;opacity:1}to{transform-origin:center;transform:rotate3d(0, 0, 1, 200deg);opacity:0}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{from{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate3d(0, 0, 1, 45deg);opacity:0}
14096}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{from{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate3d(0, 0, 1, -45deg);opacity:0}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{from{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate3d(0, 0, 1, -45deg);opacity:0}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{from{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate3d(0, 0, 1, 90deg);opacity:0}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate3d(0, 0, 1, 80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%,80%{transform:rotate3d(0, 0, 1, 60deg);transform-origin:top left;animation-timing-function:ease-in-out;opacity:1}to{transform:translate3d(0, 700px, 0);opacity:0}}.hinge{animation-name:hinge}@keyframes jackInTheBox{from{opacity:0;transform:scale(0.1) rotate(30deg);transform-origin:center bottom}50%{transform:rotate(-10deg)}70%{transform:rotate(3deg)}to{opacity:1;transform:scale(1)}}.jackInTheBox{animation-name:jackInTheBox}@keyframes rollIn{from{opacity:0;transform:translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg)}to{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{from{opacity:1}to{opacity:0;transform:translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3, .3, .3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{from{opacity:0;transform:scale3d(.1, .1, .1) translate3d(0, -1000px, 0);animation-timing-function:cubic-bezier(0.550, .055, .675, .190)}60%{opacity:1;transform:scale3d(.475, .475, .475) translate3d(0, 60px, 0);animation-timing-function:cubic-bezier(0.175, .885, .320, 1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{from{opacity:0;transform:scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);animation-timing-function:cubic-bezier(0.550, .055, .675, .190)}60%{opacity:1;transform:scale3d(.475, .475, .475) translate3d(10px, 0, 0);animation-timing-function:cubic-bezier(0.175, .885, .320, 1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{from{opacity:0;transform:scale3d(.1, .1, .1) translate3d(1000px, 0, 0);animation-timing-function:cubic-bezier(0.550, .055, .675, .190)}60%{opacity:1;transform:scale3d(.475, .475, .475) translate3d(-10px, 0, 0);animation-timing-function:cubic-bezier(0.175, .885, .320, 1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{from{opacity:0;transform:scale3d(.1, .1, .1) translate3d(0, 1000px, 0);animation-timing-function:cubic-bezier(0.550, .055, .675, .190)}60%{opacity:1;transform:scale3d(.475, .475, .475) translate3d(0, -60px, 0);animation-timing-function:cubic-bezier(0.175, .885, .320, 1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{from{opacity:1}50%{opacity:0;transform:scale3d(.3, .3, .3)}to{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(.475, .475, .475) translate3d(0, -60px, 0);animation-timing-function:cubic-bezier(0.550, .055, .675, .190)}\r\nto{opacity:0;transform:scale3d(.1, .1, .1) translate3d(0, 2000px, 0);transform-origin:center bottom;animation-timing-function:cubic-bezier(0.175, .885, .320, 1)}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(.475, .475, .475) translate3d(42px, 0, 0)}to{opacity:0;transform:scale(.1) translate3d(-2000px, 0, 0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(.475, .475, .475) translate3d(-42px, 0, 0)}to{opacity:0;transform:scale(.1) translate3d(2000px, 0, 0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(.475, .475, .475) translate3d(0, 60px, 0);animation-timing-function:cubic-bezier(0.550, .055, .675, .190)}to{opacity:0;transform:scale3d(.1, .1, .1) translate3d(0, -2000px, 0);transform-origin:center bottom;animation-timing-function:cubic-bezier(0.175, .885, .320, 1)}}.zoomOutUp{animation-name:zoomOutUp}@keyframes slideInDown{from{transform:translate3d(0, -100%, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}.slideInDown{animation-name:slideInDown}@keyframes slideInLeft{from{transform:translate3d(-100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}.slideInLeft{animation-name:slideInLeft}@keyframes slideInRight{from{transform:translate3d(100%, 0, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}.slideInRight{animation-name:slideInRight}@keyframes slideInUp{from{transform:translate3d(0, 100%, 0);visibility:visible}to{transform:translate3d(0, 0, 0)}}.slideInUp{animation-name:slideInUp}@keyframes slideOutDown{from{transform:translate3d(0, 0, 0)}to{visibility:hidden;transform:translate3d(0, 100%, 0)}}.slideOutDown{animation-name:slideOutDown}@keyframes slideOutLeft{from{transform:translate3d(0, 0, 0)}to{visibility:hidden;transform:translate3d(-100%, 0, 0)}}.slideOutLeft{animation-name:slideOutLeft}@keyframes slideOutRight{from{transform:translate3d(0, 0, 0)}to{visibility:hidden;transform:translate3d(100%, 0, 0)}}.slideOutRight{animation-name:slideOutRight}@keyframes slideOutUp{from{transform:translate3d(0, 0, 0)}to{visibility:hidden;transform:translate3d(0, -100%, 0)}}.slideOutUp{animation-name:slideOutUp}", ""]);
14097
vendor: 10,942 bytes, lines 14098-14528
14098// exports
14099
14100
14101/***/ }),
14102
14103/***/ 3:
14104/***/ (function(module, exports) {
14105
14106/*
14107	MIT License http://www.opensource.org/licenses/mit-license.php
14108	Author Tobias Koppers @sokra
14109*/
14110// css base code, injected by the css-loader
14111module.exports = function (useSourceMap) {
14112	var list = [];
14113
14114	// return the list of modules as css string
14115	list.toString = function toString() {
14116		return this.map(function (item) {
14117			var content = cssWithMappingToString(item, useSourceMap);
14118			if (item[2]) {
14119				return "@media " + item[2] + "{" + content + "}";
14120			} else {
14121				return content;
14122			}
14123		}).join("");
14124	};
14125
14126	// import a list of modules into the list
14127	list.i = function (modules, mediaQuery) {
14128		if (typeof modules === "string") modules = [[null, modules, ""]];
14129		var alreadyImportedModules = {};
14130		for (var i = 0; i < this.length; i++) {
14131			var id = this[i][0];
14132			if (typeof id === "number") alreadyImportedModules[id] = true;
14133		}
14134		for (i = 0; i < modules.length; i++) {
14135			var item = modules[i];
14136			// skip already imported module
14137			// this implementation is not 100% perfect for weird media query combinations
14138			//  when a module is imported multiple times with different media queries.
14139			//  I hope this will never occur (Hey this way we have smaller bundles)
14140			if (typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
14141				if (mediaQuery && !item[2]) {
14142					item[2] = mediaQuery;
14143				} else if (mediaQuery) {
14144					item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
14145				}
14146				list.push(item);
14147			}
14148		}
14149	};
14150	return list;
14151};
14152
14153function cssWithMappingToString(item, useSourceMap) {
14154	var content = item[1] || '';
14155	var cssMapping = item[3];
14156	if (!cssMapping) {
14157		return content;
14158	}
14159
14160	if (useSourceMap && typeof btoa === 'function') {
14161		var sourceMapping = toComment(cssMapping);
14162		var sourceURLs = cssMapping.sources.map(function (source) {
14163			return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */';
14164		});
14165
14166		return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
14167	}
14168
14169	return [content].join('\n');
14170}
14171
14172// Adapted from convert-source-map (MIT)
14173function toComment(sourceMap) {
14174	// eslint-disable-next-line no-undef
14175	var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
14176	var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;
14177
14178	return '/*# ' + data + ' */';
14179}
14180
14181/***/ }),
14182
14183/***/ 4:
14184/***/ (function(module, exports, __webpack_require__) {
14185
14186/*
14187	MIT License http://www.opensource.org/licenses/mit-license.php
14188	Author Tobias Koppers @sokra
14189*/
14190
14191var stylesInDom = {};
14192
14193var	memoize = function (fn) {
14194	var memo;
14195
14196	return function () {
14197		if (typeof memo === "undefined") memo = fn.apply(this, arguments);
14198		return memo;
14199	};
14200};
14201
14202var isOldIE = memoize(function () {
14203	// Test for IE <= 9 as proposed by Browserhacks
14204	// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
14205	// Tests for existence of standard globals is to allow style-loader
14206	// to operate correctly into non-standard environments
14207	// @see https://github.com/webpack-contrib/style-loader/issues/177
14208	return window && document && document.all && !window.atob;
14209});
14210
14211var getElement = (function (fn) {
14212	var memo = {};
14213
14214	return function(selector) {
14215		if (typeof memo[selector] === "undefined") {
14216			memo[selector] = fn.call(this, selector);
14217		}
14218
14219		return memo[selector]
14220	};
14221})(function (target) {
14222	return document.querySelector(target)
14223});
14224
14225var singleton = null;
14226var	singletonCounter = 0;
14227var	stylesInsertedAtTop = [];
14228
14229var	fixUrls = __webpack_require__(11);
14230
14231module.exports = function(list, options) {
14232	if (typeof DEBUG !== "undefined" && DEBUG) {
14233		if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
14234	}
14235
14236	options = options || {};
14237
14238	options.attrs = typeof options.attrs === "object" ? options.attrs : {};
14239
14240	// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
14241	// tags it will allow on a page
14242	if (!options.singleton) options.singleton = isOldIE();
14243
14244	// By default, add <style> tags to the <head> element
14245	if (!options.insertInto) options.insertInto = "head";
14246
14247	// By default, add <style> tags to the bottom of the target
14248	if (!options.insertAt) options.insertAt = "bottom";
14249
14250	var styles = listToStyles(list, options);
14251
14252	addStylesToDom(styles, options);
14253
14254	return function update (newList) {
14255		var mayRemove = [];
14256
14257		for (var i = 0; i < styles.length; i++) {
14258			var item = styles[i];
14259			var domStyle = stylesInDom[item.id];
14260
14261			domStyle.refs--;
14262			mayRemove.push(domStyle);
14263		}
14264
14265		if(newList) {
14266			var newStyles = listToStyles(newList, options);
14267			addStylesToDom(newStyles, options);
14268		}
14269
14270		for (var i = 0; i < mayRemove.length; i++) {
14271			var domStyle = mayRemove[i];
14272
14273			if(domStyle.refs === 0) {
14274				for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();
14275
14276				delete stylesInDom[domStyle.id];
14277			}
14278		}
14279	};
14280};
14281
14282function addStylesToDom (styles, options) {
14283	for (var i = 0; i < styles.length; i++) {
14284		var item = styles[i];
14285		var domStyle = stylesInDom[item.id];
14286
14287		if(domStyle) {
14288			domStyle.refs++;
14289
14290			for(var j = 0; j < domStyle.parts.length; j++) {
14291				domStyle.parts[j](item.parts[j]);
14292			}
14293
14294			for(; j < item.parts.length; j++) {
14295				domStyle.parts.push(addStyle(item.parts[j], options));
14296			}
14297		} else {
14298			var parts = [];
14299
14300			for(var j = 0; j < item.parts.length; j++) {
14301				parts.push(addStyle(item.parts[j], options));
14302			}
14303
14304			stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
14305		}
14306	}
14307}
14308
14309function listToStyles (list, options) {
14310	var styles = [];
14311	var newStyles = {};
14312
14313	for (var i = 0; i < list.length; i++) {
14314		var item = list[i];
14315		var id = options.base ? item[0] + options.base : item[0];
14316		var css = item[1];
14317		var media = item[2];
14318		var sourceMap = item[3];
14319		var part = {css: css, media: media, sourceMap: sourceMap};
14320
14321		if(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});
14322		else newStyles[id].parts.push(part);
14323	}
14324
14325	return styles;
14326}
14327
14328function insertStyleElement (options, style) {
14329	var target = getElement(options.insertInto)
14330
14331	if (!target) {
14332		throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");
14333	}
14334
14335	var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];
14336
14337	if (options.insertAt === "top") {
14338		if (!lastStyleElementInsertedAtTop) {
14339			target.insertBefore(style, target.firstChild);
14340		} else if (lastStyleElementInsertedAtTop.nextSibling) {
14341			target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);
14342		} else {
14343			target.appendChild(style);
14344		}
14345		stylesInsertedAtTop.push(style);
14346	} else if (options.insertAt === "bottom") {
14347		target.appendChild(style);
14348	} else {
14349		throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
14350	}
14351}
14352
14353function removeStyleElement (style) {
14354	if (style.parentNode === null) return false;
14355	style.parentNode.removeChild(style);
14356
14357	var idx = stylesInsertedAtTop.indexOf(style);
14358	if(idx >= 0) {
14359		stylesInsertedAtTop.splice(idx, 1);
14360	}
14361}
14362
14363function createStyleElement (options) {
14364	var style = document.createElement("style");
14365
14366	options.attrs.type = "text/css";
14367
14368	addAttrs(style, options.attrs);
14369	insertStyleElement(options, style);
14370
14371	return style;
14372}
14373
14374function createLinkElement (options) {
14375	var link = document.createElement("link");
14376
14377	options.attrs.type = "text/css";
14378	options.attrs.rel = "stylesheet";
14379
14380	addAttrs(link, options.attrs);
14381	insertStyleElement(options, link);
14382
14383	return link;
14384}
14385
14386function addAttrs (el, attrs) {
14387	Object.keys(attrs).forEach(function (key) {
14388		el.setAttribute(key, attrs[key]);
14389	});
14390}
14391
14392function addStyle (obj, options) {
14393	var style, update, remove, result;
14394
14395	// If a transform function was defined, run it on the css
14396	if (options.transform && obj.css) {
14397	    result = options.transform(obj.css);
14398
14399	    if (result) {
14400	    	// If transform returns a value, use that instead of the original css.
14401	    	// This allows running runtime transformations on the css.
14402	    	obj.css = result;
14403	    } else {
14404	    	// If the transform function returns a falsy value, don't add this css.
14405	    	// This allows conditional loading of css
14406	    	return function() {
14407	    		// noop
14408	    	};
14409	    }
14410	}
14411
14412	if (options.singleton) {
14413		var styleIndex = singletonCounter++;
14414
14415		style = singleton || (singleton = createStyleElement(options));
14416
14417		update = applyToSingletonTag.bind(null, style, styleIndex, false);
14418		remove = applyToSingletonTag.bind(null, style, styleIndex, true);
14419
14420	} else if (
14421		obj.sourceMap &&
14422		typeof URL === "function" &&
14423		typeof URL.createObjectURL === "function" &&
14424		typeof URL.revokeObjectURL === "function" &&
14425		typeof Blob === "function" &&
14426		typeof btoa === "function"
14427	) {
14428		style = createLinkElement(options);
14429		update = updateLink.bind(null, style, options);
14430		remove = function () {
14431			removeStyleElement(style);
14432
14433			if(style.href) URL.revokeObjectURL(style.href);
14434		};
14435	} else {
14436		style = createStyleElement(options);
14437		update = applyToTag.bind(null, style);
14438		remove = function () {
14439			removeStyleElement(style);
14440		};
14441	}
14442
14443	update(obj);
14444
14445	return function updateStyle (newObj) {
14446		if (newObj) {
14447			if (
14448				newObj.css === obj.css &&
14449				newObj.media === obj.media &&
14450				newObj.sourceMap === obj.sourceMap
14451			) {
14452				return;
14453			}
14454
14455			update(obj = newObj);
14456		} else {
14457			remove();
14458		}
14459	};
14460}
14461
14462var replaceText = (function () {
14463	var textStore = [];
14464
14465	return function (index, replacement) {
14466		textStore[index] = replacement;
14467
14468		return textStore.filter(Boolean).join('\n');
14469	};
14470})();
14471
14472function applyToSingletonTag (style, index, remove, obj) {
14473	var css = remove ? "" : obj.css;
14474
14475	if (style.styleSheet) {
14476		style.styleSheet.cssText = replaceText(index, css);
14477	} else {
14478		var cssNode = document.createTextNode(css);
14479		var childNodes = style.childNodes;
14480
14481		if (childNodes[index]) style.removeChild(childNodes[index]);
14482
14483		if (childNodes.length) {
14484			style.insertBefore(cssNode, childNodes[index]);
14485		} else {
14486			style.appendChild(cssNode);
14487		}
14488	}
14489}
14490
14491function applyToTag (style, obj) {
14492	var css = obj.css;
14493	var media = obj.media;
14494
14495	if(media) {
14496		style.setAttribute("media", media)
14497	}
14498
14499	if(style.styleSheet) {
14500		style.styleSheet.cssText = css;
14501	} else {
14502		while(style.firstChild) {
14503			style.removeChild(style.firstChild);
14504		}
14505
14506		style.appendChild(document.createTextNode(css));
14507	}
14508}
14509
14510function updateLink (link, options, obj) {
14511	var css = obj.css;
14512	var sourceMap = obj.sourceMap;
14513
14514	/*
14515		If convertToAbsoluteUrls isn't defined, but sourcemaps are enabled
14516		and there is no publicPath defined then lets turn convertToAbsoluteUrls
14517		on by default.  Otherwise default to the convertToAbsoluteUrls option
14518		directly
14519	*/
14520	var autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;
14521
14522	if (options.convertToAbsoluteUrls || autoFixUrls) {
14523		css = fixUrls(css);
14524	}
14525
14526	if (sourceMap) {
14527		// http://stackoverflow.com/a/26603875
14528		css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)
14528))) + " */";
14529	}
14530
14531	var blob = new Blob([css], { type: "text/css" });
14532
14533	var oldSrc = link.href;
14534
14535	link.href = URL.createObjectURL(blob);
14536
14537	if(oldSrc) URL.revokeObjectURL(oldSrc);
14538}
14539
14540
14541/***/ }),
14542
14543/***/ 56:
14544/***/ (function(module, __webpack_exports__, __webpack_require__) {
14545
14546"use strict";
14547Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
14548/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0);
14549/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__);
14550/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_carousel__ = __webpack_require__(12);
14551/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_carousel___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_carousel__);
14552/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__lib_owlcarousel_assets_owl_carousel_min_css__ = __webpack_require__(14);
14553/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__lib_owlcarousel_assets_owl_carousel_min_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__lib_owlcarousel_assets_owl_carousel_min_css__);
14554/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__lib_owlcarousel_assets_owl_theme_default_min_css__ = __webpack_require__(17);
14555/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__lib_owlcarousel_assets_owl_theme_default_min_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3__lib_owlcarousel_assets_owl_theme_default_min_css__);
14556/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__lib_owlcarousel_assets_animate_css__ = __webpack_require__(19);
14557/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__lib_owlcarousel_assets_animate_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__lib_owlcarousel_assets_animate_css__);
14558/* eslint no-loop-func: 0 */
14559/* eslint no-unused-vars: 0 */
14560/* eslint prefer-destructuring: ["off", {VariableDeclarator: {object: false}}] */
14561/* eslint no-lonely-if: "off" */
14562/* eslint max-len: ["off", { "code": 250 }] */
14563/* eslint no-undef: "off" */
14564/* eslint func-names: ["error", "never"] */
14565
14566/**
14567 * ------------------------------------------------------------------
14568 * 招聘 -
14569 * ------------------------------------------------------------------
14570 */
14571
14572/**
14573* @date     2017-10-30
14574* @author   Telliex<[email protected]>
14575*           Fish<[email protected]>
14576*/
14577
14578
14579
14580
14581
14582
14583$(() => {
14584  $('.career-values-slide').owlCarousel({
14585    loop: true,
14586    autoplay: true,
14587    items: 1,
14588    nav: false,
14589    dots: true,
14590    responsive: {
14591      0: {
14592        nav: false
14593      },
14594      960: {
14595        nav: true
14596      }
14597    }
14598  });
14599});
14600/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(0)))
14601
14602/***/ })
14603
14604/******/ });
14605//# sourceMappingURL=../../src/map/lyt-cn-careers.js.map

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.