PageSourceSearch

https://www.emilevandorenmuseum.be/scripts/jq-3.min.js

js emilevandorenmuseum.be collected 2026-10-02 07:29:04 UTC 536,577 bytes, 14,448 lines download raw bytes

vendor: 37,002 bytes, lines 1-3
1
2/*! jQuery v3.6.3 | (c) OpenJS Foundation and other contributors | jquery.org/license */
3!function (e, t) { "use strict"; "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function (e) { if (!e.document) throw new Error("jQuery requires a window with a document"); return t(e) } : t(e) }("undefined" != typeof window ? window : this, function (C, e) { "use strict"; var t = [], r = Object.getPrototypeOf, s = t.slice, g = t.flat ? function (e) { return t.flat.call(e) } : function (e) { return t.concat.apply([], e) }, u = t.push, i = t.indexOf, n = {}, o = n.toString, y = n.hasOwnProperty, a = y.toString, l = a.call(Object), v = {}, m = function (e) { return "function" == typeof e && "number" != typeof e.nodeType && "function" != typeof e.item }, x = function (e) { return null != e && e === e.window }, S = C.document, c = { type: !0, src: !0, nonce: !0, noModule: !0 }; function b(e, t, n) { var r, i, o = (n = n || S).createElement("script"); if (o.text = e, t) for (r in c) (i = t[r] || t.getAttribute && t.getAttribute(r)) && o.setAttribute(r, i); n.head.appendChild(o).parentNode.removeChild(o) } function w(e) { return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? n[o.call(e)] || "object" : typeof e } var f = "3.6.3", E = function (e, t) { return new E.fn.init(e, t) }; function p(e) { var t = !!e && "length" in e && e.length, n = w(e); return !m(e) && !x(e) && ("array" === n || 0 === t || "number" == typeof t && 0 < t && t - 1 in e) } E.fn = E.prototype = { jquery: f, constructor: E, length: 0, toArray: function () { return s.call(this) }, get: function (e) { return null == e ? s.call(this) : e < 0 ? this[e + this.length] : this[e] }, pushStack: function (e) { var t = E.merge(this.constructor(), e); return t.prevObject = this, t }, each: function (e) { return E.each(this, e) }, map: function (n) { return this.pushStack(E.map(this, function (e, t) { return n.call(e, t, e) })) }, slice: function () { return this.pushStack(s.apply(this, arguments)) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, even: function () { return this.pushStack(E.grep(this, function (e, t) { return (t + 1) % 2 })) }, odd: function () { return this.pushStack(E.grep(this, function (e, t) { return t % 2 })) }, eq: function (e) { var t = this.length, n = +e + (e < 0 ? t : 0); return this.pushStack(0 <= n && n < t ? [this[n]] : []) }, end: function () { return this.prevObject || this.constructor() }, push: u, sort: t.sort, splice: t.splice }, E.extend = E.fn.extend = function () { var e, t, n, r, i, o, a = arguments[0] || {}, s = 1, u = arguments.length, l = !1; for ("boolean" == typeof a && (l = a, a = arguments[s] || {}, s++), "object" == typeof a || m(a) || (a = {}), s === u && (a = this, s--); s < u; s++)if (null != (e = arguments[s])) for (t in e) r = e[t], "__proto__" !== t && a !== r && (l && r && (E.isPlainObject(r) || (i = Array.isArray(r))) ? (n = a[t], o = i && !Array.isArray(n) ? [] : i || E.isPlainObject(n) ? n : {}, i = !1, a[t] = E.extend(l, o, r)) : void 0 !== r && (a[t] = r)); return a }, E.extend({ expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), isReady: !0, error: function (e) { throw new Error(e) }, noop: function () { }, isPlainObject: function (e) { var t, n; return !(!e || "[object Object]" !== o.call(e)) && (!(t = r(e)) || "function" == typeof (n = y.call(t, "constructor") && t.constructor) && a.call(n) === l) }, isEmptyObject: function (e) { var t; for (t in e) return !1; return !0 }, globalEval: function (e, t, n) { b(e, { nonce: t && t.nonce }, n) }, each: function (e, t) { var n, r = 0; if (p(e)) { for (n = e.length; r < n; r++)if (!1 === t.call(e[r], r, e[r])) break } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break; return e }, makeArray: function (e, t) { var n = t || []; return null != e && (p(Object(e)) ? E.merge(n, "string" == typeof e ? [e] : e) : u.call(n, e)), n }, inArray: function (e, t, n) { return null == t ? -1 : i.call(t, e, n) }, merge: function (e, t) { for (var n = +t.length, r = 0, i = e.length; r < n; r++)e[i++] = t[r]; return e.length = i, e }, grep: function (e, t, n) { for (var r = [], i = 0, o = e.length, a = !n; i < o; i++)!t(e[i], i) !== a && r.push(e[i]); return r }, map: function (e, t, n) { var r, i, o = 0, a = []; if (p(e)) for (r = e.length; o < r; o++)null != (i = t(e[o], o, n)) && a.push(i); else for (o in e) null != (i = t(e[o], o, n)) && a.push(i); return g(a) }, guid: 1, support: v }), "function" == typeof Symbol && (E.fn[Symbol.iterator] = t[Symbol.iterator]), E.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (e, t) { n["[object " + t + "]"] = t.toLowerCase() }); var d = function (n) { var e, d, b, o, i, h, f, g, w, u, l, T, C, a, S, y, s, c, v, E = "sizzle" + 1 * new Date, p = n.document, k = 0, r = 0, m = ue(), x = ue(), A = ue(), N = ue(), j = function (e, t) { return e === t && (l = !0), 0 }, D = {}.hasOwnProperty, t = [], q = t.pop, L = t.push, H = t.push, O = t.slice, P = function (e, t) { for (var n = 0, r = e.length; n < r; n++)if (e[n] === t) return n; return -1 }, R = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", M = "[\\x20\\t\\r\\n\\f]", I = "(?:\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", W = "\\[" + M + "*(" + I + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + I + "))|)" + M + "*\\]", F = ":(" + I + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + W + ")*)|.*)\\)|)", $ = new RegExp(M + "+", "g"), B = new RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"), _ = new RegExp("^" + M + "*," + M + "*"), z = new RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"), U = new RegExp(M + "|>"), X = new RegExp(F), V = new RegExp("^" + I + "$"), G = { ID: new RegExp("^#(" + I + ")"), CLASS: new RegExp("^\\.(" + I + ")"), TAG: new RegExp("^(" + I + "|[*])"), ATTR: new RegExp("^" + W), PSEUDO: new RegExp("^" + F), CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i"), bool: new RegExp("^(?:" + R + ")$", "i"), needsContext: new RegExp("^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i") }, Y = /HTML$/i, Q = /^(?:input|select|textarea|button)$/i, J = /^h\d$/i, K = /^[^{]+\{\s*\[native \w/, Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, ee = /[+~]/, te = new RegExp("\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\([^\\r\\n\\f])", "g"), ne = function (e, t) { var n = "0x" + e.slice(1) - 65536; return t || (n < 0 ? String.fromCharCode(n + 65536) : String.fromCharCode(n >> 10 | 55296, 1023 & n | 56320)) }, re = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, ie = function (e, t) { return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e }, oe = function () { T() }, ae = be(function (e) { return !0 === e.disabled && "fieldset" === e.nodeName.toLowerCase() }, { dir: "parentNode", next: "legend" }); try { H.apply(t = O.call(p.childNodes), p.childNodes), t[p.childNodes.length].nodeType } catch (e) { H = { apply: t.length ? function (e, t) { L.apply(e, O.call(t)) } : function (e, t) { var n = e.length, r = 0; while (e[n++] = t[r++]); e.length = n - 1 } } } function se(t, e, n, r) { var i, o, a, s, u, l, c, f = e && e.ownerDocument, p = e ? e.nodeType : 9; if (n = n || [], "string" != typeof t || !t || 1 !== p && 9 !== p && 11 !== p) return n; if (!r && (T(e), e = e || C, S)) { if (11 !== p && (u = Z.exec(t))) if (i = u[1]) { if (9 === p) { if (!(a = e.getElementById(i))) return n; if (a.id === i) return n.push(a), n } else if (f && (a = f.getElementById(i)) && v(e, a) && a.id === i) return n.push(a), n } else { if (u[2]) return H.apply(n, e.getElementsByTagName(t)), n; if ((i = u[3]) && d.getElementsByClassName && e.getElementsByClassName) return H.apply(n, e.getElementsByClassName(i)), n } if (d.qsa && !N[t + " "] && (!y || !y.test(t)) && (1 !== p || "object" !== e.nodeName.toLowerCase())) { if (c = t, f = e, 1 === p && (U.test(t) || z.test(t))) { (f = ee.test(t) && ve(e.parentNode) || e) === e && d.scope || ((s = e.getAttribute("id")) ? s = s.replace(re, ie) : e.setAttribute("id", s = E)), o = (l = h(t)).length; while (o--) l[o] = (s ? "#" + s : ":scope") + " " + xe(l[o]); c = l.join(",") } try { if (d.cssSupportsSelector && !CSS.supports("selector(:is(" + c + "))")) throw new Error; return H.apply(n, f.querySelectorAll(c)), n } catch (e) { N(t, !0) } finally { s === E && e.removeAttribute("id") } } } return g(t.replace(B, "$1"), e, n, r) } function ue() { var r = []; return function e(t, n) { return r.push(t + " ") > b.cacheLength && delete e[r.shift()], e[t + " "] = n } } function le(e) { return e[E] = !0, e } function ce(e) { var t = C.createElement("fieldset"); try { return !!e(t) } catch (e) { return !1 } finally { t.parentNode && t.parentNode.removeChild(t), t = null } } function fe(e, t) { var n = e.split("|"), r = n.length; while (r--) b.attrHandle[n[r]] = t } function pe(e, t) { var n = t && e, r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; if (r) return r; if (n) while (n = n.nextSibling) if (n === t) return -1; return e ? 1 : -1 } function de(t) { return function (e) { return "input" === e.nodeName.toLowerCase() && e.type === t } } function he(n) { return function (e) { var t = e.nodeName.toLowerCase(); return ("input" === t || "button" === t) && e.type === n } } function ge(t) { return function (e) { return "form" in e ? e.parentNode && !1 === e.disabled ? "label" in e ? "label" in e.parentNode ? e.parentNode.disabled === t : e.disabled === t : e.isDisabled === t || e.isDisabled !== !t && ae(e) === t : e.disabled === t : "label" in e && e.disabled === t } } function ye(a) { return le(function (o) { return o = +o, le(function (e, t) { var n, r = a([], e.length, o), i = r.length; while (i--) e[n = r[i]] && (e[n] = !(t[n] = e[n])) }) }) } function ve(e) { return e && "undefined" != typeof e.getElementsByTagName && e } for (e in d = se.support = {}, i = se.isXML = function (e) { var t = e && e.namespaceURI, n = e && (e.ownerDocument || e).documentElement; return !Y.test(t || n && n.nodeName || "HTML") }, T = se.setDocument = function (e) { var t, n, r = e ? e.ownerDocument || e : p; return r != C && 9 === r.nodeType && r.documentElement && (a = (C = r).documentElement, S = !i(C), p != C && (n = C.defaultView) && n.top !== n && (n.addEventListener ? n.addEventListener("unload", oe, !1) : n.attachEvent && n.attachEvent("onunload", oe)), d.scope = ce(function (e) { return a.appendChild(e).appendChild(C.createElement("div")), "undefined" != typeof e.querySelectorAll && !e.querySelectorAll(":scope fieldset div").length }), d.cssSupportsSelector = ce(function () { return CSS.supports("selector(*)") && C.querySelectorAll(":is(:jqfake)") && !CSS.supports("selector(:is(*,:jqfake))") }), d.attributes = ce(function (e) { return e.className = "i", !e.getAttribute("className") }), d.getElementsByTagName = ce(function (e) { return e.appendChild(C.createComment("")), !e.getElementsByTagName("*").length }), d.getElementsByClassName = K.test(C.getElementsByClassName), d.getById = ce(function (e) { return a.appendChild(e).id = E, !C.getElementsByName || !C.getElementsByName(E).length }), d.getById ? (b.filter.ID = function (e) { var t = e.replace(te, ne); return function (e) { return e.getAttribute("id") === t } }, b.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && S) { var n = t.getElementById(e); return n ? [n] : [] } }) : (b.filter.ID = function (e) { var n = e.replace(te, ne); return function (e) { var t = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id"); return t && t.value === n } }, b.find.ID = function (e, t) { if ("undefined" != typeof t.getElementById && S) { var n, r, i, o = t.getElementById(e); if (o) { if ((n = o.getAttributeNode("id")) && n.value === e) return [o]; i = t.getElementsByName(e), r = 0; while (o = i[r++]) if ((n = o.getAttributeNode("id")) && n.value === e) return [o] } return [] } }), b.find.TAG = d.getElementsByTagName ? function (e, t) { return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : d.qsa ? t.querySelectorAll(e) : void 0 } : function (e, t) { var n, r = [], i = 0, o = t.getElementsByTagName(e); if ("*" === e) { while (n = o[i++]) 1 === n.nodeType && r.push(n); return r } return o }, b.find.CLASS = d.getElementsByClassName && function (e, t) { if ("undefined" != typeof t.getElementsByClassName && S) return t.getElementsByClassName(e) }, s = [], y = [], (d.qsa = K.test(C.querySelectorAll)) && (ce(function (e) { var t; a.appendChild(e).innerHTML = "<a id='" + E + "'></a><select id='" + E + "-\r\\' msallowcapture=''><option selected=''></option></select>", e.querySelectorAll("[msallowcapture^='']").length && y.push("[*^$]=" + M + "*(?:''|\"\")"), e.querySelectorAll("[selected]").length || y.push("\\[" + M + "*(?:value|" + R + ")"), e.querySelectorAll("[id~=" + E + "-]").length || y.push("~="), (t = C.createElement("input")).setAttribute("name", ""), e.appendChild(t), e.querySelectorAll("[name='']").length || y.push("\\[" + M + "*name" + M + "*=" + M + "*(?:''|\"\")"), e.querySelectorAll(":checked").length || y.push(":checked"), e.querySelectorAll("a#" + E + "+*").length || y.push(".#.+[+~]"), e.querySelectorAll("\\\f"), y.push("[\\r\\n\\f]") }), ce(function (e) { e.innerHTML = "<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>"; var t = C.createElement("input"); t.setAttribute("type", "hidden"), e.appendChild(t).setAttribute("name", "D"), e.querySelectorAll("[name=d]").length && y.push("name" + M + "*[*^$|!~]?="), 2 !== e.querySelectorAll(":enabled").length && y.push(":enabled", ":disabled"), a.appendChild(e).disabled = !0, 2 !== e.querySelectorAll(":disabled").length && y.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), y.push(",.*:") })), (d.matchesSelector = K.test(c = a.matches || a.webkitMatchesSelector || a.mozMatchesSelector || a.oMatchesSelector || a.msMatchesSelector)) && ce(function (e) { d.disconnectedMatch = c.call(e, "*"), c.call(e, "[s!='']:x"), s.push("!=", F) }), d.cssSupportsSelector || y.push(":has"), y = y.length && new RegExp(y.join("|")), s = s.length && new RegExp(s.join("|")), t = K.test(a.compareDocumentPosition), v = t || K.test(a.contains) ? function (e, t) { var n = 9 === e.nodeType && e.documentElement || e, r = t && t.parentNode; return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) } : function (e, t) { if (t) while (t = t.parentNode) if (t === e) return !0; return !1 }, j = t ? function (e, t) { if (e === t) return l = !0, 0; var n = !e.compareDocumentPosition - !t.compareDocumentPosition; return n || (1 & (n = (e.ownerDocument || e) == (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !d.sortDetached && t.compareDocumentPosition(e) === n ? e == C || e.ownerDocument == p && v(p, e) ? -1 : t == C || t.ownerDocument == p && v(p, t) ? 1 : u ? P(u, e) - P(u, t) : 0 : 4 & n ? -1 : 1) } : function (e, t) { if (e === t) return l = !0, 0; var n, r = 0, i = e.parentNode, o = t.parentNode, a = [e], s = [t]; if (!i || !o) return e == C ? -1 : t == C ? 1 : i ? -1 : o ? 1 : u ? P(u, e) - P(u, t) : 0; if (i === o) return pe(e, t); n = e; while (n = n.parentNode) a.unshift(n); n = t; while (n = n.parentNode) s.unshift(n); while (a[r] === s[r]) r++; return r ? pe(a[r], s[r]) : a[r] == p ? -1 : s[r] == p ? 1 : 0 }), C }, se.matches = function (e, t) { return se(e, null, null, t) }, se.matchesSelector = function (e, t) { if (T(e), d.matchesSelector && S && !N[t + " "] && (!s || !s.test(t)) && (!y || !y.test(t))) try { var n = c.call(e, t); if (n || d.disconnectedMatch || e.document && 11 !== e.document.nodeType) return n } catch (e) { N(t, !0) } return 0 < se(t, C, null, [e]).length }, se.contains = function (e, t) { return (e.ownerDocument || e) != C && T(e), v(e, t) }, se.attr = function (e, t) { (e.ownerDocument || e) != C && T(e); var n = b.attrHandle[t.toLowerCase()], r = n && D.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !S) : void 0; return void 0 !== r ? r : d.attributes || !S ? e.getAttribute(t) : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }, se.escape = function (e) { return (e + "").replace(re, ie) }, se.error = function (e) { throw new Error("Syntax error, unrecognized expression: " + e) }, se.uniqueSort = function (e) { var t, n = [], r = 0, i = 0; if (l = !d.detectDuplicates, u = !d.sortStable && e.slice(0), e.sort(j), l) { while (t = e[i++]) t === e[i] && (r = n.push(i)); while (r--) e.splice(n[r], 1) } return u = null, e }, o = se.getText = function (e) { var t, n = "", r = 0, i = e.nodeType; if (i) { if (1 === i || 9 === i || 11 === i) { if ("string" == typeof e.textContent) return e.textContent; for (e = e.firstChild; e; e = e.nextSibling)n += o(e) } else if (3 === i || 4 === i) return e.nodeValue } else while (t = e[r++]) n += o(t); return n }, (b = se.selectors = { cacheLength: 50, createPseudo: le, match: G, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (e) { return e[1] = e[1].replace(te, ne), e[3] = (e[3] || e[4] || e[5] || "").replace(te, ne), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4) }, CHILD: function (e) { return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || se.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && se.error(e[0]), e }, PSEUDO: function (e) { var t, n = !e[6] && e[2]; return G.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && X.test(n) && (t = h(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3)) } }, filter: { TAG: function (e) { var t = e.replace(te, ne).toLowerCase(); return "*" === e ? function () { return !0 } : function (e) { return e.nodeName && e.nodeName.toLowerCase() === t } }, CLASS: function (e) { var t = m[e + " "]; return t || (t = new RegExp("(^|" + M + ")" + e + "(" + M + "|$)")) && m(e, function (e) { return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "") }) }, ATTR: function (n, r, i) { return function (e) { var t = se.attr(e, n); return null == t ? "!=" === r : !r || (t += "", "=" === r ? t === i : "!=" === r ? t !== i : "^=" === r ? i && 0 === t.indexOf(i) : "*=" === r ? i && -1 < t.indexOf(i) : "$=" === r ? i && t.slice(-i.length) === i : "~=" === r ? -1 < (" " + t.replace($, " ") + " ").indexOf(i) : "|=" === r && (t === i || t.slice(0, i.length + 1) === i + "-")) } }, CHILD: function (h, e, t, g, y) { var v = "nth" !== h.slice(0, 3), m = "last" !== h.slice(-4), x = "of-type" === e; return 1 === g && 0 === y ? function (e) { return !!e.parentNode } : function (e, t, n) { var r, i, o, a, s, u, l = v !== m ? "nextSibling" : "previousSibling", c = e.parentNode, f = x && e.nodeName.toLowerCase(), p = !n && !x, d = !1; if (c) { if (v) { while (l) { a = e; while (a = a[l]) if (x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) return !1; u = l = "only" === h && !u && "nextSibling" } return !0 } if (u = [m ? c.firstChild : c.lastChild], m && p) { d = (s = (r = (i = (o = (a = c)[E] || (a[E] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]) && r[2], a = s && c.childNodes[s]; while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if (1 === a.nodeType && ++d && a === e) { i[h] = [k, s, d]; break } } else if (p && (d = s = (r = (i = (o = (a = e)[E] || (a[E] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]), !1 === d) while (a = ++s && a && a[l] || (d = s = 0) || u.pop()) if ((x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType) && ++d && (p && ((i = (o = a[E] || (a[E] = {}))[a.uniqueID] || (o[a.uniqueID] = {}))[h] = [k, d]), a === e)) break; return (d -= y) === g || d % g == 0 && 0 <= d / g } } }, PSEUDO: function (e, o) { var t, a = b.pseudos[e] || b.setFilters[e.toLowerCase()] || se.error("unsupported pseudo: " + e); return a[E] ? a(o) : 1 < a.length ? (t = [e, e, "", o], b.setFilters.hasOwnProperty(e.toLowerCase()) ? le(function (e, t) { var n, r = a(e, o), i = r.length; while (i--) e[n = P(e, r[i])] = !(t[n] = r[i]) }) : function (e) { return a(e, 0, t) }) : a } }, pseudos: { not: le(function (e) { var r = [], i = [], s = f(e.replace(B, "$1")); return s[E] ? le(function (e, t, n, r) { var i, o = s(e, null, r, []), a = e.length; while (a--) (i = o[a]) && (e[a] = !(t[a] = i)) }) : function (e, t, n) { return r[0] = e, s(r, null, n, i), r[0] = null, !i.pop() } }), has: le(function (t) { return function (e) { return 0 < se(t, e).length } }), contains: le(function (t) { return t = t.replace(te, ne), function (e) { return -1 < (e.textContent || o(e)).indexOf(t) } }), lang: le(function (n) { return V.test(n || "") || se.error("unsupported lang: " + n), n = n.replace(te, ne).toLowerCase(), function (e) { var t; do { if (t = S ? e.lang : e.getAttribute("xml:lang") || e.getAttribute("lang")) return (t = t.toLowerCase()) === n || 0 === t.indexOf(n + "-") } while ((e = e.parentNode) && 1 === e.nodeType); return !1 } }), target: function (e) { var t = n.location && n.location.hash; return t && t.slice(1) === e.id }, root: function (e) { return e === a }, focus: function (e) { return e === C.activeElement && (!C.hasFocus || C.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) }, enabled: ge(!1), disabled: ge(!0), checked: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && !!e.checked || "option" === t && !!e.selected }, selected: function (e) { return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected }, empty: function (e) { for (e = e.firstChild; e; e = e.nextSibling)if (e.nodeType < 6) return !1; return !0 }, parent: function (e) { return !b.pseudos.empty(e) }, header: function (e) { return J.test(e.nodeName) }, input: function (e) { return Q.test(e.nodeName) }, button: function (e) { var t = e.nodeName.toLowerCase(); return "input" === t && "button" === e.type || "button" === t }, text: function (e) { var t; return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) }, first: ye(function () { return [0] }), last: ye(function (e, t) { return [t - 1] }), eq: ye(function (e, t, n) { return [n < 0 ? n + t : n] }), even: ye(function (e, t) { for (var n = 0; n < t; n += 2)e.push(n); return e }), odd: ye(function (e, t) { for (var n = 1; n < t; n += 2)e.push(n); return e }), lt: ye(function (e, t, n) { for (var r = n < 0 ? n + t : t < n ? t : n; 0 <= --r;)e.push(r); return e }), gt: ye(function (e, t, n) { for (var r = n < 0 ? n + t : n; ++r < t;)e.push(r); return e }) } }).pseudos.nth = b.pseudos.eq, { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) b.pseudos[e] = de(e); for (e in { submit: !0, reset: !0 }) b.pseudos[e] = he(e); function me() { } function xe(e) { for (var t = 0, n = e.length, r = ""; t < n; t++)r += e[t].value; return r } function be(s, e, t) { var u = e.dir, l = e.next, c = l || u, f = t && "parentNode" === c, p = r++; return e.first ? function (e, t, n) { while (e = e[u]) if (1 === e.nodeType || f) return s(e, t, n); return !1 } : function (e, t, n) { var r, i, o, a = [k, p]; if (n) { while (e = e[u]) if ((1 === e.nodeType || f) && s(e, t, n)) return !0 } else while (e = e[u]) if (1 === e.nodeType || f) if (i = (o = e[E] || (e[E] = {}))[e.uniqueID] || (o[e.uniqueID] = {}), l && l === e.nodeName.toLowerCase()) e = e[u] || e; else { if ((r = i[c]) && r[0] === k && r[1] === p) return a[2] = r[2]; if ((i[c] = a)[2] = s(e, t, n)) return !0 } return !1 } } function we(i) { return 1 < i.length ? function (e, t, n) { var r = i.length; while (r--) if (!i[r](e, t, n)) return !1; return !0 } : i[0] } function Te(e, t, n, r, i) { for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++)(o = e[s]) && (n && !n(o, r, i) || (a.push(o), l && t.push(s))); return a } function Ce(d, h, g, y, v, e) { return y && !y[E] && (y = Ce(y)), v && !v[E] && (v = Ce(v, e)), le(function (e, t, n, r) { var i, o, a, s = [], u = [], l = t.length, c = e || function (e, t, n) { for (var r = 0, i = t.length; r < i; r++)se(e, t[r], n); return n }(h || "*", n.nodeType ? [n] : n, []), f = !d || !e && h ? c : Te(c, s, d, n, r), p = g ? v || (e ? d : l || y) ? [] : t : f; if (g && g(f, p, n, r), y) { i = Te(p, u), y(i, [], n, r), o = i.length; while (o--) (a = i[o]) && (p[u[o]] = !(f[u[o]] = a)) } if (e) { if (v || d) { if (v) { i = [], o = p.length; while (o--) (a = p[o]) && i.push(f[o] = a); v(null, p = [], i, r) } o = p.length; while (o--) (a = p[o]) && -1 < (i = v ? P(e, a) : s[o]) && (e[i] = !(t[i] = a)) } } else p = Te(p === t ? p.splice(l, p.length) : p), v ? v(null, t, p, r) : H.apply(t, p) }) } function Se(e) { for (var i, t, n, r = e.length, o = b.relative[e[0].type], a = o || b.relative[" "], s = o ? 1 : 0, u = be(function (e) { return e === i }, a, !0), l = be(function (e) { return -1 < P(i, e) }, a, !0), c = [function (e, t, n) { var r = !o && (n || t !== w) || ((i = t).nodeType ? u(e, t, n) : l(e, t, n)); return i = null, r }]; s < r; s++)if (t = b.relative[e[s].type]) c = [be(we(c), t)]; else { if ((t = b.filter[e[s].type].apply(null, e[s].matches))[E]) { for (n = ++s; n < r; n++)if (b.relative[e[n].type]) break; return Ce(1 < s && we(c), 1 < s && xe(e.slice(0, s - 1).concat({ value: " " === e[s - 2].type ? "*" : "" })).replace(B, "$1"), t, s < n && Se(e.slice(s, n)), n < r && Se(e = e.slice(n)), n < r && xe(e)) } c.push(t) } return we(c) } return me.prototype = b.filters = b.pseudos, b.setFilters = new me, h = se.tokenize = function (e, t) { var n, r, i, o, a, s, u, l = x[e + " "]; if (l) return t ? 0 : l.slice(0); a = e, s = [], u = b.preFilter; while (a) { for (o in n && !(r = _.exec(a)) || (r && (a = a.slice(r[0].length) || a), s.push(i = [])), n = !1, (r = z.exec(a)) && (n = r.shift(), i.push({ value: n, type: r[0].replace(B, " ") }), a = a.slice(n.length)), b.filter) !(r = G[o].exec(a)) || u[o] && !(r = u[o](r)) || (n = r.shift(), i.push({ value: n, type: o, matches: r }), a = a.slice(n.length)); if (!n) break } return t ? a.length : a ? se.error(e) : x(e, s).slice(0) }, f = se.compile = function (e, t) { var n, y, v, m, x, r, i = [], o = [], a = A[e + " "]; if (!a) { t || (t = h(e)), n = t.length; while (n--) (a = Se(t[n]))[E] ? i.push(a) : o.push(a); (a = A(e, (y = o, m = 0 < (v = i).length, x = 0 < y.length, r = function (e, t, n, r, i) { var o, a, s, u = 0, l = "0", c = e && [], f = [], p = w, d = e || x && b.find.TAG("*", i), h = k += null == p ? 1 : Math.random() || .1, g = d.length; for (i && (w = t == C || t || i); l !== g && null != (o = d[l]); l++) { if (x && o) { a = 0, t || o.ownerDocument == C || (T(o), n = !S); while (s = y[a++]) if (s(o, t || C, n)) { r.push(o); break } i && (k = h) } m && ((o = !s && o) && u--, e && c.push(o)) } if (u += l, m && l !== u) { a = 0; while (s = v[a++]) s(c, f, t, n); if (e) { if (0 < u) while (l--) c[l] || f[l] || (f[l] = q.call(r)); f = Te(f) } H.apply(r, f), i && !e && 0 < f.length && 1 < u + v.length && se.uniqueSort(r) } return i && (k = h, w = p), c }, m ? le(r) : r))).selector = e } return a }, g = se.select = function (e, t, n, r) { var i, o, a, s, u, l = "function" == typeof e && e, c = !r && h(e = l.selector || e); if (n = n || [], 1 === c.length) { if (2 < (o = c[0] = c[0].slice(0)).length && "ID" === (a = o[0]).type && 9 === t.nodeType && S && b.relative[o[1].type]) { if (!(t = (b.find.ID(a.matches[0].replace(te, ne), t) || [])[0])) return n; l && (t = t.parentNode), e = e.slice(o.shift().value.length) } i = G.needsContext.test(e) ? 0 : o.length; while (i--) { if (a = o[i], b.relative[s = a.type]) break; if ((u = b.find[s]) && (r = u(a.matches[0].replace(te, ne), ee.test(o[0].type) && ve(t.parentNode) || t))) { if (o.splice(i, 1), !(e = r.length && xe(o))) return H.apply(n, r), n; break } } } return (l || f(e, c))(r, t, !S, n, !t || ee.test(e) && ve(t.parentNode) || t), n }, d.sortStable = E.split("").sort(j).join("") === E, d.detectDuplicates = !!l, T(), d.sortDetached = ce(function (e) { return 1 & e.compareDocumentPosition(C.createElement("fieldset")) }), ce(function (e) { return e.innerHTML = "<a href='#'></a>", "#" === e.firstChild.getAttribute("href") }) || fe("type|href|height|width", function (e, t, n) { if (!n) return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) }), d.attributes && ce(function (e) { return e.innerHTML = "<input/>", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value") }) || fe("value", function (e, t, n) { if (!n && "input" === e.nodeName.toLowerCase()) return e.defaultValue }), ce(function (e) { return null == e.getAttribute("disabled") }) || fe(R, function (e, t, n) { var r; if (!n) return !0 === e[t] ? t.toLowerCase() : (r = e.getAttributeNode(t)) && r.specified ? r.value : null }), se }(C); E.find = d, E.expr = d.selectors, E.expr[":"] = E.expr.pseudos, E.uniqueSort = E.unique = d.uniqueSort, E.text = d.getText, E.isXMLDoc = d.isXML, E.contains = d.contains, E.escapeSelector = d.escape; var h = function (e, t, n) { var r = [], i = void 0 !== n; while ((e = e[t]) && 9 !== e.nodeType) if (1 === e.nodeType) { if (i && E(e).is(n)) break; r.push(e) } return r }, T = function (e, t) { for (var n = []; e; e = e.nextSibling)1 === e.nodeType && e !== t && n.push(e); return n }, k = E.expr.match.needsContext; function A(e, t) { return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() } var N = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; function j(e, n, r) { return m(n) ? E.grep(e, function (e, t) { return !!n.call(e, t, e) !== r }) : n.nodeType ? E.grep(e, function (e) { return e === n !== r }) : "string" != typeof n ? E.grep(e, function (e) { return -1 < i.call(n, e) !== r }) : E.filter(n, e, r) } E.filter = function (e, t, n) { var r = t[0]; return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? E.find.matchesSelector(r, e) ? [r] : [] : E.find.matches(e, E.grep(t, function (e) { return 1 === e.nodeType })) }, E.fn.extend({ find: function (e) { var t, n, r = this.length, i = this; if ("string" != typeof e) return this.pushStack(E(e).filter(function () { for (t = 0; t < r; t++)if (E.contains(i[t], this)) return !0 })); for (n = this.pushStack([]), t = 0; t < r; t++)E.find(e, i[t], n); return 1 < r ? E.uniqueSort(n) : n }, filter: function (e) { return this.pushStack(j(this, e || [], !1)) }, not: function (e) { return this.pushStack(j(this, e || [], !0)) }, is: function (e) { return !!j(this, "string" == typeof e && k.test(e) ? E(e) : e || [], !1).length } }); var D, q = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; (E.fn.init = function (e, t, n) { var r, i; if (!e) return this; if (n = n || D, "string" == typeof e) { if (!(r = "<" === e[0] && ">" === e[e.length - 1] && 3 <= e.length ? [null, e, null] : q.exec(e)) || !r[1] && t) return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); if (r[1]) { if (t = t instanceof E ? t[0] : t, E.merge(this, E.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : S, !0)), N.test(r[1]) && E.isPlainObject(t)) for (r in t) m(this[r]) ? this[r](t[r]) : this.attr(r, t[r]); return this } return (i = S.getElementById(r[2])) && (this[0] = i, this.length = 1), this } return e.nodeType ? (this[0] = e, this.length = 1, this) : m(e) ? void 0 !== n.ready ? n.ready(e) : e(E) : E.makeArray(e, this) }).prototype = E.fn, D = E(S); var L = /^(?:parents|prev(?:Until|All))/, H = { children: !0, contents: !0, next: !0, prev: !0 }; function O(e, t) { while ((e = e[t]) && 1 !== e.nodeType); return e } E.fn.extend({ has: function (e) { var t = E(e, this), n = t.length; return this.filter(function () { for (var e = 0; e < n; e++)if (E.contains(this, t[e])) return !0 }) }, closest: function (e, t) { var n, r = 0, i = this.length, o = [], a = "string" != typeof e && E(e); if (!k.test(e)) for (; r < i; r++)for (n = this[r]; n && n !== t; n = n.parentNode)if (n.nodeType < 11 && (a ? -1 < a.index(n) : 1 === n.nodeType && E.find.matchesSelector(n, e))) { o.push(n); break } return this.pushStack(1 < o.length ? E.uniqueSort(o) : o) }, index: function (e) { return e ? "string" == typeof e ? i.call(E(e), this[0]) : i.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 }, add: function (e, t) { return this.pushStack(E.uniqueSort(E.merge(this.get(), E(e, t)))) }, addBack: function (e) { return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) } }), E.each({ parent: function (e) { var t = e.parentNode; return t && 11 !== t.nodeType ? t : null }, parents: function (e) { return h(e, "parentNode") }, parentsUntil: function (e, t, n) { return h(e, "parentNode", n) }, next: function (e) { return O(e, "nextSibling") }, prev: function (e) { return O(e, "previousSibling") }, nextAll: function (e) { return h(e, "nextSibling") }, prevAll: function (e) { return h(e, "previousSibling") }, nextUntil: function (e, t, n) { return h(e, "nextSibling", n) }, prevUntil: function (e, t, n) { return h(e, "previousSibling", n) }, siblings: function (e) { return T((e.parentNode || {}).firstChild, e) }, children: function (e) { return T(e.firstChild) }, contents: function (e) { return null != e.contentDocument && r(e.contentDocument) ? e.contentDocument : (A(e, "template") && (e = e.content || e), E.merge([], e.childNodes)) } }, function (r, i) { E.fn[r] = function (e, t) { var n = E.map(this, i, e); return "Until" !== r.slice(-5) && (t = e), t && "string" == typeof t && (n = E.filter(t, n)), 1 < this.length && (H[r] || E.uniqueSort(n), L.test(r) && n.reverse()), this.pushStack(n) } }); var P = /[^\x20\t\r\n\f]+/g; function R(e) { return e } function M(e) { throw e } function I(e, t, n, r) { var i; try { e && m(i = e.promise) ? i.call(e).done(t).fail(n) : e && m(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) } catch (e) { n.apply(void 0, [e]) } } E.Callbacks = function (r) { var e, n; r = "string" == typeof r ? (e = r, n = {}, E.each(e.match(P) || [], function (e, t) { n[t] = !0 }), n) : E.extend({}, r); var i, t, o, a, s = [], u = [], l = -1, c = function () { for (a = a || r.once, o = i = !0; u.length; l = -1) { t = u.shift(); while (++l < s.length) !1 === s[l].apply(t[0], t[1]) && r.stopOnFalse && (l = s.length, t = !1) } r.memory || (t = !1), i = !1, a && (s = t ? [] : "") }, f = { add: function () { return s && (t && !i && (l = s.length - 1, u.push(t)), function n(e) { E.each(e, function (e, t) { m(t) ? r.unique && f.has(t) || s.push(t) : t && t.length && "string" !== w(t) && n(t) }) }(arguments), t && !i && c()), this }, remove: function () { return E.each(arguments, function (e, t) { var n; while (-1 < (n = E.inArray(t, s, n))) s.splice(n, 1), n <= l && l-- }), this }, has: function (e) { return e ? -1 < E.inArray(e, s) : 0 < s.length }, empty: function () { return s && (s = []), this }, disable: function () { return a = u = [], s = t = "", this }, disabled: function () { return !s }, lock: function () { return a = u = [], t || i || (s = t = ""), this }, locked: function () { return !!a }, fireWith: function (e, t) { return a || (t = [e, (t = t || []).slice ? t.slice() : t], u.push(t), i || c()), this }, fire: function () { return f.fireWith(this, arguments), this }, fired: function () { return !!o } }; return f }, E.extend({ Deferred: function (e) { var o = [["notify", "progress", E.Callbacks("memory"), E.Callbacks("memory"), 2], ["resolve", "done", E.Callbacks("once memory"), E.Callbacks("once memory"), 0, "resolved"], ["reject", "fail", E.Callbacks("once memory"), E.Callbacks("once memory"), 1, "rejected"]], i = "pending", a = { state: function () { return i }, always: function () { return s.done(arguments).fail(arguments), this }, "catch": function (e) { return a.then(null, e) }, pipe: function () { var i = arguments; return E.Deferred(function (r) { E.each(o, function (e, t) { var n = m(i[t[4]]) && i[t[4]]; s[t[1]](function () { var e = n && n.apply(this, arguments); e && m(e.promise) ? e.promise().progress(r.notify).done(r.resolve).fail(r.reject) : r[t[0] + "With"](this, n ? [e] : arguments) }) }), i = null }).promise() }, then: function (t, n, r) { var u = 0; function l(i, o, a, s) { return function () { var n = this, r = arguments, e = function () { var e, t; if (!(i < u)) { if ((e = a.apply(n, r)) === o.promise()) throw new TypeError("Thenable self
3-resolution"); t = e && ("object" == typeof e || "function" == typeof e) && e.then, m(t) ? s ? t.call(e, l(u, o, R, s), l(u, o, M, s)) : (u++, t.call(e, l(u, o, R, s), l(u, o, M, s), l(u, o, R, o.notifyWith))) : (a !== R && (n = void 0, r = [e]), (s || o.resolveWith)(n, r)) } }, t = s ? e : function () { try { e() } catch (e) { E.Deferred.exceptionHook && E.Deferred.exceptionHook(e, t.stackTrace), u <= i + 1 && (a !== M && (n = void 0, r = [e]), o.rejectWith(n, r)) } }; i ? t() : (E.Deferred.getStackHook && (t.stackTrace = E.Deferred.getStackHook()), C.setTimeout(t)) } } return E.Deferred(function (e) { o[0][3].add(l(0, e, m(r) ? r : R, e.notifyWith)), o[1][3].add(l(0, e, m(t) ? t : R)), o[2][3].add(l(0, e, m(n) ? n : M)) }).promise() }, promise: function (e) { return null != e ? E.extend(e, a) : a } }, s = {}; return E.each(o, function (e, t) { var n = t[2], r = t[5]; a[t[1]] = n.add, r && n.add(function () { i = r }, o[3 - e][2].disable, o[3 - e][3].disable, o[0][2].lock, o[0][3].lock), n.add(t[3].fire), s[t[0]] = function () { return s[t[0] + "With"](this === s ? void 0 : this, arguments), this }, s[t[0] + "With"] = n.fireWith }), a.promise(s), e && e.call(s, s), s }, when: function (e) { var n = arguments.length, t = n, r = Array(t), i = s.call(arguments), o = E.Deferred(), a = function (t) { return function (e) { r[t] = this, i[t] = 1 < arguments.length ? s.call(arguments) : e, --n || o.resolveWith(r, i) } }; if (n <= 1 && (I(e, o.done(a(t)).resolve, o.reject, !n), "pending" === o.state() || m(i[t] && i[t].then))) return o.then(); while (t--) I(i[t], a(t), o.reject); return o.promise() } }); var W = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; E.Deferred.exceptionHook = function (e, t) { C.console && C.console.warn && e && W.test(e.name) && C.console.warn("jQuery.Deferred exception: " + e.message, e.stack, t) }, E.readyException = function (e) { C.setTimeout(function () { throw e }) }; var F = E.Deferred(); function $() { S.removeEventListener("DOMContentLoaded", $), C.removeEventListener("load", $), E.ready() } E.fn.ready = function (e) { return F.then(e)["catch"](function (e) { E.readyException(e) }), this }, E.extend({ isReady: !1, readyWait: 1, ready: function (e) { (!0 === e ? --E.readyWait : E.isReady) || (E.isReady = !0) !== e && 0 < --E.readyWait || F.resolveWith(S, [E]) } }), E.ready.then = F.then, "complete" === S.readyState || "loading" !== S.readyState && !S.documentElement.doScroll ? C.setTimeout(E.ready) : (S.addEventListener("DOMContentLoaded", $), C.addEventListener("load", $)); var B = function (e, t, n, r, i, o, a) { var s = 0, u = e.length, l = null == n; if ("object" === w(n)) for (s in i = !0, n) B(e, t, s, n[s], !0, o, a); else if (void 0 !== r && (i = !0, m(r) || (a = !0), l && (a ? (t.call(e, r), t = null) : (l = t, t = function (e, t, n) { return l.call(E(e), n) })), t)) for (; s < u; s++)t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))); return i ? e : l ? t.call(e) : u ? t(e[0], n) : o }, _ = /^-ms-/, z = /-([a-z])/g; function U(e, t) { return t.toUpperCase() } function X(e) { return e.replace(_, "ms-").replace(z, U) } var V = function (e) { return 1 === e.nodeType || 9 === e.nodeType || !+e.n
vendor: 23,316 bytes, line 3
3odeType }; function G() { this.expando = E.expando + G.uid++ } G.uid = 1, G.prototype = { cache: function (e) { var t = e[this.expando]; return t || (t = {}, V(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, { value: t, configurable: !0 }))), t }, set: function (e, t, n) { var r, i = this.cache(e); if ("string" == typeof t) i[X(t)] = n; else for (r in t) i[X(r)] = t[r]; return i }, get: function (e, t) { return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][X(t)] }, access: function (e, t, n) { return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), void 0 !== n ? n : t) }, remove: function (e, t) { var n, r = e[this.expando]; if (void 0 !== r) { if (void 0 !== t) { n = (t = Array.isArray(t) ? t.map(X) : (t = X(t)) in r ? [t] : t.match(P) || []).length; while (n--) delete r[t[n]] } (void 0 === t || E.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando]) } }, hasData: function (e) { var t = e[this.expando]; return void 0 !== t && !E.isEmptyObject(t) } }; var Y = new G, Q = new G, J = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, K = /[A-Z]/g; function Z(e, t, n) { var r, i; if (void 0 === n && 1 === e.nodeType) if (r = "data-" + t.replace(K, "-$&").toLowerCase(), "string" == typeof (n = e.getAttribute(r))) { try { n = "true" === (i = n) || "false" !== i && ("null" === i ? null : i === +i + "" ? +i : J.test(i) ? JSON.parse(i) : i) } catch (e) { } Q.set(e, t, n) } else n = void 0; return n } E.extend({ hasData: function (e) { return Q.hasData(e) || Y.hasData(e) }, data: function (e, t, n) { return Q.access(e, t, n) }, removeData: function (e, t) { Q.remove(e, t) }, _data: function (e, t, n) { return Y.access(e, t, n) }, _removeData: function (e, t) { Y.remove(e, t) } }), E.fn.extend({ data: function (n, e) { var t, r, i, o = this[0], a = o && o.attributes; if (void 0 === n) { if (this.length && (i = Q.get(o), 1 === o.nodeType && !Y.get(o, "hasDataAttrs"))) { t = a.length; while (t--) a[t] && 0 === (r = a[t].name).indexOf("data-") && (r = X(r.slice(5)), Z(o, r, i[r])); Y.set(o, "hasDataAttrs", !0) } return i } return "object" == typeof n ? this.each(function () { Q.set(this, n) }) : B(this, function (e) { var t; if (o && void 0 === e) return void 0 !== (t = Q.get(o, n)) ? t : void 0 !== (t = Z(o, n)) ? t : void 0; this.each(function () { Q.set(this, n, e) }) }, null, e, 1 < arguments.length, null, !0) }, removeData: function (e) { return this.each(function () { Q.remove(this, e) }) } }), E.extend({ queue: function (e, t, n) { var r; if (e) return t = (t || "fx") + "queue", r = Y.get(e, t), n && (!r || Array.isArray(n) ? r = Y.access(e, t, E.makeArray(n)) : r.push(n)), r || [] }, dequeue: function (e, t) { t = t || "fx"; var n = E.queue(e, t), r = n.length, i = n.shift(), o = E._queueHooks(e, t); "inprogress" === i && (i = n.shift(), r--), i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, function () { E.dequeue(e, t) }, o)), !r && o && o.empty.fire() }, _queueHooks: function (e, t) { var n = t + "queueHooks"; return Y.get(e, n) || Y.access(e, n, { empty: E.Callbacks("once memory").add(function () { Y.remove(e, [t + "queue", n]) }) }) } }), E.fn.extend({ queue: function (t, n) { var e = 2; return "string" != typeof t && (n = t, t = "fx", e--), arguments.length < e ? E.queue(this[0], t) : void 0 === n ? this : this.each(function () { var e = E.queue(this, t, n); E._queueHooks(this, t), "fx" === t && "inprogress" !== e[0] && E.dequeue(this, t) }) }, dequeue: function (e) { return this.each(function () { E.dequeue(this, e) }) }, clearQueue: function (e) { return this.queue(e || "fx", []) }, promise: function (e, t) { var n, r = 1, i = E.Deferred(), o = this, a = this.length, s = function () { --r || i.resolveWith(o, [o]) }; "string" != typeof e && (t = e, e = void 0), e = e || "fx"; while (a--) (n = Y.get(o[a], e + "queueHooks")) && n.empty && (r++, n.empty.add(s)); return s(), i.promise(t) } }); var ee = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, te = new RegExp("^(?:([+-])=|)(" + ee + ")([a-z%]*)$", "i"), ne = ["Top", "Right", "Bottom", "Left"], re = S.documentElement, ie = function (e) { return E.contains(e.ownerDocument, e) }, oe = { composed: !0 }; re.getRootNode && (ie = function (e) { return E.contains(e.ownerDocument, e) || e.getRootNode(oe) === e.ownerDocument }); var ae = function (e, t) { return "none" === (e = t || e).style.display || "" === e.style.display && ie(e) && "none" === E.css(e, "display") }; function se(e, t, n, r) { var i, o, a = 20, s = r ? function () { return r.cur() } : function () { return E.css(e, t, "") }, u = s(), l = n && n[3] || (E.cssNumber[t] ? "" : "px"), c = e.nodeType && (E.cssNumber[t] || "px" !== l && +u) && te.exec(E.css(e, t)); if (c && c[3] !== l) { u /= 2, l = l || c[3], c = +u || 1; while (a--) E.style(e, t, c + l), (1 - o) * (1 - (o = s() / u || .5)) <= 0 && (a = 0), c /= o; c *= 2, E.style(e, t, c + l), n = n || [] } return n && (c = +c || +u || 0, i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], r && (r.unit = l, r.start = c, r.end = i)), i } var ue = {}; function le(e, t) { for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++)(r = e[c]).style && (n = r.style.display, t ? ("none" === n && (l[c] = Y.get(r, "display") || null, l[c] || (r.style.display = "")), "" === r.style.display && ae(r) && (l[c] = (u = a = o = void 0, a = (i = r).ownerDocument, s = i.nodeName, (u = ue[s]) || (o = a.body.appendChild(a.createElement(s)), u = E.css(o, "display"), o.parentNode.removeChild(o), "none" === u && (u = "block"), ue[s] = u)))) : "none" !== n && (l[c] = "none", Y.set(r, "display", n))); for (c = 0; c < f; c++)null != l[c] && (e[c].style.display = l[c]); return e } E.fn.extend({ show: function () { return le(this, !0) }, hide: function () { return le(this) }, toggle: function (e) { return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function () { ae(this) ? E(this).show() : E(this).hide() }) } }); var ce, fe, pe = /^(?:checkbox|radio)$/i, de = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, he = /^$|^module$|\/(?:java|ecma)script/i; ce = S.createDocumentFragment().appendChild(S.createElement("div")), (fe = S.createElement("input")).setAttribute("type", "radio"), fe.setAttribute("checked", "checked"), fe.setAttribute("name", "t"), ce.appendChild(fe), v.checkClone = ce.cloneNode(!0).cloneNode(!0).lastChild.checked, ce.innerHTML = "<textarea>x</textarea>", v.noCloneChecked = !!ce.cloneNode(!0).lastChild.defaultValue, ce.innerHTML = "<option></option>", v.option = !!ce.lastChild; var ge = { thead: [1, "<table>", "</table>"], col: [2, "<table><colgroup>", "</colgroup></table>"], tr: [2, "<table><tbody>", "</tbody></table>"], td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], _default: [0, "", ""] }; function ye(e, t) { var n; return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName(t || "*") : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll(t || "*") : [], void 0 === t || t && A(e, t) ? E.merge([e], n) : n } function ve(e, t) { for (var n = 0, r = e.length; n < r; n++)Y.set(e[n], "globalEval", !t || Y.get(t[n], "globalEval")) } ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead, ge.th = ge.td, v.option || (ge.optgroup = ge.option = [1, "<select multiple='multiple'>", "</select>"]); var me = /<|&#?\w+;/; function xe(e, t, n, r, i) { for (var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++)if ((o = e[d]) || 0 === o) if ("object" === w(o)) E.merge(p, o.nodeType ? [o] : o); else if (me.test(o)) { a = a || f.appendChild(t.createElement("div")), s = (de.exec(o) || ["", ""])[1].toLowerCase(), u = ge[s] || ge._default, a.innerHTML = u[1] + E.htmlPrefilter(o) + u[2], c = u[0]; while (c--) a = a.lastChild; E.merge(p, a.childNodes), (a = f.firstChild).textContent = "" } else p.push(t.createTextNode(o)); f.textContent = "", d = 0; while (o = p[d++]) if (r && -1 < E.inArray(o, r)) i && i.push(o); else if (l = ie(o), a = ye(f.appendChild(o), "script"), l && ve(a), n) { c = 0; while (o = a[c++]) he.test(o.type || "") && n.push(o) } return f } var be = /^([^.]*)(?:\.(.+)|)/; function we() { return !0 } function Te() { return !1 } function Ce(e, t) { return e === function () { try { return S.activeElement } catch (e) { } }() == ("focus" === t) } function Se(e, t, n, r, i, o) { var a, s; if ("object" == typeof t) { for (s in "string" != typeof n && (r = r || n, n = void 0), t) Se(e, s, n, r, t[s], o); return e } if (null == r && null == i ? (i = n, r = n = void 0) : null == i && ("string" == typeof n ? (i = r, r = void 0) : (i = r, r = n, n = void 0)), !1 === i) i = Te; else if (!i) return e; return 1 === o && (a = i, (i = function (e) { return E().off(e), a.apply(this, arguments) }).guid = a.guid || (a.guid = E.guid++)), e.each(function () { E.event.add(this, t, i, r, n) }) } function Ee(e, i, o) { o ? (Y.set(e, i, !1), E.event.add(e, i, { namespace: !1, handler: function (e) { var t, n, r = Y.get(this, i); if (1 & e.isTrigger && this[i]) { if (r.length) (E.event.special[i] || {}).delegateType && e.stopPropagation(); else if (r = s.call(arguments), Y.set(this, i, r), t = o(this, i), this[i](), r !== (n = Y.get(this, i)) || t ? Y.set(this, i, !1) : n = {}, r !== n) return e.stopImmediatePropagation(), e.preventDefault(), n && n.value } else r.length && (Y.set(this, i, { value: E.event.trigger(E.extend(r[0], E.Event.prototype), r.slice(1), this) }), e.stopImmediatePropagation()) } })) : void 0 === Y.get(e, i) && E.event.add(e, i, we) } E.event = { global: {}, add: function (t, e, n, r, i) { var o, a, s, u, l, c, f, p, d, h, g, y = Y.get(t); if (V(t)) { n.handler && (n = (o = n).handler, i = o.selector), i && E.find.matchesSelector(re, i), n.guid || (n.guid = E.guid++), (u = y.events) || (u = y.events = Object.create(null)), (a = y.handle) || (a = y.handle = function (e) { return "undefined" != typeof E && E.event.triggered !== e.type ? E.event.dispatch.apply(t, arguments) : void 0 }), l = (e = (e || "").match(P) || [""]).length; while (l--) d = g = (s = be.exec(e[l]) || [])[1], h = (s[2] || "").split(".").sort(), d && (f = E.event.special[d] || {}, d = (i ? f.delegateType : f.bindType) || d, f = E.event.special[d] || {}, c = E.extend({ type: d, origType: g, data: r, handler: n, guid: n.guid, selector: i, needsContext: i && E.expr.match.needsContext.test(i), namespace: h.join(".") }, o), (p = u[d]) || ((p = u[d] = []).delegateCount = 0, f.setup && !1 !== f.setup.call(t, r, h, a) || t.addEventListener && t.addEventListener(d, a)), f.add && (f.add.call(t, c), c.handler.guid || (c.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, c) : p.push(c), E.event.global[d] = !0) } }, remove: function (e, t, n, r, i) { var o, a, s, u, l, c, f, p, d, h, g, y = Y.hasData(e) && Y.get(e); if (y && (u = y.events)) { l = (t = (t || "").match(P) || [""]).length; while (l--) if (d = g = (s = be.exec(t[l]) || [])[1], h = (s[2] || "").split(".").sort(), d) { f = E.event.special[d] || {}, p = u[d = (r ? f.delegateType : f.bindType) || d] || [], s = s[2] && new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), a = o = p.length; while (o--) c = p[o], !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test(c.namespace) || r && r !== c.selector && ("**" !== r || !c.selector) || (p.splice(o, 1), c.selector && p.delegateCount--, f.remove && f.remove.call(e, c)); a && !p.length && (f.teardown && !1 !== f.teardown.call(e, h, y.handle) || E.removeEvent(e, d, y.handle), delete u[d]) } else for (d in u) E.event.remove(e, d + t[l], n, r, !0); E.isEmptyObject(u) && Y.remove(e, "handle events") } }, dispatch: function (e) { var t, n, r, i, o, a, s = new Array(arguments.length), u = E.event.fix(e), l = (Y.get(this, "events") || Object.create(null))[u.type] || [], c = E.event.special[u.type] || {}; for (s[0] = u, t = 1; t < arguments.length; t++)s[t] = arguments[t]; if (u.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call(this, u)) { a = E.event.handlers.call(this, u, l), t = 0; while ((i = a[t++]) && !u.isPropagationStopped()) { u.currentTarget = i.elem, n = 0; while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped()) u.rnamespace && !1 !== o.namespace && !u.rnamespace.test(o.namespace) || (u.handleObj = o, u.data = o.data, void 0 !== (r = ((E.event.special[o.origType] || {}).handle || o.handler).apply(i.elem, s)) && !1 === (u.result = r) && (u.preventDefault(), u.stopPropagation())) } return c.postDispatch && c.postDispatch.call(this, u), u.result } }, handlers: function (e, t) { var n, r, i, o, a, s = [], u = t.delegateCount, l = e.target; if (u && l.nodeType && !("click" === e.type && 1 <= e.button)) for (; l !== this; l = l.parentNode || this)if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) { for (o = [], a = {}, n = 0; n < u; n++)void 0 === a[i = (r = t[n]).selector + " "] && (a[i] = r.needsContext ? -1 < E(i, this).index(l) : E.find(i, this, null, [l]).length), a[i] && o.push(r); o.length && s.push({ elem: l, handlers: o }) } return l = this, u < t.length && s.push({ elem: l, handlers: t.slice(u) }), s }, addProp: function (t, e) { Object.defineProperty(E.Event.prototype, t, { enumerable: !0, configurable: !0, get: m(e) ? function () { if (this.originalEvent) return e(this.originalEvent) } : function () { if (this.originalEvent) return this.originalEvent[t] }, set: function (e) { Object.defineProperty(this, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) } }) }, fix: function (e) { return e[E.expando] ? e : new E.Event(e) }, special: { load: { noBubble: !0 }, click: { setup: function (e) { var t = this || e; return pe.test(t.type) && t.click && A(t, "input") && Ee(t, "click", we), !1 }, trigger: function (e) { var t = this || e; return pe.test(t.type) && t.click && A(t, "input") && Ee(t, "click"), !0 }, _default: function (e) { var t = e.target; return pe.test(t.type) && t.click && A(t, "input") && Y.get(t, "click") || A(t, "a") } }, beforeunload: { postDispatch: function (e) { void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result) } } } }, E.removeEvent = function (e, t, n) { e.removeEventListener && e.removeEventListener(t, n) }, E.Event = function (e, t) { if (!(this instanceof E.Event)) return new E.Event(e, t); e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? we : Te, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget) : this.type = e, t && E.extend(this, t), this.timeStamp = e && e.timeStamp || Date.now(), this[E.expando] = !0 }, E.Event.prototype = { constructor: E.Event, isDefaultPrevented: Te, isPropagationStopped: Te, isImmediatePropagationStopped: Te, isSimulated: !1, preventDefault: function () { var e = this.originalEvent; this.isDefaultPrevented = we, e && !this.isSimulated && e.preventDefault() }, stopPropagation: function () { var e = this.originalEvent; this.isPropagationStopped = we, e && !this.isSimulated && e.stopPropagation() }, stopImmediatePropagation: function () { var e = this.originalEvent; this.isImmediatePropagationStopped = we, e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation() } }, E.each({ altKey: !0, bubbles: !0, cancelable: !0, changedTouches: !0, ctrlKey: !0, detail: !0, eventPhase: !0, metaKey: !0, pageX: !0, pageY: !0, shiftKey: !0, view: !0, "char": !0, code: !0, charCode: !0, key: !0, keyCode: !0, button: !0, buttons: !0, clientX: !0, clientY: !0, offsetX: !0, offsetY: !0, pointerId: !0, pointerType: !0, screenX: !0, screenY: !0, targetTouches: !0, toElement: !0, touches: !0, which: !0 }, E.event.addProp), E.each({ focus: "focusin", blur: "focusout" }, function (t, e) { E.event.special[t] = { setup: function () { return Ee(this, t, Ce), !1 }, trigger: function () { return Ee(this, t), !0 }, _default: function (e) { return Y.get(e.target, t) }, delegateType: e } }), E.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function (e, i) { E.event.special[e] = { delegateType: i, bindType: i, handle: function (e) { var t, n = e.relatedTarget, r = e.handleObj; return n && (n === this || E.contains(this, n)) || (e.type = r.origType, t = r.handler.apply(this, arguments), e.type = i), t } } }), E.fn.extend({ on: function (e, t, n, r) { return Se(this, e, t, n, r) }, one: function (e, t, n, r) { return Se(this, e, t, n, r, 1) }, off: function (e, t, n) { var r, i; if (e && e.preventDefault && e.handleObj) return r = e.handleObj, E(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this; if ("object" == typeof e) { for (i in e) this.off(i, t, e[i]); return this } return !1 !== t && "function" != typeof t || (n = t, t = void 0), !1 === n && (n = Te), this.each(function () { E.event.remove(this, e, n, t) }) } }); var ke = /<script|<style|<link/i, Ae = /checked\s*(?:[^=]|=\s*.checked.)/i, Ne = /^\s*<!\[CDATA\[|\]\]>\s*$/g; function je(e, t) { return A(e, "table") && A(11 !== t.nodeType ? t : t.firstChild, "tr") && E(e).children("tbody")[0] || e } function De(e) { return e.type = (null !== e.getAttribute("type")) + "/" + e.type, e } function qe(e) { return "true/" === (e.type || "").slice(0, 5) ? e.type = e.type.slice(5) : e.removeAttribute("type"), e } function Le(e, t) { var n, r, i, o, a, s; if (1 === t.nodeType) { if (Y.hasData(e) && (s = Y.get(e).events)) for (i in Y.remove(t, "handle events"), s) for (n = 0, r = s[i].length; n < r; n++)E.event.add(t, i, s[i][n]); Q.hasData(e) && (o = Q.access(e), a = E.extend({}, o), Q.set(t, a)) } } function He(n, r, i, o) { r = g(r); var e, t, a, s, u, l, c = 0, f = n.length, p = f - 1, d = r[0], h = m(d); if (h || 1 < f && "string" == typeof d && !v.checkClone && Ae.test(d)) return n.each(function (e) { var t = n.eq(e); h && (r[0] = d.call(this, e, t.html())), He(t, r, i, o) }); if (f && (t = (e = xe(r, n[0].ownerDocument, !1, n, o)).firstChild, 1 === e.childNodes.length && (e = t), t || o)) { for (s = (a = E.map(ye(e, "script"), De)).length; c < f; c++)u = e, c !== p && (u = E.clone(u, !0, !0), s && E.merge(a, ye(u, "script"))), i.call(n[c], u, c); if (s) for (l = a[a.length - 1].ownerDocument, E.map(a, qe), c = 0; c < s; c++)u = a[c], he.test(u.type || "") && !Y.access(u, "globalEval") && E.contains(l, u) && (u.src && "module" !== (u.type || "").toLowerCase() ? E._evalUrl && !u.noModule && E._evalUrl(u.src, { nonce: u.nonce || u.getAttribute("nonce") }, l) : b(u.textContent.replace(Ne, ""), u, l)) } return n } function Oe(e, t, n) { for (var r, i = t ? E.filter(t, e) : e, o = 0; null != (r = i[o]); o++)n || 1 !== r.nodeType || E.cleanData(ye(r)), r.parentNode && (n && ie(r) && ve(ye(r, "script")), r.parentNode.removeChild(r)); return e } E.extend({ htmlPrefilter: function (e) { return e }, clone: function (e, t, n) { var r, i, o, a, s, u, l, c = e.cloneNode(!0), f = ie(e); if (!(v.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || E.isXMLDoc(e))) for (a = ye(c), r = 0, i = (o = ye(e)).length; r < i; r++)s = o[r], u = a[r], void 0, "input" === (l = u.nodeName.toLowerCase()) && pe.test(s.type) ? u.checked = s.checked : "input" !== l && "textarea" !== l || (u.defaultValue = s.defaultValue); if (t) if (n) for (o = o || ye(e), a = a || ye(c), r = 0, i = o.length; r < i; r++)Le(o[r], a[r]); else Le(e, c); return 0 < (a = ye(c, "script")).length && ve(a, !f && ye(e, "script")), c }, cleanData: function (e) { for (var t, n, r, i = E.event.special, o = 0; void 0 !== (n = e[o]); o++)if (V(n)) { if (t = n[Y.expando]) { if (t.events) for (r in t.events) i[r] ? E.event.remove(n, r) : E.removeEvent(n, r, t.handle); n[Y.expando] = void 0 } n[Q.expando] && (n[Q.expando] = void 0) } } }), E.fn.extend({ detach: function (e) { return Oe(this, e, !0) }, remove: function (e) { return Oe(this, e) }, text: function (e) { return B(this, function (e) { return void 0 === e ? E.text(this) : this.empty().each(function () { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (this.textContent = e) }) }, null, e, arguments.length) }, append: function () { return He(this, arguments, function (e) { 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || je(this, e).appendChild(e) }) }, prepend: function () { return He(this, arguments, function (e) { if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { var t = je(this, e); t.insertBefore(e, t.firstChild) } }) }, before: function () { return He(this, arguments, function (e) { this.parentNode && this.parentNode.insertBefore(e, this) }) }, after: function () { return He(this, arguments, function (e) { this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) }) }, empty: function () { for (var e, t = 0; null != (e = this[t]); t++)1 === e.nodeType && (E.cleanData(ye(e, !1)), e.textContent = ""); return this }, clone: function (e, t) { return e = null != e && e, t = null == t ? e : t, this.map(function () { return E.clone(this, e, t) }) }, html: function (e) { return B(this, function (e) { var t = this[0] || {}, n = 0, r = this.length; if (void 0 === e && 1 === t.nodeType) return t.innerHTML; if ("string" == typeof e && !ke.test(e) && !ge[(de.exec(e) || ["", ""])[1].toLowerCase()]) { e = E.htmlPrefilter(e); try { for (; n < r; n++)1 === (t = this[n] || {}).nodeType && (E.cleanData(ye(t, !1)), t.innerHTML = e); t = 0 } catch (e) { } } t && this.empty().append(e) }, null, e, arguments.length) }, replaceWith: function () { var n = []; return He(this, arguments, function (e) { var t = this.parentNode; E.inArray(this, n) < 0 && (E.cleanData(ye(this)), t && t.replaceChild(e, this)) }, n) } }), E.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function (e, a) { E.fn[e] = function (e) { for (var t, n = [], r = E(e), i = r.length - 1, o = 0; o <= i; o++)t = o === i ? this : this.clone(!0), E(r[o])[a](t), u.apply(n, t.get()); return this.pushStack(n) } }); var Pe = new RegExp("^(" + ee + ")(?!px)[a-z%]+$", "i"), Re = /^--/, Me = function (e) { var t = e.ownerDocument.defaultView; return t && t.opener || (t = C), t.getComputedStyle(e) }, Ie = function (e, t, n) { var r, i, o = {}; for (i in t) o[i] = e.style[i], e.style[i] = t[i]; for (i in r = n.call(e), t) e.style[i] = o[i]; return r }, We = new RegExp(ne.join("|"), "i"), Fe = "[\\x20\\t\\r\\n\\f]", $e = new RegExp("^" + Fe + "+|((?:^|[^\\\\])(?:\\\\.)*)" + Fe + "+$", "g"); function Be(e, t, n) { var r, i, o, a, s = Re.test(t), u = e.style; return (n = n || Me(e)) && (a = n.getPropertyValue(t) || n[t], s && a && (a = a.replace($e, "$1") || void 0), "" !== a || ie(e) || (a = E.style(e, t)), !v.pixelBoxStyles() && Pe.test(a) && We.test(t) && (r = u.width, i = u.minWidth, o = u.maxWidth, u.minWidth = u.maxWidth = u.width = a, a = n.width, u.width = r, u.minWidth = i, u.maxWidth = o)), void 0 !== a ? a + "" : a } function _e(e, t) { return { get: function () { if (!e()) return (this.get = t).apply(this, arguments); delete this.get } } } !function () { function e() { if (l) { u.style.cssText = "position:absolute;
3left:-11111px;width:60px;margin-top:1px;padding:0;border:0", l.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", re.appendChild(u).appendChild(l); var e = C.getComputedStyle(l); n = "1%" !== e.top, s = 12 === t(e.marginLeft), l.style.right = "60%", o = 36 === t(e.right), r = 36 === t(e.width), l.style.position = "absolute", i = 12 === t(l.offsetWidth / 3), re.removeChild(u), l = null } } function t(e) { return Math.round(parseFloat(e)) } var n, r, i, o, a, s, u = S.createElement("div"), l = S.createElement("div"); l.style && (l.style.backgroundClip = "content-box", l.cloneNode(!0).style.backgroundClip = "", v.clearCloneStyle = "content-box" === l.style.backgroundClip, E.extend(v, { boxSizingReliable: function () { return e(), r }, pixelBoxStyles: function () { return e(), o }, pixelPosition: function () { return e(), n }, reliableMarginLeft: function () { return e(), s }, scrollboxSize: function () { return e(), i }, reliableTrDimensions: function () { var e, t, n, r; return null == a && (e = S.createElement("table"), t = S.createElement("tr"), n = S.createElement("div"), e.style.cssText = "position:absolute;left:-11111px;border-collapse:separate", t.style.cssText = "border:1px solid", t.style.height = "1px", n.style.height = "9px", n.style.display = "block", re.appendChild(e).appendChild(t).appendChild(n), r = C.getComputedStyle(t), a = parseInt(r.height, 10) + parseInt(r.borderTopWidth, 10) + parseInt(r.borderBottomWidth, 10) === t.offsetHeight, re.removeChild(e)), a } })) }(); var ze = ["Webkit", "Moz", "ms"], Ue = S.createElement("div").style, Xe = {}; function Ve(e) { var t = E.cssProps[e] || Xe[e]; return t || (e in Ue ? e : Xe[e] = function (e) { var t = e[0].toUpperCase() + e.slice(1), n = ze.length; while (n--) if ((e = ze[n] + t) in Ue) return e }(e) || e) } var Ge = /^(none|table(?!-c[ea]).+)/, Ye = { position: "absolute", visibility: "hidden", display: "block" }, Qe = { letterSpacing: "0", fontWeight: "400" }; function Je(e, t, n) { var r = te.exec(t); return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t } function Ke(e, t, n, r, i, o) { var a = "width" === t ? 1 : 0, s = 0, u = 0; if (n === (r ? "border" : "content")) return 0; for (; a < 4; a += 2)"margin" === n && (u += E.css(e, n + ne[a], !0, i)), r ? ("content" === n && (u -= E.css(e, "padding" + ne[a], !0, i)), "margin" !== n && (u -= E.css(e, "border" + ne[a] + "Width", !0, i))) : (u += E.css(e, "padding" + ne[a], !0, i), "padding" !== n ? u += E.css(e, "border" + ne[a] + "Width", !0, i) : s += E.css(e, "border" + ne[a] + "Width", !0, i)); return !r && 0 <= o && (u += Math.max(0, Math.ceil(e["offset" + t[0].toUpperCase() + t.slice(1)] - o - u - s - .5)) || 0), u } function Ze(e, t, n) { var r = Me(e), i = (!v.boxSizingReliable() || n) && "border-box" === E.css(e, "boxSizing", !1, r), o = i, a = Be(e, t, r), s = "offset" + t[0].toUpperCase() + t.slice(1); if (Pe.test(a)) { if (!n) return a; a = "auto" } return (!v.boxSizingReliable() && i || !v.reliableTrDimensions() && A(e, "tr") || "auto" === a || !parseFloat(a) && "inline" === E.css(e, "display", !1, r)) && e.getClientRects().length && (i = "border-box" === E.css(e, "boxSizing", !1, r), (o = s in e) && (a = e[s])), (a = parseFloat(a) || 0) + Ke(e, t, n || (i ? "border" : "content"), o, r, a) + "px" } function et(e, t, n, r, i) { return new et.prototype.init(e, t, n, r, i) } E.extend({ cssHooks: { opacity: { get: function (e, t) { if (t) { var n = Be(e, "opacity"); return "" === n ? "1" : n } } } }, cssNumber: { animationIterationCount: !0, columnCount: !0, fillOpacity: !0, flexGrow: !0, flexShrink: !0, fontWeight: !0, gridArea: !0, gridColumn: !0, gridColumnEnd: !0, gridColumnStart: !0, gridRow: !0, gridRowEnd: !0, gridRowStart: !0, lineHeight: !0, opacity: !0, order: !0, orphans: !0, widows: !0, zIndex: !0, zoom: !0 }, cssProps: {}, style: function (e, t, n, r) { if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { var i, o, a, s = X(t), u = Re.test(t), l = e.style; if (u || (t = Ve(s)), a = E.cssHooks[t] || E.cssHooks[s], void 0 === n) return a && "get" in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t]; "string" === (o = typeof n) && (i = te.exec(n)) && i[1] && (n = se(e, t, i), o = "number"), null != n && n == n && ("number" !== o || u || (n += i && i[3] || (E.cssNumber[s] ? "" : "px")), v.clearCloneStyle || "" !== n || 0 !== t.indexOf("background") || (l[t] = "inherit"), a && "set" in a && void 0 === (n = a.set(e, n, r)) || (u ? l.setProperty(t, n) : l[t] = n)) } }, css: function (e, t, n, r) { var i, o, a, s = X(t); return Re.test(t) || (t = Ve(s)), (a = E.cssHooks[t] || E.cssHooks[s]) && "get" in a && (i = a.get(e, !0, n)), void 0 === i && (i = Be(e, t, r)), "n
3ormal" === i && t in Qe && (i = Qe[t]), "" === n || n ? (o = parseFloat(i), !0 === n || isFinite(o) ? o || 0 : i) : i } }), E.each(["height", "width"], function (e, u) { E.cssHooks[u] = { get: function (e, t, n) { if (t) return !Ge.test(E.css(e, "display")) || e.getClientRects().length && e.getBoundingClientRect().width ? Ze(e, u, n) : Ie(e, Ye, function () { return Ze(e, u, n) }) }, set: function (e, t, n) { var r, i = Me(e), o = !v.scrollboxSize() && "absolute" === i.position, a = (o || n) && "border-box" === E.css(e, "boxSizing", !1, i), s = n ? Ke(e, u, n, a, i) : 0; return a && o && (s -= Math.ceil(e["offset" + u[0].toUpperCase() + u.slice(1)] - parseFloat(i[u]) - Ke(e, u, "border", !1, i) - .5)), s && (r = te.exec(t)) && "px" !== (r[3] || "px") && (e.style[u] = t, t = E.css(e, u)), Je(0, t, s) } } }), E.cssHooks.marginLeft = _e(v.reliableMarginLeft, function (e, t) { if (t) return (parseFloat(Be(e, "marginLeft")) || e.getBoundingClientRect().left - Ie(e, { marginLeft: 0 }, function () { return e.getBoundingClientRect().left })) + "px" }), E.each({ margin: "", padding: "", border: "Width" }, function (i, o) { E.cssHooks[i + o] = { expand: function (e) { for (var t = 0, n = {}, r = "string" == typeof e ? e.split(" ") : [e]; t < 4; t++)n[i + ne[t] + o] = r[t] || r[t - 2] || r[0]; return n } }, "margin" !== i && (E.cssHooks[i + o].set = Je) }), E.fn.extend({ css: function (e, t) { return B(this, function (e, t, n) { var r, i, o = {}, a = 0; if (Array.isArray(t)) { for (r = Me(e), i = t.length; a < i; a++)o[t[a]] = E.css(e, t[a], !1, r); return o } return void 0 !== n ? E.style(e, t, n) : E.css(e, t) }, e, t, 1 < arguments.length) } }), ((E.Tween = et).prototype = { constructor: et, init: function (e, t, n, r, i, o) { this.elem = e, this.prop = n, this.easing = i || E.easing._default, this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (E.cssNumber[n] ? "" : "px") }, cur: function () { var e = et.propHooks[this.prop]; return e && e.get ? e.get(this) : et.propHooks._default.get(this) }, run: function (e) { var t, n = et.propHooks[this.prop]; return this.options.duration ? this.pos = t = E.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : et.propHooks._default.set(this), this } }).init.prototype = et.prototype, (et.propHooks = { _default: { get: function (e) { var t; return 1 !== e.elem.nodeType || null != e.elem[e.prop] && null == e.elem.style[e.prop] ? e.elem[e.prop] : (t = E.css(e.elem, e.prop, "")) && "auto" !== t ? t : 0 }, set: function (e) { E.fx.step[e.prop] ? E.fx.step[e.prop](e) : 1 !== e.elem.nodeType || !E.cssHooks[e.prop] && null == e.elem.style[Ve(e.prop)] ? e.elem[e.prop] = e.now : E.style(e.elem, e.prop, e.now + e.unit) } } }).scrollTop = et.propHooks.scrollLeft = { set: function (e) { e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) } }, E.easing = { linear: function (e) { return e }, swing: function (e) { return .5 - Math.cos(e * Math.PI) / 2 }, _default: "swing" }, E.fx = et.prototype.init, E.fx.step = {}; var tt, nt, rt, it, ot = /^(?:toggle|show|hide)$/, at = /queueHooks$/; function st() { nt && (!1 === S.hidden && C.requestAnimationFrame ? C.requestAnimationFrame(st) : C.setTimeout(st, E.fx.interval), E.fx.tick()) } function ut() { return C.setTimeout(function () { tt = void 0 }), tt = Date.now() } function lt(e, t) { var n, r = 0, i = { height: e }; for (t = t ? 1 : 0; r < 4; r += 2 - t)i["margin" + (n = ne[r])] = i["padding" + n] = e; return t && (i.opacity = i.width = e), i } function ct(e, t, n) { for (var r, i = (ft.tweeners[t] || []).concat(ft.tweeners["*"]), o = 0, a = i.length; o < a; o++)if (r = i[o].call(n, t, e)) return r } function ft(o, e, t) { var n, a, r = 0, i = ft.prefilters.length, s = E.Deferred().always(function () { delete u.elem }), u = function () { if (a) return !1; for (var e = tt || ut(), t = Math.max(0, l.startTime + l.duration - e), n = 1 - (t / l.duration || 0), r = 0, i = l.tweens.length; r < i; r++)l.tweens[r].run(n); return s.notifyWith(o, [l, n, t]), n < 1 && i ? t : (i || s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l]), !1) }, l = s.promise({ elem: o, props: E.extend({}, e), opts: E.extend(!0, { specialEasing: {}, easing: E.easing._default }, t), originalProperties: e, originalOptions: t, startTime: tt || ut(), duration: t.duration, tweens: [], createTween: function (e, t) { var n = E.Tween(o, l.opts, e, t, l.opts.specialEasing[e] || l.opts.easing); return l.tweens.push(n), n }, stop: function (e) { var t = 0, n = e ? l.tweens.length : 0; if (a) return this; for (a = !0; t < n; t++)l.tweens[t].run(1); return e ? (s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l, e])) : s.rejectWith(o, [l, e]), this } }), c = l.props; for (!function (e, t) { var n, r, i, o, a; for (n in e) if (i = t[r = X(n)], o = e[n], Array.isArray(o) && (i = o[1], o = e[n] = o[0]), n !== r && (e[r] = o, delete e[n]), (a = E.cssHooks[r]) && "expand" in a) for (n in o = a.expand(o), delete e[r], o) n in e || (e[n] = o[n], t[n] = i); else t[r] = i }(c, l.opts.specialEasing); r < i;
vendor: 32,207 bytes, line 3
3 r++)if (n = ft.prefilters[r].call(l, o, c, l.opts)) return m(n.stop) && (E._queueHooks(l.elem, l.opts.queue).stop = n.stop.bind(n)), n; return E.map(c, ct, l), m(l.opts.start) && l.opts.start.call(o, l), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always), E.fx.timer(E.extend(u, { elem: o, anim: l, queue: l.opts.queue })), l } E.Animation = E.extend(ft, { tweeners: { "*": [function (e, t) { var n = this.createTween(e, t); return se(n.elem, e, te.exec(t), n), n }] }, tweener: function (e, t) { m(e) ? (t = e, e = ["*"]) : e = e.match(P); for (var n, r = 0, i = e.length; r < i; r++)n = e[r], ft.tweeners[n] = ft.tweeners[n] || [], ft.tweeners[n].unshift(t) }, prefilters: [function (e, t, n) { var r, i, o, a, s, u, l, c, f = "width" in t || "height" in t, p = this, d = {}, h = e.style, g = e.nodeType && ae(e), y = Y.get(e, "fxshow"); for (r in n.queue || (null == (a = E._queueHooks(e, "fx")).unqueued && (a.unqueued = 0, s = a.empty.fire, a.empty.fire = function () { a.unqueued || s() }), a.unqueued++, p.always(function () { p.always(function () { a.unqueued--, E.queue(e, "fx").length || a.empty.fire() }) })), t) if (i = t[r], ot.test(i)) { if (delete t[r], o = o || "toggle" === i, i === (g ? "hide" : "show")) { if ("show" !== i || !y || void 0 === y[r]) continue; g = !0 } d[r] = y && y[r] || E.style(e, r) } if ((u = !E.isEmptyObject(t)) || !E.isEmptyObject(d)) for (r in f && 1 === e.nodeType && (n.overflow = [h.overflow, h.overflowX, h.overflowY], null == (l = y && y.display) && (l = Y.get(e, "display")), "none" === (c = E.css(e, "display")) && (l ? c = l : (le([e], !0), l = e.style.display || l, c = E.css(e, "display"), le([e]))), ("inline" === c || "inline-block" === c && null != l) && "none" === E.css(e, "float") && (u || (p.done(function () { h.display = l }), null == l && (c = h.display, l = "none" === c ? "" : c)), h.display = "inline-block")), n.overflow && (h.overflow = "hidden", p.always(function () { h.overflow = n.overflow[0], h.overflowX = n.overflow[1], h.overflowY = n.overflow[2] })), u = !1, d) u || (y ? "hidden" in y && (g = y.hidden) : y = Y.access(e, "fxshow", { display: l }), o && (y.hidden = !g), g && le([e], !0), p.done(function () { for (r in g || le([e]), Y.remove(e, "fxshow"), d) E.style(e, r, d[r]) })), u = ct(g ? y[r] : 0, r, p), r in y || (y[r] = u.start, g && (u.end = u.start, u.start = 0)) }], prefilter: function (e, t) { t ? ft.prefilters.unshift(e) : ft.prefilters.push(e) } }), E.speed = function (e, t, n) { var r = e && "object" == typeof e ? E.extend({}, e) : { complete: n || !n && t || m(e) && e, duration: e, easing: n && t || t && !m(t) && t }; return E.fx.off ? r.duration = 0 : "number" != typeof r.duration && (r.duration in E.fx.speeds ? r.duration = E.fx.speeds[r.duration] : r.duration = E.fx.speeds._default), null != r.queue && !0 !== r.queue || (r.queue = "fx"), r.old = r.complete, r.complete = function () { m(r.old) && r.old.call(this), r.queue && E.dequeue(this, r.queue) }, r }, E.fn.extend({ fadeTo: function (e, t, n, r) { return this.filter(ae).css("opacity", 0).show().end().animate({ opacity: t }, e, n, r) }, animate: function (t, e, n, r) { var i = E.isEmptyObject(t), o = E.speed(e, n, r), a = function () { var e = ft(this, E.extend({}, t), o); (i || Y.get(this, "finish")) && e.stop(!0) }; return a.finish = a, i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) }, stop: function (i, e, o) { var a = function (e) { var t = e.stop; delete e.stop, t(o) }; return "string" != typeof i && (o = e, e = i, i = void 0), e && this.queue(i || "fx", []), this.each(function () { var e = !0, t = null != i && i + "queueHooks", n = E.timers, r = Y.get(this); if (t) r[t] && r[t].stop && a(r[t]); else for (t in r) r[t] && r[t].stop && at.test(t) && a(r[t]); for (t = n.length; t--;)n[t].elem !== this || null != i && n[t].queue !== i || (n[t].anim.stop(o), e = !1, n.splice(t, 1)); !e && o || E.dequeue(this, i) }) }, finish: function (a) { return !1 !== a && (a = a || "fx"), this.each(function () { var e, t = Y.get(this), n = t[a + "queue"], r = t[a + "queueHooks"], i = E.timers, o = n ? n.length : 0; for (t.finish = !0, E.queue(this, a, []), r && r.stop && r.stop.call(this, !0), e = i.length; e--;)i[e].elem === this && i[e].queue === a && (i[e].anim.stop(!0), i.splice(e, 1)); for (e = 0; e < o; e++)n[e] && n[e].finish && n[e].finish.call(this); delete t.finish }) } }), E.each(["toggle", "show", "hide"], function (e, r) { var i = E.fn[r]; E.fn[r] = function (e, t, n) { return null == e || "boolean" == typeof e ? i.apply(this, arguments) : this.animate(lt(r, !0), e, t, n) } }), E.each({ slideDown: lt("show"), slideUp: lt("hide"), slideToggle: lt("toggle"), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function (e, r) { E.fn[e] = function (e, t, n) { return this.animate(r, e, t, n) } }), E.timers = [], E.fx.tick = function () { var e, t = 0, n = E.timers; for (tt = Date.now(); t < n.length; t++)(e = n[t])() || n[t] !== e || n.splice(t--, 1); n.length || E.fx.stop(), tt = void 0 }, E.fx.timer = function (e) { E.timers.push(e), E.fx.start() }, E.fx.interval = 13, E.fx.start = function () { nt || (nt = !0, st()) }, E.fx.stop = function () { nt = null }, E.fx.speeds = { slow: 600, fast: 200, _default: 400 }, E.fn.delay = function (r, e) { return r = E.fx && E.fx.speeds[r] || r, e = e || "fx", this.queue(e, function (e, t) { var n = C.setTimeout(e, r); t.stop = function () { C.clearTimeout(n) } }) }, rt = S.createElement("input"), it = S.createElement("select").appendChild(S.createElement("option")), rt.type = "checkbox", v.checkOn = "" !== rt.value, v.optSelected = it.selected, (rt = S.createElement("input")).value = "t", rt.type = "radio", v.radioValue = "t" === rt.value; var pt, dt = E.expr.attrHandle; E.fn.extend({ attr: function (e, t) { return B(this, E.attr, e, t, 1 < arguments.length) }, removeAttr: function (e) { return this.each(function () { E.removeAttr(this, e) }) } }), E.extend({ attr: function (e, t, n) { var r, i, o = e.nodeType; if (3 !== o && 8 !== o && 2 !== o) return "undefined" == typeof e.getAttribute ? E.prop(e, t, n) : (1 === o && E.isXMLDoc(e) || (i = E.attrHooks[t.toLowerCase()] || (E.expr.match.bool.test(t) ? pt : void 0)), void 0 !== n ? null === n ? void E.removeAttr(e, t) : i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : (e.setAttribute(t, n + ""), n) : i && "get" in i && null !== (r = i.get(e, t)) ? r : null == (r = E.find.attr(e, t)) ? void 0 : r) }, attrHooks: { type: { set: function (e, t) { if (!v.radioValue && "radio" === t && A(e, "input")) { var n = e.value; return e.setAttribute("type", t), n && (e.value = n), t } } } }, removeAttr: function (e, t) { var n, r = 0, i = t && t.match(P); if (i && 1 === e.nodeType) while (n = i[r++]) e.removeAttribute(n) } }), pt = { set: function (e, t, n) { return !1 === t ? E.removeAttr(e, n) : e.setAttribute(n, n), n } }, E.each(E.expr.match.bool.source.match(/\w+/g), function (e, t) { var a = dt[t] || E.find.attr; dt[t] = function (e, t, n) { var r, i, o = t.toLowerCase(); return n || (i = dt[o], dt[o] = r, r = null != a(e, t, n) ? o : null, dt[o] = i), r } }); var ht = /^(?:input|select|textarea|button)$/i, gt = /^(?:a|area)$/i; function yt(e) { return (e.match(P) || []).join(" ") } function vt(e) { return e.getAttribute && e.getAttribute("class") || "" } function mt(e) { return Array.isArray(e) ? e : "string" == typeof e && e.match(P) || [] } E.fn.extend({ prop: function (e, t) { return B(this, E.prop, e, t, 1 < arguments.length) }, removeProp: function (e) { return this.each(function () { delete this[E.propFix[e] || e] }) } }), E.extend({ prop: function (e, t, n) { var r, i, o = e.nodeType; if (3 !== o && 8 !== o && 2 !== o) return 1 === o && E.isXMLDoc(e) || (t = E.propFix[t] || t, i = E.propHooks[t]), void 0 !== n ? i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : e[t] = n : i && "get" in i && null !== (r = i.get(e, t)) ? r : e[t] }, propHooks: { tabIndex: { get: function (e) { var t = E.find.attr(e, "tabindex"); return t ? parseInt(t, 10) : ht.test(e.nodeName) || gt.test(e.nodeName) && e.href ? 0 : -1 } } }, propFix: { "for": "htmlFor", "class": "className" } }), v.optSelected || (E.propHooks.selected = { get: function (e) { var t = e.parentNode; return t && t.parentNode && t.parentNode.selectedIndex, null }, set: function (e) { var t = e.parentNode; t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) } }), E.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { E.propFix[this.toLowerCase()] = this }), E.fn.extend({ addClass: function (t) { var e, n, r, i, o, a; return m(t) ? this.each(function (e) { E(this).addClass(t.call(this, e, vt(this))) }) : (e = mt(t)).length ? this.each(function () { if (r = vt(this), n = 1 === this.nodeType && " " + yt(r) + " ") { for (o = 0; o < e.length; o++)i = e[o], n.indexOf(" " + i + " ") < 0 && (n += i + " "); a = yt(n), r !== a && this.setAttribute("class", a) } }) : this }, removeClass: function (t) { var e, n, r, i, o, a; return m(t) ? this.each(function (e) { E(this).removeClass(t.call(this, e, vt(this))) }) : arguments.length ? (e = mt(t)).length ? this.each(function () { if (r = vt(this), n = 1 === this.nodeType && " " + yt(r) + " ") { for (o = 0; o < e.length; o++) { i = e[o]; while (-1 < n.indexOf(" " + i + " ")) n = n.replace(" " + i + " ", " ") } a = yt(n), r !== a && this.setAttribute("class", a) } }) : this : this.attr("class", "") }, toggleClass: function (t, n) { var e, r, i, o, a = typeof t, s = "string" === a || Array.isArray(t); return m(t) ? this.each(function (e) { E(this).toggleClass(t.call(this, e, vt(this), n), n) }) : "boolean" == typeof n && s ? n ? this.addClass(t) : this.removeClass(t) : (e = mt(t), this.each(function () { if (s) for (o = E(this), i = 0; i < e.length; i++)r = e[i], o.hasClass(r) ? o.removeClass(r) : o.addClass(r); else void 0 !== t && "boolean" !== a || ((r = vt(this)) && Y.set(this, "__className__", r), this.setAttribute && this.setAttribute("class", r || !1 === t ? "" : Y.get(this, "__className__") || "")) })) }, hasClass: function (e) { var t, n, r = 0; t = " " + e + " "; while (n = this[r++]) if (1 === n.nodeType && -1 < (" " + yt(vt(n)) + " ").indexOf(t)) return !0; return !1 } }); var xt = /\r/g; E.fn.extend({ val: function (n) { var r, e, i, t = this[0]; return arguments.length ? (i = m(n), this.each(function (e) { var t; 1 === this.nodeType && (null == (t = i ? n.call(this, e, E(this).val()) : n) ? t = "" : "number" == typeof t ? t += "" : Array.isArray(t) && (t = E.map(t, function (e) { return null == e ? "" : e + "" })), (r = E.valHooks[this.type] || E.valHooks[this.nodeName.toLowerCase()]) && "set" in r && void 0 !== r.set(this, t, "value") || (this.value = t)) })) : t ? (r = E.valHooks[t.type] || E.valHooks[t.nodeName.toLowerCase()]) && "get" in r && void 0 !== (e = r.get(t, "value")) ? e : "string" == typeof (e = t.value) ? e.replace(xt, "") : null == e ? "" : e : void 0 } }), E.extend({ valHooks: { option: { get: function (e) { var t = E.find.attr(e, "value"); return null != t ? t : yt(E.text(e)) } }, select: { get: function (e) { var t, n, r, i = e.options, o = e.selectedIndex, a = "select-one" === e.type, s = a ? null : [], u = a ? o + 1 : i.length; for (r = o < 0 ? u : a ? o : 0; r < u; r++)if (((n = i[r]).selected || r === o) && !n.disabled && (!n.parentNode.disabled || !A(n.parentNode, "optgroup"))) { if (t = E(n).val(), a) return t; s.push(t) } return s }, set: function (e, t) { var n, r, i = e.options, o = E.makeArray(t), a = i.length; while (a--) ((r = i[a]).selected = -1 < E.inArray(E.valHooks.option.get(r), o)) && (n = !0); return n || (e.selectedIndex = -1), o } } } }), E.each(["radio", "checkbox"], function () { E.valHooks[this] = { set: function (e, t) { if (Array.isArray(t)) return e.checked = -1 < E.inArray(E(e).val(), t) } }, v.checkOn || (E.valHooks[this].get = function (e) { return null === e.getAttribute("value") ? "on" : e.value }) }), v.focusin = "onfocusin" in C; var bt = /^(?:focusinfocus|focusoutblur)$/, wt = function (e) { e.stopPropagation() }; E.extend(E.event, { trigger: function (e, t, n, r) { var i, o, a, s, u, l, c, f, p = [n || S], d = y.call(e, "type") ? e.type : e, h = y.call(e, "namespace") ? e.namespace.split(".") : []; if (o = f = a = n = n || S, 3 !== n.nodeType && 8 !== n.nodeType && !bt.test(d + E.event.triggered) && (-1 < d.indexOf(".") && (d = (h = d.split(".")).shift(), h.sort()), u = d.indexOf(":") < 0 && "on" + d, (e = e[E.expando] ? e : new E.Event(d, "object" == typeof e && e)).isTrigger = r ? 2 : 3, e.namespace = h.join("."), e.rnamespace = e.namespace ? new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, e.result = void 0, e.target || (e.target = n), t = null == t ? [e] : E.makeArray(t, [e]), c = E.event.special[d] || {}, r || !c.trigger || !1 !== c.trigger.apply(n, t))) { if (!r && !c.noBubble && !x(n)) { for (s = c.delegateType || d, bt.test(s + d) || (o = o.parentNode); o; o = o.parentNode)p.push(o), a = o; a === (n.ownerDocument || S) && p.push(a.defaultView || a.parentWindow || C) } i = 0; while ((o = p[i++]) && !e.isPropagationStopped()) f = o, e.type = 1 < i ? s : c.bindType || d, (l = (Y.get(o, "events") || Object.create(null))[e.type] && Y.get(o, "handle")) && l.apply(o, t), (l = u && o[u]) && l.apply && V(o) && (e.result = l.apply(o, t), !1 === e.result && e.preventDefault()); return e.type = d, r || e.isDefaultPrevented() || c._default && !1 !== c._default.apply(p.pop(), t) || !V(n) || u && m(n[d]) && !x(n) && ((a = n[u]) && (n[u] = null), E.event.triggered = d, e.isPropagationStopped() && f.addEventListener(d, wt), n[d](), e.isPropagationStopped() && f.removeEventListener(d, wt), E.event.triggered = void 0, a && (n[u] = a)), e.result } }, simulate: function (e, t, n) { var r = E.extend(new E.Event, n, { type: e, isSimulated: !0 }); E.event.trigger(r, null, t) } }), E.fn.extend({ trigger: function (e, t) { return this.each(function () { E.event.trigger(e, t, this) }) }, triggerHandler: function (e, t) { var n = this[0]; if (n) return E.event.trigger(e, t, n, !0) } }), v.focusin || E.each({ focus: "focusin", blur: "focusout" }, function (n, r) { var i = function (e) { E.event.simulate(r, e.target, E.event.fix(e)) }; E.event.special[r] = { setup: function () { var e = this.ownerDocument || this.document || this, t = Y.access(e, r); t || e.addEventListener(n, i, !0), Y.access(e, r, (t || 0) + 1) }, teardown: function () { var e = this.ownerDocument || this.document || this, t = Y.access(e, r) - 1; t ? Y.access(e, r, t) : (e.removeEventListener(n, i, !0), Y.remove(e, r)) } } }); var Tt = C.location, Ct = { guid: Date.now() }, St = /\?/; E.parseXML = function (e) { var t, n; if (!e || "string" != typeof e) return null; try { t = (new C.DOMParser).parseFromString(e, "text/xml") } catch (e) { } return n = t && t.getElementsByTagName("parsererror")[0], t && !n || E.error("Invalid XML: " + (n ? E.map(n.childNodes, function (e) { return e.textContent }).join("\n") : e)), t }; var Et = /\[\]$/, kt = /\r?\n/g, At = /^(?:submit|button|image|reset|file)$/i, Nt = /^(?:input|select|textarea|keygen)/i; function jt(n, e, r, i) { var t; if (Array.isArray(e)) E.each(e, function (e, t) { r || Et.test(n) ? i(n, t) : jt(n + "[" + ("object" == typeof t && null != t ? e : "") + "]", t, r, i) }); else if (r || "object" !== w(e)) i(n, e); else for (t in e) jt(n + "[" + t + "]", e[t], r, i) } E.param = function (e, t) { var n, r = [], i = function (e, t) { var n = m(t) ? t() : t; r[r.length] = encodeURIComponent(e) + "=" + encodeURIComponent(null == n ? "" : n) }; if (null == e) return ""; if (Array.isArray(e) || e.jquery && !E.isPlainObject(e)) E.each(e, function () { i(this.name, this.value) }); else for (n in e) jt(n, e[n], t, i); return r.join("&") }, E.fn.extend({ serialize: function () { return E.param(this.serializeArray()) }, serializeArray: function () { return this.map(function () { var e = E.prop(this, "elements"); return e ? E.makeArray(e) : this }).filter(function () { var e = this.type; return this.name && !E(this).is(":disabled") && Nt.test(this.nodeName) && !At.test(e) && (this.checked || !pe.test(e)) }).map(function (e, t) { var n = E(this).val(); return null == n ? null : Array.isArray(n) ? E.map(n, function (e) { return { name: t.name, value: e.replace(kt, "\r\n") } }) : { name: t.name, value: n.replace(kt, "\r\n") } }).get() } }); var Dt = /%20/g, qt = /#.*$/, Lt = /([?&])_=[^&]*/, Ht = /^(.*?):[ \t]*([^\r\n]*)$/gm, Ot = /^(?:GET|HEAD)$/, Pt = /^\/\//, Rt = {}, Mt = {}, It = "*/".concat("*"), Wt = S.createElement("a"); function Ft(o) { return function (e, t) { "string" != typeof e && (t = e, e = "*"); var n, r = 0, i = e.toLowerCase().match(P) || []; if (m(t)) while (n = i[r++]) "+" === n[0] ? (n = n.slice(1) || "*", (o[n] = o[n] || []).unshift(t)) : (o[n] = o[n] || []).push(t) } } function $t(t, i, o, a) { var s = {}, u = t === Mt; function l(e) { var r; return s[e] = !0, E.each(t[e] || [], function (e, t) { var n = t(i, o, a); return "string" != typeof n || u || s[n] ? u ? !(r = n) : void 0 : (i.dataTypes.unshift(n), l(n), !1) }), r } return l(i.dataTypes[0]) || !s["*"] && l("*") } function Bt(e, t) { var n, r, i = E.ajaxSettings.flatOptions || {}; for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]); return r && E.extend(!0, e, r), e } Wt.href = Tt.href, E.extend({ active: 0, lastModified: {}, etag: {}, ajaxSettings: { url: Tt.href, type: "GET", isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol), global: !0, processData: !0, async: !0, contentType: "application/x-www-form-urlencoded; charset=UTF-8", accepts: { "*": It, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, converters: { "* text": String, "text html": !0, "text json": JSON.parse, "text xml": E.parseXML }, flatOptions: { url: !0, context: !0 } }, ajaxSetup: function (e, t) { return t ? Bt(Bt(e, E.ajaxSettings), t) : Bt(E.ajaxSettings, e) }, ajaxPrefilter: Ft(Rt), ajaxTransport: Ft(Mt), ajax: function (e, t) { "object" == typeof e && (t = e, e = void 0), t = t || {}; var c, f, p, n, d, r, h, g, i, o, y = E.ajaxSetup({}, t), v = y.context || y, m = y.context && (v.nodeType || v.jquery) ? E(v) : E.event, x = E.Deferred(), b = E.Callbacks("once memory"), w = y.statusCode || {}, a = {}, s = {}, u = "canceled", T = { readyState: 0, getResponseHeader: function (e) { var t; if (h) { if (!n) { n = {}; while (t = Ht.exec(p)) n[t[1].toLowerCase() + " "] = (n[t[1].toLowerCase() + " "] || []).concat(t[2]) } t = n[e.toLowerCase() + " "] } return null == t ? null : t.join(", ") }, getAllResponseHeaders: function () { return h ? p : null }, setRequestHeader: function (e, t) { return null == h && (e = s[e.toLowerCase()] = s[e.toLowerCase()] || e, a[e] = t), this }, overrideMimeType: function (e) { return null == h && (y.mimeType = e), this }, statusCode: function (e) { var t; if (e) if (h) T.always(e[T.status]); else for (t in e) w[t] = [w[t], e[t]]; return this }, abort: function (e) { var t = e || u; return c && c.abort(t), l(0, t), this } }; if (x.promise(T), y.url = ((e || y.url || Tt.href) + "").replace(Pt, Tt.protocol + "//"), y.type = t.method || t.type || y.method || y.type, y.dataTypes = (y.dataType || "*").toLowerCase().match(P) || [""], null == y.crossDomain) { r = S.createElement("a"); try { r.href = y.url, r.href = r.href, y.crossDomain = Wt.protocol + "//" + Wt.host != r.protocol + "//" + r.host } catch (e) { y.crossDomain = !0 } } if (y.data && y.processData && "string" != typeof y.data && (y.data = E.param(y.data, y.traditional)), $t(Rt, y, t, T), h) return T; for (i in (g = E.event && y.global) && 0 == E.active++ && E.event.trigger("ajaxStart"), y.type = y.type.toUpperCase(), y.hasContent = !Ot.test(y.type), f = y.url.replace(qt, ""), y.hasContent ? y.data && y.processData && 0 === (y.contentType || "").indexOf("application/x-www-form-urlencoded") && (y.data = y.data.replace(Dt, "+")) : (o = y.url.slice(f.length), y.data && (y.processData || "string" == typeof y.data) && (f += (St.test(f) ? "&" : "?") + y.data, delete y.data), !1 === y.cache && (f = f.replace(Lt, "$1"), o = (St.test(f) ? "&" : "?") + "_=" + Ct.guid++ + o), y.url = f + o), y.ifModified && (E.lastModified[f] && T.setRequestHeader("If-Modified-Since", E.lastModified[f]), E.etag[f] && T.setRequestHeader("If-None-Match", E.etag[f])), (y.data && y.hasContent && !1 !== y.contentType || t.contentType) && T.setRequestHeader("Content-Type", y.contentType), T.setRequestHeader("Accept", y.dataTypes[0] && y.accepts[y.dataTypes[0]] ? y.accepts[y.dataTypes[0]] + ("*" !== y.dataTypes[0] ? ", " + It + "; q=0.01" : "") : y.accepts["*"]), y.headers) T.setRequestHeader(i, y.headers[i]); if (y.beforeSend && (!1 === y.beforeSend.call(v, T, y) || h)) return T.abort(); if (u = "abort", b.add(y.complete), T.done(y.success), T.fail(y.error), c = $t(Mt, y, t, T)) { if (T.readyState = 1, g && m.trigger("ajaxSend", [T, y]), h) return T; y.async && 0 < y.timeout && (d = C.setTimeout(function () { T.abort("timeout") }, y.timeout)); try { h = !1, c.send(a, l) } catch (e) { if (h) throw e; l(-1, e) } } else l(-1, "No Transport"); function l(e, t, n, r) { var i, o, a, s, u, l = t; h || (h = !0, d && C.clearTimeout(d), c = void 0, p = r || "", T.readyState = 0 < e ? 4 : 0, i = 200 <= e && e < 300 || 304 === e, n && (s = function (e, t, n) { var r, i, o, a, s = e.contents, u = e.dataTypes; while ("*" === u[0]) u.shift(), void 0 === r && (r = e.mimeType || t.getResponseHeader("Content-Type")); if (r) for (i in s) if (s[i] && s[i].test(r)) { u.unshift(i); break } if (u[0] in n) o = u[0]; else { for (i in n) { if (!u[0] || e.converters[i + " " + u[0]]) { o = i; break } a || (a = i) } o = o || a } if (o) return o !== u[0] && u.unshift(o), n[o] }(y, T, n)), !i && -1 < E.inArray("script", y.dataTypes) && E.inArray("json", y.dataTypes) < 0 && (y.converters["text script"] = function () { }), s = function (e, t, n, r) { var i, o, a, s, u, l = {}, c = e.dataTypes.slice(); if (c[1]) for (a in e.converters) l[a.toLowerCase()] = e.converters[a]; o = c.shift(); while (o) if (e.responseFields[o] && (n[e.responseFields[o]] = t), !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), u = o, o = c.shift()) if ("*" === o) o = u; else if ("*" !== u && u !== o) { if (!(a = l[u + " " + o] || l["* " + o])) for (i in l) if ((s = i.split(" "))[1] === o && (a = l[u + " " + s[0]] || l["* " + s[0]])) { !0 === a ? a = l[i] : !0 !== l[i] && (o = s[0], c.unshift(s[1])); break } if (!0 !== a) if (a && e["throws"]) t = a(t); else try { t = a(t) } catch (e) { return { state: "parsererror", error: a ? e : "No conversion from " + u + " to " + o } } } return { state: "success", data: t } }(y, s, T, i), i ? (y.ifModified && ((u = T.getResponseHeader("Last-Modified")) && (E.lastModified[f] = u), (u = T.getResponseHeader("etag")) && (E.etag[f] = u)), 204 === e || "HEAD" === y.type ? l = "nocontent" : 304 === e ? l = "notmodified" : (l = s.state, o = s.data, i = !(a = s.error))) : (a = l, !e && l || (l = "error", e < 0 && (e = 0))), T.status = e, T.statusText = (t || l) + "", i ? x.resolveWith(v, [o, l, T]) : x.rejectWith(v, [T, l, a]), T.statusCode(w), w = void 0, g && m.trigger(i ? "ajaxSuccess" : "ajaxError", [T, y, i ? o : a]), b.fireWith(v, [T, l]), g && (m.trigger("ajaxComplete", [T, y]), --E.active || E.event.trigger("ajaxStop"))) } return T }, getJSON: function (e, t, n) { return E.get(e, t, n, "json") }, getScript: function (e, t) { return E.get(e, void 0, t, "script") } }), E.each(["get", "post"], function (e, i) { E[i] = function (e, t, n, r) { return m(t) && (r = r || n, n = t, t = void 0), E.ajax(E.extend({ url: e, type: i, dataType: r, data: t, success: n }, E.isPlainObject(e) && e)) } }), E.ajaxPrefilter(function (e) { var t; for (t in e.headers) "content-type" === t.toLowerCase() && (e.contentType = e.headers[t] || "") }), E._evalUrl = function (e, t, n) { return E.ajax({ url: e, type: "GET", dataType: "script", cache: !0, async: !1, global: !1, converters: { "text script": function () { } }, dataFilter: function (e) { E.globalEval(e, t, n) } }) }, E.fn.extend({ wrapAll: function (e) { var t; return this[0] && (m(e) && (e = e.call(this[0])), t = E(e, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && t.insertBefore(this[0]), t.map(function () { var e = this; while (e.firstElementChild) e = e.firstElementChild; return e }).append(this)), this }, wrapInner: function (n) { return m(n) ? this.each(function (e) { E(this).wrapInner(n.call(this, e)) }) : this.each(function () { var e = E(this), t = e.contents(); t.length ? t.wrapAll(n) : e.append(n) }) }, wrap: function (t) { var n = m(t); return this.each(function (e) { E(this).wrapAll(n ? t.call(this, e) : t) }) }, unwrap: function (e) { return this.parent(e).not("body").each(function () { E(this).replaceWith(this.childNodes) }), this } }), E.expr.pseudos.hidden = function (e) { return !E.expr.pseudos.visible(e) }, E.expr.pseudos.visible = function (e) { return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) }, E.ajaxSettings.xhr = function () { try { return new C.XMLHttpRequest } catch (e) { } }; var _t = { 0: 200, 1223: 204 }, zt = E.ajaxSettings.xhr(); v.cors = !!zt && "withCredentials" in zt, v.ajax = zt = !!zt, E.ajaxTransport(function (i) { var o, a; if (v.cors || zt && !i.crossDomain) return { send: function (e, t) { var n, r = i.xhr(); if (r.open(i.type, i.url, i.async, i.username, i.password), i.xhrFields) for (n in i.xhrFields) r[n] = i.xhrFields[n]; for (n in i.mimeType && r.overrideMimeType && r.overrideMimeType(i.mimeType), i.crossDomain || e["X-Requested-With"] || (e["X-Requested-With"] = "XMLHttpRequest"), e) r.setRequestHeader(n, e[n]); o = function (e) { return function () { o && (o = a = r.onload = r.onerror = r.onabort = r.ontimeout = r.onreadystatechange = null, "abort" === e ? r.abort() : "error" === e ? "number" != typeof r.status ? t(0, "error") : t(r.status, r.statusText) : t(_t[r.status] || r.status, r.statusText, "text" !== (r.responseType || "text") || "string" != typeof r.responseText ? { binary: r.response } : { text: r.responseText }, r.getAllResponseHeaders())) } }, r.onload = o(), a = r.onerror = r.ontimeout = o("error"), void 0 !== r.onabort ? r.onabort = a : r.onreadystatechange = function () { 4 === r.readyState && C.setTimeout(function () { o && a() }) }, o = o("abort"); try { r.send(i.hasContent && i.data || null) } catch (e) { if (o) throw e } }, abort: function () { o && o() } } }), E.ajaxPrefilter(function (e) { e.crossDomain && (e.contents.script = !1) }), E.ajaxSetup({ accepts: { script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function (e) { return E.globalEval(e), e } } }), E.ajaxPrefilter("script", function (e) { void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = "GET") }), E.ajaxTransport("script", function (n) { var r, i; if (n.crossDomain || n.scriptAttrs) return { send: function (e, t) { r = E("<script>").attr(n.scriptAttrs || {}).prop({ charset: n.scriptCharset, src: n.url }).on("load error", i = function (e) { r.remove(), i = null, e && t("error" === e.type ? 404 : 200, e.type) }), S.head.appendChild(r[0]) }, abort: function () { i && i() } } }); var Ut, Xt = [], Vt = /(=)\?(?=&|$)|\?\?/; E.ajaxSetup({ jsonp: "callback", jsonpCallback: function () { var e = Xt.pop() || E.expando + "_" + Ct.guid++; return this[e] = !0, e } }), E.ajaxPrefilter("json jsonp", function (e, t, n) { var r, i, o, a = !1 !== e.jsonp && (Vt.test(e.url) ? "url" : "string" == typeof e.data && 0 === (e.contentType || "").indexOf("application/x-www-form-urlencoded") && Vt.test(e.data) && "data"); if (a || "jsonp" === e.dataTypes[0]) return r = e.jsonpCallback = m(e.jsonpCallback) ? e.jsonpCallback() : e.jsonpCallback, a ? e[a] = e[a].replace(Vt, "$1" + r) : !1 !== e.jsonp && (e.url += (St.test(e.url) ? "&" : "?") + e.jsonp + "=" + r), e.converters["script json"] = function () { return o || E.error(r + " was not called"), o[0] }, e.dataTypes[0] = "json", i = C[r], C[r] = function () { o = arguments }, n.always(function () { void 0 === i ? E(C).removeProp(r) : C[r] = i, e[r] && (e.jsonpCallback = t.jsonpCallback, Xt.push(r)), o && m(i) && i(o[0]), o = i = void 0 }), "script" }), v.createHTMLDocument = ((Ut = S.implementation.createHTMLDocument("").body).innerHTML = "<form></form><form></form>", 2 === Ut.childNodes.length), E.parseHTML = function (e, t, n) { return "string" != typeof e ? [] : ("boolean" == typeof t && (n = t, t = !1), t || (v.createHTMLDocument ? ((r = (t = S.implementation.createHTMLDocument("")).createElement("base")).href = S.location.href, t.head.appendChild(r)) : t = S), o = !n && [], (i = N.exec(e)) ? [t.createElement(i[1])] : (i = xe([e], t, o), o && o.length && E(o).remove(), E.merge([], i.childNodes))); var r, i, o }, E.fn.load = function (e, t, n) { var r, i, o, a = this, s = e.indexOf(" "); return -1 < s && (r = yt(e.slice(s)), e = e.slice(0, s)), m(t) ? (n = t, t = void 0) : t && "object" == typeof t && (i = "POST"), 0 < a.length && E.ajax({ url: e, type: i || "GET", dataType: "html", data: t }).done(function (e) { o = arguments, a.html(r ? E("<div>").append(E.parseHTML(e)).find(r) : e) }).always(n && function (e, t) { a.each(function () { n.apply(this, o || [e.responseText, t, e]) }) }), this }, E.expr.pseudos.animated = function (t) { return E.grep(E.timers, function (e) { return t === e.elem }).length }, E.offset = { setOffset: function (e, t, n) { var r, i, o, a, s, u, l = E.css(e, "position"), c = E(e), f = {}; "static" === l && (e.style.position = "relative"), s = c.offset(), o = E.css(e, "top"), u = E.css(e, "left"), ("absolute" === l || "fixed" === l) && -1 < (o + u).indexOf("auto") ? (a = (r = c.position()).top, i = r.left) : (a = parseFloat(o) || 0, i = parseFloat(u) || 0), m(t) && (t = t.call(e, n, E.extend({}, s))), null != t.top && (f.top = t.top - s.top + a), null != t.left && (f.left = t.left - s.left + i), "using" in t ? t.using.call(e, f) : c.css(f) } }, E.fn.extend({ offset: function (t) { if (arguments.length) return void 0 === t ? this : this.each(function (e) { E.offset.setOffset(this, t, e) }); var e, n, r = this[0]; return r ? r.getClientRects().length ? (e = r.getBoundingClientRect(), n = r.ownerDocument.defaultView, { top: e.top + n.pageYOffset, left: e.left + n.pageXOffset }) : { top: 0, left: 0 } : void 0 }, position: function () { if (this[0]) { var e, t, n, r = this[0], i = { top: 0, left: 0 }; if ("fixed" === E.css(r, "position")) t = r.getBoundingClientRect(); else { t = this.offset(), n = r.ownerDocument, e = r.offsetParent || n.documentElement; while (e && (e === n.body || e === n.documentElement) && "static" === E.css(e, "position")) e = e.parentNode; e && e !== r && 1 === e.nodeType && ((i = E(e).offset()).top += E.css(e, "borderTopWidth", !0), i.left += E.css(e, "borderLeftWidth", !0)) } return { top: t.top - i.top - E.css(r, "marginTop", !0), left: t.left - i.left - E.css(r, "marginLeft", !0) } } }, offsetParent: function () { return this.map(function () { var e = this.offsetParent; while (e && "static" === E.css(e, "position")) e = e.offsetParent; return e || re }) } }), E.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (t, i) { var o = "pageYOffset" === i; E.fn[t] = function (e) { return B(this, function (e, t, n) { var r; if (x(e) ? r = e : 9 === e.nodeType && (r = e.defaultView), void 0 === n) return r ? r[i] : e[t]; r ? r.scrollTo(o ? r.pageXOffset : n, o ? n : r.pageYOffset) : e[t] = n }, t, e, arguments.length) } }), E.each(["top", "left"], function (e, n) { E.cssHooks[n] = _e(v.pixelPosition, function (e, t) { if (t) return t = Be(e, n), Pe.test(t) ? E(e).position()[n] + "px" : t }) }), E.each({ Height: "height", Width: "width" }
3, function (a, s) { E.each({ padding: "inner" + a, content: s, "": "outer" + a }, function (r, o) { E.fn[o] = function (e, t) { var n = arguments.length && (r || "boolean" != typeof e), i = r || (!0 === e || !0 === t ? "margin" : "border"); return B(this, function (e, t, n) { var r; return x(e) ? 0 === o.indexOf("outer") ? e["inner" + a] : e.document.documentElement["client" + a] : 9 === e.nodeType ? (r = e.documentElement, Math.max(e.body["scroll" + a], r["scroll" + a], e.body["offset" + a], r["offset" + a], r["client" + a])) : void 0 === n ? E.css(e, t, i) : E.style(e, t, n, i) }, s, n ? e : void 0, n) } }) }), E.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (e, t) { E.fn[t] = function (e) { return this.on(t, e) } }), E.fn.extend({ bind: function (e, t, n) { return this.on(e, null, t, n) }, unbind: function (e, t) { return this.off(e, null, t) }, delegate: function (e, t, n, r) { return this.on(t, e, n, r) }, undelegate: function (e, t, n) { return 1 === arguments.length ? this.off(e, "**") : this.off(t, e || "**", n) }, hover: function (e, t) { return this.mouseenter(e).mouseleave(t || e) } }), E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "), function (e, n) { E.fn[n] = function (e, t) { return 0 < arguments.length ? this.on(n, null, e, t) : this.trigger(n) } }); var Gt = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; E.proxy = function (e, t) { var n, r, i; if ("string" == typeof t && (n = e[t], t = e, e = n), m(e)) return r = s.call(arguments, 2), (i = function () { return e.apply(t || this, r.concat(s.call(arguments))) }).guid = e.guid = e.guid || E.guid++, i }, E.holdReady = function (e) { e ? E.readyWait++ : E.ready(!0) }, E.isArray = Array.isArray, E.parseJSON = JSON.parse, E.nodeName = A, E.isFunction = m, E.isWindow = x, E.camelCase = X, E.type = w, E.now = Date.now, E.isNumeric = function (e) { var t = E.type(e); return ("number" === t || "string" === t) && !isNaN(e - parseFloat(e)) }, E.trim = function (e) { return null == e ? "" : (e + "").replace(Gt, "$1") }, "function" == typeof define && define.amd && define("jquery", [], function () { return E }); var Yt = C.jQuery, Qt = C.$; return E.noConflict = function (e) { return C.$ === E && (C.$ = Qt), e && C.jQuery === E && (C.jQuery = Yt), E }, "undefined" == typeof e && (C.jQuery = C.$ = E), E });
4
5/*!
6 * jQuery Migrate - v3.3.2 - 2020-11-17T23:22Z
7 * Copyright OpenJS Foundation and other contributors
8 */
9(function (factory) {
10	"use strict";
11
12	if (typeof define === "function" && define.amd) {
13
14		// AMD. Register as an anonymous module.
15		define(["jquery"], function (jQuery) {
16			return factory(jQuery, window);
17		});
18	} else if (typeof module === "object" && module.exports) {
19
20		// Node/CommonJS
21		// eslint-disable-next-line no-undef
22		module.exports = factory(require("jquery"), window);
23	} else {
24
25		// Browser globals
26		factory(jQuery, window);
27	}
28})(function (jQuery, window) {
29	"use strict";
30
31	jQuery.migrateVersion = "3.3.2";
32
33	// Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2
34	function compareVersions(v1, v2) {
35		var i,
36			rVersionParts = /^(\d+)\.(\d+)\.(\d+)/,
37			v1p = rVersionParts.exec(v1) || [],
38			v2p = rVersionParts.exec(v2) || [];
39
40		for (i = 1; i <= 3; i++) {
41			if (+v1p[i] > +v2p[i]) {
42				return 1;
43			}
44			if (+v1p[i] < +v2p[i]) {
45				return -1;
46			}
47		}
48		return 0;
49	}
50
51	function jQueryVersionSince(version) {
52		return compareVersions(jQuery.fn.jquery, version) >= 0;
53	}
54
55	(function () {
56
57		// Support: IE9 only
58		// IE9 only creates console object when dev tools are first opened
59		// IE9 console is a host object, callable but doesn't have .apply()
60		if (!window.console || !window.console.log) {
61			return;
62		}
63
64		// Need jQuery 3.0.0+ and no older Migrate loaded
65		if (!jQuery || !jQueryVersionSince("3.0.0")) {
66			window.console.log("JQMIGRATE: jQuery 3.0.0+ REQUIRED");
67		}
68		if (jQuery.migrateWarnings) {
69			window.console.log("JQMIGRATE: Migrate plugin loaded multiple times");
70		}
71		jQuery.migrateMute = window.location.host.indexOf('dev-') == -1 && window.location.host.indexOf('dev.') == -1;
72		if (!jQuery.migrateMute) {
73
74			// Show a message on the console so devs know we're active
75			window.console.log("JQMIGRATE: Migrate is installed" +
76				(jQuery.migrateMute ? "" : " with logging active on dev- domain ") +
77				", version " + jQuery.migrateVersion);
78		}
79
80	})();
81
82	var warnedAbout = {};
83
84	// By default each warning is only reported once.
85	jQuery.migrateDeduplicateWarnings = true;
86
87	// List of warnings already given; public read only
88	jQuery.migrateWarnings = [];
89
90	// Set to false to disable traces that appear with warnings
91	if (jQuery.migrateTrace === undefined) {
92		jQuery.migrateTrace = true;
93	}
94
95	// Forget any warnings we've already given; public
96	jQuery.migrateReset = function () {
97		warnedAbout = {};
98		jQuery.migrateWarnings.length = 0;
99	};
100
101	function migrateWarn(msg) {
102		var console = window.console;
103		if (!jQuery.migrateDeduplicateWarnings || !warnedAbout[msg]) {
104			warnedAbout[msg] = true;
105			jQuery.migrateWarnings.push(msg);
106			if (console && console.warn && !jQuery.migrateMute) {
107				console.warn("JQMIGRATE: " + msg);
108				if (jQuery.migrateTrace && console.trace) {
109					console.trace();
110				}
111			}
112		}
113	}
114
115	function migrateWarnProp(obj, prop, value, msg) {
116		Object.defineProperty(obj, prop, {
117			configurable: true,
118			enumerable: true,
119			get: function () {
120				migrateWarn(msg);
121				return value;
122			},
123			set: function (newValue) {
124				migrateWarn(msg);
125				value = newValue;
126			}
127		});
128	}
129
130	function migrateWarnFunc(obj, prop, newFunc, msg) {
131		obj[prop] = function () {
132			migrateWarn(msg);
133			return newFunc.apply(this, arguments);
134		};
135	}
136
137	if (window.document.compatMode === "BackCompat") {
138
139		// JQuery has never supported or tested Quirks Mode
140		migrateWarn("jQuery is not compatible with Quirks Mode");
141	}
142
143	var findProp,
144		class2type = {},
145		oldInit = jQuery.fn.init,
146		oldFind = jQuery.find,
147
148		rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
149		rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
150
151		// Support: Android <=4.0 only
152		// Make sure we trim BOM and NBSP
153		rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
154
155	jQuery.fn.init = function (arg1) {
156		var args = Array.prototype.slice.call(arguments);
157
158		if (typeof arg1 === "string" && arg1 === "#") {
159
160			// JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
161			migrateWarn("jQuery( '#' ) is not a valid selector");
162			args[0] = [];
163		}
164
165		return oldInit.apply(this, args);
166	};
167	jQuery.fn.init.prototype = jQuery.fn;
168
169	jQuery.find = function (selector) {
170		var args = Array.prototype.slice.call(arguments);
171
172		// Support: PhantomJS 1.x
173		// String#match fails to match when used with a //g RegExp, only on some strings
174		if (typeof selector === "string" && rattrHashTest.test(selector)) {
175
176			// The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
177			// First see if qS thinks it's a valid selector, if so avoid a false positive
178			try {
179				window.document.querySelector(selector);
180			} catch (err1) {
181
182				// Didn't *look* valid to qSA, warn and try quoting what we think is the value
183				selector = selector.replace(rattrHashGlob, function (_, attr, op, value) {
184					return "[" + attr + op + "\"" + value + "\"]";
185				});
186
187				// If the regexp *may* have created an invalid selector, don't update it
188				// Note that there may be false alarms if selector uses jQuery extensions
189				try {
190					window.document.querySelector(selector);
191					migrateWarn("Attribute selector with '#' must be quoted: " + args[0]);
192					args[0] = selector;
193				} catch (err2) {
194					migrateWarn("Attribute selector with '#' was not fixed: " + args[0]);
195				}
196			}
197		}
198
199		return oldFind.apply(this, args);
200	};
201
202	// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
203	for (findProp in oldFind) {
204		if (Object.prototype.hasOwnProperty.call(oldFind, findProp)) {
205			jQuery.find[findProp] = oldFind[findProp];
206		}
207	}
208
209	// The number of elements contained in the matched element set
210	migrateWarnFunc(jQuery.fn, "size", function () {
211		return this.length;
212	},
213		"jQuery.fn.size() is deprecated and removed; use the .length property");
214
215	migrateWarnFunc(jQuery, "parseJSON", function () {
216		return JSON.parse.apply(null, arguments);
217	},
218		"jQuery.parseJSON is deprecated; use JSON.parse");
219
220	migrateWarnFunc(jQuery, "holdReady", jQuery.holdReady,
221		"jQuery.holdReady is deprecated");
222
223	migrateWarnFunc(jQuery, "unique", jQuery.uniqueSort,
224		"jQuery.unique is deprecated; use jQuery.uniqueSort");
225
226	// Now jQuery.expr.pseudos is the standard incantation
227	migrateWarnProp(jQuery.expr, "filters", jQuery.expr.pseudos,
228		"jQuery.expr.filters is deprecated; use jQuery.expr.pseudos");
229	migrateWarnProp(jQuery.expr, ":", jQuery.expr.pseudos,
230		"jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos");
231
232	// Prior to jQuery 3.1.1 there were internal refs so we don't warn there
233	if (jQueryVersionSince("3.1.1")) {
234		migrateWarnFunc(jQuery, "trim", function (text) {
235			return text == null ?
236				"" :
237				(text + "").replace(rtrim, "");
238		},
239			"jQuery.trim is deprecated; use String.prototype.trim");
240	}
241
242	// Prior to jQuery 3.2 there were internal refs so we don't warn there
243	if (jQueryVersionSince("3.2.0")) {
244		migrateWarnFunc(jQuery, "nodeName", function (elem, name) {
245			return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
246		},
247			"jQuery.nodeName is deprecated");
248
249		migrateWarnFunc(jQuery, "isArray", Array.isArray,
250			"jQuery.isArray is deprecated; use Array.isArray"
251		);
252	}
253
254	if (jQueryVersionSince("3.3.0")) {
255
256		migrateWarnFunc(jQuery, "isNumeric", function (obj) {
257
258			// As of jQuery 3.0, isNumeric is limited to
259			// strings and numbers (primitives or objects)
260			// that can be coerced to finite numbers (gh-2662)
261			var type = typeof obj;
262			return (type === "number" || type === "string") &&
263
264				// parseFloat NaNs numeric-cast false positives ("")
265				// ...but misinterprets leading-number strings, e.g. hex literals ("0x...")
266				// subtraction forces infinities to NaN
267				!isNaN(obj - parseFloat(obj));
268		},
269			"jQuery.isNumeric() is deprecated"
270		);
271
272		// Populate the class2type map
273		jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".
274			split(" "),
275			function (_, name) {
276				class2type["[object " + name + "]"] = name.toLowerCase();
277			});
278
279		migrateWarnFunc(jQuery, "type", function (obj) {
280			if (obj == null) {
281				return obj + "";
282			}
283
284			// Support: Android <=2.3 only (functionish RegExp)
285			return typeof obj === "object" || typeof obj === "function" ?
286				class2type[Object.prototype.toString.call(obj)] || "object" :
287				typeof obj;
288		},
289			"jQuery.type is deprecated");
290
291
292		migrateWarnFunc(jQuery, "isWindow",
293			function (obj) {
294				return obj != null && obj === obj.window;
295			},
296			"jQuery.isWindow() is deprecated"
297		);
298	}
299
300	// Support jQuery slim which excludes the ajax module
301	if (jQuery.ajax) {
302
303		var oldAjax = jQuery.ajax,
304			rjsonp = /(=)\?(?=&|$)|\?\?/;
305
306		jQuery.ajax = function () {
307			var jQXHR = oldAjax.apply(this, arguments);
308
309			// Be sure we got a jQXHR (e.g., not sync)
310			if (jQXHR.promise) {
311				migrateWarnFunc(jQXHR, "success", jQXHR.done,
312					"jQXHR.success is deprecated and removed");
313				migrateWarnFunc(jQXHR, "error", jQXHR.fail,
314					"jQXHR.error is deprecated and removed");
315				migrateWarnFunc(jQXHR, "complete", jQXHR.always,
316					"jQXHR.complete is deprecated and removed");
317			}
318
319			return jQXHR;
320		};
321
322		// Only trigger the logic in jQuery <4 as the JSON-to-JSONP auto-promotion
323		// behavior is gone in jQuery 4.0 and as it has security implications, we don't
324		// want to restore the legacy behavior.
325		if (!jQueryVersionSince("4.0.0")) {
326
327			// Register this prefilter before the jQuery one. Otherwise, a promoted
328			// request is transformed into one with the script dataType and we can't
329			// catch it anymore.
330			jQuery.ajaxPrefilter("+json", function (s) {
331
332				// Warn if JSON-to-JSONP auto-promotion happens.
333				if (s.jsonp !== false && (rjsonp.test(s.url) ||
334					typeof s.data === "string" &&
335					(s.contentType || "")
336						.indexOf("application/x-www-form-urlencoded") === 0 &&
337					rjsonp.test(s.data)
338				)) {
339					migrateWarn("JSON-to-JSONP auto-promotion is deprecated");
340				}
341			});
342		}
343
344	}
345
346	var oldRemoveAttr = jQuery.fn.removeAttr,
347		oldToggleClass = jQuery.fn.toggleClass,
348		rmatchNonSpace = /\S+/g;
349
350	jQuery.fn.removeAttr = function (name) {
351		var self = this;
352
353		jQuery.each(name.match(rmatchNonSpace), function (_i, attr) {
354			if (jQuery.expr.match.bool.test(attr)) {
355				migrateWarn("jQuery.fn.removeAttr no longer sets boolean properties: " + attr);
356				self.prop(attr, false);
357			}
358		});
359
360		return oldRemoveAttr.apply(this, arguments);
361	};
362
363	jQuery.fn.toggleClass = function (state) {
364
365		// Only deprecating no-args or single boolean arg
366		if (state !== undefined && typeof state !== "boolean") {
367			return oldToggleClass.apply(this, arguments);
368		}
369
370		migrateWarn("jQuery.fn.toggleClass( boolean ) is deprecated");
371
372		// Toggle entire class name of each element
373		return this.each(function () {
374			var className = this.getAttribute && this.getAttribute("class") || "";
375
376			if (className) {
377				jQuery.data(this, "__className__", className);
378			}
379
380			// If the element has a class name or if we're passed `false`,
381			// then remove the whole classname (if there was one, the above saved it).
382			// Otherwise bring back whatever was previously saved (if anything),
383			// falling back to the empty string if nothing was stored.
384			if (this.setAttribute) {
385				this.setAttribute("class",
386					className || state === false ?
387						"" :
388						jQuery.data(this, "__className__") || ""
389				);
390			}
391		});
392	};
393
394	function camelCase(string) {
395		return string.replace(/-([a-z])/g, function (_, letter) {
396			return letter.toUpperCase();
397		});
398	}
399
400	var oldFnCss,
401		internalSwapCall = false,
402		ralphaStart = /^[a-z]/,
403
404		// The regex visualized:
405		//
406		//                         /----------\
407		//                        |            |    /-------\
408		//                        |  / Top  \  |   |         |
409		//         /--- Border ---+-| Right  |-+---+- Width -+---\
410		//        |                 | Bottom |                    |
411		//        |                  \ Left /                     |
412		//        |                                               |
413		//        |                              /----------\     |
414		//        |          /-------------\    |            |    |- END
415		//        |         |               |   |  / Top  \  |    |
416		//        |         |  / Margin  \  |   | | Right  | |    |
417		//        |---------+-|           |-+---+-| Bottom |-+----|
418		//        |            \ Padding /         \ Left /       |
419		// BEGIN -|                                               |
420		//        |                /---------\                    |
421		//        |               |           |                   |
422		//        |               |  / Min \  |    / Width  \     |
423		//         \--------------+-|       |-+---|          |---/
424		//                           \ Max /       \ Height /
425		rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;
426
427	// If this version of jQuery has .swap(), don't false-alarm on internal uses
428	if (jQuery.swap) {
429		jQuery.each(["height", "width", "reliableMarginRight"], function (_, name) {
430			var oldHook = jQuery.cssHooks[name] && jQuery.cssHooks[name].get;
431
432			if (oldHook) {
433				jQuery.cssHooks[name].get = function () {
434					var ret;
435
436					internalSwapCall = true;
437					ret = oldHook.apply(this, arguments);
438					internalSwapCall = false;
439					return ret;
440				};
441			}
442		});
443	}
444
445	jQuery.swap = function (elem, options, callback, args) {
446		var ret, name,
447			old = {};
448
449		if (!internalSwapCall) {
450			migrateWarn("jQuery.swap() is undocumented and deprecated");
451		}
452
453		// Remember the old values, and insert the new ones
454		for (name in options) {
455			old[name] = elem.style[name];
456			elem.style[name] = options[name];
457		}
458
459		ret = callback.apply(elem, args || []);
460
461		// Revert the old values
462		for (name in options) {
463			elem.style[name] = old[name];
464		}
465
466		return ret;
467	};
468
469	if (jQueryVersionSince("3.4.0") && typeof Proxy !== "undefined") {
470
471		jQuery.cssProps = new Proxy(jQuery.cssProps || {}, {
472			set: function () {
473				migrateWarn("JQMIGRATE: jQuery.cssProps is deprecated");
474				return Reflect.set.apply(this, arguments);
475			}
476		});
477	}
478
479	// Create a dummy jQuery.cssNumber if missing. It won't be used by jQuery but
480	// it will prevent code adding new keys to it unconditionally from crashing.
481	if (!jQuery.cssNumber) {
482		jQuery.cssNumber = {};
483	}
484
485	function isAutoPx(prop) {
486
487		// The first test is used to ensure that:
488		// 1. The prop starts with a lowercase letter (as we uppercase it for the second regex).
489		// 2. The prop is not empty.
490		return ralphaStart.test(prop) &&
491			rautoPx.test(prop[0].toUpperCase() + prop.slice(1));
492	}
493
494	oldFnCss = jQuery.fn.css;
495
496	jQuery.fn.css = function (name, value) {
497		var camelName,
498			origThis = this;
499		if (name && typeof name === "object" && !Array.isArray(name)) {
500			jQuery.each(name, function (n, v) {
501				jQuery.fn.css.call(origThis, n, v);
502			});
503			return this;
504		}
505		if (typeof value === "number") {
506			camelName = camelCase(name);
507			if (!isAutoPx(camelName) && !jQuery.cssNumber[camelName]) {
508				migrateWarn("Number-typed values are deprecated for jQuery.fn.css( \"" +
509					name + "\", value )");
510			}
511		}
512
513		return oldFnCss.apply(this, arguments);
514	};
515
516	var oldData = jQuery.data;
517
518	jQuery.data = function (elem, name, value) {
519		var curData, sameKeys, key;
520
521		// Name can be an object, and each entry in the object is meant to be set as data
522		if (name && typeof name === "object" && arguments.length === 2) {
523			curData = jQuery.hasData(elem) && oldData.call(this, elem);
524			sameKeys = {};
525			for (key in name) {
526				if (key !== camelCase(key)) {
527					migrateWarn("jQuery.data() always sets/gets camelCased names: " + key);
528					curData[key] = name[key];
529				} else {
530					sameKeys[key] = name[key];
531				}
532			}
533
534			oldData.call(this, elem, sameKeys);
535
536			return name;
537		}
538
539		// If the name is transformed, look for the un-transformed name in the data object
540		if (name && typeof name === "string" && name !== camelCase(name)) {
541			curData = jQuery.hasData(elem) && oldData.call(this, elem);
542			if (curData && name in curData) {
543				migrateWarn("jQuery.data() always sets/gets camelCased names: " + name);
544				if (arguments.length > 2) {
545					curData[name] = value;
546				}
547				return curData[name];
548			}
549		}
550
551		return oldData.apply(this, arguments);
552	};
553
554	// Support jQuery slim which excludes the effects module
555	if (jQuery.fx) {
556
557		var intervalValue, intervalMsg,
558			oldTweenRun = jQuery.Tween.prototype.run,
559			linearEasing = function (pct) {
560				return pct;
561			};
562
563		jQuery.Tween.prototype.run = function () {
564			if (jQuery.easing[this.easing].length > 1) {
565				migrateWarn(
566					"'jQuery.easing." + this.easing.toString() + "' should use only one argument"
567				);
568
569				jQuery.easing[this.easing] = linearEasing;
570			}
571
572			oldTweenRun.apply(this, arguments);
573		};
574
575		intervalValue = jQuery.fx.interval || 13;
576		intervalMsg = "jQuery.fx.interval is deprecated";
577
578		// Support: IE9, Android <=4.4
579		// Avoid false positives on browsers that lack rAF
580		// Don't warn if document is hidden, jQuery uses setTimeout (#292)
581		if (window.requestAnimationFrame) {
582			Object.defineProperty(jQuery.fx, "interval", {
583				configurable: true,
584				enumerable: true,
585				get: function () {
586					if (!window.document.hidden) {
587						migrateWarn(intervalMsg);
588					}
589					return intervalValue;
590				},
591				set: function (newValue) {
592					migrateWarn(intervalMsg);
593					intervalValue = newValue;
594				}
595			});
596		}
597
598	}
599
600	var oldLoad = jQuery.fn.load,
601		oldEventAdd = jQuery.event.add,
602		originalFix = jQuery.event.fix;
603
604	jQuery.event.props = [];
605	jQuery.event.fixHooks = {};
606
607	migrateWarnProp(jQuery.event.props, "concat", jQuery.event.props.concat,
608		"jQuery.event.props.concat() is deprecated and removed");
609
610	jQuery.event.fix = function (originalEvent) {
611		var event,
612			type = originalEvent.type,
613			fixHook = this.fixHooks[type],
614			props = jQuery.event.props;
615
616		if (props.length) {
617			migrateWarn("jQuery.event.props are deprecated and removed: " + props.join());
618			while (props.length) {
619				jQuery.event.addProp(props.pop());
620			}
621		}
622
623		if (fixHook && !fixHook._migrated_) {
624			fixHook._migrated_ = true;
625			migrateWarn("jQuery.event.fixHooks are deprecated and removed: " + type);
626			if ((props = fixHook.props) && props.length) {
627				while (props.length) {
628					jQuery.event.addProp(props.pop());
629				}
630			}
631		}
632
633		event = originalFix.call(this, originalEvent);
634
635		return fixHook && fixHook.filter ? fixHook.filter(event, originalEvent) : event;
636	};
637
638	jQuery.event.add = function (elem, types) {
639
640		// This misses the multiple-types case but that seems awfully rare
641		if (elem === window && types === "load" && window.document.readyState === "complete") {
642			migrateWarn("jQuery(window).on('load'...) called after load event occurred");
643		}
644		return oldEventAdd.apply(this, arguments);
645	};
646
647	jQuery.each(["load", "unload", "error"], function (_, name) {
648
649		jQuery.fn[name] = function () {
650			var args = Array.prototype.slice.call(arguments, 0);
651
652			// If this is an ajax load() the first arg should be the string URL;
653			// technically this could also be the "Anything" arg of the event .load()
654			// which just goes to show why this dumb signature has been deprecated!
655			// jQuery custom builds that exclude the Ajax module justifiably die here.
656			if (name === "load" && typeof args[0] === "string") {
657				return oldLoad.apply(this, args);
658			}
659
660			migrateWarn("jQuery.fn." + name + "() is deprecated");
661
662			args.splice(0, 0, name);
663			if (arguments.length) {
664				return this.on.apply(this, args);
665			}
666
667			// Use .triggerHandler here because:
668			// - load and unload events don't need to bubble, only applied to window or image
669			// - error event should not bubble to window, although it does pre-1.7
670			// See http://bugs.jquery.com/ticket/11820
671			this.triggerHandler.apply(this, args);
672			return this;
673		};
674
675	});
676
677	jQuery.each(("blur focus focusin focusout resize scroll click dblclick " +
678		"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
679		"change select submit keydown keypress keyup contextmenu").split(" "),
680		function (_i, name) {
681
682			// Handle event binding
683			jQuery.fn[name] = function (data, fn) {
684				migrateWarn("jQuery.fn." + name + "() event shorthand is deprecated");
685				return arguments.length > 0 ?
686					this.on(name, null, data, fn) :
687					this.trigger(name);
688			};
689		});
690
691	// Trigger "ready" event only once, on document ready
692	jQuery(function () {
693		jQuery(window.document).triggerHandler("ready");
694	});
695
696	jQuery.event.special.ready = {
697		setup: function () {
698			if (this === window.document) {
699				migrateWarn("'ready' event is deprecated");
700			}
701		}
702	};
703
704	jQuery.fn.extend({
705
706		bind: function (types, data, fn) {
707			migrateWarn("jQuery.fn.bind() is deprecated");
708			return this.on(types, null, data, fn);
709		},
710		unbind: function (types, fn) {
711			migrateWarn("jQuery.fn.unbind() is deprecated");
712			return this.off(types, null, fn);
713		},
714		delegate: function (selector, types, data, fn) {
715			migrateWarn("jQuery.fn.delegate() is deprecated");
716			return this.on(types, selector, data, fn);
717		},
718		undelegate: function (selector, types, fn) {
719			migrateWarn("jQuery.fn.undelegate() is deprecated");
720			return arguments.length === 1 ?
721				this.off(selector, "**") :
722				this.off(types, selector || "**", fn);
723		},
724		hover: function (fnOver, fnOut) {
725			migrateWarn("jQuery.fn.hover() is deprecated");
726			return this.on("mouseenter", fnOver).on("mouseleave", fnOut || fnOver);
727		}
728	});
729
730	var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
731		origHtmlPrefilter = jQuery.htmlPrefilter,
732		makeMarkup = function (html) {
733			var doc = window.document.implementation.createHTMLDocument("");
734			doc.body.innerHTML = html;
735			return doc.body && doc.body.innerHTML;
736		},
737		warnIfChanged = function (html) {
738			var changed = html.replace(rxhtmlTag, "<$1></$2>");
739			if (changed !== html && makeMarkup(html) !== makeMarkup(changed)) {
740				migrateWarn("HTML tags must be properly nested and closed: " + html);
741			}
742		};
743
744	jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function () {
745		jQuery.htmlPrefilter = function (html) {
746			warnIfChanged(html);
747			return html.replace(rxhtmlTag, "<$1></$2>");
748		};
749	};
750
751	jQuery.htmlPrefilter = function (html) {
752		warnIfChanged(html);
753		return origHtmlPrefilter(html);
754	};
755
756	var oldOffset = jQuery.fn.offset;
757
758	jQuery.fn.offset = function () {
759		var elem = this[0];
760
761		if (elem && (!elem.nodeType || !elem.getBoundingClientRect)) {
762			migrateWarn("jQuery.fn.offset() requires a valid DOM element");
763			return arguments.length ? this : undefined;
764		}
765
766		return oldOffset.apply(this, arguments);
767	};
768
769	// Support jQuery slim which excludes the ajax module
770	// The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional`
771	// so it doesn't make sense for the slim build.
772	if (jQuery.ajax) {
773
774		var oldParam = jQuery.param;
775
776		jQuery.param = function (data, traditional) {
777			var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
778
779			if (traditional === undefined && ajaxTraditional) {
780
781				migrateWarn("jQuery.param() no longer uses jQuery.ajaxSettings.traditional");
782				traditional = ajaxTraditional;
783			}
784
785			return oldParam.call(this, data, traditional);
786		};
787
788	}
789
790	var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
791
792	jQuery.fn.andSelf = function () {
793		migrateWarn("jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()");
794		return oldSelf.apply(this, arguments);
795	};
796
797	// Support jQuery slim which excludes the deferred module in jQuery 4.0+
798	if (jQuery.Deferred) {
799
800		var oldDeferred = jQuery.Deferred,
801			tuples = [
802
803				// Action, add listener, callbacks, .then handlers, final state
804				["resolve", "done", jQuery.Callbacks("once memory"),
805					jQuery.Callbacks("once memory"), "resolved"],
806				["reject", "fail", jQuery.Callbacks("once memory"),
807					jQuery.Callbacks("once memory"), "rejected"],
808				["notify", "progress", jQuery.Callbacks("memory"),
809					jQuery.Callbacks("memory")]
810			];
811
812		jQuery.Deferred = function (func) {
813			var deferred = oldDeferred(),
814				promise = deferred.promise();
815
816			deferred.pipe = promise.pipe = function ( /* fnDone, fnFail, fnProgress */) {
817				var fns = arguments;
818
819				migrateWarn("deferred.pipe() is deprecated");
820
821				return jQuery.Deferred(function (newDefer) {
822					jQuery.each(tuples, function (i, tuple) {
823						var fn = typeof fns[i] === "function" && fns[i];
824
825						// Deferred.done(function() { bind to newDefer or newDefer.resolve })
826						// deferred.fail(function() { bind to newDefer or newDefer.reject })
827						// deferred.progress(function() { bind to newDefer or newDefer.notify })
828						deferred[tuple[1]](function () {
829							var returned = fn && fn.apply(this, arguments);
830							if (returned && typeof returned.promise === "function") {
831								returned.promise()
832									.done(newDefer.resolve)
833									.fail(newDefer.reject)
834									.progress(newDefer.notify);
835							} else {
836								newDefer[tuple[0] + "With"](
837									this === promise ? newDefer.promise() : this,
838									fn ? [returned] : arguments
839								);
840							}
841						});
842					});
843					fns = null;
844				}).promise();
845
846			};
847
848			if (func) {
849				func.call(deferred, deferred);
850			}
851
852			return deferred;
853		};
854
855		// Preserve handler of uncaught exceptions in promise chains
856		jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
857
858	}
859
860	return jQuery;
861});
862
863/*! jQuery UI - v1.13.1 - 2022-03-03
864* http://jqueryui.com
865* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/selectmenu.js
866* Copyright jQuery Foundation and other contributors; Licensed MIT */
867
868(function (factory) {
869	"use strict";
870
871	if (typeof define === "function" && define.amd) {
872
873		// AMD. Register as an anonymous module.
874		define(["jquery"], factory);
875	} else {
876
877		// Browser globals
878		factory(jQuery);
879	}
880})(function ($) {
881	"use strict";
882
883	$.ui = $.ui || {};
884
885	var version = $.ui.version = "1.13.1";
886
887
888	/*!
889	 * jQuery UI Widget 1.13.1
890	 * http://jqueryui.com
891	 *
892	 * Copyright jQuery Foundation and other contributors
893	 * Released under the MIT license.
894	 * http://jquery.org/license
895	 */
896
897	//>>label: Widget
898	//>>group: Core
899	//>>description: Provides a factory for creating stateful widgets with a common API.
900	//>>docs: http://api.jqueryui.com/jQuery.widget/
901	//>>demos: http://jqueryui.com/widget/
902
903
904	var widgetUuid = 0;
905	var widgetHasOwnProperty = Array.prototype.hasOwnProperty;
906	var widgetSlice = Array.prototype.slice;
907
908	$.cleanData = (function (orig) {
909		return function (elems) {
910			var events, elem, i;
911			for (i = 0; (elem = elems[i]) != null; i++) {
912
913				// Only trigger remove when necessary to save time
914				events = $._data(elem, "events");
915				if (events && events.remove) {
916					$(elem).triggerHandler("remove");
917				}
918			}
919			orig(elems);
920		};
921	})($.cleanData);
922
923	$.widget = function (name, base, prototype) {
924		var existingConstructor, constructor, basePrototype;
925
926		// ProxiedPrototype allows the provided prototype to remain unmodified
927		// so that it can be used as a mixin for multiple widgets (#8876)
928		var proxiedPrototype = {};
929
930		var namespace = name.split(".")[0];
931		name = name.split(".")[1];
932		var fullName = namespace + "-" + name;
933
934		if (!prototype) {
935			prototype = base;
936			base = $.Widget;
937		}
938
939		if (Array.isArray(prototype)) {
940			prototype = $.extend.apply(null, [{}].concat(prototype));
941		}
942
943		// Create selector for plugin
944		$.expr.pseudos[fullName.toLowerCase()] = function (elem) {
945			return !!$.data(elem, fullName);
946		};
947
948		$[namespace] = $[namespace] || {};
949		existingConstructor = $[namespace][name];
950		constructor = $[namespace][name] = function (options, element) {
951
952			// Allow instantiation without "new" keyword
953			if (!this || !this._createWidget) {
954				return new constructor(options, element);
955			}
956
957			// Allow instantiation without initializing for simple inheritance
958			// must use "new" keyword (the code above always passes args)
959			if (arguments.length) {
960				this._createWidget(options, element);
961			}
962		};
963
964		// Extend with the existing constructor to carry over any static properties
965		$.extend(constructor, existingConstructor, {
966			version: prototype.version,
967
968			// Copy the object used to create the prototype in case we need to
969			// redefine the widget later
970			_proto: $.extend({}, prototype),
971
972			// Track widgets that inherit from this widget in case this widget is
973			// redefined after a widget inherits from it
974			_childConstructors: []
975		});
976
977		basePrototype = new base();
978
979		// We need to make the options hash a property directly on the new instance
980		// otherwise we'll modify the options hash on the prototype that we're
981		// inheriting from
982		basePrototype.options = $.widget.extend({}, basePrototype.options);
983		$.each(prototype, function (prop, value) {
984			if (typeof value !== "function") {
985				proxiedPrototype[prop] = value;
986				return;
987			}
988			proxiedPrototype[prop] = (function () {
989				function _super() {
990					return base.prototype[prop].apply(this, arguments);
991				}
992
993				function _superApply(args) {
994					return base.prototype[prop].apply(this, args);
995				}
996
997				return function () {
998					var __super = this._super;
999					var __superApply = this._superApply;
1000					var returnValue;
1001
1002					this._super = _super;
1003					this._superApply = _superApply;
1004
vendor: 33,156 bytes, lines 1005-2129
1005					returnValue = value.apply(this, arguments);
1006
1007					this._super = __super;
1008					this._superApply = __superApply;
1009
1010					return returnValue;
1011				};
1012			})();
1013		});
1014		constructor.prototype = $.widget.extend(basePrototype, {
1015
1016			// TODO: remove support for widgetEventPrefix
1017			// always use the name + a colon as the prefix, e.g., draggable:start
1018			// don't prefix for widgets that aren't DOM-based
1019			widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
1020		}, proxiedPrototype, {
1021			constructor: constructor,
1022			namespace: namespace,
1023			widgetName: name,
1024			widgetFullName: fullName
1025		});
1026
1027		// If this widget is being redefined then we need to find all widgets that
1028		// are inheriting from it and redefine all of them so that they inherit from
1029		// the new version of this widget. We're essentially trying to replace one
1030		// level in the prototype chain.
1031		if (existingConstructor) {
1032			$.each(existingConstructor._childConstructors, function (i, child) {
1033				var childPrototype = child.prototype;
1034
1035				// Redefine the child widget using the same prototype that was
1036				// originally used, but inherit from the new version of the base
1037				$.widget(childPrototype.namespace + "." + childPrototype.widgetName, constructor,
1038					child._proto);
1039			});
1040
1041			// Remove the list of existing child constructors from the old constructor
1042			// so the old child constructors can be garbage collected
1043			delete existingConstructor._childConstructors;
1044		} else {
1045			base._childConstructors.push(constructor);
1046		}
1047
1048		$.widget.bridge(name, constructor);
1049
1050		return constructor;
1051	};
1052
1053	$.widget.extend = function (target) {
1054		var input = widgetSlice.call(arguments, 1);
1055		var inputIndex = 0;
1056		var inputLength = input.length;
1057		var key;
1058		var value;
1059
1060		for (; inputIndex < inputLength; inputIndex++) {
1061			for (key in input[inputIndex]) {
1062				value = input[inputIndex][key];
1063				if (widgetHasOwnProperty.call(input[inputIndex], key) && value !== undefined) {
1064
1065					// Clone objects
1066					if ($.isPlainObject(value)) {
1067						target[key] = $.isPlainObject(target[key]) ?
1068							$.widget.extend({}, target[key], value) :
1069
1070							// Don't extend strings, arrays, etc. with objects
1071							$.widget.extend({}, value);
1072
1073						// Copy everything else by reference
1074					} else {
1075						target[key] = value;
1076					}
1077				}
1078			}
1079		}
1080		return target;
1081	};
1082
1083	$.widget.bridge = function (name, object) {
1084		var fullName = object.prototype.widgetFullName || name;
1085		$.fn[name] = function (options) {
1086			var isMethodCall = typeof options === "string";
1087			var args = widgetSlice.call(arguments, 1);
1088			var returnValue = this;
1089
1090			if (isMethodCall) {
1091
1092				// If this is an empty collection, we need to have the instance method
1093				// return undefined instead of the jQuery instance
1094				if (!this.length && options === "instance") {
1095					returnValue = undefined;
1096				} else {
1097					this.each(function () {
1098						var methodValue;
1099						var instance = $.data(this, fullName);
1100
1101						if (options === "instance") {
1102							returnValue = instance;
1103							return false;
1104						}
1105
1106						if (!instance) {
1107							return $.error("cannot call methods on " + name +
1108								" prior to initialization; " +
1109								"attempted to call method '" + options + "'");
1110						}
1111
1112						if (typeof instance[options] !== "function" ||
1113							options.charAt(0) === "_") {
1114							return $.error("no such method '" + options + "' for " + name +
1115								" widget instance");
1116						}
1117
1118						methodValue = instance[options].apply(instance, args);
1119
1120						if (methodValue !== instance && methodValue !== undefined) {
1121							returnValue = methodValue && methodValue.jquery ?
1122								returnValue.pushStack(methodValue.get()) :
1123								methodValue;
1124							return false;
1125						}
1126					});
1127				}
1128			} else {
1129
1130				// Allow multiple hashes to be passed on init
1131				if (args.length) {
1132					options = $.widget.extend.apply(null, [options].concat(args));
1133				}
1134
1135				this.each(function () {
1136					var instance = $.data(this, fullName);
1137					if (instance) {
1138						instance.option(options || {});
1139						if (instance._init) {
1140							instance._init();
1141						}
1142					} else {
1143						$.data(this, fullName, new object(options, this));
1144					}
1145				});
1146			}
1147
1148			return returnValue;
1149		};
1150	};
1151
1152	$.Widget = function ( /* options, element */) { };
1153	$.Widget._childConstructors = [];
1154
1155	$.Widget.prototype = {
1156		widgetName: "widget",
1157		widgetEventPrefix: "",
1158		defaultElement: "<div>",
1159
1160		options: {
1161			classes: {},
1162			disabled: false,
1163
1164			// Callbacks
1165			create: null
1166		},
1167
1168		_createWidget: function (options, element) {
1169			element = $(element || this.defaultElement || this)[0];
1170			this.element = $(element);
1171			this.uuid = widgetUuid++;
1172			this.eventNamespace = "." + this.widgetName + this.uuid;
1173
1174			this.bindings = $();
1175			this.hoverable = $();
1176			this.focusable = $();
1177			this.classesElementLookup = {};
1178
1179			if (element !== this) {
1180				$.data(element, this.widgetFullName, this);
1181				this._on(true, this.element, {
1182					remove: function (event) {
1183						if (event.target === element) {
1184							this.destroy();
1185						}
1186					}
1187				});
1188				this.document = $(element.style ?
1189
1190					// Element within the document
1191					element.ownerDocument :
1192
1193					// Element is window or document
1194					element.document || element);
1195				this.window = $(this.document[0].defaultView || this.document[0].parentWindow);
1196			}
1197
1198			this.options = $.widget.extend({},
1199				this.options,
1200				this._getCreateOptions(),
1201				options);
1202
1203			this._create();
1204
1205			if (this.options.disabled) {
1206				this._setOptionDisabled(this.options.disabled);
1207			}
1208
1209			this._trigger("create", null, this._getCreateEventData());
1210			this._init();
1211		},
1212
1213		_getCreateOptions: function () {
1214			return {};
1215		},
1216
1217		_getCreateEventData: $.noop,
1218
1219		_create: $.noop,
1220
1221		_init: $.noop,
1222
1223		destroy: function () {
1224			var that = this;
1225
1226			this._destroy();
1227			$.each(this.classesElementLookup, function (key, value) {
1228				that._removeClass(value, key);
1229			});
1230
1231			// We can probably remove the unbind calls in 2.0
1232			// all event bindings should go through this._on()
1233			this.element
1234				.off(this.eventNamespace)
1235				.removeData(this.widgetFullName);
1236			this.widget()
1237				.off(this.eventNamespace)
1238				.removeAttr("aria-disabled");
1239
1240			// Clean up events and states
1241			this.bindings.off(this.eventNamespace);
1242		},
1243
1244		_destroy: $.noop,
1245
1246		widget: function () {
1247			return this.element;
1248		},
1249
1250		option: function (key, value) {
1251			var options = key;
1252			var parts;
1253			var curOption;
1254			var i;
1255
1256			if (arguments.length === 0) {
1257
1258				// Don't return a reference to the internal hash
1259				return $.widget.extend({}, this.options);
1260			}
1261
1262			if (typeof key === "string") {
1263
1264				// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
1265				options = {};
1266				parts = key.split(".");
1267				key = parts.shift();
1268				if (parts.length) {
1269					curOption = options[key] = $.widget.extend({}, this.options[key]);
1270					for (i = 0; i < parts.length - 1; i++) {
1271						curOption[parts[i]] = curOption[parts[i]] || {};
1272						curOption = curOption[parts[i]];
1273					}
1274					key = parts.pop();
1275					if (arguments.length === 1) {
1276						return curOption[key] === undefined ? null : curOption[key];
1277					}
1278					curOption[key] = value;
1279				} else {
1280					if (arguments.length === 1) {
1281						return this.options[key] === undefined ? null : this.options[key];
1282					}
1283					options[key] = value;
1284				}
1285			}
1286
1287			this._setOptions(options);
1288
1289			return this;
1290		},
1291
1292		_setOptions: function (options) {
1293			var key;
1294
1295			for (key in options) {
1296				this._setOption(key, options[key]);
1297			}
1298
1299			return this;
1300		},
1301
1302		_setOption: function (key, value) {
1303			if (key === "classes") {
1304				this._setOptionClasses(value);
1305			}
1306
1307			this.options[key] = value;
1308
1309			if (key === "disabled") {
1310				this._setOptionDisabled(value);
1311			}
1312
1313			return this;
1314		},
1315
1316		_setOptionClasses: function (value) {
1317			var classKey, elements, currentElements;
1318
1319			for (classKey in value) {
1320				currentElements = this.classesElementLookup[classKey];
1321				if (value[classKey] === this.options.classes[classKey] ||
1322					!currentElements ||
1323					!currentElements.length) {
1324					continue;
1325				}
1326
1327				// We are doing this to create a new jQuery object because the _removeClass() call
1328				// on the next line is going to destroy the reference to the current elements being
1329				// tracked. We need to save a copy of this collection so that we can add the new classes
1330				// below.
1331				elements = $(currentElements.get());
1332				this._removeClass(currentElements, classKey);
1333
1334				// We don't use _addClass() here, because that uses this.options.classes
1335				// for generating the string of classes. We want to use the value passed in from
1336				// _setOption(), this is the new value of the classes option which was passed to
1337				// _setOption(). We pass this value directly to _classes().
1338				elements.addClass(this._classes({
1339					element: elements,
1340					keys: classKey,
1341					classes: value,
1342					add: true
1343				}));
1344			}
1345		},
1346
1347		_setOptionDisabled: function (value) {
1348			this._toggleClass(this.widget(), this.widgetFullName + "-disabled", null, !!value);
1349
1350			// If the widget is becoming disabled, then nothing is interactive
1351			if (value) {
1352				this._removeClass(this.hoverable, null, "ui-state-hover");
1353				this._removeClass(this.focusable, null, "ui-state-focus");
1354			}
1355		},
1356
1357		enable: function () {
1358			return this._setOptions({ disabled: false });
1359		},
1360
1361		disable: function () {
1362			return this._setOptions({ disabled: true });
1363		},
1364
1365		_classes: function (options) {
1366			var full = [];
1367			var that = this;
1368
1369			options = $.extend({
1370				element: this.element,
1371				classes: this.options.classes || {}
1372			}, options);
1373
1374			function bindRemoveEvent() {
1375				var nodesToBind = [];
1376
1377				options.element.each(function (_, element) {
1378					var isTracked = $.map(that.classesElementLookup, function (elements) {
1379						return elements;
1380					})
1381						.some(function (elements) {
1382							return elements.is(element);
1383						});
1384
1385					if (!isTracked) {
1386						nodesToBind.push(element);
1387					}
1388				});
1389
1390				that._on($(nodesToBind), {
1391					remove: "_untrackClassesElement"
1392				});
1393			}
1394
1395			function processClassString(classes, checkOption) {
1396				var current, i;
1397				for (i = 0; i < classes.length; i++) {
1398					current = that.classesElementLookup[classes[i]] || $();
1399					if (options.add) {
1400						bindRemoveEvent();
1401						current = $($.uniqueSort(current.get().concat(options.element.get())));
1402					} else {
1403						current = $(current.not(options.element).get());
1404					}
1405					that.classesElementLookup[classes[i]] = current;
1406					full.push(classes[i]);
1407					if (checkOption && options.classes[classes[i]]) {
1408						full.push(options.classes[classes[i]]);
1409					}
1410				}
1411			}
1412
1413			if (options.keys) {
1414				processClassString(options.keys.match(/\S+/g) || [], true);
1415			}
1416			if (options.extra) {
1417				processClassString(options.extra.match(/\S+/g) || []);
1418			}
1419
1420			return full.join(" ");
1421		},
1422
1423		_untrackClassesElement: function (event) {
1424			var that = this;
1425			$.each(that.classesElementLookup, function (key, value) {
1426				if ($.inArray(event.target, value) !== -1) {
1427					that.classesElementLookup[key] = $(value.not(event.target).get());
1428				}
1429			});
1430
1431			this._off($(event.target));
1432		},
1433
1434		_removeClass: function (element, keys, extra) {
1435			return this._toggleClass(element, keys, extra, false);
1436		},
1437
1438		_addClass: function (element, keys, extra) {
1439			return this._toggleClass(element, keys, extra, true);
1440		},
1441
1442		_toggleClass: function (element, keys, extra, add) {
1443			add = (typeof add === "boolean") ? add : extra;
1444			var shift = (typeof element === "string" || element === null),
1445				options = {
1446					extra: shift ? keys : extra,
1447					keys: shift ? element : keys,
1448					element: shift ? this.element : element,
1449					add: add
1450				};
1451			options.element.toggleClass(this._classes(options), add);
1452			return this;
1453		},
1454
1455		_on: function (suppressDisabledCheck, element, handlers) {
1456			var delegateElement;
1457			var instance = this;
1458
1459			// No suppressDisabledCheck flag, shuffle arguments
1460			if (typeof suppressDisabledCheck !== "boolean") {
1461				handlers = element;
1462				element = suppressDisabledCheck;
1463				suppressDisabledCheck = false;
1464			}
1465
1466			// No element argument, shuffle and use this.element
1467			if (!handlers) {
1468				handlers = element;
1469				element = this.element;
1470				delegateElement = this.widget();
1471			} else {
1472				element = delegateElement = $(element);
1473				this.bindings = this.bindings.add(element);
1474			}
1475
1476			$.each(handlers, function (event, handler) {
1477				function handlerProxy() {
1478
1479					// Allow widgets to customize the disabled handling
1480					// - disabled as an array instead of boolean
1481					// - disabled class as method for disabling individual parts
1482					if (!suppressDisabledCheck &&
1483						(instance.options.disabled === true ||
1484							$(this).hasClass("ui-state-disabled"))) {
1485						return;
1486					}
1487					return (typeof handler === "string" ? instance[handler] : handler)
1488						.apply(instance, arguments);
1489				}
1490
1491				// Copy the guid so direct unbinding works
1492				if (typeof handler !== "string") {
1493					handlerProxy.guid = handler.guid =
1494						handler.guid || handlerProxy.guid || $.guid++;
1495				}
1496
1497				var match = event.match(/^([\w:-]*)\s*(.*)$/);
1498				var eventName = match[1] + instance.eventNamespace;
1499				var selector = match[2];
1500
1501				if (selector) {
1502					delegateElement.on(eventName, selector, handlerProxy);
1503				} else {
1504					element.on(eventName, handlerProxy);
1505				}
1506			});
1507		},
1508
1509		_off: function (element, eventName) {
1510			eventName = (eventName || "").split(" ").join(this.eventNamespace + " ") +
1511				this.eventNamespace;
1512			element.off(eventName);
1513
1514			// Clear the stack to avoid memory leaks (#10056)
1515			this.bindings = $(this.bindings.not(element).get());
1516			this.focusable = $(this.focusable.not(element).get());
1517			this.hoverable = $(this.hoverable.not(element).get());
1518		},
1519
1520		_delay: function (handler, delay) {
1521			function handlerProxy() {
1522				return (typeof handler === "string" ? instance[handler] : handler)
1523					.apply(instance, arguments);
1524			}
1525			var instance = this;
1526			return setTimeout(handlerProxy, delay || 0);
1527		},
1528
1529		_hoverable: function (element) {
1530			this.hoverable = this.hoverable.add(element);
1531			this._on(element, {
1532				mouseenter: function (event) {
1533					this._addClass($(event.currentTarget), null, "ui-state-hover");
1534				},
1535				mouseleave: function (event) {
1536					this._removeClass($(event.currentTarget), null, "ui-state-hover");
1537				}
1538			});
1539		},
1540
1541		_focusable: function (element) {
1542			this.focusable = this.focusable.add(element);
1543			this._on(element, {
1544				focusin: function (event) {
1545					this._addClass($(event.currentTarget), null, "ui-state-focus");
1546				},
1547				focusout: function (event) {
1548					this._removeClass($(event.currentTarget), null, "ui-state-focus");
1549				}
1550			});
1551		},
1552
1553		_trigger: function (type, event, data) {
1554			var prop, orig;
1555			var callback = this.options[type];
1556
1557			data = data || {};
1558			event = $.Event(event);
1559			event.type = (type === this.widgetEventPrefix ?
1560				type :
1561				this.widgetEventPrefix + type).toLowerCase();
1562
1563			// The original event may come from any element
1564			// so we need to reset the target on the new event
1565			event.target = this.element[0];
1566
1567			// Copy original event properties over to the new event
1568			orig = event.originalEvent;
1569			if (orig) {
1570				for (prop in orig) {
1571					if (!(prop in event)) {
1572						event[prop] = orig[prop];
1573					}
1574				}
1575			}
1576
1577			this.element.trigger(event, data);
1578			return !(typeof callback === "function" &&
1579				callback.apply(this.element[0], [event].concat(data)) === false ||
1580				event.isDefaultPrevented());
1581		}
1582	};
1583
1584	$.each({ show: "fadeIn", hide: "fadeOut" }, function (method, defaultEffect) {
1585		$.Widget.prototype["_" + method] = function (element, options, callback) {
1586			if (typeof options === "string") {
1587				options = { effect: options };
1588			}
1589
1590			var hasOptions;
1591			var effectName = !options ?
1592				method :
1593				options === true || typeof options === "number" ?
1594					defaultEffect :
1595					options.effect || defaultEffect;
1596
1597			options = options || {};
1598			if (typeof options === "number") {
1599				options = { duration: options };
1600			} else if (options === true) {
1601				options = {};
1602			}
1603
1604			hasOptions = !$.isEmptyObject(options);
1605			options.complete = callback;
1606
1607			if (options.delay) {
1608				element.delay(options.delay);
1609			}
1610
1611			if (hasOptions && $.effects && $.effects.effect[effectName]) {
1612				element[method](options);
1613			} else if (effectName !== method && element[effectName]) {
1614				element[effectName](options.duration, options.easing, callback);
1615			} else {
1616				element.queue(function (next) {
1617					$(this)[method]();
1618					if (callback) {
1619						callback.call(element[0]);
1620					}
1621					next();
1622				});
1623			}
1624		};
1625	});
1626
1627	var widget = $.widget;
1628
1629
1630	/*!
1631	 * jQuery UI Position 1.13.1
1632	 * http://jqueryui.com
1633	 *
1634	 * Copyright jQuery Foundation and other contributors
1635	 * Released under the MIT license.
1636	 * http://jquery.org/license
1637	 *
1638	 * http://api.jqueryui.com/position/
1639	 */
1640
1641	//>>label: Position
1642	//>>group: Core
1643	//>>description: Positions elements relative to other elements.
1644	//>>docs: http://api.jqueryui.com/position/
1645	//>>demos: http://jqueryui.com/position/
1646
1647
1648	(function () {
1649		var cachedScrollbarWidth,
1650			max = Math.max,
1651			abs = Math.abs,
1652			rhorizontal = /left|center|right/,
1653			rvertical = /top|center|bottom/,
1654			roffset = /[\+\-]\d+(\.[\d]+)?%?/,
1655			rposition = /^\w+/,
1656			rpercent = /%$/,
1657			_position = $.fn.position;
1658
1659		function getOffsets(offsets, width, height) {
1660			return [
1661				parseFloat(offsets[0]) * (rpercent.test(offsets[0]) ? width / 100 : 1),
1662				parseFloat(offsets[1]) * (rpercent.test(offsets[1]) ? height / 100 : 1)
1663			];
1664		}
1665
1666		function parseCss(element, property) {
1667			return parseInt($.css(element, property), 10) || 0;
1668		}
1669
1670		function isWindow(obj) {
1671			return obj != null && obj === obj.window;
1672		}
1673
1674		function getDimensions(elem) {
1675			var raw = elem[0];
1676			if (raw.nodeType === 9) {
1677				return {
1678					width: elem.width(),
1679					height: elem.height(),
1680					offset: { top: 0, left: 0 }
1681				};
1682			}
1683			if (isWindow(raw)) {
1684				return {
1685					width: elem.width(),
1686					height: elem.height(),
1687					offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
1688				};
1689			}
1690			if (raw.preventDefault) {
1691				return {
1692					width: 0,
1693					height: 0,
1694					offset: { top: raw.pageY, left: raw.pageX }
1695				};
1696			}
1697			return {
1698				width: elem.outerWidth(),
1699				height: elem.outerHeight(),
1700				offset: elem.offset()
1701			};
1702		}
1703
1704		$.position = {
1705			scrollbarWidth: function () {
1706				if (cachedScrollbarWidth !== undefined) {
1707					return cachedScrollbarWidth;
1708				}
1709				var w1, w2,
1710					div = $("<div style=" +
1711						"'display:block;position:absolute;width:200px;height:200px;overflow:hidden;'>" +
1712						"<div style='height:300px;width:auto;'></div></div>"),
1713					innerDiv = div.children()[0];
1714
1715				$("body").append(div);
1716				w1 = innerDiv.offsetWidth;
1717				div.css("overflow", "scroll");
1718
1719				w2 = innerDiv.offsetWidth;
1720
1721				if (w1 === w2) {
1722					w2 = div[0].clientWidth;
1723				}
1724
1725				div.remove();
1726
1727				return (cachedScrollbarWidth = w1 - w2);
1728			},
1729			getScrollInfo: function (within) {
1730				var overflowX = within.isWindow || within.isDocument ? "" :
1731					within.element.css("overflow-x"),
1732					overflowY = within.isWindow || within.isDocument ? "" :
1733						within.element.css("overflow-y"),
1734					hasOverflowX = overflowX === "scroll" ||
1735						(overflowX === "auto" && within.width < within.element[0].scrollWidth),
1736					hasOverflowY = overflowY === "scroll" ||
1737						(overflowY === "auto" && within.height < within.element[0].scrollHeight);
1738				return {
1739					width: hasOverflowY ? $.position.scrollbarWidth() : 0,
1740					height: hasOverflowX ? $.position.scrollbarWidth() : 0
1741				};
1742			},
1743			getWithinInfo: function (element) {
1744				var withinElement = $(element || window),
1745					isElemWindow = isWindow(withinElement[0]),
1746					isDocument = !!withinElement[0] && withinElement[0].nodeType === 9,
1747					hasOffset = !isElemWindow && !isDocument;
1748				return {
1749					element: withinElement,
1750					isWindow: isElemWindow,
1751					isDocument: isDocument,
1752					offset: hasOffset ? $(element).offset() : { left: 0, top: 0 },
1753					scrollLeft: withinElement.scrollLeft(),
1754					scrollTop: withinElement.scrollTop(),
1755					width: withinElement.outerWidth(),
1756					height: withinElement.outerHeight()
1757				};
1758			}
1759		};
1760
1761		$.fn.position = function (options) {
1762			if (!options || !options.of) {
1763				return _position.apply(this, arguments);
1764			}
1765
1766			// Make a copy, we don't want to modify arguments
1767			options = $.extend({}, options);
1768
1769			var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
1770
1771				// Make sure string options are treated as CSS selectors
1772				target = typeof options.of === "string" ?
1773					$(document).find(options.of) :
1774					$(options.of),
1775
1776				within = $.position.getWithinInfo(options.within),
1777				scrollInfo = $.position.getScrollInfo(within),
1778				collision = (options.collision || "flip").split(" "),
1779				offsets = {};
1780
1781			dimensions = getDimensions(target);
1782			if (target[0].preventDefault) {
1783
1784				// Force left top to allow flipping
1785				options.at = "left top";
1786			}
1787			targetWidth = dimensions.width;
1788			targetHeight = dimensions.height;
1789			targetOffset = dimensions.offset;
1790
1791			// Clone to reuse original targetOffset later
1792			basePosition = $.extend({}, targetOffset);
1793
1794			// Force my and at to have valid horizontal and vertical positions
1795			// if a value is missing or invalid, it will be converted to center
1796			$.each(["my", "at"], function () {
1797				var pos = (options[this] || "").split(" "),
1798					horizontalOffset,
1799					verticalOffset;
1800
1801				if (pos.length === 1) {
1802					pos = rhorizontal.test(pos[0]) ?
1803						pos.concat(["center"]) :
1804						rvertical.test(pos[0]) ?
1805							["center"].concat(pos) :
1806							["center", "center"];
1807				}
1808				pos[0] = rhorizontal.test(pos[0]) ? pos[0] : "center";
1809				pos[1] = rvertical.test(pos[1]) ? pos[1] : "center";
1810
1811				// Calculate offsets
1812				horizontalOffset = roffset.exec(pos[0]);
1813				verticalOffset = roffset.exec(pos[1]);
1814				offsets[this] = [
1815					horizontalOffset ? horizontalOffset[0] : 0,
1816					verticalOffset ? verticalOffset[0] : 0
1817				];
1818
1819				// Reduce to just the positions without the offsets
1820				options[this] = [
1821					rposition.exec(pos[0])[0],
1822					rposition.exec(pos[1])[0]
1823				];
1824			});
1825
1826			// Normalize collision option
1827			if (collision.length === 1) {
1828				collision[1] = collision[0];
1829			}
1830
1831			if (options.at[0] === "right") {
1832				basePosition.left += targetWidth;
1833			} else if (options.at[0] === "center") {
1834				basePosition.left += targetWidth / 2;
1835			}
1836
1837			if (options.at[1] === "bottom") {
1838				basePosition.top += targetHeight;
1839			} else if (options.at[1] === "center") {
1840				basePosition.top += targetHeight / 2;
1841			}
1842
1843			atOffset = getOffsets(offsets.at, targetWidth, targetHeight);
1844			basePosition.left += atOffset[0];
1845			basePosition.top += atOffset[1];
1846
1847			return this.each(function () {
1848				var collisionPosition, using,
1849					elem = $(this),
1850					elemWidth = elem.outerWidth(),
1851					elemHeight = elem.outerHeight(),
1852					marginLeft = parseCss(this, "marginLeft"),
1853					marginTop = parseCss(this, "marginTop"),
1854					collisionWidth = elemWidth + marginLeft + parseCss(this, "marginRight") +
1855						scrollInfo.width,
1856					collisionHeight = elemHeight + marginTop + parseCss(this, "marginBottom") +
1857						scrollInfo.height,
1858					position = $.extend({}, basePosition),
1859					myOffset = getOffsets(offsets.my, elem.outerWidth(), elem.outerHeight());
1860
1861				if (options.my[0] === "right") {
1862					position.left -= elemWidth;
1863				} else if (options.my[0] === "center") {
1864					position.left -= elemWidth / 2;
1865				}
1866
1867				if (options.my[1] === "bottom") {
1868					position.top -= elemHeight;
1869				} else if (options.my[1] === "center") {
1870					position.top -= elemHeight / 2;
1871				}
1872
1873				position.left += myOffset[0];
1874				position.top += myOffset[1];
1875
1876				collisionPosition = {
1877					marginLeft: marginLeft,
1878					marginTop: marginTop
1879				};
1880
1881				$.each(["left", "top"], function (i, dir) {
1882					if ($.ui.position[collision[i]]) {
1883						$.ui.position[collision[i]][dir](position, {
1884							targetWidth: targetWidth,
1885							targetHeight: targetHeight,
1886							elemWidth: elemWidth,
1887							elemHeight: elemHeight,
1888							collisionPosition: collisionPosition,
1889							collisionWidth: collisionWidth,
1890							collisionHeight: collisionHeight,
1891							offset: [atOffset[0] + myOffset[0], atOffset[1] + myOffset[1]],
1892							my: options.my,
1893							at: options.at,
1894							within: within,
1895							elem: elem
1896						});
1897					}
1898				});
1899
1900				if (options.using) {
1901
1902					// Adds feedback as second argument to using callback, if present
1903					using = function (props) {
1904						var left = targetOffset.left - position.left,
1905							right = left + targetWidth - elemWidth,
1906							top = targetOffset.top - position.top,
1907							bottom = top + targetHeight - elemHeight,
1908							feedback = {
1909								target: {
1910									element: target,
1911									left: targetOffset.left,
1912									top: targetOffset.top,
1913									width: targetWidth,
1914									height: targetHeight
1915								},
1916								element: {
1917									element: elem,
1918									left: position.left,
1919									top: position.top,
1920									width: elemWidth,
1921									height: elemHeight
1922								},
1923								horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
1924								vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
1925							};
1926						if (targetWidth < elemWidth && abs(left + right) < targetWidth) {
1927							feedback.horizontal = "center";
1928						}
1929						if (targetHeight < elemHeight && abs(top + bottom) < targetHeight) {
1930							feedback.vertical = "middle";
1931						}
1932						if (max(abs(left), abs(right)) > max(abs(top), abs(bottom))) {
1933							feedback.important = "horizontal";
1934						} else {
1935							feedback.important = "vertical";
1936						}
1937						options.using.call(this, props, feedback);
1938					};
1939				}
1940
1941				elem.offset($.extend(position, { using: using }));
1942			});
1943		};
1944
1945		$.ui.position = {
1946			fit: {
1947				left: function (position, data) {
1948					var within = data.within,
1949						withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
1950						outerWidth = within.width,
1951						collisionPosLeft = position.left - data.collisionPosition.marginLeft,
1952						overLeft = withinOffset - collisionPosLeft,
1953						overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
1954						newOverRight;
1955
1956					// Element is wider than within
1957					if (data.collisionWidth > outerWidth) {
1958
1959						// Element is initially over the left side of within
1960						if (overLeft > 0 && overRight <= 0) {
1961							newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
1962								withinOffset;
1963							position.left += overLeft - newOverRight;
1964
1965							// Element is initially over right side of within
1966						} else if (overRight > 0 && overLeft <= 0) {
1967							position.left = withinOffset;
1968
1969							// Element is initially over both left and right sides of within
1970						} else {
1971							if (overLeft > overRight) {
1972								position.left = withinOffset + outerWidth - data.collisionWidth;
1973							} else {
1974								position.left = withinOffset;
1975							}
1976						}
1977
1978						// Too far left -> align with left edge
1979					} else if (overLeft > 0) {
1980						position.left += overLeft;
1981
1982						// Too far right -> align with right edge
1983					} else if (overRight > 0) {
1984						position.left -= overRight;
1985
1986						// Adjust based on position and margin
1987					} else {
1988						position.left = max(position.left - collisionPosLeft, position.left);
1989					}
1990				},
1991				top: function (position, data) {
1992					var within = data.within,
1993						withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
1994						outerHeight = data.within.height,
1995						collisionPosTop = position.top - data.collisionPosition.marginTop,
1996						overTop = withinOffset - collisionPosTop,
1997						overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
1998						newOverBottom;
1999
2000					// Element is taller than within
2001					if (data.collisionHeight > outerHeight) {
2002
2003						// Element is initially over the top of within
2004						if (overTop > 0 && overBottom <= 0) {
2005							newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
2006								withinOffset;
2007							position.top += overTop - newOverBottom;
2008
2009							// Element is initially over bottom of within
2010						} else if (overBottom > 0 && overTop <= 0) {
2011							position.top = withinOffset;
2012
2013							// Element is initially over both top and bottom of within
2014						} else {
2015							if (overTop > overBottom) {
2016								position.top = withinOffset + outerHeight - data.collisionHeight;
2017							} else {
2018								position.top = withinOffset;
2019							}
2020						}
2021
2022						// Too far up -> align with top
2023					} else if (overTop > 0) {
2024						position.top += overTop;
2025
2026						// Too far down -> align with bottom edge
2027					} else if (overBottom > 0) {
2028						position.top -= overBottom;
2029
2030						// Adjust based on position and margin
2031					} else {
2032						position.top = max(position.top - collisionPosTop, position.top);
2033					}
2034				}
2035			},
2036			flip: {
2037				left: function (position, data) {
2038					var within = data.within,
2039						withinOffset = within.offset.left + within.scrollLeft,
2040						outerWidth = within.width,
2041						offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
2042						collisionPosLeft = position.left - data.collisionPosition.marginLeft,
2043						overLeft = collisionPosLeft - offsetLeft,
2044						overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
2045						myOffset = data.my[0] === "left" ?
2046							-data.elemWidth :
2047							data.my[0] === "right" ?
2048								data.elemWidth :
2049								0,
2050						atOffset = data.at[0] === "left" ?
2051							data.targetWidth :
2052							data.at[0] === "right" ?
2053								-data.targetWidth :
2054								0,
2055						offset = -2 * data.offset[0],
2056						newOverRight,
2057						newOverLeft;
2058
2059					if (overLeft < 0) {
2060						newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
2061							outerWidth - withinOffset;
2062						if (newOverRight < 0 || newOverRight < abs(overLeft)) {
2063							position.left += myOffset + atOffset + offset;
2064						}
2065					} else if (overRight > 0) {
2066						newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
2067							atOffset + offset - offsetLeft;
2068						if (newOverLeft > 0 || abs(newOverLeft) < overRight) {
2069							position.left += myOffset + atOffset + offset;
2070						}
2071					}
2072				},
2073				top: function (position, data) {
2074					var within = data.within,
2075						withinOffset = within.offset.top + within.scrollTop,
2076						outerHeight = within.height,
2077						offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
2078						collisionPosTop = position.top - data.collisionPosition.marginTop,
2079						overTop = collisionPosTop - offsetTop,
2080						overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
2081						top = data.my[1] === "top",
2082						myOffset = top ?
2083							-data.elemHeight :
2084							data.my[1] === "bottom" ?
2085								data.elemHeight :
2086								0,
2087						atOffset = data.at[1] === "top" ?
2088							data.targetHeight :
2089							data.at[1] === "bottom" ?
2090								-data.targetHeight :
2091								0,
2092						offset = -2 * data.offset[1],
2093						newOverTop,
2094						newOverBottom;
2095					if (overTop < 0) {
2096						newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
2097							outerHeight - withinOffset;
2098						if (newOverBottom < 0 || newOverBottom < abs(overTop)) {
2099							position.top += myOffset + atOffset + offset;
2100						}
2101					} else if (overBottom > 0) {
2102						newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
2103							offset - offsetTop;
2104						if (newOverTop > 0 || abs(newOverTop) < overBottom) {
2105							position.top += myOffset + atOffset + offset;
2106						}
2107					}
2108				}
2109			},
2110			flipfit: {
2111				left: function () {
2112					$.ui.position.flip.left.apply(this, arguments);
2113					$.ui.position.fit.left.apply(this, arguments);
2114				},
2115				top: function () {
2116					$.ui.position.flip.top.apply(this, arguments);
2117					$.ui.position.fit.top.apply(this, arguments);
2118				}
2119			}
2120		};
2121
2122	})();
2123
2124	var position = $.ui.position;
2125
2126
2127	/*!
2128	 * jQuery UI :data 1.13.1
2129	 * http://jqueryui.com
vendor: 24,520 bytes, lines 2130-3062
2130	 *
2131	 * Copyright jQuery Foundation and other contributors
2132	 * Released under the MIT license.
2133	 * http://jquery.org/license
2134	 */
2135
2136	//>>label: :data Selector
2137	//>>group: Core
2138	//>>description: Selects elements which have data stored under the specified key.
2139	//>>docs: http://api.jqueryui.com/data-selector/
2140
2141
2142	var data = $.extend($.expr.pseudos, {
2143		data: $.expr.createPseudo ?
2144			$.expr.createPseudo(function (dataName) {
2145				return function (elem) {
2146					return !!$.data(elem, dataName);
2147				};
2148			}) :
2149
2150			// Support: jQuery <1.8
2151			function (elem, i, match) {
2152				return !!$.data(elem, match[3]);
2153			}
2154	});
2155
2156	/*!
2157	 * jQuery UI Disable Selection 1.13.1
2158	 * http://jqueryui.com
2159	 *
2160	 * Copyright jQuery Foundation and other contributors
2161	 * Released under the MIT license.
2162	 * http://jquery.org/license
2163	 */
2164
2165	//>>label: disableSelection
2166	//>>group: Core
2167	//>>description: Disable selection of text content within the set of matched elements.
2168	//>>docs: http://api.jqueryui.com/disableSelection/
2169
2170	// This file is deprecated
2171
2172	var disableSelection = $.fn.extend({
2173		disableSelection: (function () {
2174			var eventType = "onselectstart" in document.createElement("div") ?
2175				"selectstart" :
2176				"mousedown";
2177
2178			return function () {
2179				return this.on(eventType + ".ui-disableSelection", function (event) {
2180					event.preventDefault();
2181				});
2182			};
2183		})(),
2184
2185		enableSelection: function () {
2186			return this.off(".ui-disableSelection");
2187		}
2188	});
2189
2190
2191	/*!
2192	 * jQuery UI Focusable 1.13.1
2193	 * http://jqueryui.com
2194	 *
2195	 * Copyright jQuery Foundation and other contributors
2196	 * Released under the MIT license.
2197	 * http://jquery.org/license
2198	 */
2199
2200	//>>label: :focusable Selector
2201	//>>group: Core
2202	//>>description: Selects elements which can be focused.
2203	//>>docs: http://api.jqueryui.com/focusable-selector/
2204
2205
2206	// Selectors
2207	$.ui.focusable = function (element, hasTabindex) {
2208		var map, mapName, img, focusableIfVisible, fieldset,
2209			nodeName = element.nodeName.toLowerCase();
2210
2211		if ("area" === nodeName) {
2212			map = element.parentNode;
2213			mapName = map.name;
2214			if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
2215				return false;
2216			}
2217			img = $("img[usemap='#" + mapName + "']");
2218			return img.length > 0 && img.is(":visible");
2219		}
2220
2221		if (/^(input|select|textarea|button|object)$/.test(nodeName)) {
2222			focusableIfVisible = !element.disabled;
2223
2224			if (focusableIfVisible) {
2225
2226				// Form controls within a disabled fieldset are disabled.
2227				// However, controls within the fieldset's legend do not get disabled.
2228				// Since controls generally aren't placed inside legends, we skip
2229				// this portion of the check.
2230				fieldset = $(element).closest("fieldset")[0];
2231				if (fieldset) {
2232					focusableIfVisible = !fieldset.disabled;
2233				}
2234			}
2235		} else if ("a" === nodeName) {
2236			focusableIfVisible = element.href || hasTabindex;
2237		} else {
2238			focusableIfVisible = hasTabindex;
2239		}
2240
2241		return focusableIfVisible && $(element).is(":visible") && visible($(element));
2242	};
2243
2244	// Support: IE 8 only
2245	// IE 8 doesn't resolve inherit to visible/hidden for computed values
2246	function visible(element) {
2247		var visibility = element.css("visibility");
2248		while (visibility === "inherit") {
2249			element = element.parent();
2250			visibility = element.css("visibility");
2251		}
2252		return visibility === "visible";
2253	}
2254
2255	$.extend($.expr.pseudos, {
2256		focusable: function (element) {
2257			return $.ui.focusable(element, $.attr(element, "tabindex") != null);
2258		}
2259	});
2260
2261	var focusable = $.ui.focusable;
2262
2263
2264
2265	// Support: IE8 Only
2266	// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
2267	// with a string, so we need to find the proper form.
2268	var form = $.fn._form = function () {
2269		return typeof this[0].form === "string" ? this.closest("form") : $(this[0].form);
2270	};
2271
2272
2273	/*!
2274	 * jQuery UI Form Reset Mixin 1.13.1
2275	 * http://jqueryui.com
2276	 *
2277	 * Copyright jQuery Foundation and other contributors
2278	 * Released under the MIT license.
2279	 * http://jquery.org/license
2280	 */
2281
2282	//>>label: Form Reset Mixin
2283	//>>group: Core
2284	//>>description: Refresh input widgets when their form is reset
2285	//>>docs: http://api.jqueryui.com/form-reset-mixin/
2286
2287
2288	var formResetMixin = $.ui.formResetMixin = {
2289		_formResetHandler: function () {
2290			var form = $(this);
2291
2292			// Wait for the form reset to actually happen before refreshing
2293			setTimeout(function () {
2294				var instances = form.data("ui-form-reset-instances");
2295				$.each(instances, function () {
2296					this.refresh();
2297				});
2298			});
2299		},
2300
2301		_bindFormResetHandler: function () {
2302			this.form = this.element._form();
2303			if (!this.form.length) {
2304				return;
2305			}
2306
2307			var instances = this.form.data("ui-form-reset-instances") || [];
2308			if (!instances.length) {
2309
2310				// We don't use _on() here because we use a single event handler per form
2311				this.form.on("reset.ui-form-reset", this._formResetHandler);
2312			}
2313			instances.push(this);
2314			this.form.data("ui-form-reset-instances", instances);
2315		},
2316
2317		_unbindFormResetHandler: function () {
2318			if (!this.form.length) {
2319				return;
2320			}
2321
2322			var instances = this.form.data("ui-form-reset-instances");
2323			instances.splice($.inArray(this, instances), 1);
2324			if (instances.length) {
2325				this.form.data("ui-form-reset-instances", instances);
2326			} else {
2327				this.form
2328					.removeData("ui-form-reset-instances")
2329					.off("reset.ui-form-reset");
2330			}
2331		}
2332	};
2333
2334
2335	/*!
2336	 * jQuery UI Support for jQuery core 1.8.x and newer 1.13.1
2337	 * http://jqueryui.com
2338	 *
2339	 * Copyright jQuery Foundation and other contributors
2340	 * Released under the MIT license.
2341	 * http://jquery.org/license
2342	 *
2343	 */
2344
2345	//>>label: jQuery 1.8+ Support
2346	//>>group: Core
2347	//>>description: Support version 1.8.x and newer of jQuery core
2348
2349
2350	// Support: jQuery 1.9.x or older
2351	// $.expr[ ":" ] is deprecated.
2352	if (!$.expr.pseudos) {
2353		$.expr.pseudos = $.expr[":"];
2354	}
2355
2356	// Support: jQuery 1.11.x or older
2357	// $.unique has been renamed to $.uniqueSort
2358	if (!$.uniqueSort) {
2359		$.uniqueSort = $.unique;
2360	}
2361
2362	// Support: jQuery 2.2.x or older.
2363	// This method has been defined in jQuery 3.0.0.
2364	// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js
2365	if (!$.escapeSelector) {
2366
2367		// CSS string/identifier serialization
2368		// https://drafts.csswg.org/cssom/#common-serializing-idioms
2369		var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
2370
2371		var fcssescape = function (ch, asCodePoint) {
2372			if (asCodePoint) {
2373
2374				// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
2375				if (ch === "\0") {
2376					return "\uFFFD";
2377				}
2378
2379				// Control characters and (dependent upon position) numbers get escaped as code points
2380				return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
2381			}
2382
2383			// Other potentially-special ASCII characters get backslash-escaped
2384			return "\\" + ch;
2385		};
2386
2387		$.escapeSelector = function (sel) {
2388			return (sel + "").replace(rcssescape, fcssescape);
2389		};
2390	}
2391
2392	// Support: jQuery 3.4.x or older
2393	// These methods have been defined in jQuery 3.5.0.
2394	if (!$.fn.even || !$.fn.odd) {
2395		$.fn.extend({
2396			even: function () {
2397				return this.filter(function (i) {
2398					return i % 2 === 0;
2399				});
2400			},
2401			odd: function () {
2402				return this.filter(function (i) {
2403					return i % 2 === 1;
2404				});
2405			}
2406		});
2407	}
2408
2409	;
2410	/*!
2411	 * jQuery UI Keycode 1.13.1
2412	 * http://jqueryui.com
2413	 *
2414	 * Copyright jQuery Foundation and other contributors
2415	 * Released under the MIT license.
2416	 * http://jquery.org/license
2417	 */
2418
2419	//>>label: Keycode
2420	//>>group: Core
2421	//>>description: Provide keycodes as keynames
2422	//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
2423
2424
2425	var keycode = $.ui.keyCode = {
2426		BACKSPACE: 8,
2427		COMMA: 188,
2428		DELETE: 46,
2429		DOWN: 40,
2430		END: 35,
2431		ENTER: 13,
2432		ESCAPE: 27,
2433		HOME: 36,
2434		LEFT: 37,
2435		PAGE_DOWN: 34,
2436		PAGE_UP: 33,
2437		PERIOD: 190,
2438		RIGHT: 39,
2439		SPACE: 32,
2440		TAB: 9,
2441		UP: 38
2442	};
2443
2444
2445	/*!
2446	 * jQuery UI Labels 1.13.1
2447	 * http://jqueryui.com
2448	 *
2449	 * Copyright jQuery Foundation and other contributors
2450	 * Released under the MIT license.
2451	 * http://jquery.org/license
2452	 */
2453
2454	//>>label: labels
2455	//>>group: Core
2456	//>>description: Find all the labels associated with a given input
2457	//>>docs: http://api.jqueryui.com/labels/
2458
2459
2460	var labels = $.fn.labels = function () {
2461		var ancestor, selector, id, labels, ancestors;
2462
2463		if (!this.length) {
2464			return this.pushStack([]);
2465		}
2466
2467		// Check control.labels first
2468		if (this[0].labels && this[0].labels.length) {
2469			return this.pushStack(this[0].labels);
2470		}
2471
2472		// Support: IE <= 11, FF <= 37, Android <= 2.3 only
2473		// Above browsers do not support control.labels. Everything below is to support them
2474		// as well as document fragments. control.labels does not work on document fragments
2475		labels = this.eq(0).parents("label");
2476
2477		// Look for the label based on the id
2478		id = this.attr("id");
2479		if (id) {
2480
2481			// We don't search against the document in case the element
2482			// is disconnected from the DOM
2483			ancestor = this.eq(0).parents().last();
2484
2485			// Get a full set of top level ancestors
2486			ancestors = ancestor.add(ancestor.length ? ancestor.siblings() : this.siblings());
2487
2488			// Create a selector for the label based on the id
2489			selector = "label[for='" + $.escapeSelector(id) + "']";
2490
2491			labels = labels.add(ancestors.find(selector).addBack(selector));
2492
2493		}
2494
2495		// Return whatever we have found for labels
2496		return this.pushStack(labels);
2497	};
2498
2499
2500	/*!
2501	 * jQuery UI Scroll Parent 1.13.1
2502	 * http://jqueryui.com
2503	 *
2504	 * Copyright jQuery Foundation and other contributors
2505	 * Released under the MIT license.
2506	 * http://jquery.org/license
2507	 */
2508
2509	//>>label: scrollParent
2510	//>>group: Core
2511	//>>description: Get the closest ancestor element that is scrollable.
2512	//>>docs: http://api.jqueryui.com/scrollParent/
2513
2514
2515	var scrollParent = $.fn.scrollParent = function (includeHidden) {
2516		var position = this.css("position"),
2517			excludeStaticParent = position === "absolute",
2518			overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
2519			scrollParent = this.parents().filter(function () {
2520				var parent = $(this);
2521				if (excludeStaticParent && parent.css("position") === "static") {
2522					return false;
2523				}
2524				return overflowRegex.test(parent.css("overflow") + parent.css("overflow-y") +
2525					parent.css("overflow-x"));
2526			}).eq(0);
2527
2528		return position === "fixed" || !scrollParent.length ?
2529			$(this[0].ownerDocument || document) :
2530			scrollParent;
2531	};
2532
2533
2534	/*!
2535	 * jQuery UI Tabbable 1.13.1
2536	 * http://jqueryui.com
2537	 *
2538	 * Copyright jQuery Foundation and other contributors
2539	 * Released under the MIT license.
2540	 * http://jquery.org/license
2541	 */
2542
2543	//>>label: :tabbable Selector
2544	//>>group: Core
2545	//>>description: Selects elements which can be tabbed to.
2546	//>>docs: http://api.jqueryui.com/tabbable-selector/
2547
2548
2549	var tabbable = $.extend($.expr.pseudos, {
2550		tabbable: function (element) {
2551			var tabIndex = $.attr(element, "tabindex"),
2552				hasTabindex = tabIndex != null;
2553			return (!hasTabindex || tabIndex >= 0) && $.ui.focusable(element, hasTabindex);
2554		}
2555	});
2556
2557
2558	/*!
2559	 * jQuery UI Unique ID 1.13.1
2560	 * http://jqueryui.com
2561	 *
2562	 * Copyright jQuery Foundation and other contributors
2563	 * Released under the MIT license.
2564	 * http://jquery.org/license
2565	 */
2566
2567	//>>label: uniqueId
2568	//>>group: Core
2569	//>>description: Functions to generate and remove uniqueId's
2570	//>>docs: http://api.jqueryui.com/uniqueId/
2571
2572
2573	var uniqueId = $.fn.extend({
2574		uniqueId: (function () {
2575			var uuid = 0;
2576
2577			return function () {
2578				return this.each(function () {
2579					if (!this.id) {
2580						this.id = "ui-id-" + (++uuid);
2581					}
2582				});
2583			};
2584		})(),
2585
2586		removeUniqueId: function () {
2587			return this.each(function () {
2588				if (/^ui-id-\d+$/.test(this.id)) {
2589					$(this).removeAttr("id");
2590				}
2591			});
2592		}
2593	});
2594
2595
2596
2597	// This file is deprecated
2598	var ie = $.ui.ie = !!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());
2599
2600	/*!
2601	 * jQuery UI Mouse 1.13.1
2602	 * http://jqueryui.com
2603	 *
2604	 * Copyright jQuery Foundation and other contributors
2605	 * Released under the MIT license.
2606	 * http://jquery.org/license
2607	 */
2608
2609	//>>label: Mouse
2610	//>>group: Widgets
2611	//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
2612	//>>docs: http://api.jqueryui.com/mouse/
2613
2614
2615	var mouseHandled = false;
2616	$(document).on("mouseup", function () {
2617		mouseHandled = false;
2618	});
2619
2620	var widgetsMouse = $.widget("ui.mouse", {
2621		version: "1.13.1",
2622		options: {
2623			cancel: "input, textarea, button, select, option",
2624			distance: 1,
2625			delay: 0
2626		},
2627		_mouseInit: function () {
2628			var that = this;
2629
2630			this.element
2631				.on("mousedown." + this.widgetName, function (event) {
2632					return that._mouseDown(event);
2633				})
2634				.on("click." + this.widgetName, function (event) {
2635					if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
2636						$.removeData(event.target, that.widgetName + ".preventClickEvent");
2637						event.stopImmediatePropagation();
2638						return false;
2639					}
2640				});
2641
2642			this.started = false;
2643		},
2644
2645		// TODO: make sure destroying one instance of mouse doesn't mess with
2646		// other instances of mouse
2647		_mouseDestroy: function () {
2648			this.element.off("." + this.widgetName);
2649			if (this._mouseMoveDelegate) {
2650				this.document
2651					.off("mousemove." + this.widgetName, this._mouseMoveDelegate)
2652					.off("mouseup." + this.widgetName, this._mouseUpDelegate);
2653			}
2654		},
2655
2656		_mouseDown: function (event) {
2657
2658			// don't let more than one widget handle mouseStart
2659			if (mouseHandled) {
2660				return;
2661			}
2662
2663			this._mouseMoved = false;
2664
2665			// We may have missed mouseup (out of window)
2666			if (this._mouseStarted) {
2667				this._mouseUp(event);
2668			}
2669
2670			this._mouseDownEvent = event;
2671
2672			var that = this,
2673				btnIsLeft = (event.which === 1),
2674
2675				// event.target.nodeName works around a bug in IE 8 with
2676				// disabled inputs (#7620)
2677				elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ?
2678					$(event.target).closest(this.options.cancel).length : false);
2679			if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
2680				return true;
2681			}
2682
2683			this.mouseDelayMet = !this.options.delay;
2684			if (!this.mouseDelayMet) {
2685				this._mouseDelayTimer = setTimeout(function () {
2686					that.mouseDelayMet = true;
2687				}, this.options.delay);
2688			}
2689
2690			if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
2691				this._mouseStarted = (this._mouseStart(event) !== false);
2692				if (!this._mouseStarted) {
2693					event.preventDefault();
2694					return true;
2695				}
2696			}
2697
2698			// Click event may never have fired (Gecko & Opera)
2699			if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
2700				$.removeData(event.target, this.widgetName + ".preventClickEvent");
2701			}
2702
2703			// These delegates are required to keep context
2704			this._mouseMoveDelegate = function (event) {
2705				return that._mouseMove(event);
2706			};
2707			this._mouseUpDelegate = function (event) {
2708				return that._mouseUp(event);
2709			};
2710
2711			this.document
2712				.on("mousemove." + this.widgetName, this._mouseMoveDelegate)
2713				.on("mouseup." + this.widgetName, this._mouseUpDelegate);
2714
2715			event.preventDefault();
2716
2717			mouseHandled = true;
2718			return true;
2719		},
2720
2721		_mouseMove: function (event) {
2722
2723			// Only check for mouseups outside the document if you've moved inside the document
2724			// at least once. This prevents the firing of mouseup in the case of IE<9, which will
2725			// fire a mousemove event if content is placed under the cursor. See #7778
2726			// Support: IE <9
2727			if (this._mouseMoved) {
2728
2729				// IE mouseup check - mouseup happened when mouse was out of window
2730				if ($.ui.ie && (!document.documentMode || document.documentMode < 9) &&
2731					!event.button) {
2732					return this._mouseUp(event);
2733
2734					// Iframe mouseup check - mouseup occurred in another document
2735				} else if (!event.which) {
2736
2737					// Support: Safari <=8 - 9
2738					// Safari sets which to 0 if you press any of the following keys
2739					// during a drag (#14461)
2740					if (event.originalEvent.altKey || event.originalEvent.ctrlKey ||
2741						event.originalEvent.metaKey || event.originalEvent.shiftKey) {
2742						this.ignoreMissingWhich = true;
2743					} else if (!this.ignoreMissingWhich) {
2744						return this._mouseUp(event);
2745					}
2746				}
2747			}
2748
2749			if (event.which || event.button) {
2750				this._mouseMoved = true;
2751			}
2752
2753			if (this._mouseStarted) {
2754				this._mouseDrag(event);
2755				return event.preventDefault();
2756			}
2757
2758			if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
2759				this._mouseStarted =
2760					(this._mouseStart(this._mouseDownEvent, event) !== false);
2761				if (this._mouseStarted) {
2762					this._mouseDrag(event);
2763				} else {
2764					this._mouseUp(event);
2765				}
2766			}
2767
2768			return !this._mouseStarted;
2769		},
2770
2771		_mouseUp: function (event) {
2772			this.document
2773				.off("mousemove." + this.widgetName, this._mouseMoveDelegate)
2774				.off("mouseup." + this.widgetName, this._mouseUpDelegate);
2775
2776			if (this._mouseStarted) {
2777				this._mouseStarted = false;
2778
2779				if (event.target === this._mouseDownEvent.target) {
2780					$.data(event.target, this.widgetName + ".preventClickEvent", true);
2781				}
2782
2783				this._mouseStop(event);
2784			}
2785
2786			if (this._mouseDelayTimer) {
2787				clearTimeout(this._mouseDelayTimer);
2788				delete this._mouseDelayTimer;
2789			}
2790
2791			this.ignoreMissingWhich = false;
2792			mouseHandled = false;
2793			event.preventDefault();
2794		},
2795
2796		_mouseDistanceMet: function (event) {
2797			return (Math.max(
2798				Math.abs(this._mouseDownEvent.pageX - event.pageX),
2799				Math.abs(this._mouseDownEvent.pageY - event.pageY)
2800			) >= this.options.distance
2801			);
2802		},
2803
2804		_mouseDelayMet: function ( /* event */) {
2805			return this.mouseDelayMet;
2806		},
2807
2808		// These are placeholder methods, to be overriden by extending plugin
2809		_mouseStart: function ( /* event */) { },
2810		_mouseDrag: function ( /* event */) { },
2811		_mouseStop: function ( /* event */) { },
2812		_mouseCapture: function ( /* event */) {
2813			return true;
2814		}
2815	});
2816
2817
2818
2819	// $.ui.plugin is deprecated. Use $.widget() extensions instead.
2820	var plugin = $.ui.plugin = {
2821		add: function (module, option, set) {
2822			var i,
2823				proto = $.ui[module].prototype;
2824			for (i in set) {
2825				proto.plugins[i] = proto.plugins[i] || [];
2826				proto.plugins[i].push([option, set[i]]);
2827			}
2828		},
2829		call: function (instance, name, args, allowDisconnected) {
2830			var i,
2831				set = instance.plugins[name];
2832
2833			if (!set) {
2834				return;
2835			}
2836
2837			if (!allowDisconnected && (!instance.element[0].parentNode ||
2838				instance.element[0].parentNode.nodeType === 11)) {
2839				return;
2840			}
2841
2842			for (i = 0; i < set.length; i++) {
2843				if (instance.options[set[i][0]]) {
2844					set[i][1].apply(instance.element, args);
2845				}
2846			}
2847		}
2848	};
2849
2850
2851
2852	var safeActiveElement = $.ui.safeActiveElement = function (document) {
2853		var activeElement;
2854
2855		// Support: IE 9 only
2856		// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
2857		try {
2858			activeElement = document.activeElement;
2859		} catch (error) {
2860			activeElement = document.body;
2861		}
2862
2863		// Support: IE 9 - 11 only
2864		// IE may return null instead of an element
2865		// Interestingly, this only seems to occur when NOT in an iframe
2866		if (!activeElement) {
2867			activeElement = document.body;
2868		}
2869
2870		// Support: IE 11 only
2871		// IE11 returns a seemingly empty object in some cases when accessing
2872		// document.activeElement from an <iframe>
2873		if (!activeElement.nodeName) {
2874			activeElement = document.body;
2875		}
2876
2877		return activeElement;
2878	};
2879
2880
2881
2882	var safeBlur = $.ui.safeBlur = function (element) {
2883
2884		// Support: IE9 - 10 only
2885		// If the <body> is blurred, IE will switch windows, see #9420
2886		if (element && element.nodeName.toLowerCase() !== "body") {
2887			$(element).trigger("blur");
2888		}
2889	};
2890
2891
2892	/*!
2893	 * jQuery UI Draggable 1.13.1
2894	 * http://jqueryui.com
2895	 *
2896	 * Copyright jQuery Foundation and other contributors
2897	 * Released under the MIT license.
2898	 * http://jquery.org/license
2899	 */
2900
2901	//>>label: Draggable
2902	//>>group: Interactions
2903	//>>description: Enables dragging functionality for any element.
2904	//>>docs: http://api.jqueryui.com/draggable/
2905	//>>demos: http://jqueryui.com/draggable/
2906	//>>css.structure: ../../themes/base/draggable.css
2907
2908
2909	$.widget("ui.draggable", $.ui.mouse, {
2910		version: "1.13.1",
2911		widgetEventPrefix: "drag",
2912		options: {
2913			addClasses: true,
2914			appendTo: "parent",
2915			axis: false,
2916			connectToSortable: false,
2917			containment: false,
2918			cursor: "auto",
2919			cursorAt: false,
2920			grid: false,
2921			handle: false,
2922			helper: "original",
2923			iframeFix: false,
2924			opacity: false,
2925			refreshPositions: false,
2926			revert: false,
2927			revertDuration: 500,
2928			scope: "default",
2929			scroll: true,
2930			scrollSensitivity: 20,
2931			scrollSpeed: 20,
2932			snap: false,
2933			snapMode: "both",
2934			snapTolerance: 20,
2935			stack: false,
2936			zIndex: false,
2937
2938			// Callbacks
2939			drag: null,
2940			start: null,
2941			stop: null
2942		},
2943		_create: function () {
2944
2945			if (this.options.helper === "original") {
2946				this._setPositionRelative();
2947			}
2948			if (this.options.addClasses) {
2949				this._addClass("ui-draggable");
2950			}
2951			this._setHandleClassName();
2952
2953			this._mouseInit();
2954		},
2955
2956		_setOption: function (key, value) {
2957			this._super(key, value);
2958			if (key === "handle") {
2959				this._removeHandleClassName();
2960				this._setHandleClassName();
2961			}
2962		},
2963
2964		_destroy: function () {
2965			if ((this.helper || this.element).is(".ui-draggable-dragging")) {
2966				this.destroyOnClear = true;
2967				return;
2968			}
2969			this._removeHandleClassName();
2970			this._mouseDestroy();
2971		},
2972
2973		_mouseCapture: function (event) {
2974			var o = this.options;
2975
2976			// Among others, prevent a drag on a resizable-handle
2977			if (this.helper || o.disabled ||
2978				$(event.target).closest(".ui-resizable-handle").length > 0) {
2979				return false;
2980			}
2981
2982			//Quit if we're not on a valid handle
2983			this.handle = this._getHandle(event);
2984			if (!this.handle) {
2985				return false;
2986			}
2987
2988			this._blurActiveElement(event);
2989
2990			this._blockFrames(o.iframeFix === true ? "iframe" : o.iframeFix);
2991
2992			return true;
2993
2994		},
2995
2996		_blockFrames: function (selector) {
2997			this.iframeBlocks = this.document.find(selector).map(function () {
2998				var iframe = $(this);
2999
3000				return $("<div>")
3001					.css("position", "absolute")
3002					.appendTo(iframe.parent())
3003					.outerWidth(iframe.outerWidth())
3004					.outerHeight(iframe.outerHeight())
3005					.offset(iframe.offset())[0];
3006			});
3007		},
3008
3009		_unblockFrames: function () {
3010			if (this.iframeBlocks) {
3011				this.iframeBlocks.remove();
3012				delete this.iframeBlocks;
3013			}
3014		},
3015
3016		_blurActiveElement: function (event) {
3017			var activeElement = $.ui.safeActiveElement(this.document[0]),
3018				target = $(event.target);
3019
3020			// Don't blur if the event occurred on an element that is within
3021			// the currently focused element
3022			// See #10527, #12472
3023			if (target.closest(activeElement).length) {
3024				return;
3025			}
3026
3027			// Blur any element that currently has focus, see #4261
3028			$.ui.safeBlur(activeElement);
3029		},
3030
3031		_mouseStart: function (event) {
3032
3033			var o = this.options;
3034
3035			//Create and append the visible helper
3036			this.helper = this._createHelper(event);
3037
3038			this._addClass(this.helper, "ui-draggable-dragging");
3039
3040			//Cache the helper size
3041			this._cacheHelperProportions();
3042
3043			//If ddmanager is used for droppables, set the global draggable
3044			if ($.ui.ddmanager) {
3045				$.ui.ddmanager.current = this;
3046			}
3047
3048			/*
3049			 * - Position generation -
3050			 * This block generates everything position related - it's the core of draggables.
3051			 */
3052
3053			//Cache the margins of the original element
3054			this._cacheMargins();
3055
3056			//Store the helper's css position
3057			this.cssPosition = this.helper.css("position");
3058			this.scrollParent = this.helper.scrollParent(true);
3059			this.offsetParent = this.helper.offsetParent();
3060			this.hasFixedAncestor = this.helper.parents().filter(function () {
3061				return $(this).css("position") === "fixed";
3062			}).length > 0;
vendor: 40,924 bytes, lines 3063-4469
3063
3064			//The element's absolute position on the page minus margins
3065			this.positionAbs = this.element.offset();
3066			this._refreshOffsets(event);
3067
3068			//Generate the original position
3069			this.originalPosition = this.position = this._generatePosition(event, false);
3070			this.originalPageX = event.pageX;
3071			this.originalPageY = event.pageY;
3072
3073			//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
3074			if (o.cursorAt) {
3075				this._adjustOffsetFromHelper(o.cursorAt);
3076			}
3077
3078			//Set a containment if given in the options
3079			this._setContainment();
3080
3081			//Trigger event + callbacks
3082			if (this._trigger("start", event) === false) {
3083				this._clear();
3084				return false;
3085			}
3086
3087			//Recache the helper size
3088			this._cacheHelperProportions();
3089
3090			//Prepare the droppable offsets
3091			if ($.ui.ddmanager && !o.dropBehaviour) {
3092				$.ui.ddmanager.prepareOffsets(this, event);
3093			}
3094
3095			// Execute the drag once - this causes the helper not to be visible before getting its
3096			// correct position
3097			this._mouseDrag(event, true);
3098
3099			// If the ddmanager is used for droppables, inform the manager that dragging has started
3100			// (see #5003)
3101			if ($.ui.ddmanager) {
3102				$.ui.ddmanager.dragStart(this, event);
3103			}
3104
3105			return true;
3106		},
3107
3108		_refreshOffsets: function (event) {
3109			this.offset = {
3110				top: this.positionAbs.top - this.margins.top,
3111				left: this.positionAbs.left - this.margins.left,
3112				scroll: false,
3113				parent: this._getParentOffset(),
3114				relative: this._getRelativeOffset()
3115			};
3116
3117			this.offset.click = {
3118				left: event.pageX - this.offset.left,
3119				top: event.pageY - this.offset.top
3120			};
3121		},
3122
3123		_mouseDrag: function (event, noPropagation) {
3124
3125			// reset any necessary cached properties (see #5009)
3126			if (this.hasFixedAncestor) {
3127				this.offset.parent = this._getParentOffset();
3128			}
3129
3130			//Compute the helpers position
3131			this.position = this._generatePosition(event, true);
3132			this.positionAbs = this._convertPositionTo("absolute");
3133
3134			//Call plugins and callbacks and use the resulting position if something is returned
3135			if (!noPropagation) {
3136				var ui = this._uiHash();
3137				if (this._trigger("drag", event, ui) === false) {
3138					this._mouseUp(new $.Event("mouseup", event));
3139					return false;
3140				}
3141				this.position = ui.position;
3142			}
3143
3144			this.helper[0].style.left = this.position.left + "px";
3145			this.helper[0].style.top = this.position.top + "px";
3146
3147			if ($.ui.ddmanager) {
3148				$.ui.ddmanager.drag(this, event);
3149			}
3150
3151			return false;
3152		},
3153
3154		_mouseStop: function (event) {
3155
3156			//If we are using droppables, inform the manager about the drop
3157			var that = this,
3158				dropped = false;
3159			if ($.ui.ddmanager && !this.options.dropBehaviour) {
3160				dropped = $.ui.ddmanager.drop(this, event);
3161			}
3162
3163			//if a drop comes from outside (a sortable)
3164			if (this.dropped) {
3165				dropped = this.dropped;
3166				this.dropped = false;
3167			}
3168
3169			if ((this.options.revert === "invalid" && !dropped) ||
3170				(this.options.revert === "valid" && dropped) ||
3171				this.options.revert === true || (typeof this.options.revert === "function" &&
3172					this.options.revert.call(this.element, dropped))
3173			) {
3174				$(this.helper).animate(
3175					this.originalPosition,
3176					parseInt(this.options.revertDuration, 10),
3177					function () {
3178						if (that._trigger("stop", event) !== false) {
3179							that._clear();
3180						}
3181					}
3182				);
3183			} else {
3184				if (this._trigger("stop", event) !== false) {
3185					this._clear();
3186				}
3187			}
3188
3189			return false;
3190		},
3191
3192		_mouseUp: function (event) {
3193			this._unblockFrames();
3194
3195			// If the ddmanager is used for droppables, inform the manager that dragging has stopped
3196			// (see #5003)
3197			if ($.ui.ddmanager) {
3198				$.ui.ddmanager.dragStop(this, event);
3199			}
3200
3201			// Only need to focus if the event occurred on the draggable itself, see #10527
3202			if (this.handleElement.is(event.target)) {
3203
3204				// The interaction is over; whether or not the click resulted in a drag,
3205				// focus the element
3206				this.element.trigger("focus");
3207			}
3208
3209			return $.ui.mouse.prototype._mouseUp.call(this, event);
3210		},
3211
3212		cancel: function () {
3213
3214			if (this.helper.is(".ui-draggable-dragging")) {
3215				this._mouseUp(new $.Event("mouseup", { target: this.element[0] }));
3216			} else {
3217				this._clear();
3218			}
3219
3220			return this;
3221
3222		},
3223
3224		_getHandle: function (event) {
3225			return this.options.handle ?
3226				!!$(event.target).closest(this.element.find(this.options.handle)).length :
3227				true;
3228		},
3229
3230		_setHandleClassName: function () {
3231			this.handleElement = this.options.handle ?
3232				this.element.find(this.options.handle) : this.element;
3233			this._addClass(this.handleElement, "ui-draggable-handle");
3234		},
3235
3236		_removeHandleClassName: function () {
3237			this._removeClass(this.handleElement, "ui-draggable-handle");
3238		},
3239
3240		_createHelper: function (event) {
3241
3242			var o = this.options,
3243				helperIsFunction = typeof o.helper === "function",
3244				helper = helperIsFunction ?
3245					$(o.helper.apply(this.element[0], [event])) :
3246					(o.helper === "clone" ?
3247						this.element.clone().removeAttr("id") :
3248						this.element);
3249
3250			if (!helper.parents("body").length) {
3251				helper.appendTo((o.appendTo === "parent" ?
3252					this.element[0].parentNode :
3253					o.appendTo));
3254			}
3255
3256			// Http://bugs.jqueryui.com/ticket/9446
3257			// a helper function can return the original element
3258			// which wouldn't have been set to relative in _create
3259			if (helperIsFunction && helper[0] === this.element[0]) {
3260				this._setPositionRelative();
3261			}
3262
3263			if (helper[0] !== this.element[0] &&
3264				!(/(fixed|absolute)/).test(helper.css("position"))) {
3265				helper.css("position", "absolute");
3266			}
3267
3268			return helper;
3269
3270		},
3271
3272		_setPositionRelative: function () {
3273			if (!(/^(?:r|a|f)/).test(this.element.css("position"))) {
3274				this.element[0].style.position = "relative";
3275			}
3276		},
3277
3278		_adjustOffsetFromHelper: function (obj) {
3279			if (typeof obj === "string") {
3280				obj = obj.split(" ");
3281			}
3282			if (Array.isArray(obj)) {
3283				obj = { left: +obj[0], top: +obj[1] || 0 };
3284			}
3285			if ("left" in obj) {
3286				this.offset.click.left = obj.left + this.margins.left;
3287			}
3288			if ("right" in obj) {
3289				this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
3290			}
3291			if ("top" in obj) {
3292				this.offset.click.top = obj.top + this.margins.top;
3293			}
3294			if ("bottom" in obj) {
3295				this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
3296			}
3297		},
3298
3299		_isRootNode: function (element) {
3300			return (/(html|body)/i).test(element.tagName) || element === this.document[0];
3301		},
3302
3303		_getParentOffset: function () {
3304
3305			//Get the offsetParent and cache its position
3306			var po = this.offsetParent.offset(),
3307				document = this.document[0];
3308
3309			// This is a special case where we need to modify a offset calculated on start, since the
3310			// following happened:
3311			// 1. The position of the helper is absolute, so it's position is calculated based on the
3312			// next positioned parent
3313			// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
3314			// the document, which means that the scroll is included in the initial calculation of the
3315			// offset of the parent, and never recalculated upon drag
3316			if (this.cssPosition === "absolute" && this.scrollParent[0] !== document &&
3317				$.contains(this.scrollParent[0], this.offsetParent[0])) {
3318				po.left += this.scrollParent.scrollLeft();
3319				po.top += this.scrollParent.scrollTop();
3320			}
3321
3322			if (this._isRootNode(this.offsetParent[0])) {
3323				po = { top: 0, left: 0 };
3324			}
3325
3326			return {
3327				top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
3328				left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
3329			};
3330
3331		},
3332
3333		_getRelativeOffset: function () {
3334			if (this.cssPosition !== "relative") {
3335				return { top: 0, left: 0 };
3336			}
3337
3338			var p = this.element.position(),
3339				scrollIsRootNode = this._isRootNode(this.scrollParent[0]);
3340
3341			return {
3342				top: p.top - (parseInt(this.helper.css("top"), 10) || 0) +
3343					(!scrollIsRootNode ? this.scrollParent.scrollTop() : 0),
3344				left: p.left - (parseInt(this.helper.css("left"), 10) || 0) +
3345					(!scrollIsRootNode ? this.scrollParent.scrollLeft() : 0)
3346			};
3347
3348		},
3349
3350		_cacheMargins: function () {
3351			this.margins = {
3352				left: (parseInt(this.element.css("marginLeft"), 10) || 0),
3353				top: (parseInt(this.element.css("marginTop"), 10) || 0),
3354				right: (parseInt(this.element.css("marginRight"), 10) || 0),
3355				bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
3356			};
3357		},
3358
3359		_cacheHelperProportions: function () {
3360			this.helperProportions = {
3361				width: this.helper.outerWidth(),
3362				height: this.helper.outerHeight()
3363			};
3364		},
3365
3366		_setContainment: function () {
3367
3368			var isUserScrollable, c, ce,
3369				o = this.options,
3370				document = this.document[0];
3371
3372			this.relativeContainer = null;
3373
3374			if (!o.containment) {
3375				this.containment = null;
3376				return;
3377			}
3378
3379			if (o.containment === "window") {
3380				this.containment = [
3381					$(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
3382					$(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
3383					$(window).scrollLeft() + $(window).width() -
3384					this.helperProportions.width - this.margins.left,
3385					$(window).scrollTop() +
3386					($(window).height() || document.body.parentNode.scrollHeight) -
3387					this.helperProportions.height - this.margins.top
3388				];
3389				return;
3390			}
3391
3392			if (o.containment === "document") {
3393				this.containment = [
3394					0,
3395					0,
3396					$(document).width() - this.helperProportions.width - this.margins.left,
3397					($(document).height() || document.body.parentNode.scrollHeight) -
3398					this.helperProportions.height - this.margins.top
3399				];
3400				return;
3401			}
3402
3403			if (o.containment.constructor === Array) {
3404				this.containment = o.containment;
3405				return;
3406			}
3407
3408			if (o.containment === "parent") {
3409				o.containment = this.helper[0].parentNode;
3410			}
3411
3412			c = $(o.containment);
3413			ce = c[0];
3414
3415			if (!ce) {
3416				return;
3417			}
3418
3419			isUserScrollable = /(scroll|auto)/.test(c.css("overflow"));
3420
3421			this.containment = [
3422				(parseInt(c.css("borderLeftWidth"), 10) || 0) +
3423				(parseInt(c.css("paddingLeft"), 10) || 0),
3424				(parseInt(c.css("borderTopWidth"), 10) || 0) +
3425				(parseInt(c.css("paddingTop"), 10) || 0),
3426				(isUserScrollable ? Math.max(ce.scrollWidth, ce.offsetWidth) : ce.offsetWidth) -
3427				(parseInt(c.css("borderRightWidth"), 10) || 0) -
3428				(parseInt(c.css("paddingRight"), 10) || 0) -
3429				this.helperProportions.width -
3430				this.margins.left -
3431				this.margins.right,
3432				(isUserScrollable ? Math.max(ce.scrollHeight, ce.offsetHeight) : ce.offsetHeight) -
3433				(parseInt(c.css("borderBottomWidth"), 10) || 0) -
3434				(parseInt(c.css("paddingBottom"), 10) || 0) -
3435				this.helperProportions.height -
3436				this.margins.top -
3437				this.margins.bottom
3438			];
3439			this.relativeContainer = c;
3440		},
3441
3442		_convertPositionTo: function (d, pos) {
3443
3444			if (!pos) {
3445				pos = this.position;
3446			}
3447
3448			var mod = d === "absolute" ? 1 : -1,
3449				scrollIsRootNode = this._isRootNode(this.scrollParent[0]);
3450
3451			return {
3452				top: (
3453
3454					// The absolute mouse position
3455					pos.top +
3456
3457					// Only for relative positioned nodes: Relative offset from element to offset parent
3458					this.offset.relative.top * mod +
3459
3460					// The offsetParent's offset without borders (offset + border)
3461					this.offset.parent.top * mod -
3462					((this.cssPosition === "fixed" ?
3463						-this.offset.scroll.top :
3464						(scrollIsRootNode ? 0 : this.offset.scroll.top)) * mod)
3465				),
3466				left: (
3467
3468					// The absolute mouse position
3469					pos.left +
3470
3471					// Only for relative positioned nodes: Relative offset from element to offset parent
3472					this.offset.relative.left * mod +
3473
3474					// The offsetParent's offset without borders (offset + border)
3475					this.offset.parent.left * mod -
3476					((this.cssPosition === "fixed" ?
3477						-this.offset.scroll.left :
3478						(scrollIsRootNode ? 0 : this.offset.scroll.left)) * mod)
3479				)
3480			};
3481
3482		},
3483
3484		_generatePosition: function (event, constrainPosition) {
3485
3486			var containment, co, top, left,
3487				o = this.options,
3488				scrollIsRootNode = this._isRootNode(this.scrollParent[0]),
3489				pageX = event.pageX,
3490				pageY = event.pageY;
3491
3492			// Cache the scroll
3493			if (!scrollIsRootNode || !this.offset.scroll) {
3494				this.offset.scroll = {
3495					top: this.scrollParent.scrollTop(),
3496					left: this.scrollParent.scrollLeft()
3497				};
3498			}
3499
3500			/*
3501			 * - Position constraining -
3502			 * Constrain the position to a mix of grid, containment.
3503			 */
3504
3505			// If we are not dragging yet, we won't check for options
3506			if (constrainPosition) {
3507				if (this.containment) {
3508					if (this.relativeContainer) {
3509						co = this.relativeContainer.offset();
3510						containment = [
3511							this.containment[0] + co.left,
3512							this.containment[1] + co.top,
3513							this.containment[2] + co.left,
3514							this.containment[3] + co.top
3515						];
3516					} else {
3517						containment = this.containment;
3518					}
3519
3520					if (event.pageX - this.offset.click.left < containment[0]) {
3521						pageX = containment[0] + this.offset.click.left;
3522					}
3523					if (event.pageY - this.offset.click.top < containment[1]) {
3524						pageY = containment[1] + this.offset.click.top;
3525					}
3526					if (event.pageX - this.offset.click.left > containment[2]) {
3527						pageX = containment[2] + this.offset.click.left;
3528					}
3529					if (event.pageY - this.offset.click.top > containment[3]) {
3530						pageY = containment[3] + this.offset.click.top;
3531					}
3532				}
3533
3534				if (o.grid) {
3535
3536					//Check for grid elements set to 0 to prevent divide by 0 error causing invalid
3537					// argument errors in IE (see ticket #6950)
3538					top = o.grid[1] ? this.originalPageY + Math.round((pageY -
3539						this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
3540					pageY = containment ? ((top - this.offset.click.top >= containment[1] ||
3541						top - this.offset.click.top > containment[3]) ?
3542						top :
3543						((top - this.offset.click.top >= containment[1]) ?
3544							top - o.grid[1] : top + o.grid[1])) : top;
3545
3546					left = o.grid[0] ? this.originalPageX +
3547						Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] :
3548						this.originalPageX;
3549					pageX = containment ? ((left - this.offset.click.left >= containment[0] ||
3550						left - this.offset.click.left > containment[2]) ?
3551						left :
3552						((left - this.offset.click.left >= containment[0]) ?
3553							left - o.grid[0] : left + o.grid[0])) : left;
3554				}
3555
3556				if (o.axis === "y") {
3557					pageX = this.originalPageX;
3558				}
3559
3560				if (o.axis === "x") {
3561					pageY = this.originalPageY;
3562				}
3563			}
3564
3565			return {
3566				top: (
3567
3568					// The absolute mouse position
3569					pageY -
3570
3571					// Click offset (relative to the element)
3572					this.offset.click.top -
3573
3574					// Only for relative positioned nodes: Relative offset from element to offset parent
3575					this.offset.relative.top -
3576
3577					// The offsetParent's offset without borders (offset + border)
3578					this.offset.parent.top +
3579					(this.cssPosition === "fixed" ?
3580						-this.offset.scroll.top :
3581						(scrollIsRootNode ? 0 : this.offset.scroll.top))
3582				),
3583				left: (
3584
3585					// The absolute mouse position
3586					pageX -
3587
3588					// Click offset (relative to the element)
3589					this.offset.click.left -
3590
3591					// Only for relative positioned nodes: Relative offset from element to offset parent
3592					this.offset.relative.left -
3593
3594					// The offsetParent's offset without borders (offset + border)
3595					this.offset.parent.left +
3596					(this.cssPosition === "fixed" ?
3597						-this.offset.scroll.left :
3598						(scrollIsRootNode ? 0 : this.offset.scroll.left))
3599				)
3600			};
3601
3602		},
3603
3604		_clear: function () {
3605			this._removeClass(this.helper, "ui-draggable-dragging");
3606			if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
3607				this.helper.remove();
3608			}
3609			this.helper = null;
3610			this.cancelHelperRemoval = false;
3611			if (this.destroyOnClear) {
3612				this.destroy();
3613			}
3614		},
3615
3616		// From now on bulk stuff - mainly helpers
3617
3618		_trigger: function (type, event, ui) {
3619			ui = ui || this._uiHash();
3620			$.ui.plugin.call(this, type, [event, ui, this], true);
3621
3622			// Absolute position and offset (see #6884 ) have to be recalculated after plugins
3623			if (/^(drag|start|stop)/.test(type)) {
3624				this.positionAbs = this._convertPositionTo("absolute");
3625				ui.offset = this.positionAbs;
3626			}
3627			return $.Widget.prototype._trigger.call(this, type, event, ui);
3628		},
3629
3630		plugins: {},
3631
3632		_uiHash: function () {
3633			return {
3634				helper: this.helper,
3635				position: this.position,
3636				originalPosition: this.originalPosition,
3637				offset: this.positionAbs
3638			};
3639		}
3640
3641	});
3642
3643	$.ui.plugin.add("draggable", "connectToSortable", {
3644		start: function (event, ui, draggable) {
3645			var uiSortable = $.extend({}, ui, {
3646				item: draggable.element
3647			});
3648
3649			draggable.sortables = [];
3650			$(draggable.options.connectToSortable).each(function () {
3651				var sortable = $(this).sortable("instance");
3652
3653				if (sortable && !sortable.options.disabled) {
3654					draggable.sortables.push(sortable);
3655
3656					// RefreshPositions is called at drag start to refresh the containerCache
3657					// which is used in drag. This ensures it's initialized and synchronized
3658					// with any changes that might have happened on the page since initialization.
3659					sortable.refreshPositions();
3660					sortable._trigger("activate", event, uiSortable);
3661				}
3662			});
3663		},
3664		stop: function (event, ui, draggable) {
3665			var uiSortable = $.extend({}, ui, {
3666				item: draggable.element
3667			});
3668
3669			draggable.cancelHelperRemoval = false;
3670
3671			$.each(draggable.sortables, function () {
3672				var sortable = this;
3673
3674				if (sortable.isOver) {
3675					sortable.isOver = 0;
3676
3677					// Allow this sortable to handle removing the helper
3678					draggable.cancelHelperRemoval = true;
3679					sortable.cancelHelperRemoval = false;
3680
3681					// Use _storedCSS To restore properties in the sortable,
3682					// as this also handles revert (#9675) since the draggable
3683					// may have modified them in unexpected ways (#8809)
3684					sortable._storedCSS = {
3685						position: sortable.placeholder.css("position"),
3686						top: sortable.placeholder.css("top"),
3687						left: sortable.placeholder.css("left")
3688					};
3689
3690					sortable._mouseStop(event);
3691
3692					// Once drag has ended, the sortable should return to using
3693					// its original helper, not the shared helper from draggable
3694					sortable.options.helper = sortable.options._helper;
3695				} else {
3696
3697					// Prevent this Sortable from removing the helper.
3698					// However, don't set the draggable to remove the helper
3699					// either as another connected Sortable may yet handle the removal.
3700					sortable.cancelHelperRemoval = true;
3701
3702					sortable._trigger("deactivate", event, uiSortable);
3703				}
3704			});
3705		},
3706		drag: function (event, ui, draggable) {
3707			$.each(draggable.sortables, function () {
3708				var innermostIntersecting = false,
3709					sortable = this;
3710
3711				// Copy over variables that sortable's _intersectsWith uses
3712				sortable.positionAbs = draggable.positionAbs;
3713				sortable.helperProportions = draggable.helperProportions;
3714				sortable.offset.click = draggable.offset.click;
3715
3716				if (sortable._intersectsWith(sortable.containerCache)) {
3717					innermostIntersecting = true;
3718
3719					$.each(draggable.sortables, function () {
3720
3721						// Copy over variables that sortable's _intersectsWith uses
3722						this.positionAbs = draggable.positionAbs;
3723						this.helperProportions = draggable.helperProportions;
3724						this.offset.click = draggable.offset.click;
3725
3726						if (this !== sortable &&
3727							this._intersectsWith(this.containerCache) &&
3728							$.contains(sortable.element[0], this.element[0])) {
3729							innermostIntersecting = false;
3730						}
3731
3732						return innermostIntersecting;
3733					});
3734				}
3735
3736				if (innermostIntersecting) {
3737
3738					// If it intersects, we use a little isOver variable and set it once,
3739					// so that the move-in stuff gets fired only once.
3740					if (!sortable.isOver) {
3741						sortable.isOver = 1;
3742
3743						// Store draggable's parent in case we need to reappend to it later.
3744						draggable._parent = ui.helper.parent();
3745
3746						sortable.currentItem = ui.helper
3747							.appendTo(sortable.element)
3748							.data("ui-sortable-item", true);
3749
3750						// Store helper option to later restore it
3751						sortable.options._helper = sortable.options.helper;
3752
3753						sortable.options.helper = function () {
3754							return ui.helper[0];
3755						};
3756
3757						// Fire the start events of the sortable with our passed browser event,
3758						// and our own helper (so it doesn't create a new one)
3759						event.target = sortable.currentItem[0];
3760						sortable._mouseCapture(event, true);
3761						sortable._mouseStart(event, true, true);
3762
3763						// Because the browser event is way off the new appended portlet,
3764						// modify necessary variables to reflect the changes
3765						sortable.offset.click.top = draggable.offset.click.top;
3766						sortable.offset.click.left = draggable.offset.click.left;
3767						sortable.offset.parent.left -= draggable.offset.parent.left -
3768							sortable.offset.parent.left;
3769						sortable.offset.parent.top -= draggable.offset.parent.top -
3770							sortable.offset.parent.top;
3771
3772						draggable._trigger("toSortable", event);
3773
3774						// Inform draggable that the helper is in a valid drop zone,
3775						// used solely in the revert option to handle "valid/invalid".
3776						draggable.dropped = sortable.element;
3777
3778						// Need to refreshPositions of all sortables in the case that
3779						// adding to one sortable changes the location of the other sortables (#9675)
3780						$.each(draggable.sortables, function () {
3781							this.refreshPositions();
3782						});
3783
3784						// Hack so receive/update callbacks work (mostly)
3785						draggable.currentItem = draggable.element;
3786						sortable.fromOutside = draggable;
3787					}
3788
3789					if (sortable.currentItem) {
3790						sortable._mouseDrag(event);
3791
3792						// Copy the sortable's position because the draggable's can potentially reflect
3793						// a relative position, while sortable is always absolute, which the dragged
3794						// element has now become. (#8809)
3795						ui.position = sortable.position;
3796					}
3797				} else {
3798
3799					// If it doesn't intersect with the sortable, and it intersected before,
3800					// we fake the drag stop of the sortable, but make sure it doesn't remove
3801					// the helper by using cancelHelperRemoval.
3802					if (sortable.isOver) {
3803
3804						sortable.isOver = 0;
3805						sortable.cancelHelperRemoval = true;
3806
3807						// Calling sortable's mouseStop would trigger a revert,
3808						// so revert must be temporarily false until after mouseStop is called.
3809						sortable.options._revert = sortable.options.revert;
3810						sortable.options.revert = false;
3811
3812						sortable._trigger("out", event, sortable._uiHash(sortable));
3813						sortable._mouseStop(event, true);
3814
3815						// Restore sortable behaviors that were modfied
3816						// when the draggable entered the sortable area (#9481)
3817						sortable.options.revert = sortable.options._revert;
3818						sortable.options.helper = sortable.options._helper;
3819
3820						if (sortable.placeholder) {
3821							sortable.placeholder.remove();
3822						}
3823
3824						// Restore and recalculate the draggable's offset considering the sortable
3825						// may have modified them in unexpected ways. (#8809, #10669)
3826						ui.helper.appendTo(draggable._parent);
3827						draggable._refreshOffsets(event);
3828						ui.position = draggable._generatePosition(event, true);
3829
3830						draggable._trigger("fromSortable", event);
3831
3832						// Inform draggable that the helper is no longer in a valid drop zone
3833						draggable.dropped = false;
3834
3835						// Need to refreshPositions of all sortables just in case removing
3836						// from one sortable changes the location of other sortables (#9675)
3837						$.each(draggable.sortables, function () {
3838							this.refreshPositions();
3839						});
3840					}
3841				}
3842			});
3843		}
3844	});
3845
3846	$.ui.plugin.add("draggable", "cursor", {
3847		start: function (event, ui, instance) {
3848			var t = $("body"),
3849				o = instance.options;
3850
3851			if (t.css("cursor")) {
3852				o._cursor = t.css("cursor");
3853			}
3854			t.css("cursor", o.cursor);
3855		},
3856		stop: function (event, ui, instance) {
3857			var o = instance.options;
3858			if (o._cursor) {
3859				$("body").css("cursor", o._cursor);
3860			}
3861		}
3862	});
3863
3864	$.ui.plugin.add("draggable", "opacity", {
3865		start: function (event, ui, instance) {
3866			var t = $(ui.helper),
3867				o = instance.options;
3868			if (t.css("opacity")) {
3869				o._opacity = t.css("opacity");
3870			}
3871			t.css("opacity", o.opacity);
3872		},
3873		stop: function (event, ui, instance) {
3874			var o = instance.options;
3875			if (o._opacity) {
3876				$(ui.helper).css("opacity", o._opacity);
3877			}
3878		}
3879	});
3880
3881	$.ui.plugin.add("draggable", "scroll", {
3882		start: function (event, ui, i) {
3883			if (!i.scrollParentNotHidden) {
3884				i.scrollParentNotHidden = i.helper.scrollParent(false);
3885			}
3886
3887			if (i.scrollParentNotHidden[0] !== i.document[0] &&
3888				i.scrollParentNotHidden[0].tagName !== "HTML") {
3889				i.overflowOffset = i.scrollParentNotHidden.offset();
3890			}
3891		},
3892		drag: function (event, ui, i) {
3893
3894			var o = i.options,
3895				scrolled = false,
3896				scrollParent = i.scrollParentNotHidden[0],
3897				document = i.document[0];
3898
3899			if (scrollParent !== document && scrollParent.tagName !== "HTML") {
3900				if (!o.axis || o.axis !== "x") {
3901					if ((i.overflowOffset.top + scrollParent.offsetHeight) - event.pageY <
3902						o.scrollSensitivity) {
3903						scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
3904					} else if (event.pageY - i.overflowOffset.top < o.scrollSensitivity) {
3905						scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
3906					}
3907				}
3908
3909				if (!o.axis || o.axis !== "y") {
3910					if ((i.overflowOffset.left + scrollParent.offsetWidth) - event.pageX <
3911						o.scrollSensitivity) {
3912						scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
3913					} else if (event.pageX - i.overflowOffset.left < o.scrollSensitivity) {
3914						scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
3915					}
3916				}
3917
3918			} else {
3919
3920				if (!o.axis || o.axis !== "x") {
3921					if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
3922						scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
3923					} else if ($(window).height() - (event.pageY - $(document).scrollTop()) <
3924						o.scrollSensitivity) {
3925						scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
3926					}
3927				}
3928
3929				if (!o.axis || o.axis !== "y") {
3930					if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
3931						scrolled = $(document).scrollLeft(
3932							$(document).scrollLeft() - o.scrollSpeed
3933						);
3934					} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) <
3935						o.scrollSensitivity) {
3936						scrolled = $(document).scrollLeft(
3937							$(document).scrollLeft() + o.scrollSpeed
3938						);
3939					}
3940				}
3941
3942			}
3943
3944			if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
3945				$.ui.ddmanager.prepareOffsets(i, event);
3946			}
3947
3948		}
3949	});
3950
3951	$.ui.plugin.add("draggable", "snap", {
3952		start: function (event, ui, i) {
3953
3954			var o = i.options;
3955
3956			i.snapElements = [];
3957
3958			$(o.snap.constructor !== String ? (o.snap.items || ":data(ui-draggable)") : o.snap)
3959				.each(function () {
3960					var $t = $(this),
3961						$o = $t.offset();
3962					if (this !== i.element[0]) {
3963						i.snapElements.push({
3964							item: this,
3965							width: $t.outerWidth(), height: $t.outerHeight(),
3966							top: $o.top, left: $o.left
3967						});
3968					}
3969				});
3970
3971		},
3972		drag: function (event, ui, inst) {
3973
3974			var ts, bs, ls, rs, l, r, t, b, i, first,
3975				o = inst.options,
3976				d = o.snapTolerance,
3977				x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
3978				y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
3979
3980			for (i = inst.snapElements.length - 1; i >= 0; i--) {
3981
3982				l = inst.snapElements[i].left - inst.margins.left;
3983				r = l + inst.snapElements[i].width;
3984				t = inst.snapElements[i].top - inst.margins.top;
3985				b = t + inst.snapElements[i].height;
3986
3987				if (x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
3988					!$.contains(inst.snapElements[i].item.ownerDocument,
3989						inst.snapElements[i].item)) {
3990					if (inst.snapElements[i].snapping) {
3991						if (inst.options.snap.release) {
3992							inst.options.snap.release.call(
3993								inst.element,
3994								event,
3995								$.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })
3996							);
3997						}
3998					}
3999					inst.snapElements[i].snapping = false;
4000					continue;
4001				}
4002
4003				if (o.snapMode !== "inner") {
4004					ts = Math.abs(t - y2) <= d;
4005					bs = Math.abs(b - y1) <= d;
4006					ls = Math.abs(l - x2) <= d;
4007					rs = Math.abs(r - x1) <= d;
4008					if (ts) {
4009						ui.position.top = inst._convertPositionTo("relative", {
4010							top: t - inst.helperProportions.height,
4011							left: 0
4012						}).top;
4013					}
4014					if (bs) {
4015						ui.position.top = inst._convertPositionTo("relative", {
4016							top: b,
4017							left: 0
4018						}).top;
4019					}
4020					if (ls) {
4021						ui.position.left = inst._convertPositionTo("relative", {
4022							top: 0,
4023							left: l - inst.helperProportions.width
4024						}).left;
4025					}
4026					if (rs) {
4027						ui.position.left = inst._convertPositionTo("relative", {
4028							top: 0,
4029							left: r
4030						}).left;
4031					}
4032				}
4033
4034				first = (ts || bs || ls || rs);
4035
4036				if (o.snapMode !== "outer") {
4037					ts = Math.abs(t - y1) <= d;
4038					bs = Math.abs(b - y2) <= d;
4039					ls = Math.abs(l - x1) <= d;
4040					rs = Math.abs(r - x2) <= d;
4041					if (ts) {
4042						ui.position.top = inst._convertPositionTo("relative", {
4043							top: t,
4044							left: 0
4045						}).top;
4046					}
4047					if (bs) {
4048						ui.position.top = inst._convertPositionTo("relative", {
4049							top: b - inst.helperProportions.height,
4050							left: 0
4051						}).top;
4052					}
4053					if (ls) {
4054						ui.position.left = inst._convertPositionTo("relative", {
4055							top: 0,
4056							left: l
4057						}).left;
4058					}
4059					if (rs) {
4060						ui.position.left = inst._convertPositionTo("relative", {
4061							top: 0,
4062							left: r - inst.helperProportions.width
4063						}).left;
4064					}
4065				}
4066
4067				if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
4068					if (inst.options.snap.snap) {
4069						inst.options.snap.snap.call(
4070							inst.element,
4071							event,
4072							$.extend(inst._uiHash(), {
4073								snapItem: inst.snapElements[i].item
4074							}));
4075					}
4076				}
4077				inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
4078
4079			}
4080
4081		}
4082	});
4083
4084	$.ui.plugin.add("draggable", "stack", {
4085		start: function (event, ui, instance) {
4086			var min,
4087				o = instance.options,
4088				group = $.makeArray($(o.stack)).sort(function (a, b) {
4089					return (parseInt($(a).css("zIndex"), 10) || 0) -
4090						(parseInt($(b).css("zIndex"), 10) || 0);
4091				});
4092
4093			if (!group.length) {
4094				return;
4095			}
4096
4097			min = parseInt($(group[0]).css("zIndex"), 10) || 0;
4098			$(group).each(function (i) {
4099				$(this).css("zIndex", min + i);
4100			});
4101			this.css("zIndex", (min + group.length));
4102		}
4103	});
4104
4105	$.ui.plugin.add("draggable", "zIndex", {
4106		start: function (event, ui, instance) {
4107			var t = $(ui.helper),
4108				o = instance.options;
4109
4110			if (t.css("zIndex")) {
4111				o._zIndex = t.css("zIndex");
4112			}
4113			t.css("zIndex", o.zIndex);
4114		},
4115		stop: function (event, ui, instance) {
4116			var o = instance.options;
4117
4118			if (o._zIndex) {
4119				$(ui.helper).css("zIndex", o._zIndex);
4120			}
4121		}
4122	});
4123
4124	var widgetsDraggable = $.ui.draggable;
4125
4126
4127	/*!
4128	 * jQuery UI Droppable 1.13.1
4129	 * http://jqueryui.com
4130	 *
4131	 * Copyright jQuery Foundation and other contributors
4132	 * Released under the MIT license.
4133	 * http://jquery.org/license
4134	 */
4135
4136	//>>label: Droppable
4137	//>>group: Interactions
4138	//>>description: Enables drop targets for draggable elements.
4139	//>>docs: http://api.jqueryui.com/droppable/
4140	//>>demos: http://jqueryui.com/droppable/
4141
4142
4143	$.widget("ui.droppable", {
4144		version: "1.13.1",
4145		widgetEventPrefix: "drop",
4146		options: {
4147			accept: "*",
4148			addClasses: true,
4149			greedy: false,
4150			scope: "default",
4151			tolerance: "intersect",
4152
4153			// Callbacks
4154			activate: null,
4155			deactivate: null,
4156			drop: null,
4157			out: null,
4158			over: null
4159		},
4160		_create: function () {
4161
4162			var proportions,
4163				o = this.options,
4164				accept = o.accept;
4165
4166			this.isover = false;
4167			this.isout = true;
4168
4169			this.accept = typeof accept === "function" ? accept : function (d) {
4170				return d.is(accept);
4171			};
4172
4173			this.proportions = function ( /* valueToWrite */) {
4174				if (arguments.length) {
4175
4176					// Store the droppable's proportions
4177					proportions = arguments[0];
4178				} else {
4179
4180					// Retrieve or derive the droppable's proportions
4181					return proportions ?
4182						proportions :
4183						proportions = {
4184							width: this.element[0].offsetWidth,
4185							height: this.element[0].offsetHeight
4186						};
4187				}
4188			};
4189
4190			this._addToManager(o.scope);
4191
4192			if (o.addClasses) {
4193				this._addClass("ui-droppable");
4194			}
4195
4196		},
4197
4198		_addToManager: function (scope) {
4199
4200			// Add the reference and positions to the manager
4201			$.ui.ddmanager.droppables[scope] = $.ui.ddmanager.droppables[scope] || [];
4202			$.ui.ddmanager.droppables[scope].push(this);
4203		},
4204
4205		_splice: function (drop) {
4206			var i = 0;
4207			for (; i < drop.length; i++) {
4208				if (drop[i] === this) {
4209					drop.splice(i, 1);
4210				}
4211			}
4212		},
4213
4214		_destroy: function () {
4215			var drop = $.ui.ddmanager.droppables[this.options.scope];
4216
4217			this._splice(drop);
4218		},
4219
4220		_setOption: function (key, value) {
4221
4222			if (key === "accept") {
4223				this.accept = typeof value === "function" ? value : function (d) {
4224					return d.is(value);
4225				};
4226			} else if (key === "scope") {
4227				var drop = $.ui.ddmanager.droppables[this.options.scope];
4228
4229				this._splice(drop);
4230				this._addToManager(value);
4231			}
4232
4233			this._super(key, value);
4234		},
4235
4236		_activate: function (event) {
4237			var draggable = $.ui.ddmanager.current;
4238
4239			this._addActiveClass();
4240			if (draggable) {
4241				this._trigger("activate", event, this.ui(draggable));
4242			}
4243		},
4244
4245		_deactivate: function (event) {
4246			var draggable = $.ui.ddmanager.current;
4247
4248			this._removeActiveClass();
4249			if (draggable) {
4250				this._trigger("deactivate", event, this.ui(draggable));
4251			}
4252		},
4253
4254		_over: function (event) {
4255
4256			var draggable = $.ui.ddmanager.current;
4257
4258			// Bail if draggable and droppable are same element
4259			if (!draggable || (draggable.currentItem ||
4260				draggable.element)[0] === this.element[0]) {
4261				return;
4262			}
4263
4264			if (this.accept.call(this.element[0], (draggable.currentItem ||
4265				draggable.element))) {
4266				this._addHoverClass();
4267				this._trigger("over", event, this.ui(draggable));
4268			}
4269
4270		},
4271
4272		_out: function (event) {
4273
4274			var draggable = $.ui.ddmanager.current;
4275
4276			// Bail if draggable and droppable are same element
4277			if (!draggable || (draggable.currentItem ||
4278				draggable.element)[0] === this.element[0]) {
4279				return;
4280			}
4281
4282			if (this.accept.call(this.element[0], (draggable.currentItem ||
4283				draggable.element))) {
4284				this._removeHoverClass();
4285				this._trigger("out", event, this.ui(draggable));
4286			}
4287
4288		},
4289
4290		_drop: function (event, custom) {
4291
4292			var draggable = custom || $.ui.ddmanager.current,
4293				childrenIntersection = false;
4294
4295			// Bail if draggable and droppable are same element
4296			if (!draggable || (draggable.currentItem ||
4297				draggable.element)[0] === this.element[0]) {
4298				return false;
4299			}
4300
4301			this.element
4302				.find(":data(ui-droppable)")
4303				.not(".ui-draggable-dragging")
4304				.each(function () {
4305					var inst = $(this).droppable("instance");
4306					if (
4307						inst.options.greedy &&
4308						!inst.options.disabled &&
4309						inst.options.scope === draggable.options.scope &&
4310						inst.accept.call(
4311							inst.element[0], (draggable.currentItem || draggable.element)
4312						) &&
4313						$.ui.intersect(
4314							draggable,
4315							$.extend(inst, { offset: inst.element.offset() }),
4316							inst.options.tolerance, event
4317						)
4318					) {
4319						childrenIntersection = true;
4320						return false;
4321					}
4322				});
4323			if (childrenIntersection) {
4324				return false;
4325			}
4326
4327			if (this.accept.call(this.element[0],
4328				(draggable.currentItem || draggable.element))) {
4329				this._removeActiveClass();
4330				this._removeHoverClass();
4331
4332				this._trigger("drop", event, this.ui(draggable));
4333				return this.element;
4334			}
4335
4336			return false;
4337
4338		},
4339
4340		ui: function (c) {
4341			return {
4342				draggable: (c.currentItem || c.element),
4343				helper: c.helper,
4344				position: c.position,
4345				offset: c.positionAbs
4346			};
4347		},
4348
4349		// Extension points just to make backcompat sane and avoid duplicating logic
4350		// TODO: Remove in 1.14 along with call to it below
4351		_addHoverClass: function () {
4352			this._addClass("ui-droppable-hover");
4353		},
4354
4355		_removeHoverClass: function () {
4356			this._removeClass("ui-droppable-hover");
4357		},
4358
4359		_addActiveClass: function () {
4360			this._addClass("ui-droppable-active");
4361		},
4362
4363		_removeActiveClass: function () {
4364			this._removeClass("ui-droppable-active");
4365		}
4366	});
4367
4368	$.ui.intersect = (function () {
4369		function isOverAxis(x, reference, size) {
4370			return (x >= reference) && (x < (reference + size));
4371		}
4372
4373		return function (draggable, droppable, toleranceMode, event) {
4374
4375			if (!droppable.offset) {
4376				return false;
4377			}
4378
4379			var x1 = (draggable.positionAbs ||
4380				draggable.position.absolute).left + draggable.margins.left,
4381				y1 = (draggable.positionAbs ||
4382					draggable.position.absolute).top + draggable.margins.top,
4383				x2 = x1 + draggable.helperProportions.width,
4384				y2 = y1 + draggable.helperProportions.height,
4385				l = droppable.offset.left,
4386				t = droppable.offset.top,
4387				r = l + droppable.proportions().width,
4388				b = t + droppable.proportions().height;
4389
4390			switch (toleranceMode) {
4391				case "fit":
4392					return (l <= x1 && x2 <= r && t <= y1 && y2 <= b);
4393				case "intersect":
4394					return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half
4395						x2 - (draggable.helperProportions.width / 2) < r && // Left Half
4396						t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half
4397						y2 - (draggable.helperProportions.height / 2) < b); // Top Half
4398				case "pointer":
4399					return isOverAxis(event.pageY, t, droppable.proportions().height) &&
4400						isOverAxis(event.pageX, l, droppable.proportions().width);
4401				case "touch":
4402					return (
4403						(y1 >= t && y1 <= b) || // Top edge touching
4404						(y2 >= t && y2 <= b) || // Bottom edge touching
4405						(y1 < t && y2 > b) // Surrounded vertically
4406					) && (
4407							(x1 >= l && x1 <= r) || // Left edge touching
4408							(x2 >= l && x2 <= r) || // Right edge touching
4409							(x1 < l && x2 > r) // Surrounded horizontally
4410						);
4411				default:
4412					return false;
4413			}
4414		};
4415	})();
4416
4417	/*
4418		This manager tracks offsets of draggables and droppables
4419	*/
4420	$.ui.ddmanager = {
4421		current: null,
4422		droppables: { "default": [] },
4423		prepareOffsets: function (t, event) {
4424
4425			var i, j,
4426				m = $.ui.ddmanager.droppables[t.options.scope] || [],
4427				type = event ? event.type : null, // workaround for #2317
4428				list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack();
4429
4430			droppablesLoop: for (i = 0; i < m.length; i++) {
4431
4432				// No disabled and non-accepted
4433				if (m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],
4434					(t.currentItem || t.element)))) {
4435					continue;
4436				}
4437
4438				// Filter out elements in the current dragged item
4439				for (j = 0; j < list.length; j++) {
4440					if (list[j] === m[i].element[0]) {
4441						m[i].proportions().height = 0;
4442						continue droppablesLoop;
4443					}
4444				}
4445
4446				m[i].visible = m[i].element.css("display") !== "none";
4447				if (!m[i].visible) {
4448					continue;
4449				}
4450
4451				// Activate the droppable if used directly from draggables
4452				if (type === "mousedown") {
4453					m[i]._activate.call(m[i], event);
4454				}
4455
4456				m[i].offset = m[i].element.offset();
4457				m[i].proportions({
4458					width: m[i].element[0].offsetWidth,
4459					height: m[i].element[0].offsetHeight
4460				});
4461
4462			}
4463
4464		},
4465		drop: function (draggable, event) {
4466
4467			var dropped = false;
4468
4469			// Create a copy of the droppables in case the list changes during the drop (#9116)
vendor: 22,499 bytes, lines 4470-5325
4470			$.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function () {
4471
4472				if (!this.options) {
4473					return;
4474				}
4475				if (!this.options.disabled && this.visible &&
4476					$.ui.intersect(draggable, this, this.options.tolerance, event)) {
4477					dropped = this._drop.call(this, event) || dropped;
4478				}
4479
4480				if (!this.options.disabled && this.visible && this.accept.call(this.element[0],
4481					(draggable.currentItem || draggable.element))) {
4482					this.isout = true;
4483					this.isover = false;
4484					this._deactivate.call(this, event);
4485				}
4486
4487			});
4488			return dropped;
4489
4490		},
4491		dragStart: function (draggable, event) {
4492
4493			// Listen for scrolling so that if the dragging causes scrolling the position of the
4494			// droppables can be recalculated (see #5003)
4495			draggable.element.parentsUntil("body").on("scroll.droppable", function () {
4496				if (!draggable.options.refreshPositions) {
4497					$.ui.ddmanager.prepareOffsets(draggable, event);
4498				}
4499			});
4500		},
4501		drag: function (draggable, event) {
4502
4503			// If you have a highly dynamic page, you might try this option. It renders positions
4504			// every time you move the mouse.
4505			if (draggable.options.refreshPositions) {
4506				$.ui.ddmanager.prepareOffsets(draggable, event);
4507			}
4508
4509			// Run through all droppables and check their positions based on specific tolerance options
4510			$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function () {
4511
4512				if (this.options.disabled || this.greedyChild || !this.visible) {
4513					return;
4514				}
4515
4516				var parentInstance, scope, parent,
4517					intersects = $.ui.intersect(draggable, this, this.options.tolerance, event),
4518					c = !intersects && this.isover ?
4519						"isout" :
4520						(intersects && !this.isover ? "isover" : null);
4521				if (!c) {
4522					return;
4523				}
4524
4525				if (this.options.greedy) {
4526
4527					// find droppable parents with same scope
4528					scope = this.options.scope;
4529					parent = this.element.parents(":data(ui-droppable)").filter(function () {
4530						return $(this).droppable("instance").options.scope === scope;
4531					});
4532
4533					if (parent.length) {
4534						parentInstance = $(parent[0]).droppable("instance");
4535						parentInstance.greedyChild = (c === "isover");
4536					}
4537				}
4538
4539				// We just moved into a greedy child
4540				if (parentInstance && c === "isover") {
4541					parentInstance.isover = false;
4542					parentInstance.isout = true;
4543					parentInstance._out.call(parentInstance, event);
4544				}
4545
4546				this[c] = true;
4547				this[c === "isout" ? "isover" : "isout"] = false;
4548				this[c === "isover" ? "_over" : "_out"].call(this, event);
4549
4550				// We just moved out of a greedy child
4551				if (parentInstance && c === "isout") {
4552					parentInstance.isout = false;
4553					parentInstance.isover = true;
4554					parentInstance._over.call(parentInstance, event);
4555				}
4556			});
4557
4558		},
4559		dragStop: function (draggable, event) {
4560			draggable.element.parentsUntil("body").off("scroll.droppable");
4561
4562			// Call prepareOffsets one final time since IE does not fire return scroll events when
4563			// overflow was caused by drag (see #5003)
4564			if (!draggable.options.refreshPositions) {
4565				$.ui.ddmanager.prepareOffsets(draggable, event);
4566			}
4567		}
4568	};
4569
4570	// DEPRECATED
4571	// TODO: switch return back to widget declaration at top of file when this is removed
4572	if ($.uiBackCompat !== false) {
4573
4574		// Backcompat for activeClass and hoverClass options
4575		$.widget("ui.droppable", $.ui.droppable, {
4576			options: {
4577				hoverClass: false,
4578				activeClass: false
4579			},
4580			_addActiveClass: function () {
4581				this._super();
4582				if (this.options.activeClass) {
4583					this.element.addClass(this.options.activeClass);
4584				}
4585			},
4586			_removeActiveClass: function () {
4587				this._super();
4588				if (this.options.activeClass) {
4589					this.element.removeClass(this.options.activeClass);
4590				}
4591			},
4592			_addHoverClass: function () {
4593				this._super();
4594				if (this.options.hoverClass) {
4595					this.element.addClass(this.options.hoverClass);
4596				}
4597			},
4598			_removeHoverClass: function () {
4599				this._super();
4600				if (this.options.hoverClass) {
4601					this.element.removeClass(this.options.hoverClass);
4602				}
4603			}
4604		});
4605	}
4606
4607	var widgetsDroppable = $.ui.droppable;
4608
4609
4610	/*!
4611	 * jQuery UI Resizable 1.13.1
4612	 * http://jqueryui.com
4613	 *
4614	 * Copyright jQuery Foundation and other contributors
4615	 * Released under the MIT license.
4616	 * http://jquery.org/license
4617	 */
4618
4619	//>>label: Resizable
4620	//>>group: Interactions
4621	//>>description: Enables resize functionality for any element.
4622	//>>docs: http://api.jqueryui.com/resizable/
4623	//>>demos: http://jqueryui.com/resizable/
4624	//>>css.structure: ../../themes/base/core.css
4625	//>>css.structure: ../../themes/base/resizable.css
4626	//>>css.theme: ../../themes/base/theme.css
4627
4628
4629	$.widget("ui.resizable", $.ui.mouse, {
4630		version: "1.13.1",
4631		widgetEventPrefix: "resize",
4632		options: {
4633			alsoResize: false,
4634			animate: false,
4635			animateDuration: "slow",
4636			animateEasing: "swing",
4637			aspectRatio: false,
4638			autoHide: false,
4639			classes: {
4640				"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
4641			},
4642			containment: false,
4643			ghost: false,
4644			grid: false,
4645			handles: "e,s,se",
4646			helper: false,
4647			maxHeight: null,
4648			maxWidth: null,
4649			minHeight: 10,
4650			minWidth: 10,
4651
4652			// See #7960
4653			zIndex: 90,
4654
4655			// Callbacks
4656			resize: null,
4657			start: null,
4658			stop: null
4659		},
4660
4661		_num: function (value) {
4662			return parseFloat(value) || 0;
4663		},
4664
4665		_isNumber: function (value) {
4666			return !isNaN(parseFloat(value));
4667		},
4668
4669		_hasScroll: function (el, a) {
4670
4671			if ($(el).css("overflow") === "hidden") {
4672				return false;
4673			}
4674
4675			var scroll = (a && a === "left") ? "scrollLeft" : "scrollTop",
4676				has = false;
4677
4678			if (el[scroll] > 0) {
4679				return true;
4680			}
4681
4682			// TODO: determine which cases actually cause this to happen
4683			// if the element doesn't have the scroll set, see if it's possible to
4684			// set the scroll
4685			try {
4686				el[scroll] = 1;
4687				has = (el[scroll] > 0);
4688				el[scroll] = 0;
4689			} catch (e) {
4690
4691				// `el` might be a string, then setting `scroll` will throw
4692				// an error in strict mode; ignore it.
4693			}
4694			return has;
4695		},
4696
4697		_create: function () {
4698
4699			var margins,
4700				o = this.options,
4701				that = this;
4702			this._addClass("ui-resizable");
4703
4704			$.extend(this, {
4705				_aspectRatio: !!(o.aspectRatio),
4706				aspectRatio: o.aspectRatio,
4707				originalElement: this.element,
4708				_proportionallyResizeElements: [],
4709				_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
4710			});
4711
4712			// Wrap the element if it cannot hold child nodes
4713			if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
4714
4715				this.element.wrap(
4716					$("<div class='ui-wrapper'></div>").css({
4717						overflow: "hidden",
4718						position: this.element.css("position"),
4719						width: this.element.outerWidth(),
4720						height: this.element.outerHeight(),
4721						top: this.element.css("top"),
4722						left: this.element.css("left")
4723					})
4724				);
4725
4726				this.element = this.element.parent().data(
4727					"ui-resizable", this.element.resizable("instance")
4728				);
4729
4730				this.elementIsWrapper = true;
4731
4732				margins = {
4733					marginTop: this.originalElement.css("marginTop"),
4734					marginRight: this.originalElement.css("marginRight"),
4735					marginBottom: this.originalElement.css("marginBottom"),
4736					marginLeft: this.originalElement.css("marginLeft")
4737				};
4738
4739				this.element.css(margins);
4740				this.originalElement.css("margin", 0);
4741
4742				// support: Safari
4743				// Prevent Safari textarea resize
4744				this.originalResizeStyle = this.originalElement.css("resize");
4745				this.originalElement.css("resize", "none");
4746
4747				this._proportionallyResizeElements.push(this.originalElement.css({
4748					position: "static",
4749					zoom: 1,
4750					display: "block"
4751				}));
4752
4753				// Support: IE9
4754				// avoid IE jump (hard set the margin)
4755				this.originalElement.css(margins);
4756
4757				this._proportionallyResize();
4758			}
4759
4760			this._setupHandles();
4761
4762			if (o.autoHide) {
4763				$(this.element)
4764					.on("mouseenter", function () {
4765						if (o.disabled) {
4766							return;
4767						}
4768						that._removeClass("ui-resizable-autohide");
4769						that._handles.show();
4770					})
4771					.on("mouseleave", function () {
4772						if (o.disabled) {
4773							return;
4774						}
4775						if (!that.resizing) {
4776							that._addClass("ui-resizable-autohide");
4777							that._handles.hide();
4778						}
4779					});
4780			}
4781
4782			this._mouseInit();
4783		},
4784
4785		_destroy: function () {
4786
4787			this._mouseDestroy();
4788			this._addedHandles.remove();
4789
4790			var wrapper,
4791				_destroy = function (exp) {
4792					$(exp)
4793						.removeData("resizable")
4794						.removeData("ui-resizable")
4795						.off(".resizable");
4796				};
4797
4798			// TODO: Unwrap at same DOM position
4799			if (this.elementIsWrapper) {
4800				_destroy(this.element);
4801				wrapper = this.element;
4802				this.originalElement.css({
4803					position: wrapper.css("position"),
4804					width: wrapper.outerWidth(),
4805					height: wrapper.outerHeight(),
4806					top: wrapper.css("top"),
4807					left: wrapper.css("left")
4808				}).insertAfter(wrapper);
4809				wrapper.remove();
4810			}
4811
4812			this.originalElement.css("resize", this.originalResizeStyle);
4813			_destroy(this.originalElement);
4814
4815			return this;
4816		},
4817
4818		_setOption: function (key, value) {
4819			this._super(key, value);
4820
4821			switch (key) {
4822				case "handles":
4823					this._removeHandles();
4824					this._setupHandles();
4825					break;
4826				case "aspectRatio":
4827					this._aspectRatio = !!value;
4828					break;
4829				default:
4830					break;
4831			}
4832		},
4833
4834		_setupHandles: function () {
4835			var o = this.options, handle, i, n, hname, axis, that = this;
4836			this.handles = o.handles ||
4837				(!$(".ui-resizable-handle", this.element).length ?
4838					"e,s,se" : {
4839						n: ".ui-resizable-n",
4840						e: ".ui-resizable-e",
4841						s: ".ui-resizable-s",
4842						w: ".ui-resizable-w",
4843						se: ".ui-resizable-se",
4844						sw: ".ui-resizable-sw",
4845						ne: ".ui-resizable-ne",
4846						nw: ".ui-resizable-nw"
4847					});
4848
4849			this._handles = $();
4850			this._addedHandles = $();
4851			if (this.handles.constructor === String) {
4852
4853				if (this.handles === "all") {
4854					this.handles = "n,e,s,w,se,sw,ne,nw";
4855				}
4856
4857				n = this.handles.split(",");
4858				this.handles = {};
4859
4860				for (i = 0; i < n.length; i++) {
4861
4862					handle = String.prototype.trim.call(n[i]);
4863					hname = "ui-resizable-" + handle;
4864					axis = $("<div>");
4865					this._addClass(axis, "ui-resizable-handle " + hname);
4866
4867					axis.css({ zIndex: o.zIndex });
4868
4869					this.handles[handle] = ".ui-resizable-" + handle;
4870					if (!this.element.children(this.handles[handle]).length) {
4871						this.element.append(axis);
4872						this._addedHandles = this._addedHandles.add(axis);
4873					}
4874				}
4875
4876			}
4877
4878			this._renderAxis = function (target) {
4879
4880				var i, axis, padPos, padWrapper;
4881
4882				target = target || this.element;
4883
4884				for (i in this.handles) {
4885
4886					if (this.handles[i].constructor === String) {
4887						this.handles[i] = this.element.children(this.handles[i]).first().show();
4888					} else if (this.handles[i].jquery || this.handles[i].nodeType) {
4889						this.handles[i] = $(this.handles[i]);
4890						this._on(this.handles[i], { "mousedown": that._mouseDown });
4891					}
4892
4893					if (this.elementIsWrapper &&
4894						this.originalElement[0]
4895							.nodeName
4896							.match(/^(textarea|input|select|button)$/i)) {
4897						axis = $(this.handles[i], this.element);
4898
4899						padWrapper = /sw|ne|nw|se|n|s/.test(i) ?
4900							axis.outerHeight() :
4901							axis.outerWidth();
4902
4903						padPos = ["padding",
4904							/ne|nw|n/.test(i) ? "Top" :
4905								/se|sw|s/.test(i) ? "Bottom" :
4906									/^e$/.test(i) ? "Right" : "Left"].join("");
4907
4908						target.css(padPos, padWrapper);
4909
4910						this._proportionallyResize();
4911					}
4912
4913					this._handles = this._handles.add(this.handles[i]);
4914				}
4915			};
4916
4917			// TODO: make renderAxis a prototype function
4918			this._renderAxis(this.element);
4919
4920			this._handles = this._handles.add(this.element.find(".ui-resizable-handle"));
4921			this._handles.disableSelection();
4922
4923			this._handles.on("mouseover", function () {
4924				if (!that.resizing) {
4925					if (this.className) {
4926						axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
4927					}
4928					that.axis = axis && axis[1] ? axis[1] : "se";
4929				}
4930			});
4931
4932			if (o.autoHide) {
4933				this._handles.hide();
4934				this._addClass("ui-resizable-autohide");
4935			}
4936		},
4937
4938		_removeHandles: function () {
4939			this._addedHandles.remove();
4940		},
4941
4942		_mouseCapture: function (event) {
4943			var i, handle,
4944				capture = false;
4945
4946			for (i in this.handles) {
4947				handle = $(this.handles[i])[0];
4948				if (handle === event.target || $.contains(handle, event.target)) {
4949					capture = true;
4950				}
4951			}
4952
4953			return !this.options.disabled && capture;
4954		},
4955
4956		_mouseStart: function (event) {
4957
4958			var curleft, curtop, cursor,
4959				o = this.options,
4960				el = this.element;
4961
4962			this.resizing = true;
4963
4964			this._renderProxy();
4965
4966			curleft = this._num(this.helper.css("left"));
4967			curtop = this._num(this.helper.css("top"));
4968
4969			if (o.containment) {
4970				curleft += $(o.containment).scrollLeft() || 0;
4971				curtop += $(o.containment).scrollTop() || 0;
4972			}
4973
4974			this.offset = this.helper.offset();
4975			this.position = { left: curleft, top: curtop };
4976
4977			this.size = this._helper ? {
4978				width: this.helper.width(),
4979				height: this.helper.height()
4980			} : {
4981				width: el.width(),
4982				height: el.height()
4983			};
4984
4985			this.originalSize = this._helper ? {
4986				width: el.outerWidth(),
4987				height: el.outerHeight()
4988			} : {
4989				width: el.width(),
4990				height: el.height()
4991			};
4992
4993			this.sizeDiff = {
4994				width: el.outerWidth() - el.width(),
4995				height: el.outerHeight() - el.height()
4996			};
4997
4998			this.originalPosition = { left: curleft, top: curtop };
4999			this.originalMousePosition = { left: event.pageX, top: event.pageY };
5000
5001			this.aspectRatio = (typeof o.aspectRatio === "number") ?
5002				o.aspectRatio :
5003				((this.originalSize.width / this.originalSize.height) || 1);
5004
5005			cursor = $(".ui-resizable-" + this.axis).css("cursor");
5006			$("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
5007
5008			this._addClass("ui-resizable-resizing");
5009			this._propagate("start", event);
5010			return true;
5011		},
5012
5013		_mouseDrag: function (event) {
5014
5015			var data, props,
5016				smp = this.originalMousePosition,
5017				a = this.axis,
5018				dx = (event.pageX - smp.left) || 0,
5019				dy = (event.pageY - smp.top) || 0,
5020				trigger = this._change[a];
5021
5022			this._updatePrevProperties();
5023
5024			if (!trigger) {
5025				return false;
5026			}
5027
5028			data = trigger.apply(this, [event, dx, dy]);
5029
5030			this._updateVirtualBoundaries(event.shiftKey);
5031			if (this._aspectRatio || event.shiftKey) {
5032				data = this._updateRatio(data, event);
5033			}
5034
5035			data = this._respectSize(data, event);
5036
5037			this._updateCache(data);
5038
5039			this._propagate("resize", event);
5040
5041			props = this._applyChanges();
5042
5043			if (!this._helper && this._proportionallyResizeElements.length) {
5044				this._proportionallyResize();
5045			}
5046
5047			if (!$.isEmptyObject(props)) {
5048				this._updatePrevProperties();
5049				this._trigger("resize", event, this.ui());
5050				this._applyChanges();
5051			}
5052
5053			return false;
5054		},
5055
5056		_mouseStop: function (event) {
5057
5058			this.resizing = false;
5059			var pr, ista, soffseth, soffsetw, s, left, top,
5060				o = this.options, that = this;
5061
5062			if (this._helper) {
5063
5064				pr = this._proportionallyResizeElements;
5065				ista = pr.length && (/textarea/i).test(pr[0].nodeName);
5066				soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
5067				soffsetw = ista ? 0 : that.sizeDiff.width;
5068
5069				s = {
5070					width: (that.helper.width() - soffsetw),
5071					height: (that.helper.height() - soffseth)
5072				};
5073				left = (parseFloat(that.element.css("left")) +
5074					(that.position.left - that.originalPosition.left)) || null;
5075				top = (parseFloat(that.element.css("top")) +
5076					(that.position.top - that.originalPosition.top)) || null;
5077
5078				if (!o.animate) {
5079					this.element.css($.extend(s, { top: top, left: left }));
5080				}
5081
5082				that.helper.height(that.size.height);
5083				that.helper.width(that.size.width);
5084
5085				if (this._helper && !o.animate) {
5086					this._proportionallyResize();
5087				}
5088			}
5089
5090			$("body").css("cursor", "auto");
5091
5092			this._removeClass("ui-resizable-resizing");
5093
5094			this._propagate("stop", event);
5095
5096			if (this._helper) {
5097				this.helper.remove();
5098			}
5099
5100			return false;
5101
5102		},
5103
5104		_updatePrevProperties: function () {
5105			this.prevPosition = {
5106				top: this.position.top,
5107				left: this.position.left
5108			};
5109			this.prevSize = {
5110				width: this.size.width,
5111				height: this.size.height
5112			};
5113		},
5114
5115		_applyChanges: function () {
5116			var props = {};
5117
5118			if (this.position.top !== this.prevPosition.top) {
5119				props.top = this.position.top + "px";
5120			}
5121			if (this.position.left !== this.prevPosition.left) {
5122				props.left = this.position.left + "px";
5123			}
5124			if (this.size.width !== this.prevSize.width) {
5125				props.width = this.size.width + "px";
5126			}
5127			if (this.size.height !== this.prevSize.height) {
5128				props.height = this.size.height + "px";
5129			}
5130
5131			this.helper.css(props);
5132
5133			return props;
5134		},
5135
5136		_updateVirtualBoundaries: function (forceAspectRatio) {
5137			var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
5138				o = this.options;
5139
5140			b = {
5141				minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
5142				maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
5143				minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
5144				maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
5145			};
5146
5147			if (this._aspectRatio || forceAspectRatio) {
5148				pMinWidth = b.minHeight * this.aspectRatio;
5149				pMinHeight = b.minWidth / this.aspectRatio;
5150				pMaxWidth = b.maxHeight * this.aspectRatio;
5151				pMaxHeight = b.maxWidth / this.aspectRatio;
5152
5153				if (pMinWidth > b.minWidth) {
5154					b.minWidth = pMinWidth;
5155				}
5156				if (pMinHeight > b.minHeight) {
5157					b.minHeight = pMinHeight;
5158				}
5159				if (pMaxWidth < b.maxWidth) {
5160					b.maxWidth = pMaxWidth;
5161				}
5162				if (pMaxHeight < b.maxHeight) {
5163					b.maxHeight = pMaxHeight;
5164				}
5165			}
5166			this._vBoundaries = b;
5167		},
5168
5169		_updateCache: function (data) {
5170			this.offset = this.helper.offset();
5171			if (this._isNumber(data.left)) {
5172				this.position.left = data.left;
5173			}
5174			if (this._isNumber(data.top)) {
5175				this.position.top = data.top;
5176			}
5177			if (this._isNumber(data.height)) {
5178				this.size.height = data.height;
5179			}
5180			if (this._isNumber(data.width)) {
5181				this.size.width = data.width;
5182			}
5183		},
5184
5185		_updateRatio: function (data) {
5186
5187			var cpos = this.position,
5188				csize = this.size,
5189				a = this.axis;
5190
5191			if (this._isNumber(data.height)) {
5192				data.width = (data.height * this.aspectRatio);
5193			} else if (this._isNumber(data.width)) {
5194				data.height = (data.width / this.aspectRatio);
5195			}
5196
5197			if (a === "sw") {
5198				data.left = cpos.left + (csize.width - data.width);
5199				data.top = null;
5200			}
5201			if (a === "nw") {
5202				data.top = cpos.top + (csize.height - data.height);
5203				data.left = cpos.left + (csize.width - data.width);
5204			}
5205
5206			return data;
5207		},
5208
5209		_respectSize: function (data) {
5210
5211			var o = this._vBoundaries,
5212				a = this.axis,
5213				ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
5214				ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
5215				isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
5216				isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
5217				dw = this.originalPosition.left + this.originalSize.width,
5218				dh = this.originalPosition.top + this.originalSize.height,
5219				cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
5220			if (isminw) {
5221				data.width = o.minWidth;
5222			}
5223			if (isminh) {
5224				data.height = o.minHeight;
5225			}
5226			if (ismaxw) {
5227				data.width = o.maxWidth;
5228			}
5229			if (ismaxh) {
5230				data.height = o.maxHeight;
5231			}
5232
5233			if (isminw && cw) {
5234				data.left = dw - o.minWidth;
5235			}
5236			if (ismaxw && cw) {
5237				data.left = dw - o.maxWidth;
5238			}
5239			if (isminh && ch) {
5240				data.top = dh - o.minHeight;
5241			}
5242			if (ismaxh && ch) {
5243				data.top = dh - o.maxHeight;
5244			}
5245
5246			// Fixing jump error on top/left - bug #2330
5247			if (!data.width && !data.height && !data.left && data.top) {
5248				data.top = null;
5249			} else if (!data.width && !data.height && !data.top && data.left) {
5250				data.left = null;
5251			}
5252
5253			return data;
5254		},
5255
5256		_getPaddingPlusBorderDimensions: function (element) {
5257			var i = 0,
5258				widths = [],
5259				borders = [
5260					element.css("borderTopWidth"),
5261					element.css("borderRightWidth"),
5262					element.css("borderBottomWidth"),
5263					element.css("borderLeftWidth")
5264				],
5265				paddings = [
5266					element.css("paddingTop"),
5267					element.css("paddingRight"),
5268					element.css("paddingBottom"),
5269					element.css("paddingLeft")
5270				];
5271
5272			for (; i < 4; i++) {
5273				widths[i] = (parseFloat(borders[i]) || 0);
5274				widths[i] += (parseFloat(paddings[i]) || 0);
5275			}
5276
5277			return {
5278				height: widths[0] + widths[2],
5279				width: widths[1] + widths[3]
5280			};
5281		},
5282
5283		_proportionallyResize: function () {
5284
5285			if (!this._proportionallyResizeElements.length) {
5286				return;
5287			}
5288
5289			var prel,
5290				i = 0,
5291				element = this.helper || this.element;
5292
5293			for (; i < this._proportionallyResizeElements.length; i++) {
5294
5295				prel = this._proportionallyResizeElements[i];
5296
5297				// TODO: Seems like a bug to cache this.outerDimensions
5298				// considering that we are in a loop.
5299				if (!this.outerDimensions) {
5300					this.outerDimensions = this._getPaddingPlusBorderDimensions(prel);
5301				}
5302
5303				prel.css({
5304					height: (element.height() - this.outerDimensions.height) || 0,
5305					width: (element.width() - this.outerDimensions.width) || 0
5306				});
5307
5308			}
5309
5310		},
5311
5312		_renderProxy: function () {
5313
5314			var el = this.element, o = this.options;
5315			this.elementOffset = el.offset();
5316
5317			if (this._helper) {
5318
5319				this.helper = this.helper || $("<div></div>").css({ overflow: "hidden" });
5320
5321				this._addClass(this.helper, this._helper);
5322				this.helper.css({
5323					width: this.element.outerWidth(),
5324					height: this.element.outerHeight(),
5325					position: "absolute",
vendor: 4,474 bytes, lines 5326-5491
5326					left: this.elementOffset.left + "px",
5327					top: this.elementOffset.top + "px",
5328					zIndex: ++o.zIndex //TODO: Don't modify option
5329				});
5330
5331				this.helper
5332					.appendTo("body")
5333					.disableSelection();
5334
5335			} else {
5336				this.helper = this.element;
5337			}
5338
5339		},
5340
5341		_change: {
5342			e: function (event, dx) {
5343				return { width: this.originalSize.width + dx };
5344			},
5345			w: function (event, dx) {
5346				var cs = this.originalSize, sp = this.originalPosition;
5347				return { left: sp.left + dx, width: cs.width - dx };
5348			},
5349			n: function (event, dx, dy) {
5350				var cs = this.originalSize, sp = this.originalPosition;
5351				return { top: sp.top + dy, height: cs.height - dy };
5352			},
5353			s: function (event, dx, dy) {
5354				return { height: this.originalSize.height + dy };
5355			},
5356			se: function (event, dx, dy) {
5357				return $.extend(this._change.s.apply(this, arguments),
5358					this._change.e.apply(this, [event, dx, dy]));
5359			},
5360			sw: function (event, dx, dy) {
5361				return $.extend(this._change.s.apply(this, arguments),
5362					this._change.w.apply(this, [event, dx, dy]));
5363			},
5364			ne: function (event, dx, dy) {
5365				return $.extend(this._change.n.apply(this, arguments),
5366					this._change.e.apply(this, [event, dx, dy]));
5367			},
5368			nw: function (event, dx, dy) {
5369				return $.extend(this._change.n.apply(this, arguments),
5370					this._change.w.apply(this, [event, dx, dy]));
5371			}
5372		},
5373
5374		_propagate: function (n, event) {
5375			$.ui.plugin.call(this, n, [event, this.ui()]);
5376			if (n !== "resize") {
5377				this._trigger(n, event, this.ui());
5378			}
5379		},
5380
5381		plugins: {},
5382
5383		ui: function () {
5384			return {
5385				originalElement: this.originalElement,
5386				element: this.element,
5387				helper: this.helper,
5388				position: this.position,
5389				size: this.size,
5390				originalSize: this.originalSize,
5391				originalPosition: this.originalPosition
5392			};
5393		}
5394
5395	});
5396
5397	/*
5398	 * Resizable Extensions
5399	 */
5400
5401	$.ui.plugin.add("resizable", "animate", {
5402
5403		stop: function (event) {
5404			var that = $(this).resizable("instance"),
5405				o = that.options,
5406				pr = that._proportionallyResizeElements,
5407				ista = pr.length && (/textarea/i).test(pr[0].nodeName),
5408				soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
5409				soffsetw = ista ? 0 : that.sizeDiff.width,
5410				style = {
5411					width: (that.size.width - soffsetw),
5412					height: (that.size.height - soffseth)
5413				},
5414				left = (parseFloat(that.element.css("left")) +
5415					(that.position.left - that.originalPosition.left)) || null,
5416				top = (parseFloat(that.element.css("top")) +
5417					(that.position.top - that.originalPosition.top)) || null;
5418
5419			that.element.animate(
5420				$.extend(style, top && left ? { top: top, left: left } : {}), {
5421				duration: o.animateDuration,
5422				easing: o.animateEasing,
5423				step: function () {
5424
5425					var data = {
5426						width: parseFloat(that.element.css("width")),
5427						height: parseFloat(that.element.css("height")),
5428						top: parseFloat(that.element.css("top")),
5429						left: parseFloat(that.element.css("left"))
5430					};
5431
5432					if (pr && pr.length) {
5433						$(pr[0]).css({ width: data.width, height: data.height });
5434					}
5435
5436					// Propagating resize, and updating values for each animation step
5437					that._updateCache(data);
5438					that._propagate("resize", event);
5439
5440				}
5441			}
5442			);
5443		}
5444
5445	});
5446
5447	$.ui.plugin.add("resizable", "containment", {
5448
5449		start: function () {
5450			var element, p, co, ch, cw, width, height,
5451				that = $(this).resizable("instance"),
5452				o = that.options,
5453				el = that.element,
5454				oc = o.containment,
5455				ce = (oc instanceof $) ?
5456					oc.get(0) :
5457					(/parent/.test(oc)) ? el.parent().get(0) : oc;
5458
5459			if (!ce) {
5460				return;
5461			}
5462
5463			that.containerElement = $(ce);
5464
5465			if (/document/.test(oc) || oc === document) {
5466				that.containerOffset = {
5467					left: 0,
5468					top: 0
5469				};
5470				that.containerPosition = {
5471					left: 0,
5472					top: 0
5473				};
5474
5475				that.parentData = {
5476					element: $(document),
5477					left: 0,
5478					top: 0,
5479					width: $(document).width(),
5480					height: $(document).height() || document.body.parentNode.scrollHeight
5481				};
5482			} else {
5483				element = $(ce);
5484				p = [];
5485				$(["Top", "Right", "Left", "Bottom"]).each(function (i, name) {
5486					p[i] = that._num(element.css("padding" + name));
5487				});
5488
5489				that.containerOffset = element.offset();
5490				that.containerPosition = element.position();
5491				that.containerSize = {
vendor: 4,908 bytes, lines 5492-5662
5492					height: (element.innerHeight() - p[3]),
5493					width: (element.innerWidth() - p[1])
5494				};
5495
5496				co = that.containerOffset;
5497				ch = that.containerSize.height;
5498				cw = that.containerSize.width;
5499				width = (that._hasScroll(ce, "left") ? ce.scrollWidth : cw);
5500				height = (that._hasScroll(ce) ? ce.scrollHeight : ch);
5501
5502				that.parentData = {
5503					element: ce,
5504					left: co.left,
5505					top: co.top,
5506					width: width,
5507					height: height
5508				};
5509			}
5510		},
5511
5512		resize: function (event) {
5513			var woset, hoset, isParent, isOffsetRelative,
5514				that = $(this).resizable("instance"),
5515				o = that.options,
5516				co = that.containerOffset,
5517				cp = that.position,
5518				pRatio = that._aspectRatio || event.shiftKey,
5519				cop = {
5520					top: 0,
5521					left: 0
5522				},
5523				ce = that.containerElement,
5524				continueResize = true;
5525
5526			if (ce[0] !== document && (/static/).test(ce.css("position"))) {
5527				cop = co;
5528			}
5529
5530			if (cp.left < (that._helper ? co.left : 0)) {
5531				that.size.width = that.size.width +
5532					(that._helper ?
5533						(that.position.left - co.left) :
5534						(that.position.left - cop.left));
5535
5536				if (pRatio) {
5537					that.size.height = that.size.width / that.aspectRatio;
5538					continueResize = false;
5539				}
5540				that.position.left = o.helper ? co.left : 0;
5541			}
5542
5543			if (cp.top < (that._helper ? co.top : 0)) {
5544				that.size.height = that.size.height +
5545					(that._helper ?
5546						(that.position.top - co.top) :
5547						that.position.top);
5548
5549				if (pRatio) {
5550					that.size.width = that.size.height * that.aspectRatio;
5551					continueResize = false;
5552				}
5553				that.position.top = that._helper ? co.top : 0;
5554			}
5555
5556			isParent = that.containerElement.get(0) === that.element.parent().get(0);
5557			isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position"));
5558
5559			if (isParent && isOffsetRelative) {
5560				that.offset.left = that.parentData.left + that.position.left;
5561				that.offset.top = that.parentData.top + that.position.top;
5562			} else {
5563				that.offset.left = that.element.offset().left;
5564				that.offset.top = that.element.offset().top;
5565			}
5566
5567			woset = Math.abs(that.sizeDiff.width +
5568				(that._helper ?
5569					that.offset.left - cop.left :
5570					(that.offset.left - co.left)));
5571
5572			hoset = Math.abs(that.sizeDiff.height +
5573				(that._helper ?
5574					that.offset.top - cop.top :
5575					(that.offset.top - co.top)));
5576
5577			if (woset + that.size.width >= that.parentData.width) {
5578				that.size.width = that.parentData.width - woset;
5579				if (pRatio) {
5580					that.size.height = that.size.width / that.aspectRatio;
5581					continueResize = false;
5582				}
5583			}
5584
5585			if (hoset + that.size.height >= that.parentData.height) {
5586				that.size.height = that.parentData.height - hoset;
5587				if (pRatio) {
5588					that.size.width = that.size.height * that.aspectRatio;
5589					continueResize = false;
5590				}
5591			}
5592
5593			if (!continueResize) {
5594				that.position.left = that.prevPosition.left;
5595				that.position.top = that.prevPosition.top;
5596				that.size.width = that.prevSize.width;
5597				that.size.height = that.prevSize.height;
5598			}
5599		},
5600
5601		stop: function () {
5602			var that = $(this).resizable("instance"),
5603				o = that.options,
5604				co = that.containerOffset,
5605				cop = that.containerPosition,
5606				ce = that.containerElement,
5607				helper = $(that.helper),
5608				ho = helper.offset(),
5609				w = helper.outerWidth() - that.sizeDiff.width,
5610				h = helper.outerHeight() - that.sizeDiff.height;
5611
5612			if (that._helper && !o.animate && (/relative/).test(ce.css("position"))) {
5613				$(this).css({
5614					left: ho.left - cop.left - co.left,
5615					width: w,
5616					height: h
5617				});
5618			}
5619
5620			if (that._helper && !o.animate && (/static/).test(ce.css("position"))) {
5621				$(this).css({
5622					left: ho.left - cop.left - co.left,
5623					width: w,
5624					height: h
5625				});
5626			}
5627		}
5628	});
5629
5630	$.ui.plugin.add("resizable", "alsoResize", {
5631
5632		start: function () {
5633			var that = $(this).resizable("instance"),
5634				o = that.options;
5635
5636			$(o.alsoResize).each(function () {
5637				var el = $(this);
5638				el.data("ui-resizable-alsoresize", {
5639					width: parseFloat(el.width()), height: parseFloat(el.height()),
5640					left: parseFloat(el.css("left")), top: parseFloat(el.css("top"))
5641				});
5642			});
5643		},
5644
5645		resize: function (event, ui) {
5646			var that = $(this).resizable("instance"),
5647				o = that.options,
5648				os = that.originalSize,
5649				op = that.originalPosition,
5650				delta = {
5651					height: (that.size.height - os.height) || 0,
5652					width: (that.size.width - os.width) || 0,
5653					top: (that.position.top - op.top) || 0,
5654					left: (that.position.left - op.left) || 0
5655				};
5656
5657			$(o.alsoResize).each(function () {
5658				var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
5659					css = el.parents(ui.originalElement[0]).length ?
5660						["width", "height"] :
5661						["width", "height", "top", "left"];
5662
vendor: 5,423 bytes, lines 5663-5872
5663				$.each(css, function (i, prop) {
5664					var sum = (start[prop] || 0) + (delta[prop] || 0);
5665					if (sum && sum >= 0) {
5666						style[prop] = sum || null;
5667					}
5668				});
5669
5670				el.css(style);
5671			});
5672		},
5673
5674		stop: function () {
5675			$(this).removeData("ui-resizable-alsoresize");
5676		}
5677	});
5678
5679	$.ui.plugin.add("resizable", "ghost", {
5680
5681		start: function () {
5682
5683			var that = $(this).resizable("instance"), cs = that.size;
5684
5685			that.ghost = that.originalElement.clone();
5686			that.ghost.css({
5687				opacity: 0.25,
5688				display: "block",
5689				position: "relative",
5690				height: cs.height,
5691				width: cs.width,
5692				margin: 0,
5693				left: 0,
5694				top: 0
5695			});
5696
5697			that._addClass(that.ghost, "ui-resizable-ghost");
5698
5699			// DEPRECATED
5700			// TODO: remove after 1.12
5701			if ($.uiBackCompat !== false && typeof that.options.ghost === "string") {
5702
5703				// Ghost option
5704				that.ghost.addClass(this.options.ghost);
5705			}
5706
5707			that.ghost.appendTo(that.helper);
5708
5709		},
5710
5711		resize: function () {
5712			var that = $(this).resizable("instance");
5713			if (that.ghost) {
5714				that.ghost.css({
5715					position: "relative",
5716					height: that.size.height,
5717					width: that.size.width
5718				});
5719			}
5720		},
5721
5722		stop: function () {
5723			var that = $(this).resizable("instance");
5724			if (that.ghost && that.helper) {
5725				that.helper.get(0).removeChild(that.ghost.get(0));
5726			}
5727		}
5728
5729	});
5730
5731	$.ui.plugin.add("resizable", "grid", {
5732
5733		resize: function () {
5734			var outerDimensions,
5735				that = $(this).resizable("instance"),
5736				o = that.options,
5737				cs = that.size,
5738				os = that.originalSize,
5739				op = that.originalPosition,
5740				a = that.axis,
5741				grid = typeof o.grid === "number" ? [o.grid, o.grid] : o.grid,
5742				gridX = (grid[0] || 1),
5743				gridY = (grid[1] || 1),
5744				ox = Math.round((cs.width - os.width) / gridX) * gridX,
5745				oy = Math.round((cs.height - os.height) / gridY) * gridY,
5746				newWidth = os.width + ox,
5747				newHeight = os.height + oy,
5748				isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
5749				isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
5750				isMinWidth = o.minWidth && (o.minWidth > newWidth),
5751				isMinHeight = o.minHeight && (o.minHeight > newHeight);
5752
5753			o.grid = grid;
5754
5755			if (isMinWidth) {
5756				newWidth += gridX;
5757			}
5758			if (isMinHeight) {
5759				newHeight += gridY;
5760			}
5761			if (isMaxWidth) {
5762				newWidth -= gridX;
5763			}
5764			if (isMaxHeight) {
5765				newHeight -= gridY;
5766			}
5767
5768			if (/^(se|s|e)$/.test(a)) {
5769				that.size.width = newWidth;
5770				that.size.height = newHeight;
5771			} else if (/^(ne)$/.test(a)) {
5772				that.size.width = newWidth;
5773				that.size.height = newHeight;
5774				that.position.top = op.top - oy;
5775			} else if (/^(sw)$/.test(a)) {
5776				that.size.width = newWidth;
5777				that.size.height = newHeight;
5778				that.position.left = op.left - ox;
5779			} else {
5780				if (newHeight - gridY <= 0 || newWidth - gridX <= 0) {
5781					outerDimensions = that._getPaddingPlusBorderDimensions(this);
5782				}
5783
5784				if (newHeight - gridY > 0) {
5785					that.size.height = newHeight;
5786					that.position.top = op.top - oy;
5787				} else {
5788					newHeight = gridY - outerDimensions.height;
5789					that.size.height = newHeight;
5790					that.position.top = op.top + os.height - newHeight;
5791				}
5792				if (newWidth - gridX > 0) {
5793					that.size.width = newWidth;
5794					that.position.left = op.left - ox;
5795				} else {
5796					newWidth = gridX - outerDimensions.width;
5797					that.size.width = newWidth;
5798					that.position.left = op.left + os.width - newWidth;
5799				}
5800			}
5801		}
5802
5803	});
5804
5805	var widgetsResizable = $.ui.resizable;
5806
5807
5808	/*!
5809	 * jQuery UI Selectable 1.13.1
5810	 * http://jqueryui.com
5811	 *
5812	 * Copyright jQuery Foundation and other contributors
5813	 * Released under the MIT license.
5814	 * http://jquery.org/license
5815	 */
5816
5817	//>>label: Selectable
5818	//>>group: Interactions
5819	//>>description: Allows groups of elements to be selected with the mouse.
5820	//>>docs: http://api.jqueryui.com/selectable/
5821	//>>demos: http://jqueryui.com/selectable/
5822	//>>css.structure: ../../themes/base/selectable.css
5823
5824
5825	var widgetsSelectable = $.widget("ui.selectable", $.ui.mouse, {
5826		version: "1.13.1",
5827		options: {
5828			appendTo: "body",
5829			autoRefresh: true,
5830			distance: 0,
5831			filter: "*",
5832			tolerance: "touch",
5833
5834			// Callbacks
5835			selected: null,
5836			selecting: null,
5837			start: null,
5838			stop: null,
5839			unselected: null,
5840			unselecting: null
5841		},
5842		_create: function () {
5843			var that = this;
5844
5845			this._addClass("ui-selectable");
5846
5847			this.dragged = false;
5848
5849			// Cache selectee children based on filter
5850			this.refresh = function () {
5851				that.elementPos = $(that.element[0]).offset();
5852				that.selectees = $(that.options.filter, that.element[0]);
5853				that._addClass(that.selectees, "ui-selectee");
5854				that.selectees.each(function () {
5855					var $this = $(this),
5856						selecteeOffset = $this.offset(),
5857						pos = {
5858							left: selecteeOffset.left - that.elementPos.left,
5859							top: selecteeOffset.top - that.elementPos.top
5860						};
5861					$.data(this, "selectable-item", {
5862						element: this,
5863						$element: $this,
5864						left: pos.left,
5865						top: pos.top,
5866						right: pos.left + $this.outerWidth(),
5867						bottom: pos.top + $this.outerHeight(),
5868						startselected: false,
5869						selected: $this.hasClass("ui-selected"),
5870						selecting: $this.hasClass("ui-selecting"),
5871						unselecting: $this.hasClass("ui-unselecting")
5872					});
vendor: 10,126 bytes, lines 5873-6268
5873				});
5874			};
5875			this.refresh();
5876
5877			this._mouseInit();
5878
5879			this.helper = $("<div>");
5880			this._addClass(this.helper, "ui-selectable-helper");
5881		},
5882
5883		_destroy: function () {
5884			this.selectees.removeData("selectable-item");
5885			this._mouseDestroy();
5886		},
5887
5888		_mouseStart: function (event) {
5889			var that = this,
5890				options = this.options;
5891
5892			this.opos = [event.pageX, event.pageY];
5893			this.elementPos = $(this.element[0]).offset();
5894
5895			if (this.options.disabled) {
5896				return;
5897			}
5898
5899			this.selectees = $(options.filter, this.element[0]);
5900
5901			this._trigger("start", event);
5902
5903			$(options.appendTo).append(this.helper);
5904
5905			// position helper (lasso)
5906			this.helper.css({
5907				"left": event.pageX,
5908				"top": event.pageY,
5909				"width": 0,
5910				"height": 0
5911			});
5912
5913			if (options.autoRefresh) {
5914				this.refresh();
5915			}
5916
5917			this.selectees.filter(".ui-selected").each(function () {
5918				var selectee = $.data(this, "selectable-item");
5919				selectee.startselected = true;
5920				if (!event.metaKey && !event.ctrlKey) {
5921					that._removeClass(selectee.$element, "ui-selected");
5922					selectee.selected = false;
5923					that._addClass(selectee.$element, "ui-unselecting");
5924					selectee.unselecting = true;
5925
5926					// selectable UNSELECTING callback
5927					that._trigger("unselecting", event, {
5928						unselecting: selectee.element
5929					});
5930				}
5931			});
5932
5933			$(event.target).parents().addBack().each(function () {
5934				var doSelect,
5935					selectee = $.data(this, "selectable-item");
5936				if (selectee) {
5937					doSelect = (!event.metaKey && !event.ctrlKey) ||
5938						!selectee.$element.hasClass("ui-selected");
5939					that._removeClass(selectee.$element, doSelect ? "ui-unselecting" : "ui-selected")
5940						._addClass(selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting");
5941					selectee.unselecting = !doSelect;
5942					selectee.selecting = doSelect;
5943					selectee.selected = doSelect;
5944
5945					// selectable (UN)SELECTING callback
5946					if (doSelect) {
5947						that._trigger("selecting", event, {
5948							selecting: selectee.element
5949						});
5950					} else {
5951						that._trigger("unselecting", event, {
5952							unselecting: selectee.element
5953						});
5954					}
5955					return false;
5956				}
5957			});
5958
5959		},
5960
5961		_mouseDrag: function (event) {
5962
5963			this.dragged = true;
5964
5965			if (this.options.disabled) {
5966				return;
5967			}
5968
5969			var tmp,
5970				that = this,
5971				options = this.options,
5972				x1 = this.opos[0],
5973				y1 = this.opos[1],
5974				x2 = event.pageX,
5975				y2 = event.pageY;
5976
5977			if (x1 > x2) {
5978				tmp = x2; x2 = x1; x1 = tmp;
5979			}
5980			if (y1 > y2) {
5981				tmp = y2; y2 = y1; y1 = tmp;
5982			}
5983			this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
5984
5985			this.selectees.each(function () {
5986				var selectee = $.data(this, "selectable-item"),
5987					hit = false,
5988					offset = {};
5989
5990				//prevent helper from being selected if appendTo: selectable
5991				if (!selectee || selectee.element === that.element[0]) {
5992					return;
5993				}
5994
5995				offset.left = selectee.left + that.elementPos.left;
5996				offset.right = selectee.right + that.elementPos.left;
5997				offset.top = selectee.top + that.elementPos.top;
5998				offset.bottom = selectee.bottom + that.elementPos.top;
5999
6000				if (options.tolerance === "touch") {
6001					hit = (!(offset.left > x2 || offset.right < x1 || offset.top > y2 ||
6002						offset.bottom < y1));
6003				} else if (options.tolerance === "fit") {
6004					hit = (offset.left > x1 && offset.right < x2 && offset.top > y1 &&
6005						offset.bottom < y2);
6006				}
6007
6008				if (hit) {
6009
6010					// SELECT
6011					if (selectee.selected) {
6012						that._removeClass(selectee.$element, "ui-selected");
6013						selectee.selected = false;
6014					}
6015					if (selectee.unselecting) {
6016						that._removeClass(selectee.$element, "ui-unselecting");
6017						selectee.unselecting = false;
6018					}
6019					if (!selectee.selecting) {
6020						that._addClass(selectee.$element, "ui-selecting");
6021						selectee.selecting = true;
6022
6023						// selectable SELECTING callback
6024						that._trigger("selecting", event, {
6025							selecting: selectee.element
6026						});
6027					}
6028				} else {
6029
6030					// UNSELECT
6031					if (selectee.selecting) {
6032						if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
6033							that._removeClass(selectee.$element, "ui-selecting");
6034							selectee.selecting = false;
6035							that._addClass(selectee.$element, "ui-selected");
6036							selectee.selected = true;
6037						} else {
6038							that._removeClass(selectee.$element, "ui-selecting");
6039							selectee.selecting = false;
6040							if (selectee.startselected) {
6041								that._addClass(selectee.$element, "ui-unselecting");
6042								selectee.unselecting = true;
6043							}
6044
6045							// selectable UNSELECTING callback
6046							that._trigger("unselecting", event, {
6047								unselecting: selectee.element
6048							});
6049						}
6050					}
6051					if (selectee.selected) {
6052						if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
6053							that._removeClass(selectee.$element, "ui-selected");
6054							selectee.selected = false;
6055
6056							that._addClass(selectee.$element, "ui-unselecting");
6057							selectee.unselecting = true;
6058
6059							// selectable UNSELECTING callback
6060							that._trigger("unselecting", event, {
6061								unselecting: selectee.element
6062							});
6063						}
6064					}
6065				}
6066			});
6067
6068			return false;
6069		},
6070
6071		_mouseStop: function (event) {
6072			var that = this;
6073
6074			this.dragged = false;
6075
6076			$(".ui-unselecting", this.element[0]).each(function () {
6077				var selectee = $.data(this, "selectable-item");
6078				that._removeClass(selectee.$element, "ui-unselecting");
6079				selectee.unselecting = false;
6080				selectee.startselected = false;
6081				that._trigger("unselected", event, {
6082					unselected: selectee.element
6083				});
6084			});
6085			$(".ui-selecting", this.element[0]).each(function () {
6086				var selectee = $.data(this, "selectable-item");
6087				that._removeClass(selectee.$element, "ui-selecting")
6088					._addClass(selectee.$element, "ui-selected");
6089				selectee.selecting = false;
6090				selectee.selected = true;
6091				selectee.startselected = true;
6092				that._trigger("selected", event, {
6093					selected: selectee.element
6094				});
6095			});
6096			this._trigger("stop", event);
6097
6098			this.helper.remove();
6099
6100			return false;
6101		}
6102
6103	});
6104
6105
6106	/*!
6107	 * jQuery UI Sortable 1.13.1
6108	 * http://jqueryui.com
6109	 *
6110	 * Copyright jQuery Foundation and other contributors
6111	 * Released under the MIT license.
6112	 * http://jquery.org/license
6113	 */
6114
6115	//>>label: Sortable
6116	//>>group: Interactions
6117	//>>description: Enables items in a list to be sorted using the mouse.
6118	//>>docs: http://api.jqueryui.com/sortable/
6119	//>>demos: http://jqueryui.com/sortable/
6120	//>>css.structure: ../../themes/base/sortable.css
6121
6122
6123	var widgetsSortable = $.widget("ui.sortable", $.ui.mouse, {
6124		version: "1.13.1",
6125		widgetEventPrefix: "sort",
6126		ready: false,
6127		options: {
6128			appendTo: "parent",
6129			axis: false,
6130			connectWith: false,
6131			containment: false,
6132			cursor: "auto",
6133			cursorAt: false,
6134			dropOnEmpty: true,
6135			forcePlaceholderSize: false,
6136			forceHelperSize: false,
6137			grid: false,
6138			handle: false,
6139			helper: "original",
6140			items: "> *",
6141			opacity: false,
6142			placeholder: false,
6143			revert: false,
6144			scroll: true,
6145			scrollSensitivity: 20,
6146			scrollSpeed: 20,
6147			scope: "default",
6148			tolerance: "intersect",
6149			zIndex: 1000,
6150
6151			// Callbacks
6152			activate: null,
6153			beforeStop: null,
6154			change: null,
6155			deactivate: null,
6156			out: null,
6157			over: null,
6158			receive: null,
6159			remove: null,
6160			sort: null,
6161			start: null,
6162			stop: null,
6163			update: null
6164		},
6165
6166		_isOverAxis: function (x, reference, size) {
6167			return (x >= reference) && (x < (reference + size));
6168		},
6169
6170		_isFloating: function (item) {
6171			return (/left|right/).test(item.css("float")) ||
6172				(/inline|table-cell/).test(item.css("display"));
6173		},
6174
6175		_create: function () {
6176			this.containerCache = {};
6177			this._addClass("ui-sortable");
6178
6179			//Get the items
6180			this.refresh();
6181
6182			//Let's determine the parent's offset
6183			this.offset = this.element.offset();
6184
6185			//Initialize mouse events for interaction
6186			this._mouseInit();
6187
6188			this._setHandleClassName();
6189
6190			//We're ready to go
6191			this.ready = true;
6192
6193		},
6194
6195		_setOption: function (key, value) {
6196			this._super(key, value);
6197
6198			if (key === "handle") {
6199				this._setHandleClassName();
6200			}
6201		},
6202
6203		_setHandleClassName: function () {
6204			var that = this;
6205			this._removeClass(this.element.find(".ui-sortable-handle"), "ui-sortable-handle");
6206			$.each(this.items, function () {
6207				that._addClass(
6208					this.instance.options.handle ?
6209						this.item.find(this.instance.options.handle) :
6210						this.item,
6211					"ui-sortable-handle"
6212				);
6213			});
6214		},
6215
6216		_destroy: function () {
6217			this._mouseDestroy();
6218
6219			for (var i = this.items.length - 1; i >= 0; i--) {
6220				this.items[i].item.removeData(this.widgetName + "-item");
6221			}
6222
6223			return this;
6224		},
6225
6226		_mouseCapture: function (event, overrideHandle) {
6227			var currentItem = null,
6228				validHandle = false,
6229				that = this;
6230
6231			if (this.reverting) {
6232				return false;
6233			}
6234
6235			if (this.options.disabled || this.options.type === "static") {
6236				return false;
6237			}
6238
6239			//We have to refresh the items data once first
6240			this._refreshItems(event);
6241
6242			//Find out if the clicked node (or one of its parents) is a actual item in this.items
6243			$(event.target).parents().each(function () {
6244				if ($.data(this, that.widgetName + "-item") === that) {
6245					currentItem = $(this);
6246					return false;
6247				}
6248			});
6249			if ($.data(event.target, that.widgetName + "-item") === that) {
6250				currentItem = $(event.target);
6251			}
6252
6253			if (!currentItem) {
6254				return false;
6255			}
6256			if (this.options.handle && !overrideHandle) {
6257				$(this.options.handle, currentItem).find("*").addBack().each(function () {
6258					if (this === event.target) {
6259						validHandle = true;
6260					}
6261				});
6262				if (!validHandle) {
6263					return false;
6264				}
6265			}
6266
6267			this.currentItem = currentItem;
6268			this._removeCurrentsFromItems();
vendor: 8,336 bytes, lines 6269-6540
6269			return true;
6270
6271		},
6272
6273		_mouseStart: function (event, overrideHandle, noActivation) {
6274
6275			var i, body,
6276				o = this.options;
6277
6278			this.currentContainer = this;
6279
6280			//We only need to call refreshPositions, because the refreshItems call has been moved to
6281			// mouseCapture
6282			this.refreshPositions();
6283
6284			//Prepare the dragged items parent
6285			this.appendTo = $(o.appendTo !== "parent" ?
6286				o.appendTo :
6287				this.currentItem.parent());
6288
6289			//Create and append the visible helper
6290			this.helper = this._createHelper(event);
6291
6292			//Cache the helper size
6293			this._cacheHelperProportions();
6294
6295			/*
6296			 * - Position generation -
6297			 * This block generates everything position related - it's the core of draggables.
6298			 */
6299
6300			//Cache the margins of the original element
6301			this._cacheMargins();
6302
6303			//The element's absolute position on the page minus margins
6304			this.offset = this.currentItem.offset();
6305			this.offset = {
6306				top: this.offset.top - this.margins.top,
6307				left: this.offset.left - this.margins.left
6308			};
6309
6310			$.extend(this.offset, {
6311				click: { //Where the click happened, relative to the element
6312					left: event.pageX - this.offset.left,
6313					top: event.pageY - this.offset.top
6314				},
6315
6316				// This is a relative to absolute position minus the actual position calculation -
6317				// only used for relative positioned helper
6318				relative: this._getRelativeOffset()
6319			});
6320
6321			// After we get the helper offset, but before we get the parent offset we can
6322			// change the helper's position to absolute
6323			// TODO: Still need to figure out a way to make relative sorting possible
6324			this.helper.css("position", "absolute");
6325			this.cssPosition = this.helper.css("position");
6326
6327			//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
6328			if (o.cursorAt) {
6329				this._adjustOffsetFromHelper(o.cursorAt);
6330			}
6331
6332			//Cache the former DOM position
6333			this.domPosition = {
6334				prev: this.currentItem.prev()[0],
6335				parent: this.currentItem.parent()[0]
6336			};
6337
6338			// If the helper is not the original, hide the original so it's not playing any role during
6339			// the drag, won't cause anything bad this way
6340			if (this.helper[0] !== this.currentItem[0]) {
6341				this.currentItem.hide();
6342			}
6343
6344			//Create the placeholder
6345			this._createPlaceholder();
6346
6347			//Get the next scrolling parent
6348			this.scrollParent = this.placeholder.scrollParent();
6349
6350			$.extend(this.offset, {
6351				parent: this._getParentOffset()
6352			});
6353
6354			//Set a containment if given in the options
6355			if (o.containment) {
6356				this._setContainment();
6357			}
6358
6359			if (o.cursor && o.cursor !== "auto") { // cursor option
6360				body = this.document.find("body");
6361
6362				// Support: IE
6363				this.storedCursor = body.css("cursor");
6364				body.css("cursor", o.cursor);
6365
6366				this.storedStylesheet =
6367					$("<style>*{ cursor: " + o.cursor + " !important; }</style>").appendTo(body);
6368			}
6369
6370			// We need to make sure to grab the zIndex before setting the
6371			// opacity, because setting the opacity to anything lower than 1
6372			// causes the zIndex to change from "auto" to 0.
6373			if (o.zIndex) { // zIndex option
6374				if (this.helper.css("zIndex")) {
6375					this._storedZIndex = this.helper.css("zIndex");
6376				}
6377				this.helper.css("zIndex", o.zIndex);
6378			}
6379
6380			if (o.opacity) { // opacity option
6381				if (this.helper.css("opacity")) {
6382					this._storedOpacity = this.helper.css("opacity");
6383				}
6384				this.helper.css("opacity", o.opacity);
6385			}
6386
6387			//Prepare scrolling
6388			if (this.scrollParent[0] !== this.document[0] &&
6389				this.scrollParent[0].tagName !== "HTML") {
6390				this.overflowOffset = this.scrollParent.offset();
6391			}
6392
6393			//Call callbacks
6394			this._trigger("start", event, this._uiHash());
6395
6396			//Recache the helper size
6397			if (!this._preserveHelperProportions) {
6398				this._cacheHelperProportions();
6399			}
6400
6401			//Post "activate" events to possible containers
6402			if (!noActivation) {
6403				for (i = this.containers.length - 1; i >= 0; i--) {
6404					this.containers[i]._trigger("activate", event, this._uiHash(this));
6405				}
6406			}
6407
6408			//Prepare possible droppables
6409			if ($.ui.ddmanager) {
6410				$.ui.ddmanager.current = this;
6411			}
6412
6413			if ($.ui.ddmanager && !o.dropBehaviour) {
6414				$.ui.ddmanager.prepareOffsets(this, event);
6415			}
6416
6417			this.dragging = true;
6418
6419			this._addClass(this.helper, "ui-sortable-helper");
6420
6421			//Move the helper, if needed
6422			if (!this.helper.parent().is(this.appendTo)) {
6423				this.helper.detach().appendTo(this.appendTo);
6424
6425				//Update position
6426				this.offset.parent = this._getParentOffset();
6427			}
6428
6429			//Generate the original position
6430			this.position = this.originalPosition = this._generatePosition(event);
6431			this.originalPageX = event.pageX;
6432			this.originalPageY = event.pageY;
6433			this.lastPositionAbs = this.positionAbs = this._convertPositionTo("absolute");
6434
6435			this._mouseDrag(event);
6436
6437			return true;
6438
6439		},
6440
6441		_scroll: function (event) {
6442			var o = this.options,
6443				scrolled = false;
6444
6445			if (this.scrollParent[0] !== this.document[0] &&
6446				this.scrollParent[0].tagName !== "HTML") {
6447
6448				if ((this.overflowOffset.top + this.scrollParent[0].offsetHeight) -
6449					event.pageY < o.scrollSensitivity) {
6450					this.scrollParent[0].scrollTop =
6451						scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
6452				} else if (event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
6453					this.scrollParent[0].scrollTop =
6454						scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
6455				}
6456
6457				if ((this.overflowOffset.left + this.scrollParent[0].offsetWidth) -
6458					event.pageX < o.scrollSensitivity) {
6459					this.scrollParent[0].scrollLeft = scrolled =
6460						this.scrollParent[0].scrollLeft + o.scrollSpeed;
6461				} else if (event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
6462					this.scrollParent[0].scrollLeft = scrolled =
6463						this.scrollParent[0].scrollLeft - o.scrollSpeed;
6464				}
6465
6466			} else {
6467
6468				if (event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
6469					scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
6470				} else if (this.window.height() - (event.pageY - this.document.scrollTop()) <
6471					o.scrollSensitivity) {
6472					scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
6473				}
6474
6475				if (event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
6476					scrolled = this.document.scrollLeft(
6477						this.document.scrollLeft() - o.scrollSpeed
6478					);
6479				} else if (this.window.width() - (event.pageX - this.document.scrollLeft()) <
6480					o.scrollSensitivity) {
6481					scrolled = this.document.scrollLeft(
6482						this.document.scrollLeft() + o.scrollSpeed
6483					);
6484				}
6485
6486			}
6487
6488			return scrolled;
6489		},
6490
6491		_mouseDrag: function (event) {
6492			var i, item, itemElement, intersection,
6493				o = this.options;
6494
6495			//Compute the helpers position
6496			this.position = this._generatePosition(event);
6497			this.positionAbs = this._convertPositionTo("absolute");
6498
6499			//Set the helper position
6500			if (!this.options.axis || this.options.axis !== "y") {
6501				this.helper[0].style.left = this.position.left + "px";
6502			}
6503			if (!this.options.axis || this.options.axis !== "x") {
6504				this.helper[0].style.top = this.position.top + "px";
6505			}
6506
6507			//Do scrolling
6508			if (o.scroll) {
6509				if (this._scroll(event) !== false) {
6510
6511					//Update item positions used in position checks
6512					this._refreshItemPositions(true);
6513
6514					if ($.ui.ddmanager && !o.dropBehaviour) {
6515						$.ui.ddmanager.prepareOffsets(this, event);
6516					}
6517				}
6518			}
6519
6520			this.dragDirection = {
6521				vertical: this._getDragVerticalDirection(),
6522				horizontal: this._getDragHorizontalDirection()
6523			};
6524
6525			//Rearrange
6526			for (i = this.items.length - 1; i >= 0; i--) {
6527
6528				//Cache variables and intersection, continue if no intersection
6529				item = this.items[i];
6530				itemElement = item.item[0];
6531				intersection = this._intersectsWithPointer(item);
6532				if (!intersection) {
6533					continue;
6534				}
6535
6536				// Only put the placeholder inside the current Container, skip all
6537				// items from other containers. This works because when moving
6538				// an item from one container to another the
6539				// currentContainer is switched before the placeholder is moved.
6540				//
vendor: 15,297 bytes, lines 6541-7051
6541				// Without this, moving items in "sub-sortables" can cause
6542				// the placeholder to jitter between the outer and inner container.
6543				if (item.instance !== this.currentContainer) {
6544					continue;
6545				}
6546
6547				// Cannot intersect with itself
6548				// no useless actions that have been done before
6549				// no action if the item moved is the parent of the item checked
6550				if (itemElement !== this.currentItem[0] &&
6551					this.placeholder[intersection === 1 ?
6552						"next" : "prev"]()[0] !== itemElement &&
6553					!$.contains(this.placeholder[0], itemElement) &&
6554					(this.options.type === "semi-dynamic" ?
6555						!$.contains(this.element[0], itemElement) :
6556						true
6557					)
6558				) {
6559
6560					this.direction = intersection === 1 ? "down" : "up";
6561
6562					if (this.options.tolerance === "pointer" ||
6563						this._intersectsWithSides(item)) {
6564						this._rearrange(event, item);
6565					} else {
6566						break;
6567					}
6568
6569					this._trigger("change", event, this._uiHash());
6570					break;
6571				}
6572			}
6573
6574			//Post events to containers
6575			this._contactContainers(event);
6576
6577			//Interconnect with droppables
6578			if ($.ui.ddmanager) {
6579				$.ui.ddmanager.drag(this, event);
6580			}
6581
6582			//Call callbacks
6583			this._trigger("sort", event, this._uiHash());
6584
6585			this.lastPositionAbs = this.positionAbs;
6586			return false;
6587
6588		},
6589
6590		_mouseStop: function (event, noPropagation) {
6591
6592			if (!event) {
6593				return;
6594			}
6595
6596			//If we are using droppables, inform the manager about the drop
6597			if ($.ui.ddmanager && !this.options.dropBehaviour) {
6598				$.ui.ddmanager.drop(this, event);
6599			}
6600
6601			if (this.options.revert) {
6602				var that = this,
6603					cur = this.placeholder.offset(),
6604					axis = this.options.axis,
6605					animation = {};
6606
6607				if (!axis || axis === "x") {
6608					animation.left = cur.left - this.offset.parent.left - this.margins.left +
6609						(this.offsetParent[0] === this.document[0].body ?
6610							0 :
6611							this.offsetParent[0].scrollLeft
6612						);
6613				}
6614				if (!axis || axis === "y") {
6615					animation.top = cur.top - this.offset.parent.top - this.margins.top +
6616						(this.offsetParent[0] === this.document[0].body ?
6617							0 :
6618							this.offsetParent[0].scrollTop
6619						);
6620				}
6621				this.reverting = true;
6622				$(this.helper).animate(
6623					animation,
6624					parseInt(this.options.revert, 10) || 500,
6625					function () {
6626						that._clear(event);
6627					}
6628				);
6629			} else {
6630				this._clear(event, noPropagation);
6631			}
6632
6633			return false;
6634
6635		},
6636
6637		cancel: function () {
6638
6639			if (this.dragging) {
6640
6641				this._mouseUp(new $.Event("mouseup", { target: null }));
6642
6643				if (this.options.helper === "original") {
6644					this.currentItem.css(this._storedCSS);
6645					this._removeClass(this.currentItem, "ui-sortable-helper");
6646				} else {
6647					this.currentItem.show();
6648				}
6649
6650				//Post deactivating events to containers
6651				for (var i = this.containers.length - 1; i >= 0; i--) {
6652					this.containers[i]._trigger("deactivate", null, this._uiHash(this));
6653					if (this.containers[i].containerCache.over) {
6654						this.containers[i]._trigger("out", null, this._uiHash(this));
6655						this.containers[i].containerCache.over = 0;
6656					}
6657				}
6658
6659			}
6660
6661			if (this.placeholder) {
6662
6663				//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
6664				// it unbinds ALL events from the original node!
6665				if (this.placeholder[0].parentNode) {
6666					this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
6667				}
6668				if (this.options.helper !== "original" && this.helper &&
6669					this.helper[0].parentNode) {
6670					this.helper.remove();
6671				}
6672
6673				$.extend(this, {
6674					helper: null,
6675					dragging: false,
6676					reverting: false,
6677					_noFinalSort: null
6678				});
6679
6680				if (this.domPosition.prev) {
6681					$(this.domPosition.prev).after(this.currentItem);
6682				} else {
6683					$(this.domPosition.parent).prepend(this.currentItem);
6684				}
6685			}
6686
6687			return this;
6688
6689		},
6690
6691		serialize: function (o) {
6692
6693			var items = this._getItemsAsjQuery(o && o.connected),
6694				str = [];
6695			o = o || {};
6696
6697			$(items).each(function () {
6698				var res = ($(o.item || this).attr(o.attribute || "id") || "")
6699					.match(o.expression || (/(.+)[\-=_](.+)/));
6700				if (res) {
6701					str.push(
6702						(o.key || res[1] + "[]") +
6703						"=" + (o.key && o.expression ? res[1] : res[2]));
6704				}
6705			});
6706
6707			if (!str.length && o.key) {
6708				str.push(o.key + "=");
6709			}
6710
6711			return str.join("&");
6712
6713		},
6714
6715		toArray: function (o) {
6716
6717			var items = this._getItemsAsjQuery(o && o.connected),
6718				ret = [];
6719
6720			o = o || {};
6721
6722			items.each(function () {
6723				ret.push($(o.item || this).attr(o.attribute || "id") || "");
6724			});
6725			return ret;
6726
6727		},
6728
6729		/* Be careful with the following core functions */
6730		_intersectsWith: function (item) {
6731
6732			var x1 = this.positionAbs.left,
6733				x2 = x1 + this.helperProportions.width,
6734				y1 = this.positionAbs.top,
6735				y2 = y1 + this.helperProportions.height,
6736				l = item.left,
6737				r = l + item.width,
6738				t = item.top,
6739				b = t + item.height,
6740				dyClick = this.offset.click.top,
6741				dxClick = this.offset.click.left,
6742				isOverElementHeight = (this.options.axis === "x") || ((y1 + dyClick) > t &&
6743					(y1 + dyClick) < b),
6744				isOverElementWidth = (this.options.axis === "y") || ((x1 + dxClick) > l &&
6745					(x1 + dxClick) < r),
6746				isOverElement = isOverElementHeight && isOverElementWidth;
6747
6748			if (this.options.tolerance === "pointer" ||
6749				this.options.forcePointerForContainers ||
6750				(this.options.tolerance !== "pointer" &&
6751					this.helperProportions[this.floating ? "width" : "height"] >
6752					item[this.floating ? "width" : "height"])
6753			) {
6754				return isOverElement;
6755			} else {
6756
6757				return (l < x1 + (this.helperProportions.width / 2) && // Right Half
6758					x2 - (this.helperProportions.width / 2) < r && // Left Half
6759					t < y1 + (this.helperProportions.height / 2) && // Bottom Half
6760					y2 - (this.helperProportions.height / 2) < b); // Top Half
6761
6762			}
6763		},
6764
6765		_intersectsWithPointer: function (item) {
6766			var verticalDirection, horizontalDirection,
6767				isOverElementHeight = (this.options.axis === "x") ||
6768					this._isOverAxis(
6769						this.positionAbs.top + this.offset.click.top, item.top, item.height),
6770				isOverElementWidth = (this.options.axis === "y") ||
6771					this._isOverAxis(
6772						this.positionAbs.left + this.offset.click.left, item.left, item.width),
6773				isOverElement = isOverElementHeight && isOverElementWidth;
6774
6775			if (!isOverElement) {
6776				return false;
6777			}
6778
6779			verticalDirection = this.dragDirection.vertical;
6780			horizontalDirection = this.dragDirection.horizontal;
6781
6782			return this.floating ?
6783				((horizontalDirection === "right" || verticalDirection === "down") ? 2 : 1) :
6784				(verticalDirection && (verticalDirection === "down" ? 2 : 1));
6785
6786		},
6787
6788		_intersectsWithSides: function (item) {
6789
6790			var isOverBottomHalf = this._isOverAxis(this.positionAbs.top +
6791				this.offset.click.top, item.top + (item.height / 2), item.height),
6792				isOverRightHalf = this._isOverAxis(this.positionAbs.left +
6793					this.offset.click.left, item.left + (item.width / 2), item.width),
6794				verticalDirection = this.dragDirection.vertical,
6795				horizontalDirection = this.dragDirection.horizontal;
6796
6797			if (this.floating && horizontalDirection) {
6798				return ((horizontalDirection === "right" && isOverRightHalf) ||
6799					(horizontalDirection === "left" && !isOverRightHalf));
6800			} else {
6801				return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) ||
6802					(verticalDirection === "up" && !isOverBottomHalf));
6803			}
6804
6805		},
6806
6807		_getDragVerticalDirection: function () {
6808			var delta = this.positionAbs.top - this.lastPositionAbs.top;
6809			return delta !== 0 && (delta > 0 ? "down" : "up");
6810		},
6811
6812		_getDragHorizontalDirection: function () {
6813			var delta = this.positionAbs.left - this.lastPositionAbs.left;
6814			return delta !== 0 && (delta > 0 ? "right" : "left");
6815		},
6816
6817		refresh: function (event) {
6818			this._refreshItems(event);
6819			this._setHandleClassName();
6820			this.refreshPositions();
6821			return this;
6822		},
6823
6824		_connectWith: function () {
6825			var options = this.options;
6826			return options.connectWith.constructor === String ?
6827				[options.connectWith] :
6828				options.connectWith;
6829		},
6830
6831		_getItemsAsjQuery: function (connected) {
6832
6833			var i, j, cur, inst,
6834				items = [],
6835				queries = [],
6836				connectWith = this._connectWith();
6837
6838			if (connectWith && connected) {
6839				for (i = connectWith.length - 1; i >= 0; i--) {
6840					cur = $(connectWith[i], this.document[0]);
6841					for (j = cur.length - 1; j >= 0; j--) {
6842						inst = $.data(cur[j], this.widgetFullName);
6843						if (inst && inst !== this && !inst.options.disabled) {
6844							queries.push([typeof inst.options.items === "function" ?
6845								inst.options.items.call(inst.element) :
6846								$(inst.options.items, inst.element)
6847									.not(".ui-sortable-helper")
6848									.not(".ui-sortable-placeholder"), inst]);
6849						}
6850					}
6851				}
6852			}
6853
6854			queries.push([typeof this.options.items === "function" ?
6855				this.options.items
6856					.call(this.element, null, { options: this.options, item: this.currentItem }) :
6857				$(this.options.items, this.element)
6858					.not(".ui-sortable-helper")
6859					.not(".ui-sortable-placeholder"), this]);
6860
6861			function addItems() {
6862				items.push(this);
6863			}
6864			for (i = queries.length - 1; i >= 0; i--) {
6865				queries[i][0].each(addItems);
6866			}
6867
6868			return $(items);
6869
6870		},
6871
6872		_removeCurrentsFromItems: function () {
6873
6874			var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
6875
6876			this.items = $.grep(this.items, function (item) {
6877				for (var j = 0; j < list.length; j++) {
6878					if (list[j] === item.item[0]) {
6879						return false;
6880					}
6881				}
6882				return true;
6883			});
6884
6885		},
6886
6887		_refreshItems: function (event) {
6888
6889			this.items = [];
6890			this.containers = [this];
6891
6892			var i, j, cur, inst, targetData, _queries, item, queriesLength,
6893				items = this.items,
6894				queries = [[typeof this.options.items === "function" ?
6895					this.options.items.call(this.element[0], event, { item: this.currentItem }) :
6896					$(this.options.items, this.element), this]],
6897				connectWith = this._connectWith();
6898
6899			//Shouldn't be run the first time through due to massive slow-down
6900			if (connectWith && this.ready) {
6901				for (i = connectWith.length - 1; i >= 0; i--) {
6902					cur = $(connectWith[i], this.document[0]);
6903					for (j = cur.length - 1; j >= 0; j--) {
6904						inst = $.data(cur[j], this.widgetFullName);
6905						if (inst && inst !== this && !inst.options.disabled) {
6906							queries.push([typeof inst.options.items === "function" ?
6907								inst.options.items
6908									.call(inst.element[0], event, { item: this.currentItem }) :
6909								$(inst.options.items, inst.element), inst]);
6910							this.containers.push(inst);
6911						}
6912					}
6913				}
6914			}
6915
6916			for (i = queries.length - 1; i >= 0; i--) {
6917				targetData = queries[i][1];
6918				_queries = queries[i][0];
6919
6920				for (j = 0, queriesLength = _queries.length; j < queriesLength; j++) {
6921					item = $(_queries[j]);
6922
6923					// Data for target checking (mouse manager)
6924					item.data(this.widgetName + "-item", targetData);
6925
6926					items.push({
6927						item: item,
6928						instance: targetData,
6929						width: 0, height: 0,
6930						left: 0, top: 0
6931					});
6932				}
6933			}
6934
6935		},
6936
6937		_refreshItemPositions: function (fast) {
6938			var i, item, t, p;
6939
6940			for (i = this.items.length - 1; i >= 0; i--) {
6941				item = this.items[i];
6942
6943				//We ignore calculating positions of all connected containers when we're not over them
6944				if (this.currentContainer && item.instance !== this.currentContainer &&
6945					item.item[0] !== this.currentItem[0]) {
6946					continue;
6947				}
6948
6949				t = this.options.toleranceElement ?
6950					$(this.options.toleranceElement, item.item) :
6951					item.item;
6952
6953				if (!fast) {
6954					item.width = t.outerWidth();
6955					item.height = t.outerHeight();
6956				}
6957
6958				p = t.offset();
6959				item.left = p.left;
6960				item.top = p.top;
6961			}
6962		},
6963
6964		refreshPositions: function (fast) {
6965
6966			// Determine whether items are being displayed horizontally
6967			this.floating = this.items.length ?
6968				this.options.axis === "x" || this._isFloating(this.items[0].item) :
6969				false;
6970
6971			// This has to be redone because due to the item being moved out/into the offsetParent,
6972			// the offsetParent's position will change
6973			if (this.offsetParent && this.helper) {
6974				this.offset.parent = this._getParentOffset();
6975			}
6976
6977			this._refreshItemPositions(fast);
6978
6979			var i, p;
6980
6981			if (this.options.custom && this.options.custom.refreshContainers) {
6982				this.options.custom.refreshContainers.call(this);
6983			} else {
6984				for (i = this.containers.length - 1; i >= 0; i--) {
6985					p = this.containers[i].element.offset();
6986					this.containers[i].containerCache.left = p.left;
6987					this.containers[i].containerCache.top = p.top;
6988					this.containers[i].containerCache.width =
6989						this.containers[i].element.outerWidth();
6990					this.containers[i].containerCache.height =
6991						this.containers[i].element.outerHeight();
6992				}
6993			}
6994
6995			return this;
6996		},
6997
6998		_createPlaceholder: function (that) {
6999			that = that || this;
7000			var className, nodeName,
7001				o = that.options;
7002
7003			if (!o.placeholder || o.placeholder.constructor === String) {
7004				className = o.placeholder;
7005				nodeName = that.currentItem[0].nodeName.toLowerCase();
7006				o.placeholder = {
7007					element: function () {
7008
7009						var element = $("<" + nodeName + ">", that.document[0]);
7010
7011						that._addClass(element, "ui-sortable-placeholder",
7012							className || that.currentItem[0].className)
7013							._removeClass(element, "ui-sortable-helper");
7014
7015						if (nodeName === "tbody") {
7016							that._createTrPlaceholder(
7017								that.currentItem.find("tr").eq(0),
7018								$("<tr>", that.document[0]).appendTo(element)
7019							);
7020						} else if (nodeName === "tr") {
7021							that._createTrPlaceholder(that.currentItem, element);
7022						} else if (nodeName === "img") {
7023							element.attr("src", that.currentItem.attr("src"));
7024						}
7025
7026						if (!className) {
7027							element.css("visibility", "hidden");
7028						}
7029
7030						return element;
7031					},
7032					update: function (container, p) {
7033
7034						// 1. If a className is set as 'placeholder option, we don't force sizes -
7035						// the class is responsible for that
7036						// 2. The option 'forcePlaceholderSize can be enabled to force it even if a
7037						// class name is specified
7038						if (className && !o.forcePlaceholderSize) {
7039							return;
7040						}
7041
7042						// If the element doesn't have a actual height or width by itself (without
7043						// styles coming from a stylesheet), it receives the inline height and width
7044						// from the dragged item. Or, if it's a tbody or tr, it's going to have a height
7045						// anyway since we're populating them with <td>s above, but they're unlikely to
7046						// be the correct height on their own if the row heights are dynamic, so we'll
7047						// always assign the height of the dragged item given forcePlaceholderSize
7048						// is true.
7049						if (!p.height() || (o.forcePlaceholderSize &&
7050							(nodeName === "tbody" || nodeName === "tr"))) {
7051							p.height(
vendor: 12,083 bytes, lines 7052-7411
7052								that.currentItem.innerHeight() -
7053								parseInt(that.currentItem.css("paddingTop") || 0, 10) -
7054								parseInt(that.currentItem.css("paddingBottom") || 0, 10));
7055						}
7056						if (!p.width()) {
7057							p.width(
7058								that.currentItem.innerWidth() -
7059								parseInt(that.currentItem.css("paddingLeft") || 0, 10) -
7060								parseInt(that.currentItem.css("paddingRight") || 0, 10));
7061						}
7062					}
7063				};
7064			}
7065
7066			//Create the placeholder
7067			that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
7068
7069			//Append it after the actual current item
7070			that.currentItem.after(that.placeholder);
7071
7072			//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
7073			o.placeholder.update(that, that.placeholder);
7074
7075		},
7076
7077		_createTrPlaceholder: function (sourceTr, targetTr) {
7078			var that = this;
7079
7080			sourceTr.children().each(function () {
7081				$("<td>&#160;</td>", that.document[0])
7082					.attr("colspan", $(this).attr("colspan") || 1)
7083					.appendTo(targetTr);
7084			});
7085		},
7086
7087		_contactContainers: function (event) {
7088			var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
7089				floating, axis,
7090				innermostContainer = null,
7091				innermostIndex = null;
7092
7093			// Get innermost container that intersects with item
7094			for (i = this.containers.length - 1; i >= 0; i--) {
7095
7096				// Never consider a container that's located within the item itself
7097				if ($.contains(this.currentItem[0], this.containers[i].element[0])) {
7098					continue;
7099				}
7100
7101				if (this._intersectsWith(this.containers[i].containerCache)) {
7102
7103					// If we've already found a container and it's more "inner" than this, then continue
7104					if (innermostContainer &&
7105						$.contains(
7106							this.containers[i].element[0],
7107							innermostContainer.element[0])) {
7108						continue;
7109					}
7110
7111					innermostContainer = this.containers[i];
7112					innermostIndex = i;
7113
7114				} else {
7115
7116					// container doesn't intersect. trigger "out" event if necessary
7117					if (this.containers[i].containerCache.over) {
7118						this.containers[i]._trigger("out", event, this._uiHash(this));
7119						this.containers[i].containerCache.over = 0;
7120					}
7121				}
7122
7123			}
7124
7125			// If no intersecting containers found, return
7126			if (!innermostContainer) {
7127				return;
7128			}
7129
7130			// Move the item into the container if it's not there already
7131			if (this.containers.length === 1) {
7132				if (!this.containers[innermostIndex].containerCache.over) {
7133					this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
7134					this.containers[innermostIndex].containerCache.over = 1;
7135				}
7136			} else {
7137
7138				// When entering a new container, we will find the item with the least distance and
7139				// append our item near it
7140				dist = 10000;
7141				itemWithLeastDistance = null;
7142				floating = innermostContainer.floating || this._isFloating(this.currentItem);
7143				posProperty = floating ? "left" : "top";
7144				sizeProperty = floating ? "width" : "height";
7145				axis = floating ? "pageX" : "pageY";
7146
7147				for (j = this.items.length - 1; j >= 0; j--) {
7148					if (!$.contains(
7149						this.containers[innermostIndex].element[0], this.items[j].item[0])
7150					) {
7151						continue;
7152					}
7153					if (this.items[j].item[0] === this.currentItem[0]) {
7154						continue;
7155					}
7156
7157					cur = this.items[j].item.offset()[posProperty];
7158					nearBottom = false;
7159					if (event[axis] - cur > this.items[j][sizeProperty] / 2) {
7160						nearBottom = true;
7161					}
7162
7163					if (Math.abs(event[axis] - cur) < dist) {
7164						dist = Math.abs(event[axis] - cur);
7165						itemWithLeastDistance = this.items[j];
7166						this.direction = nearBottom ? "up" : "down";
7167					}
7168				}
7169
7170				//Check if dropOnEmpty is enabled
7171				if (!itemWithLeastDistance && !this.options.dropOnEmpty) {
7172					return;
7173				}
7174
7175				if (this.currentContainer === this.containers[innermostIndex]) {
7176					if (!this.currentContainer.containerCache.over) {
7177						this.containers[innermostIndex]._trigger("over", event, this._uiHash());
7178						this.currentContainer.containerCache.over = 1;
7179					}
7180					return;
7181				}
7182
7183				if (itemWithLeastDistance) {
7184					this._rearrange(event, itemWithLeastDistance, null, true);
7185				} else {
7186					this._rearrange(event, null, this.containers[innermostIndex].element, true);
7187				}
7188				this._trigger("change", event, this._uiHash());
7189				this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
7190				this.currentContainer = this.containers[innermostIndex];
7191
7192				//Update the placeholder
7193				this.options.placeholder.update(this.currentContainer, this.placeholder);
7194
7195				//Update scrollParent
7196				this.scrollParent = this.placeholder.scrollParent();
7197
7198				//Update overflowOffset
7199				if (this.scrollParent[0] !== this.document[0] &&
7200					this.scrollParent[0].tagName !== "HTML") {
7201					this.overflowOffset = this.scrollParent.offset();
7202				}
7203
7204				this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
7205				this.containers[innermostIndex].containerCache.over = 1;
7206			}
7207
7208		},
7209
7210		_createHelper: function (event) {
7211
7212			var o = this.options,
7213				helper = typeof o.helper === "function" ?
7214					$(o.helper.apply(this.element[0], [event, this.currentItem])) :
7215					(o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
7216
7217			//Add the helper to the DOM if that didn't happen already
7218			if (!helper.parents("body").length) {
7219				this.appendTo[0].appendChild(helper[0]);
7220			}
7221
7222			if (helper[0] === this.currentItem[0]) {
7223				this._storedCSS = {
7224					width: this.currentItem[0].style.width,
7225					height: this.currentItem[0].style.height,
7226					position: this.currentItem.css("position"),
7227					top: this.currentItem.css("top"),
7228					left: this.currentItem.css("left")
7229				};
7230			}
7231
7232			if (!helper[0].style.width || o.forceHelperSize) {
7233				helper.width(this.currentItem.width());
7234			}
7235			if (!helper[0].style.height || o.forceHelperSize) {
7236				helper.height(this.currentItem.height());
7237			}
7238
7239			return helper;
7240
7241		},
7242
7243		_adjustOffsetFromHelper: function (obj) {
7244			if (typeof obj === "string") {
7245				obj = obj.split(" ");
7246			}
7247			if (Array.isArray(obj)) {
7248				obj = { left: +obj[0], top: +obj[1] || 0 };
7249			}
7250			if ("left" in obj) {
7251				this.offset.click.left = obj.left + this.margins.left;
7252			}
7253			if ("right" in obj) {
7254				this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
7255			}
7256			if ("top" in obj) {
7257				this.offset.click.top = obj.top + this.margins.top;
7258			}
7259			if ("bottom" in obj) {
7260				this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
7261			}
7262		},
7263
7264		_getParentOffset: function () {
7265
7266			//Get the offsetParent and cache its position
7267			this.offsetParent = this.helper.offsetParent();
7268			var po = this.offsetParent.offset();
7269
7270			// This is a special case where we need to modify a offset calculated on start, since the
7271			// following happened:
7272			// 1. The position of the helper is absolute, so it's position is calculated based on the
7273			// next positioned parent
7274			// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
7275			// the document, which means that the scroll is included in the initial calculation of the
7276			// offset of the parent, and never recalculated upon drag
7277			if (this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] &&
7278				$.contains(this.scrollParent[0], this.offsetParent[0])) {
7279				po.left += this.scrollParent.scrollLeft();
7280				po.top += this.scrollParent.scrollTop();
7281			}
7282
7283			// This needs to be actually done for all browsers, since pageX/pageY includes this
7284			// information with an ugly IE fix
7285			if (this.offsetParent[0] === this.document[0].body ||
7286				(this.offsetParent[0].tagName &&
7287					this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
7288				po = { top: 0, left: 0 };
7289			}
7290
7291			return {
7292				top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
7293				left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
7294			};
7295
7296		},
7297
7298		_getRelativeOffset: function () {
7299
7300			if (this.cssPosition === "relative") {
7301				var p = this.currentItem.position();
7302				return {
7303					top: p.top - (parseInt(this.helper.css("top"), 10) || 0) +
7304						this.scrollParent.scrollTop(),
7305					left: p.left - (parseInt(this.helper.css("left"), 10) || 0) +
7306						this.scrollParent.scrollLeft()
7307				};
7308			} else {
7309				return { top: 0, left: 0 };
7310			}
7311
7312		},
7313
7314		_cacheMargins: function () {
7315			this.margins = {
7316				left: (parseInt(this.currentItem.css("marginLeft"), 10) || 0),
7317				top: (parseInt(this.currentItem.css("marginTop"), 10) || 0)
7318			};
7319		},
7320
7321		_cacheHelperProportions: function () {
7322			this.helperProportions = {
7323				width: this.helper.outerWidth(),
7324				height: this.helper.outerHeight()
7325			};
7326		},
7327
7328		_setContainment: function () {
7329
7330			var ce, co, over,
7331				o = this.options;
7332			if (o.containment === "parent") {
7333				o.containment = this.helper[0].parentNode;
7334			}
7335			if (o.containment === "document" || o.containment === "window") {
7336				this.containment = [
7337					0 - this.offset.relative.left - this.offset.parent.left,
7338					0 - this.offset.relative.top - this.offset.parent.top,
7339					o.containment === "document" ?
7340						this.document.width() :
7341						this.window.width() - this.helperProportions.width - this.margins.left,
7342					(o.containment === "document" ?
7343						(this.document.height() || document.body.parentNode.scrollHeight) :
7344						this.window.height() || this.document[0].body.parentNode.scrollHeight
7345					) - this.helperProportions.height - this.margins.top
7346				];
7347			}
7348
7349			if (!(/^(document|window|parent)$/).test(o.containment)) {
7350				ce = $(o.containment)[0];
7351				co = $(o.containment).offset();
7352				over = ($(ce).css("overflow") !== "hidden");
7353
7354				this.containment = [
7355					co.left + (parseInt($(ce).css("borderLeftWidth"), 10) || 0) +
7356					(parseInt($(ce).css("paddingLeft"), 10) || 0) - this.margins.left,
7357					co.top + (parseInt($(ce).css("borderTopWidth"), 10) || 0) +
7358					(parseInt($(ce).css("paddingTop"), 10) || 0) - this.margins.top,
7359					co.left + (over ? Math.max(ce.scrollWidth, ce.offsetWidth) : ce.offsetWidth) -
7360					(parseInt($(ce).css("borderLeftWidth"), 10) || 0) -
7361					(parseInt($(ce).css("paddingRight"), 10) || 0) -
7362					this.helperProportions.width - this.margins.left,
7363					co.top + (over ? Math.max(ce.scrollHeight, ce.offsetHeight) : ce.offsetHeight) -
7364					(parseInt($(ce).css("borderTopWidth"), 10) || 0) -
7365					(parseInt($(ce).css("paddingBottom"), 10) || 0) -
7366					this.helperProportions.height - this.margins.top
7367				];
7368			}
7369
7370		},
7371
7372		_convertPositionTo: function (d, pos) {
7373
7374			if (!pos) {
7375				pos = this.position;
7376			}
7377			var mod = d === "absolute" ? 1 : -1,
7378				scroll = this.cssPosition === "absolute" &&
7379					!(this.scrollParent[0] !== this.document[0] &&
7380						$.contains(this.scrollParent[0], this.offsetParent[0])) ?
7381					this.offsetParent :
7382					this.scrollParent,
7383				scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
7384
7385			return {
7386				top: (
7387
7388					// The absolute mouse position
7389					pos.top +
7390
7391					// Only for relative positioned nodes: Relative offset from element to offset parent
7392					this.offset.relative.top * mod +
7393
7394					// The offsetParent's offset without borders (offset + border)
7395					this.offset.parent.top * mod -
7396					((this.cssPosition === "fixed" ?
7397						-this.scrollParent.scrollTop() :
7398						(scrollIsRootNode ? 0 : scroll.scrollTop())) * mod)
7399				),
7400				left: (
7401
7402					// The absolute mouse position
7403					pos.left +
7404
7405					// Only for relative positioned nodes: Relative offset from element to offset parent
7406					this.offset.relative.left * mod +
7407
7408					// The offsetParent's offset without borders (offset + border)
7409					this.offset.parent.left * mod -
7410					((this.cssPosition === "fixed" ?
7411						-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
vendor: 4,583 bytes, lines 7412-7546
7412							scroll.scrollLeft()) * mod)
7413				)
7414			};
7415
7416		},
7417
7418		_generatePosition: function (event) {
7419
7420			var top, left,
7421				o = this.options,
7422				pageX = event.pageX,
7423				pageY = event.pageY,
7424				scroll = this.cssPosition === "absolute" &&
7425					!(this.scrollParent[0] !== this.document[0] &&
7426						$.contains(this.scrollParent[0], this.offsetParent[0])) ?
7427					this.offsetParent :
7428					this.scrollParent,
7429				scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
7430
7431			// This is another very weird special case that only happens for relative elements:
7432			// 1. If the css position is relative
7433			// 2. and the scroll parent is the document or similar to the offset parent
7434			// we have to refresh the relative offset during the scroll so there are no jumps
7435			if (this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] &&
7436				this.scrollParent[0] !== this.offsetParent[0])) {
7437				this.offset.relative = this._getRelativeOffset();
7438			}
7439
7440			/*
7441			 * - Position constraining -
7442			 * Constrain the position to a mix of grid, containment.
7443			 */
7444
7445			if (this.originalPosition) { //If we are not dragging yet, we won't check for options
7446
7447				if (this.containment) {
7448					if (event.pageX - this.offset.click.left < this.containment[0]) {
7449						pageX = this.containment[0] + this.offset.click.left;
7450					}
7451					if (event.pageY - this.offset.click.top < this.containment[1]) {
7452						pageY = this.containment[1] + this.offset.click.top;
7453					}
7454					if (event.pageX - this.offset.click.left > this.containment[2]) {
7455						pageX = this.containment[2] + this.offset.click.left;
7456					}
7457					if (event.pageY - this.offset.click.top > this.containment[3]) {
7458						pageY = this.containment[3] + this.offset.click.top;
7459					}
7460				}
7461
7462				if (o.grid) {
7463					top = this.originalPageY + Math.round((pageY - this.originalPageY) /
7464						o.grid[1]) * o.grid[1];
7465					pageY = this.containment ?
7466						((top - this.offset.click.top >= this.containment[1] &&
7467							top - this.offset.click.top <= this.containment[3]) ?
7468							top :
7469							((top - this.offset.click.top >= this.containment[1]) ?
7470								top - o.grid[1] : top + o.grid[1])) :
7471						top;
7472
7473					left = this.originalPageX + Math.round((pageX - this.originalPageX) /
7474						o.grid[0]) * o.grid[0];
7475					pageX = this.containment ?
7476						((left - this.offset.click.left >= this.containment[0] &&
7477							left - this.offset.click.left <= this.containment[2]) ?
7478							left :
7479							((left - this.offset.click.left >= this.containment[0]) ?
7480								left - o.grid[0] : left + o.grid[0])) :
7481						left;
7482				}
7483
7484			}
7485
7486			return {
7487				top: (
7488
7489					// The absolute mouse position
7490					pageY -
7491
7492					// Click offset (relative to the element)
7493					this.offset.click.top -
7494
7495					// Only for relative positioned nodes: Relative offset from element to offset parent
7496					this.offset.relative.top -
7497
7498					// The offsetParent's offset without borders (offset + border)
7499					this.offset.parent.top +
7500					((this.cssPosition === "fixed" ?
7501						-this.scrollParent.scrollTop() :
7502						(scrollIsRootNode ? 0 : scroll.scrollTop())))
7503				),
7504				left: (
7505
7506					// The absolute mouse position
7507					pageX -
7508
7509					// Click offset (relative to the element)
7510					this.offset.click.left -
7511
7512					// Only for relative positioned nodes: Relative offset from element to offset parent
7513					this.offset.relative.left -
7514
7515					// The offsetParent's offset without borders (offset + border)
7516					this.offset.parent.left +
7517					((this.cssPosition === "fixed" ?
7518						-this.scrollParent.scrollLeft() :
7519						scrollIsRootNode ? 0 : scroll.scrollLeft()))
7520				)
7521			};
7522
7523		},
7524
7525		_rearrange: function (event, i, a, hardRefresh) {
7526
7527			if (a) {
7528				a[0].appendChild(this.placeholder[0]);
7529			} else {
7530				i.item[0].parentNode.insertBefore(this.placeholder[0],
7531					(this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
7532			}
7533
7534			//Various things done here to improve the performance:
7535			// 1. we create a setTimeout, that calls refreshPositions
7536			// 2. on the instance, we have a counter variable, that get's higher after every append
7537			// 3. on the local scope, we copy the counter variable, and check in the timeout,
7538			// if it's still the same
7539			// 4. this lets only the last addition to the timeout stack through
7540			this.counter = this.counter ? ++this.counter : 1;
7541			var counter = this.counter;
7542
7543			this._delay(function () {
7544				if (counter === this.counter) {
7545
7546					//Precompute after each DOM insertion, NOT on mousemove
vendor: 13,431 bytes, lines 7547-8033
7547					this.refreshPositions(!hardRefresh);
7548				}
7549			});
7550
7551		},
7552
7553		_clear: function (event, noPropagation) {
7554
7555			this.reverting = false;
7556
7557			// We delay all events that have to be triggered to after the point where the placeholder
7558			// has been removed and everything else normalized again
7559			var i,
7560				delayedTriggers = [];
7561
7562			// We first have to update the dom position of the actual currentItem
7563			// Note: don't do it if the current item is already removed (by a user), or it gets
7564			// reappended (see #4088)
7565			if (!this._noFinalSort && this.currentItem.parent().length) {
7566				this.placeholder.before(this.currentItem);
7567			}
7568			this._noFinalSort = null;
7569
7570			if (this.helper[0] === this.currentItem[0]) {
7571				for (i in this._storedCSS) {
7572					if (this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
7573						this._storedCSS[i] = "";
7574					}
7575				}
7576				this.currentItem.css(this._storedCSS);
7577				this._removeClass(this.currentItem, "ui-sortable-helper");
7578			} else {
7579				this.currentItem.show();
7580			}
7581
7582			if (this.fromOutside && !noPropagation) {
7583				delayedTriggers.push(function (event) {
7584					this._trigger("receive", event, this._uiHash(this.fromOutside));
7585				});
7586			}
7587			if ((this.fromOutside ||
7588				this.domPosition.prev !==
7589				this.currentItem.prev().not(".ui-sortable-helper")[0] ||
7590				this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
7591
7592				// Trigger update callback if the DOM position has changed
7593				delayedTriggers.push(function (event) {
7594					this._trigger("update", event, this._uiHash());
7595				});
7596			}
7597
7598			// Check if the items Container has Changed and trigger appropriate
7599			// events.
7600			if (this !== this.currentContainer) {
7601				if (!noPropagation) {
7602					delayedTriggers.push(function (event) {
7603						this._trigger("remove", event, this._uiHash());
7604					});
7605					delayedTriggers.push((function (c) {
7606						return function (event) {
7607							c._trigger("receive", event, this._uiHash(this));
7608						};
7609					}).call(this, this.currentContainer));
7610					delayedTriggers.push((function (c) {
7611						return function (event) {
7612							c._trigger("update", event, this._uiHash(this));
7613						};
7614					}).call(this, this.currentContainer));
7615				}
7616			}
7617
7618			//Post events to containers
7619			function delayEvent(type, instance, container) {
7620				return function (event) {
7621					container._trigger(type, event, instance._uiHash(instance));
7622				};
7623			}
7624			for (i = this.containers.length - 1; i >= 0; i--) {
7625				if (!noPropagation) {
7626					delayedTriggers.push(delayEvent("deactivate", this, this.containers[i]));
7627				}
7628				if (this.containers[i].containerCache.over) {
7629					delayedTriggers.push(delayEvent("out", this, this.containers[i]));
7630					this.containers[i].containerCache.over = 0;
7631				}
7632			}
7633
7634			//Do what was originally in plugins
7635			if (this.storedCursor) {
7636				this.document.find("body").css("cursor", this.storedCursor);
7637				this.storedStylesheet.remove();
7638			}
7639			if (this._storedOpacity) {
7640				this.helper.css("opacity", this._storedOpacity);
7641			}
7642			if (this._storedZIndex) {
7643				this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
7644			}
7645
7646			this.dragging = false;
7647
7648			if (!noPropagation) {
7649				this._trigger("beforeStop", event, this._uiHash());
7650			}
7651
7652			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
7653			// it unbinds ALL events from the original node!
7654			this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
7655
7656			if (!this.cancelHelperRemoval) {
7657				if (this.helper[0] !== this.currentItem[0]) {
7658					this.helper.remove();
7659				}
7660				this.helper = null;
7661			}
7662
7663			if (!noPropagation) {
7664				for (i = 0; i < delayedTriggers.length; i++) {
7665
7666					// Trigger all delayed events
7667					delayedTriggers[i].call(this, event);
7668				}
7669				this._trigger("stop", event, this._uiHash());
7670			}
7671
7672			this.fromOutside = false;
7673			return !this.cancelHelperRemoval;
7674
7675		},
7676
7677		_trigger: function () {
7678			if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
7679				this.cancel();
7680			}
7681		},
7682
7683		_uiHash: function (_inst) {
7684			var inst = _inst || this;
7685			return {
7686				helper: inst.helper,
7687				placeholder: inst.placeholder || $([]),
7688				position: inst.position,
7689				originalPosition: inst.originalPosition,
7690				offset: inst.positionAbs,
7691				item: inst.currentItem,
7692				sender: _inst ? _inst.element : null
7693			};
7694		}
7695
7696	});
7697
7698
7699	/*!
7700	 * jQuery UI Accordion 1.13.1
7701	 * http://jqueryui.com
7702	 *
7703	 * Copyright jQuery Foundation and other contributors
7704	 * Released under the MIT license.
7705	 * http://jquery.org/license
7706	 */
7707
7708	//>>label: Accordion
7709	//>>group: Widgets
7710	/* eslint-disable max-len */
7711	//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
7712	/* eslint-enable max-len */
7713	//>>docs: http://api.jqueryui.com/accordion/
7714	//>>demos: http://jqueryui.com/accordion/
7715	//>>css.structure: ../../themes/base/core.css
7716	//>>css.structure: ../../themes/base/accordion.css
7717	//>>css.theme: ../../themes/base/theme.css
7718
7719
7720	var widgetsAccordion = $.widget("ui.accordion", {
7721		version: "1.13.1",
7722		options: {
7723			active: 0,
7724			animate: {},
7725			classes: {
7726				"ui-accordion-header": "ui-corner-top",
7727				"ui-accordion-header-collapsed": "ui-corner-all",
7728				"ui-accordion-content": "ui-corner-bottom"
7729			},
7730			collapsible: false,
7731			event: "click",
7732			header: function (elem) {
7733				return elem.find("> li > :first-child").add(elem.find("> :not(li)").even());
7734			},
7735			heightStyle: "auto",
7736			icons: {
7737				activeHeader: "ui-icon-triangle-1-s",
7738				header: "ui-icon-triangle-1-e"
7739			},
7740
7741			// Callbacks
7742			activate: null,
7743			beforeActivate: null
7744		},
7745
7746		hideProps: {
7747			borderTopWidth: "hide",
7748			borderBottomWidth: "hide",
7749			paddingTop: "hide",
7750			paddingBottom: "hide",
7751			height: "hide"
7752		},
7753
7754		showProps: {
7755			borderTopWidth: "show",
7756			borderBottomWidth: "show",
7757			paddingTop: "show",
7758			paddingBottom: "show",
7759			height: "show"
7760		},
7761
7762		_create: function () {
7763			var options = this.options;
7764
7765			this.prevShow = this.prevHide = $();
7766			this._addClass("ui-accordion", "ui-widget ui-helper-reset");
7767			this.element.attr("role", "tablist");
7768
7769			// Don't allow collapsible: false and active: false / null
7770			if (!options.collapsible && (options.active === false || options.active == null)) {
7771				options.active = 0;
7772			}
7773
7774			this._processPanels();
7775
7776			// handle negative values
7777			if (options.active < 0) {
7778				options.active += this.headers.length;
7779			}
7780			this._refresh();
7781		},
7782
7783		_getCreateEventData: function () {
7784			return {
7785				header: this.active,
7786				panel: !this.active.length ? $() : this.active.next()
7787			};
7788		},
7789
7790		_createIcons: function () {
7791			var icon, children,
7792				icons = this.options.icons;
7793
7794			if (icons) {
7795				icon = $("<span>");
7796				this._addClass(icon, "ui-accordion-header-icon", "ui-icon " + icons.header);
7797				icon.prependTo(this.headers);
7798				children = this.active.children(".ui-accordion-header-icon");
7799				this._removeClass(children, icons.header)
7800					._addClass(children, null, icons.activeHeader)
7801					._addClass(this.headers, "ui-accordion-icons");
7802			}
7803		},
7804
7805		_destroyIcons: function () {
7806			this._removeClass(this.headers, "ui-accordion-icons");
7807			this.headers.children(".ui-accordion-header-icon").remove();
7808		},
7809
7810		_destroy: function () {
7811			var contents;
7812
7813			// Clean up main element
7814			this.element.removeAttr("role");
7815
7816			// Clean up headers
7817			this.headers
7818				.removeAttr("role aria-expanded aria-selected aria-controls tabIndex")
7819				.removeUniqueId();
7820
7821			this._destroyIcons();
7822
7823			// Clean up content panels
7824			contents = this.headers.next()
7825				.css("display", "")
7826				.removeAttr("role aria-hidden aria-labelledby")
7827				.removeUniqueId();
7828
7829			if (this.options.heightStyle !== "content") {
7830				contents.css("height", "");
7831			}
7832		},
7833
7834		_setOption: function (key, value) {
7835			if (key === "active") {
7836
7837				// _activate() will handle invalid values and update this.options
7838				this._activate(value);
7839				return;
7840			}
7841
7842			if (key === "event") {
7843				if (this.options.event) {
7844					this._off(this.headers, this.options.event);
7845				}
7846				this._setupEvents(value);
7847			}
7848
7849			this._super(key, value);
7850
7851			// Setting collapsible: false while collapsed; open first panel
7852			if (key === "collapsible" && !value && this.options.active === false) {
7853				this._activate(0);
7854			}
7855
7856			if (key === "icons") {
7857				this._destroyIcons();
7858				if (value) {
7859					this._createIcons();
7860				}
7861			}
7862		},
7863
7864		_setOptionDisabled: function (value) {
7865			this._super(value);
7866
7867			this.element.attr("aria-disabled", value);
7868
7869			// Support: IE8 Only
7870			// #5332 / #6059 - opacity doesn't cascade to positioned elements in IE
7871			// so we need to add the disabled class to the headers and panels
7872			this._toggleClass(null, "ui-state-disabled", !!value);
7873			this._toggleClass(this.headers.add(this.headers.next()), null, "ui-state-disabled",
7874				!!value);
7875		},
7876
7877		_keydown: function (event) {
7878			if (event.altKey || event.ctrlKey) {
7879				return;
7880			}
7881
7882			var keyCode = $.ui.keyCode,
7883				length = this.headers.length,
7884				currentIndex = this.headers.index(event.target),
7885				toFocus = false;
7886
7887			switch (event.keyCode) {
7888				case keyCode.RIGHT:
7889				case keyCode.DOWN:
7890					toFocus = this.headers[(currentIndex + 1) % length];
7891					break;
7892				case keyCode.LEFT:
7893				case keyCode.UP:
7894					toFocus = this.headers[(currentIndex - 1 + length) % length];
7895					break;
7896				case keyCode.SPACE:
7897				case keyCode.ENTER:
7898					this._eventHandler(event);
7899					break;
7900				case keyCode.HOME:
7901					toFocus = this.headers[0];
7902					break;
7903				case keyCode.END:
7904					toFocus = this.headers[length - 1];
7905					break;
7906			}
7907
7908			if (toFocus) {
7909				$(event.target).attr("tabIndex", -1);
7910				$(toFocus).attr("tabIndex", 0);
7911				$(toFocus).trigger("focus");
7912				event.preventDefault();
7913			}
7914		},
7915
7916		_panelKeyDown: function (event) {
7917			if (event.keyCode === $.ui.keyCode.UP && event.ctrlKey) {
7918				$(event.currentTarget).prev().trigger("focus");
7919			}
7920		},
7921
7922		refresh: function () {
7923			var options = this.options;
7924			this._processPanels();
7925
7926			// Was collapsed or no panel
7927			if ((options.active === false && options.collapsible === true) ||
7928				!this.headers.length) {
7929				options.active = false;
7930				this.active = $();
7931
7932				// active false only when collapsible is true
7933			} else if (options.active === false) {
7934				this._activate(0);
7935
7936				// was active, but active panel is gone
7937			} else if (this.active.length && !$.contains(this.element[0], this.active[0])) {
7938
7939				// all remaining panel are disabled
7940				if (this.headers.length === this.headers.find(".ui-state-disabled").length) {
7941					options.active = false;
7942					this.active = $();
7943
7944					// activate previous panel
7945				} else {
7946					this._activate(Math.max(0, options.active - 1));
7947				}
7948
7949				// was active, active panel still exists
7950			} else {
7951
7952				// make sure active index is correct
7953				options.active = this.headers.index(this.active);
7954			}
7955
7956			this._destroyIcons();
7957
7958			this._refresh();
7959		},
7960
7961		_processPanels: function () {
7962			var prevHeaders = this.headers,
7963				prevPanels = this.panels;
7964
7965			if (typeof this.options.header === "function") {
7966				this.headers = this.options.header(this.element);
7967			} else {
7968				this.headers = this.element.find(this.options.header);
7969			}
7970			this._addClass(this.headers, "ui-accordion-header ui-accordion-header-collapsed",
7971				"ui-state-default");
7972
7973			this.panels = this.headers.next().filter(":not(.ui-accordion-content-active)").hide();
7974			this._addClass(this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content");
7975
7976			// Avoid memory leaks (#10056)
7977			if (prevPanels) {
7978				this._off(prevHeaders.not(this.headers));
7979				this._off(prevPanels.not(this.panels));
7980			}
7981		},
7982
7983		_refresh: function () {
7984			var maxHeight,
7985				options = this.options,
7986				heightStyle = options.heightStyle,
7987				parent = this.element.parent();
7988
7989			this.active = this._findActive(options.active);
7990			this._addClass(this.active, "ui-accordion-header-active", "ui-state-active")
7991				._removeClass(this.active, "ui-accordion-header-collapsed");
7992			this._addClass(this.active.next(), "ui-accordion-content-active");
7993			this.active.next().show();
7994
7995			this.headers
7996				.attr("role", "tab")
7997				.each(function () {
7998					var header = $(this),
7999						headerId = header.uniqueId().attr("id"),
8000						panel = header.next(),
8001						panelId = panel.uniqueId().attr("id");
8002					header.attr("aria-controls", panelId);
8003					panel.attr("aria-labelledby", headerId);
8004				})
8005				.next()
8006				.attr("role", "tabpanel");
8007
8008			this.headers
8009				.not(this.active)
8010				.attr({
8011					"aria-selected": "false",
8012					"aria-expanded": "false",
8013					tabIndex: -1
8014				})
8015				.next()
8016				.attr({
8017					"aria-hidden": "true"
8018				})
8019				.hide();
8020
8021			// Make sure at least one header is in the tab order
8022			if (!this.active.length) {
8023				this.headers.eq(0).attr("tabIndex", 0);
8024			} else {
8025				this.active.attr({
8026					"aria-selected": "true",
8027					"aria-expanded": "true",
8028					tabIndex: 0
8029				})
8030					.next()
8031					.attr({
8032						"aria-hidden": "false"
8033					});
vendor: 4,766 bytes, lines 8034-8200
8034			}
8035
8036			this._createIcons();
8037
8038			this._setupEvents(options.event);
8039
8040			if (heightStyle === "fill") {
8041				maxHeight = parent.height();
8042				this.element.siblings(":visible").each(function () {
8043					var elem = $(this),
8044						position = elem.css("position");
8045
8046					if (position === "absolute" || position === "fixed") {
8047						return;
8048					}
8049					maxHeight -= elem.outerHeight(true);
8050				});
8051
8052				this.headers.each(function () {
8053					maxHeight -= $(this).outerHeight(true);
8054				});
8055
8056				this.headers.next()
8057					.each(function () {
8058						$(this).height(Math.max(0, maxHeight -
8059							$(this).innerHeight() + $(this).height()));
8060					})
8061					.css("overflow", "auto");
8062			} else if (heightStyle === "auto") {
8063				maxHeight = 0;
8064				this.headers.next()
8065					.each(function () {
8066						var isVisible = $(this).is(":visible");
8067						if (!isVisible) {
8068							$(this).show();
8069						}
8070						maxHeight = Math.max(maxHeight, $(this).css("height", "").height());
8071						if (!isVisible) {
8072							$(this).hide();
8073						}
8074					})
8075					.height(maxHeight);
8076			}
8077		},
8078
8079		_activate: function (index) {
8080			var active = this._findActive(index)[0];
8081
8082			// Trying to activate the already active panel
8083			if (active === this.active[0]) {
8084				return;
8085			}
8086
8087			// Trying to collapse, simulate a click on the currently active header
8088			active = active || this.active[0];
8089
8090			this._eventHandler({
8091				target: active,
8092				currentTarget: active,
8093				preventDefault: $.noop
8094			});
8095		},
8096
8097		_findActive: function (selector) {
8098			return typeof selector === "number" ? this.headers.eq(selector) : $();
8099		},
8100
8101		_setupEvents: function (event) {
8102			var events = {
8103				keydown: "_keydown"
8104			};
8105			if (event) {
8106				$.each(event.split(" "), function (index, eventName) {
8107					events[eventName] = "_eventHandler";
8108				});
8109			}
8110
8111			this._off(this.headers.add(this.headers.next()));
8112			this._on(this.headers, events);
8113			this._on(this.headers.next(), { keydown: "_panelKeyDown" });
8114			this._hoverable(this.headers);
8115			this._focusable(this.headers);
8116		},
8117
8118		_eventHandler: function (event) {
8119			var activeChildren, clickedChildren,
8120				options = this.options,
8121				active = this.active,
8122				clicked = $(event.currentTarget),
8123				clickedIsActive = clicked[0] === active[0],
8124				collapsing = clickedIsActive && options.collapsible,
8125				toShow = collapsing ? $() : clicked.next(),
8126				toHide = active.next(),
8127				eventData = {
8128					oldHeader: active,
8129					oldPanel: toHide,
8130					newHeader: collapsing ? $() : clicked,
8131					newPanel: toShow
8132				};
8133
8134			event.preventDefault();
8135
8136			if (
8137
8138				// click on active header, but not collapsible
8139				(clickedIsActive && !options.collapsible) ||
8140
8141				// allow canceling activation
8142				(this._trigger("beforeActivate", event, eventData) === false)) {
8143				return;
8144			}
8145
8146			options.active = collapsing ? false : this.headers.index(clicked);
8147
8148			// When the call to ._toggle() comes after the class changes
8149			// it causes a very odd bug in IE 8 (see #6720)
8150			this.active = clickedIsActive ? $() : clicked;
8151			this._toggle(eventData);
8152
8153			// Switch classes
8154			// corner classes on the previously active header stay after the animation
8155			this._removeClass(active, "ui-accordion-header-active", "ui-state-active");
8156			if (options.icons) {
8157				activeChildren = active.children(".ui-accordion-header-icon");
8158				this._removeClass(activeChildren, null, options.icons.activeHeader)
8159					._addClass(activeChildren, null, options.icons.header);
8160			}
8161
8162			if (!clickedIsActive) {
8163				this._removeClass(clicked, "ui-accordion-header-collapsed")
8164					._addClass(clicked, "ui-accordion-header-active", "ui-state-active");
8165				if (options.icons) {
8166					clickedChildren = clicked.children(".ui-accordion-header-icon");
8167					this._removeClass(clickedChildren, null, options.icons.header)
8168						._addClass(clickedChildren, null, options.icons.activeHeader);
8169				}
8170
8171				this._addClass(clicked.next(), "ui-accordion-content-active");
8172			}
8173		},
8174
8175		_toggle: function (data) {
8176			var toShow = data.newPanel,
8177				toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
8178
8179			// Handle activating a panel during the animation for another activation
8180			this.prevShow.add(this.prevHide).stop(true, true);
8181			this.prevShow = toShow;
8182			this.prevHide = toHide;
8183
8184			if (this.options.animate) {
8185				this._animate(toShow, toHide, data);
8186			} else {
8187				toHide.hide();
8188				toShow.show();
8189				this._toggleComplete(data);
8190			}
8191
8192			toHide.attr({
8193				"aria-hidden": "true"
8194			});
8195			toHide.prev().attr({
8196				"aria-selected": "false",
8197				"aria-expanded": "false"
8198			});
8199
8200			// if we're switching panels, remove the old header from the tab order
vendor: 6,077 bytes, lines 8201-8417
8201			// if we're opening from collapsed state, remove the previous header from the tab order
8202			// if we're collapsing, then keep the collapsing header in the tab order
8203			if (toShow.length && toHide.length) {
8204				toHide.prev().attr({
8205					"tabIndex": -1,
8206					"aria-expanded": "false"
8207				});
8208			} else if (toShow.length) {
8209				this.headers.filter(function () {
8210					return parseInt($(this).attr("tabIndex"), 10) === 0;
8211				})
8212					.attr("tabIndex", -1);
8213			}
8214
8215			toShow
8216				.attr("aria-hidden", "false")
8217				.prev()
8218				.attr({
8219					"aria-selected": "true",
8220					"aria-expanded": "true",
8221					tabIndex: 0
8222				});
8223		},
8224
8225		_animate: function (toShow, toHide, data) {
8226			var total, easing, duration,
8227				that = this,
8228				adjust = 0,
8229				boxSizing = toShow.css("box-sizing"),
8230				down = toShow.length &&
8231					(!toHide.length || (toShow.index() < toHide.index())),
8232				animate = this.options.animate || {},
8233				options = down && animate.down || animate,
8234				complete = function () {
8235					that._toggleComplete(data);
8236				};
8237
8238			if (typeof options === "number") {
8239				duration = options;
8240			}
8241			if (typeof options === "string") {
8242				easing = options;
8243			}
8244
8245			// fall back from options to animation in case of partial down settings
8246			easing = easing || options.easing || animate.easing;
8247			duration = duration || options.duration || animate.duration;
8248
8249			if (!toHide.length) {
8250				return toShow.animate(this.showProps, duration, easing, complete);
8251			}
8252			if (!toShow.length) {
8253				return toHide.animate(this.hideProps, duration, easing, complete);
8254			}
8255
8256			total = toShow.show().outerHeight();
8257			toHide.animate(this.hideProps, {
8258				duration: duration,
8259				easing: easing,
8260				step: function (now, fx) {
8261					fx.now = Math.round(now);
8262				}
8263			});
8264			toShow
8265				.hide()
8266				.animate(this.showProps, {
8267					duration: duration,
8268					easing: easing,
8269					complete: complete,
8270					step: function (now, fx) {
8271						fx.now = Math.round(now);
8272						if (fx.prop !== "height") {
8273							if (boxSizing === "content-box") {
8274								adjust += fx.now;
8275							}
8276						} else if (that.options.heightStyle !== "content") {
8277							fx.now = Math.round(total - toHide.outerHeight() - adjust);
8278							adjust = 0;
8279						}
8280					}
8281				});
8282		},
8283
8284		_toggleComplete: function (data) {
8285			var toHide = data.oldPanel,
8286				prev = toHide.prev();
8287
8288			this._removeClass(toHide, "ui-accordion-content-active");
8289			this._removeClass(prev, "ui-accordion-header-active")
8290				._addClass(prev, "ui-accordion-header-collapsed");
8291
8292			// Work around for rendering bug in IE (#5421)
8293			if (toHide.length) {
8294				toHide.parent()[0].className = toHide.parent()[0].className;
8295			}
8296			this._trigger("activate", null, data);
8297		}
8298	});
8299
8300
8301	/*!
8302	 * jQuery UI Menu 1.13.1
8303	 * http://jqueryui.com
8304	 *
8305	 * Copyright jQuery Foundation and other contributors
8306	 * Released under the MIT license.
8307	 * http://jquery.org/license
8308	 */
8309
8310	//>>label: Menu
8311	//>>group: Widgets
8312	//>>description: Creates nestable menus.
8313	//>>docs: http://api.jqueryui.com/menu/
8314	//>>demos: http://jqueryui.com/menu/
8315	//>>css.structure: ../../themes/base/core.css
8316	//>>css.structure: ../../themes/base/menu.css
8317	//>>css.theme: ../../themes/base/theme.css
8318
8319
8320	var widgetsMenu = $.widget("ui.menu", {
8321		version: "1.13.1",
8322		defaultElement: "<ul>",
8323		delay: 300,
8324		options: {
8325			icons: {
8326				submenu: "ui-icon-caret-1-e"
8327			},
8328			items: "> *",
8329			menus: "ul",
8330			position: {
8331				my: "left top",
8332				at: "right top"
8333			},
8334			role: "menu",
8335
8336			// Callbacks
8337			blur: null,
8338			focus: null,
8339			select: null
8340		},
8341
8342		_create: function () {
8343			this.activeMenu = this.element;
8344
8345			// Flag used to prevent firing of the click handler
8346			// as the event bubbles up through nested menus
8347			this.mouseHandled = false;
8348			this.lastMousePosition = { x: null, y: null };
8349			this.element
8350				.uniqueId()
8351				.attr({
8352					role: this.options.role,
8353					tabIndex: 0
8354				});
8355
8356			this._addClass("ui-menu", "ui-widget ui-widget-content");
8357			this._on({
8358
8359				// Prevent focus from sticking to links inside menu after clicking
8360				// them (focus should always stay on UL during navigation).
8361				"mousedown .ui-menu-item": function (event) {
8362					event.preventDefault();
8363
8364					this._activateItem(event);
8365				},
8366				"click .ui-menu-item": function (event) {
8367					var target = $(event.target);
8368					var active = $($.ui.safeActiveElement(this.document[0]));
8369					if (!this.mouseHandled && target.not(".ui-state-disabled").length) {
8370						this.select(event);
8371
8372						// Only set the mouseHandled flag if the event will bubble, see #9469.
8373						if (!event.isPropagationStopped()) {
8374							this.mouseHandled = true;
8375						}
8376
8377						// Open submenu on click
8378						if (target.has(".ui-menu").length) {
8379							this.expand(event);
8380						} else if (!this.element.is(":focus") &&
8381							active.closest(".ui-menu").length) {
8382
8383							// Redirect focus to the menu
8384							this.element.trigger("focus", [true]);
8385
8386							// If the active item is on the top level, let it stay active.
8387							// Otherwise, blur the active item since it is no longer visible.
8388							if (this.active && this.active.parents(".ui-menu").length === 1) {
8389								clearTimeout(this.timer);
8390							}
8391						}
8392					}
8393				},
8394				"mouseenter .ui-menu-item": "_activateItem",
8395				"mousemove .ui-menu-item": "_activateItem",
8396				mouseleave: "collapseAll",
8397				"mouseleave .ui-menu": "collapseAll",
8398				focus: function (event, keepActiveItem) {
8399
8400					// If there's already an active item, keep it active
8401					// If not, activate the first item
8402					var item = this.active || this._menuItems().first();
8403
8404					if (!keepActiveItem) {
8405						this.focus(event, item);
8406					}
8407				},
8408				blur: function (event) {
8409					this._delay(function () {
8410						var notContained = !$.contains(
8411							this.element[0],
8412							$.ui.safeActiveElement(this.document[0])
8413						);
8414						if (notContained) {
8415							this.collapseAll(event);
8416						}
8417					});
vendor: 13,718 bytes, lines 8418-8911
8418				},
8419				keydown: "_keydown"
8420			});
8421
8422			this.refresh();
8423
8424			// Clicks outside of a menu collapse any open menus
8425			this._on(this.document, {
8426				click: function (event) {
8427					if (this._closeOnDocumentClick(event)) {
8428						this.collapseAll(event, true);
8429					}
8430
8431					// Reset the mouseHandled flag
8432					this.mouseHandled = false;
8433				}
8434			});
8435		},
8436
8437		_activateItem: function (event) {
8438
8439			// Ignore mouse events while typeahead is active, see #10458.
8440			// Prevents focusing the wrong item when typeahead causes a scroll while the mouse
8441			// is over an item in the menu
8442			if (this.previousFilter) {
8443				return;
8444			}
8445
8446			// If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356)
8447			if (event.clientX === this.lastMousePosition.x &&
8448				event.clientY === this.lastMousePosition.y) {
8449				return;
8450			}
8451
8452			this.lastMousePosition = {
8453				x: event.clientX,
8454				y: event.clientY
8455			};
8456
8457			var actualTarget = $(event.target).closest(".ui-menu-item"),
8458				target = $(event.currentTarget);
8459
8460			// Ignore bubbled events on parent items, see #11641
8461			if (actualTarget[0] !== target[0]) {
8462				return;
8463			}
8464
8465			// If the item is already active, there's nothing to do
8466			if (target.is(".ui-state-active")) {
8467				return;
8468			}
8469
8470			// Remove ui-state-active class from siblings of the newly focused menu item
8471			// to avoid a jump caused by adjacent elements both having a class with a border
8472			this._removeClass(target.siblings().children(".ui-state-active"),
8473				null, "ui-state-active");
8474			this.focus(event, target);
8475		},
8476
8477		_destroy: function () {
8478			var items = this.element.find(".ui-menu-item")
8479				.removeAttr("role aria-disabled"),
8480				submenus = items.children(".ui-menu-item-wrapper")
8481					.removeUniqueId()
8482					.removeAttr("tabIndex role aria-haspopup");
8483
8484			// Destroy (sub)menus
8485			this.element
8486				.removeAttr("aria-activedescendant")
8487				.find(".ui-menu").addBack()
8488				.removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled " +
8489					"tabIndex")
8490				.removeUniqueId()
8491				.show();
8492
8493			submenus.children().each(function () {
8494				var elem = $(this);
8495				if (elem.data("ui-menu-submenu-caret")) {
8496					elem.remove();
8497				}
8498			});
8499		},
8500
8501		_keydown: function (event) {
8502			var match, prev, character, skip,
8503				preventDefault = true;
8504
8505			switch (event.keyCode) {
8506				case $.ui.keyCode.PAGE_UP:
8507					this.previousPage(event);
8508					break;
8509				case $.ui.keyCode.PAGE_DOWN:
8510					this.nextPage(event);
8511					break;
8512				case $.ui.keyCode.HOME:
8513					this._move("first", "first", event);
8514					break;
8515				case $.ui.keyCode.END:
8516					this._move("last", "last", event);
8517					break;
8518				case $.ui.keyCode.UP:
8519					this.previous(event);
8520					break;
8521				case $.ui.keyCode.DOWN:
8522					this.next(event);
8523					break;
8524				case $.ui.keyCode.LEFT:
8525					this.collapse(event);
8526					break;
8527				case $.ui.keyCode.RIGHT:
8528					if (this.active && !this.active.is(".ui-state-disabled")) {
8529						this.expand(event);
8530					}
8531					break;
8532				case $.ui.keyCode.ENTER:
8533				case $.ui.keyCode.SPACE:
8534					this._activate(event);
8535					break;
8536				case $.ui.keyCode.ESCAPE:
8537					this.collapse(event);
8538					break;
8539				default:
8540					preventDefault = false;
8541					prev = this.previousFilter || "";
8542					skip = false;
8543
8544					// Support number pad values
8545					character = event.keyCode >= 96 && event.keyCode <= 105 ?
8546						(event.keyCode - 96).toString() : String.fromCharCode(event.keyCode);
8547
8548					clearTimeout(this.filterTimer);
8549
8550					if (character === prev) {
8551						skip = true;
8552					} else {
8553						character = prev + character;
8554					}
8555
8556					match = this._filterMenuItems(character);
8557					match = skip && match.index(this.active.next()) !== -1 ?
8558						this.active.nextAll(".ui-menu-item") :
8559						match;
8560
8561					// If no matches on the current filter, reset to the last character pressed
8562					// to move down the menu to the first item that starts with that character
8563					if (!match.length) {
8564						character = String.fromCharCode(event.keyCode);
8565						match = this._filterMenuItems(character);
8566					}
8567
8568					if (match.length) {
8569						this.focus(event, match);
8570						this.previousFilter = character;
8571						this.filterTimer = this._delay(function () {
8572							delete this.previousFilter;
8573						}, 1000);
8574					} else {
8575						delete this.previousFilter;
8576					}
8577			}
8578
8579			if (preventDefault) {
8580				event.preventDefault();
8581			}
8582		},
8583
8584		_activate: function (event) {
8585			if (this.active && !this.active.is(".ui-state-disabled")) {
8586				if (this.active.children("[aria-haspopup='true']").length) {
8587					this.expand(event);
8588				} else {
8589					this.select(event);
8590				}
8591			}
8592		},
8593
8594		refresh: function () {
8595			var menus, items, newSubmenus, newItems, newWrappers,
8596				that = this,
8597				icon = this.options.icons.submenu,
8598				submenus = this.element.find(this.options.menus);
8599
8600			this._toggleClass("ui-menu-icons", null, !!this.element.find(".ui-icon").length);
8601
8602			// Initialize nested menus
8603			newSubmenus = submenus.filter(":not(.ui-menu)")
8604				.hide()
8605				.attr({
8606					role: this.options.role,
8607					"aria-hidden": "true",
8608					"aria-expanded": "false"
8609				})
8610				.each(function () {
8611					var menu = $(this),
8612						item = menu.prev(),
8613						submenuCaret = $("<span>").data("ui-menu-submenu-caret", true);
8614
8615					that._addClass(submenuCaret, "ui-menu-icon", "ui-icon " + icon);
8616					item
8617						.attr("aria-haspopup", "true")
8618						.prepend(submenuCaret);
8619					menu.attr("aria-labelledby", item.attr("id"));
8620				});
8621
8622			this._addClass(newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front");
8623
8624			menus = submenus.add(this.element);
8625			items = menus.find(this.options.items);
8626
8627			// Initialize menu-items containing spaces and/or dashes only as dividers
8628			items.not(".ui-menu-item").each(function () {
8629				var item = $(this);
8630				if (that._isDivider(item)) {
8631					that._addClass(item, "ui-menu-divider", "ui-widget-content");
8632				}
8633			});
8634
8635			// Don't refresh list items that are already adapted
8636			newItems = items.not(".ui-menu-item, .ui-menu-divider");
8637			newWrappers = newItems.children()
8638				.not(".ui-menu")
8639				.uniqueId()
8640				.attr({
8641					tabIndex: -1,
8642					role: this._itemRole()
8643				});
8644			this._addClass(newItems, "ui-menu-item")
8645				._addClass(newWrappers, "ui-menu-item-wrapper");
8646
8647			// Add aria-disabled attribute to any disabled menu item
8648			items.filter(".ui-state-disabled").attr("aria-disabled", "true");
8649
8650			// If the active item has been removed, blur the menu
8651			if (this.active && !$.contains(this.element[0], this.active[0])) {
8652				this.blur();
8653			}
8654		},
8655
8656		_itemRole: function () {
8657			return {
8658				menu: "menuitem",
8659				listbox: "option"
8660			}[this.options.role];
8661		},
8662
8663		_setOption: function (key, value) {
8664			if (key === "icons") {
8665				var icons = this.element.find(".ui-menu-icon");
8666				this._removeClass(icons, null, this.options.icons.submenu)
8667					._addClass(icons, null, value.submenu);
8668			}
8669			this._super(key, value);
8670		},
8671
8672		_setOptionDisabled: function (value) {
8673			this._super(value);
8674
8675			this.element.attr("aria-disabled", String(value));
8676			this._toggleClass(null, "ui-state-disabled", !!value);
8677		},
8678
8679		focus: function (event, item) {
8680			var nested, focused, activeParent;
8681			this.blur(event, event && event.type === "focus");
8682
8683			this._scrollIntoView(item);
8684
8685			this.active = item.first();
8686
8687			focused = this.active.children(".ui-menu-item-wrapper");
8688			this._addClass(focused, null, "ui-state-active");
8689
8690			// Only update aria-activedescendant if there's a role
8691			// otherwise we assume focus is managed elsewhere
8692			if (this.options.role) {
8693				this.element.attr("aria-activedescendant", focused.attr("id"));
8694			}
8695
8696			// Highlight active parent menu item, if any
8697			activeParent = this.active
8698				.parent()
8699				.closest(".ui-menu-item")
8700				.children(".ui-menu-item-wrapper");
8701			this._addClass(activeParent, null, "ui-state-active");
8702
8703			if (event && event.type === "keydown") {
8704				this._close();
8705			} else {
8706				this.timer = this._delay(function () {
8707					this._close();
8708				}, this.delay);
8709			}
8710
8711			nested = item.children(".ui-menu");
8712			if (nested.length && event && (/^mouse/.test(event.type))) {
8713				this._startOpening(nested);
8714			}
8715			this.activeMenu = item.parent();
8716
8717			this._trigger("focus", event, { item: item });
8718		},
8719
8720		_scrollIntoView: function (item) {
8721			var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
8722			if (this._hasScroll()) {
8723				borderTop = parseFloat($.css(this.activeMenu[0], "borderTopWidth")) || 0;
8724				paddingTop = parseFloat($.css(this.activeMenu[0], "paddingTop")) || 0;
8725				offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
8726				scroll = this.activeMenu.scrollTop();
8727				elementHeight = this.activeMenu.height();
8728				itemHeight = item.outerHeight();
8729
8730				if (offset < 0) {
8731					this.activeMenu.scrollTop(scroll + offset);
8732				} else if (offset + itemHeight > elementHeight) {
8733					this.activeMenu.scrollTop(scroll + offset - elementHeight + itemHeight);
8734				}
8735			}
8736		},
8737
8738		blur: function (event, fromFocus) {
8739			if (!fromFocus) {
8740				clearTimeout(this.timer);
8741			}
8742
8743			if (!this.active) {
8744				return;
8745			}
8746
8747			this._removeClass(this.active.children(".ui-menu-item-wrapper"),
8748				null, "ui-state-active");
8749
8750			this._trigger("blur", event, { item: this.active });
8751			this.active = null;
8752		},
8753
8754		_startOpening: function (submenu) {
8755			clearTimeout(this.timer);
8756
8757			// Don't open if already open fixes a Firefox bug that caused a .5 pixel
8758			// shift in the submenu position when mousing over the caret icon
8759			if (submenu.attr("aria-hidden") !== "true") {
8760				return;
8761			}
8762
8763			this.timer = this._delay(function () {
8764				this._close();
8765				this._open(submenu);
8766			}, this.delay);
8767		},
8768
8769		_open: function (submenu) {
8770			var position = $.extend({
8771				of: this.active
8772			}, this.options.position);
8773
8774			clearTimeout(this.timer);
8775			this.element.find(".ui-menu").not(submenu.parents(".ui-menu"))
8776				.hide()
8777				.attr("aria-hidden", "true");
8778
8779			submenu
8780				.show()
8781				.removeAttr("aria-hidden")
8782				.attr("aria-expanded", "true")
8783				.position(position);
8784		},
8785
8786		collapseAll: function (event, all) {
8787			clearTimeout(this.timer);
8788			this.timer = this._delay(function () {
8789
8790				// If we were passed an event, look for the submenu that contains the event
8791				var currentMenu = all ? this.element :
8792					$(event && event.target).closest(this.element.find(".ui-menu"));
8793
8794				// If we found no valid submenu ancestor, use the main menu to close all
8795				// sub menus anyway
8796				if (!currentMenu.length) {
8797					currentMenu = this.element;
8798				}
8799
8800				this._close(currentMenu);
8801
8802				this.blur(event);
8803
8804				// Work around active item staying active after menu is blurred
8805				this._removeClass(currentMenu.find(".ui-state-active"), null, "ui-state-active");
8806
8807				this.activeMenu = currentMenu;
8808			}, all ? 0 : this.delay);
8809		},
8810
8811		// With no arguments, closes the currently active menu - if nothing is active
8812		// it closes all menus.  If passed an argument, it will search for menus BELOW
8813		_close: function (startMenu) {
8814			if (!startMenu) {
8815				startMenu = this.active ? this.active.parent() : this.element;
8816			}
8817
8818			startMenu.find(".ui-menu")
8819				.hide()
8820				.attr("aria-hidden", "true")
8821				.attr("aria-expanded", "false");
8822		},
8823
8824		_closeOnDocumentClick: function (event) {
8825			return !$(event.target).closest(".ui-menu").length;
8826		},
8827
8828		_isDivider: function (item) {
8829
8830			// Match hyphen, em dash, en dash
8831			return !/[^\-\u2014\u2013\s]/.test(item.text());
8832		},
8833
8834		collapse: function (event) {
8835			var newItem = this.active &&
8836				this.active.parent().closest(".ui-menu-item", this.element);
8837			if (newItem && newItem.length) {
8838				this._close();
8839				this.focus(event, newItem);
8840			}
8841		},
8842
8843		expand: function (event) {
8844			var newItem = this.active && this._menuItems(this.active.children(".ui-menu")).first();
8845
8846			if (newItem && newItem.length) {
8847				this._open(newItem.parent());
8848
8849				// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
8850				this._delay(function () {
8851					this.focus(event, newItem);
8852				});
8853			}
8854		},
8855
8856		next: function (event) {
8857			this._move("next", "first", event);
8858		},
8859
8860		previous: function (event) {
8861			this._move("prev", "last", event);
8862		},
8863
8864		isFirstItem: function () {
8865			return this.active && !this.active.prevAll(".ui-menu-item").length;
8866		},
8867
8868		isLastItem: function () {
8869			return this.active && !this.active.nextAll(".ui-menu-item").length;
8870		},
8871
8872		_menuItems: function (menu) {
8873			return (menu || this.element)
8874				.find(this.options.items)
8875				.filter(".ui-menu-item");
8876		},
8877
8878		_move: function (direction, filter, event) {
8879			var next;
8880			if (this.active) {
8881				if (direction === "first" || direction === "last") {
8882					next = this.active
8883					[direction === "first" ? "prevAll" : "nextAll"](".ui-menu-item")
8884						.last();
8885				} else {
8886					next = this.active
8887					[direction + "All"](".ui-menu-item")
8888						.first();
8889				}
8890			}
8891			if (!next || !next.length || !this.active) {
8892				next = this._menuItems(this.activeMenu)[filter]();
8893			}
8894
8895			this.focus(event, next);
8896		},
8897
8898		nextPage: function (event) {
8899			var item, base, height;
8900
8901			if (!this.active) {
8902				this.next(event);
8903				return;
8904			}
8905			if (this.isLastItem()) {
8906				return;
8907			}
8908			if (this._hasScroll()) {
8909				base = this.active.offset().top;
8910				height = this.element.innerHeight();
8911
vendor: 13,108 bytes, lines 8912-9364
8912				// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
8913				if ($.fn.jquery.indexOf("3.2.") === 0) {
8914					height += this.element[0].offsetHeight - this.element.outerHeight();
8915				}
8916
8917				this.active.nextAll(".ui-menu-item").each(function () {
8918					item = $(this);
8919					return item.offset().top - base - height < 0;
8920				});
8921
8922				this.focus(event, item);
8923			} else {
8924				this.focus(event, this._menuItems(this.activeMenu)
8925				[!this.active ? "first" : "last"]());
8926			}
8927		},
8928
8929		previousPage: function (event) {
8930			var item, base, height;
8931			if (!this.active) {
8932				this.next(event);
8933				return;
8934			}
8935			if (this.isFirstItem()) {
8936				return;
8937			}
8938			if (this._hasScroll()) {
8939				base = this.active.offset().top;
8940				height = this.element.innerHeight();
8941
8942				// jQuery 3.2 doesn't include scrollbars in innerHeight, add it back.
8943				if ($.fn.jquery.indexOf("3.2.") === 0) {
8944					height += this.element[0].offsetHeight - this.element.outerHeight();
8945				}
8946
8947				this.active.prevAll(".ui-menu-item").each(function () {
8948					item = $(this);
8949					return item.offset().top - base + height > 0;
8950				});
8951
8952				this.focus(event, item);
8953			} else {
8954				this.focus(event, this._menuItems(this.activeMenu).first());
8955			}
8956		},
8957
8958		_hasScroll: function () {
8959			return this.element.outerHeight() < this.element.prop("scrollHeight");
8960		},
8961
8962		select: function (event) {
8963
8964			// TODO: It should never be possible to not have an active item at this
8965			// point, but the tests don't trigger mouseenter before click.
8966			this.active = this.active || $(event.target).closest(".ui-menu-item");
8967			var ui = { item: this.active };
8968			if (!this.active.has(".ui-menu").length) {
8969				this.collapseAll(event, true);
8970			}
8971			this._trigger("select", event, ui);
8972		},
8973
8974		_filterMenuItems: function (character) {
8975			var escapedCharacter = character.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"),
8976				regex = new RegExp("^" + escapedCharacter, "i");
8977
8978			return this.activeMenu
8979				.find(this.options.items)
8980
8981				// Only match on items, not dividers or other content (#10571)
8982				.filter(".ui-menu-item")
8983				.filter(function () {
8984					return regex.test(
8985						String.prototype.trim.call(
8986							$(this).children(".ui-menu-item-wrapper").text()));
8987				});
8988		}
8989	});
8990
8991
8992	/*!
8993	 * jQuery UI Autocomplete 1.13.1
8994	 * http://jqueryui.com
8995	 *
8996	 * Copyright jQuery Foundation and other contributors
8997	 * Released under the MIT license.
8998	 * http://jquery.org/license
8999	 */
9000
9001	//>>label: Autocomplete
9002	//>>group: Widgets
9003	//>>description: Lists suggested words as the user is typing.
9004	//>>docs: http://api.jqueryui.com/autocomplete/
9005	//>>demos: http://jqueryui.com/autocomplete/
9006	//>>css.structure: ../../themes/base/core.css
9007	//>>css.structure: ../../themes/base/autocomplete.css
9008	//>>css.theme: ../../themes/base/theme.css
9009
9010
9011	$.widget("ui.autocomplete", {
9012		version: "1.13.1",
9013		defaultElement: "<input>",
9014		options: {
9015			appendTo: null,
9016			autoFocus: false,
9017			delay: 300,
9018			minLength: 1,
9019			position: {
9020				my: "left top",
9021				at: "left bottom",
9022				collision: "none"
9023			},
9024			source: null,
9025
9026			// Callbacks
9027			change: null,
9028			close: null,
9029			focus: null,
9030			open: null,
9031			response: null,
9032			search: null,
9033			select: null
9034		},
9035
9036		requestIndex: 0,
9037		pending: 0,
9038		liveRegionTimer: null,
9039
9040		_create: function () {
9041
9042			// Some browsers only repeat keydown events, not keypress events,
9043			// so we use the suppressKeyPress flag to determine if we've already
9044			// handled the keydown event. #7269
9045			// Unfortunately the code for & in keypress is the same as the up arrow,
9046			// so we use the suppressKeyPressRepeat flag to avoid handling keypress
9047			// events when we know the keydown event was used to modify the
9048			// search term. #7799
9049			var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
9050				nodeName = this.element[0].nodeName.toLowerCase(),
9051				isTextarea = nodeName === "textarea",
9052				isInput = nodeName === "input";
9053
9054			// Textareas are always multi-line
9055			// Inputs are always single-line, even if inside a contentEditable element
9056			// IE also treats inputs as contentEditable
9057			// All other element types are determined by whether or not they're contentEditable
9058			this.isMultiLine = isTextarea || !isInput && this._isContentEditable(this.element);
9059
9060			this.valueMethod = this.element[isTextarea || isInput ? "val" : "text"];
9061			this.isNewMenu = true;
9062
9063			this._addClass("ui-autocomplete-input");
9064			this.element.attr("autocomplete", "off");
9065
9066			this._on(this.element, {
9067				keydown: function (event) {
9068					if (this.element.prop("readOnly")) {
9069						suppressKeyPress = true;
9070						suppressInput = true;
9071						suppressKeyPressRepeat = true;
9072						return;
9073					}
9074
9075					suppressKeyPress = false;
9076					suppressInput = false;
9077					suppressKeyPressRepeat = false;
9078					var keyCode = $.ui.keyCode;
9079					switch (event.keyCode) {
9080						case keyCode.PAGE_UP:
9081							suppressKeyPress = true;
9082							this._move("previousPage", event);
9083							break;
9084						case keyCode.PAGE_DOWN:
9085							suppressKeyPress = true;
9086							this._move("nextPage", event);
9087							break;
9088						case keyCode.UP:
9089							suppressKeyPress = true;
9090							this._keyEvent("previous", event);
9091							break;
9092						case keyCode.DOWN:
9093							suppressKeyPress = true;
9094							this._keyEvent("next", event);
9095							break;
9096						case keyCode.ENTER:
9097
9098							// when menu is open and has focus
9099							if (this.menu.active) {
9100
9101								// #6055 - Opera still allows the keypress to occur
9102								// which causes forms to submit
9103								suppressKeyPress = true;
9104								event.preventDefault();
9105								this.menu.select(event);
9106							}
9107							break;
9108						case keyCode.TAB:
9109							if (this.menu.active) {
9110								this.menu.select(event);
9111							}
9112							break;
9113						case keyCode.ESCAPE:
9114							if (this.menu.element.is(":visible")) {
9115								if (!this.isMultiLine) {
9116									this._value(this.term);
9117								}
9118								this.close(event);
9119
9120								// Different browsers have different default behavior for escape
9121								// Single press can mean undo or clear
9122								// Double press in IE means clear the whole form
9123								event.preventDefault();
9124							}
9125							break;
9126						default:
9127							suppressKeyPressRepeat = true;
9128
9129							// search timeout should be triggered before the input value is changed
9130							this._searchTimeout(event);
9131							break;
9132					}
9133				},
9134				keypress: function (event) {
9135					if (suppressKeyPress) {
9136						suppressKeyPress = false;
9137						if (!this.isMultiLine || this.menu.element.is(":visible")) {
9138							event.preventDefault();
9139						}
9140						return;
9141					}
9142					if (suppressKeyPressRepeat) {
9143						return;
9144					}
9145
9146					// Replicate some key handlers to allow them to repeat in Firefox and Opera
9147					var keyCode = $.ui.keyCode;
9148					switch (event.keyCode) {
9149						case keyCode.PAGE_UP:
9150							this._move("previousPage", event);
9151							break;
9152						case keyCode.PAGE_DOWN:
9153							this._move("nextPage", event);
9154							break;
9155						case keyCode.UP:
9156							this._keyEvent("previous", event);
9157							break;
9158						case keyCode.DOWN:
9159							this._keyEvent("next", event);
9160							break;
9161					}
9162				},
9163				input: function (event) {
9164					if (suppressInput) {
9165						suppressInput = false;
9166						event.preventDefault();
9167						return;
9168					}
9169					this._searchTimeout(event);
9170				},
9171				focus: function () {
9172					this.selectedItem = null;
9173					this.previous = this._value();
9174				},
9175				blur: function (event) {
9176					clearTimeout(this.searching);
9177					this.close(event);
9178					this._change(event);
9179				}
9180			});
9181
9182			this._initSource();
9183			this.menu = $("<ul>")
9184				.appendTo(this._appendTo())
9185				.menu({
9186
9187					// disable ARIA support, the live region takes care of that
9188					role: null
9189				})
9190				.hide()
9191
9192				// Support: IE 11 only, Edge <= 14
9193				// For other browsers, we preventDefault() on the mousedown event
9194				// to keep the dropdown from taking focus from the input. This doesn't
9195				// work for IE/Edge, causing problems with selection and scrolling (#9638)
9196				// Happily, IE and Edge support an "unselectable" attribute that
9197				// prevents an element from receiving focus, exactly what we want here.
9198				.attr({
9199					"unselectable": "on"
9200				})
9201				.menu("instance");
9202
9203			this._addClass(this.menu.element, "ui-autocomplete", "ui-front");
9204			this._on(this.menu.element, {
9205				mousedown: function (event) {
9206
9207					// Prevent moving focus out of the text field
9208					event.preventDefault();
9209				},
9210				menufocus: function (event, ui) {
9211					var label, item;
9212
9213					// support: Firefox
9214					// Prevent accidental activation of menu items in Firefox (#7024 #9118)
9215					if (this.isNewMenu) {
9216						this.isNewMenu = false;
9217						if (event.originalEvent && /^mouse/.test(event.originalEvent.type)) {
9218							this.menu.blur();
9219
9220							this.document.one("mousemove", function () {
9221								$(event.target).trigger(event.originalEvent);
9222							});
9223
9224							return;
9225						}
9226					}
9227
9228					item = ui.item.data("ui-autocomplete-item");
9229					if (false !== this._trigger("focus", event, { item: item })) {
9230
9231						// use value to match what will end up in the input, if it was a key event
9232						if (event.originalEvent && /^key/.test(event.originalEvent.type)) {
9233							this._value(item.value);
9234						}
9235					}
9236
9237					// Announce the value in the liveRegion
9238					label = ui.item.attr("aria-label") || item.value;
9239					if (label && String.prototype.trim.call(label).length) {
9240						clearTimeout(this.liveRegionTimer);
9241						this.liveRegionTimer = this._delay(function () {
9242							this.liveRegion.html($("<div>").text(label));
9243						}, 100);
9244					}
9245				},
9246				menuselect: function (event, ui) {
9247					var item = ui.item.data("ui-autocomplete-item"),
9248						previous = this.previous;
9249
9250					// Only trigger when focus was lost (click on menu)
9251					if (this.element[0] !== $.ui.safeActiveElement(this.document[0])) {
9252						this.element.trigger("focus");
9253						this.previous = previous;
9254
9255						// #6109 - IE triggers two focus events and the second
9256						// is asynchronous, so we need to reset the previous
9257						// term synchronously and asynchronously :-(
9258						this._delay(function () {
9259							this.previous = previous;
9260							this.selectedItem = item;
9261						});
9262					}
9263
9264					if (false !== this._trigger("select", event, { item: item })) {
9265						this._value(item.value);
9266					}
9267
9268					// reset the term after the select event
9269					// this allows custom select handling to work properly
9270					this.term = this._value();
9271
9272					this.close(event);
9273					this.selectedItem = item;
9274				}
9275			});
9276
9277			this.liveRegion = $("<div>", {
9278				role: "status",
9279				"aria-live": "assertive",
9280				"aria-relevant": "additions"
9281			})
9282				.appendTo(this.document[0].body);
9283
9284			this._addClass(this.liveRegion, null, "ui-helper-hidden-accessible");
9285
9286			// Turning off autocomplete prevents the browser from remembering the
9287			// value when navigating through history, so we re-enable autocomplete
9288			// if the page is unloaded before the widget is destroyed. #7790
9289			this._on(this.window, {
9290				beforeunload: function () {
9291					this.element.removeAttr("autocomplete");
9292				}
9293			});
9294		},
9295
9296		_destroy: function () {
9297			clearTimeout(this.searching);
9298			this.element.removeAttr("autocomplete");
9299			this.menu.element.remove();
9300			this.liveRegion.remove();
9301		},
9302
9303		_setOption: function (key, value) {
9304			this._super(key, value);
9305			if (key === "source") {
9306				this._initSource();
9307			}
9308			if (key === "appendTo") {
9309				this.menu.element.appendTo(this._appendTo());
9310			}
9311			if (key === "disabled" && value && this.xhr) {
9312				this.xhr.abort();
9313			}
9314		},
9315
9316		_isEventTargetInWidget: function (event) {
9317			var menuElement = this.menu.element[0];
9318
9319			return event.target === this.element[0] ||
9320				event.target === menuElement ||
9321				$.contains(menuElement, event.target);
9322		},
9323
9324		_closeOnClickOutside: function (event) {
9325			if (!this._isEventTargetInWidget(event)) {
9326				this.close();
9327			}
9328		},
9329
9330		_appendTo: function () {
9331			var element = this.options.appendTo;
9332
9333			if (element) {
9334				element = element.jquery || element.nodeType ?
9335					$(element) :
9336					this.document.find(element).eq(0);
9337			}
9338
9339			if (!element || !element[0]) {
9340				element = this.element.closest(".ui-front, dialog");
9341			}
9342
9343			if (!element.length) {
9344				element = this.document[0].body;
9345			}
9346
9347			return element;
9348		},
9349
9350		_initSource: function () {
9351			var array, url,
9352				that = this;
9353			if (Array.isArray(this.options.source)) {
9354				array = this.options.source;
9355				this.source = function (request, response) {
9356					response($.ui.autocomplete.filter(array, request.term));
9357				};
9358			} else if (typeof this.options.source === "string") {
9359				url = this.options.source;
9360				this.source = function (request, response) {
9361					if (that.xhr) {
9362						that.xhr.abort();
9363					}
9364					that.xhr = $.ajax({
vendor: 5,291 bytes, lines 9365-9581
9365						url: url,
9366						data: request,
9367						dataType: "json",
9368						success: function (data) {
9369							response(data);
9370						},
9371						error: function () {
9372							response([]);
9373						}
9374					});
9375				};
9376			} else {
9377				this.source = this.options.source;
9378			}
9379		},
9380
9381		_searchTimeout: function (event) {
9382			clearTimeout(this.searching);
9383			this.searching = this._delay(function () {
9384
9385				// Search if the value has changed, or if the user retypes the same value (see #7434)
9386				var equalValues = this.term === this._value(),
9387					menuVisible = this.menu.element.is(":visible"),
9388					modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
9389
9390				if (!equalValues || (equalValues && !menuVisible && !modifierKey)) {
9391					this.selectedItem = null;
9392					this.search(null, event);
9393				}
9394			}, this.options.delay);
9395		},
9396
9397		search: function (value, event) {
9398			value = value != null ? value : this._value();
9399
9400			// Always save the actual value, not the one passed as an argument
9401			this.term = this._value();
9402
9403			if (value.length < this.options.minLength) {
9404				return this.close(event);
9405			}
9406
9407			if (this._trigger("search", event) === false) {
9408				return;
9409			}
9410
9411			return this._search(value);
9412		},
9413
9414		_search: function (value) {
9415			this.pending++;
9416			this._addClass("ui-autocomplete-loading");
9417			this.cancelSearch = false;
9418
9419			this.source({ term: value }, this._response());
9420		},
9421
9422		_response: function () {
9423			var index = ++this.requestIndex;
9424
9425			return function (content) {
9426				if (index === this.requestIndex) {
9427					this.__response(content);
9428				}
9429
9430				this.pending--;
9431				if (!this.pending) {
9432					this._removeClass("ui-autocomplete-loading");
9433				}
9434			}.bind(this);
9435		},
9436
9437		__response: function (content) {
9438			if (content) {
9439				content = this._normalize(content);
9440			}
9441			this._trigger("response", null, { content: content });
9442			if (!this.options.disabled && content && content.length && !this.cancelSearch) {
9443				this._suggest(content);
9444				this._trigger("open");
9445			} else {
9446
9447				// use ._close() instead of .close() so we don't cancel future searches
9448				this._close();
9449			}
9450		},
9451
9452		close: function (event) {
9453			this.cancelSearch = true;
9454			this._close(event);
9455		},
9456
9457		_close: function (event) {
9458
9459			// Remove the handler that closes the menu on outside clicks
9460			this._off(this.document, "mousedown");
9461
9462			if (this.menu.element.is(":visible")) {
9463				this.menu.element.hide();
9464				this.menu.blur();
9465				this.isNewMenu = true;
9466				this._trigger("close", event);
9467			}
9468		},
9469
9470		_change: function (event) {
9471			if (this.previous !== this._value()) {
9472				this._trigger("change", event, { item: this.selectedItem });
9473			}
9474		},
9475
9476		_normalize: function (items) {
9477
9478			// assume all items have the right format when the first item is complete
9479			if (items.length && items[0].label && items[0].value) {
9480				return items;
9481			}
9482			return $.map(items, function (item) {
9483				if (typeof item === "string") {
9484					return {
9485						label: item,
9486						value: item
9487					};
9488				}
9489				return $.extend({}, item, {
9490					label: item.label || item.value,
9491					value: item.value || item.label
9492				});
9493			});
9494		},
9495
9496		_suggest: function (items) {
9497			var ul = this.menu.element.empty();
9498			this._renderMenu(ul, items);
9499			this.isNewMenu = true;
9500			this.menu.refresh();
9501
9502			// Size and position menu
9503			ul.show();
9504			this._resizeMenu();
9505			ul.position($.extend({
9506				of: this.element
9507			}, this.options.position));
9508
9509			if (this.options.autoFocus) {
9510				this.menu.next();
9511			}
9512
9513			// Listen for interactions outside of the widget (#6642)
9514			this._on(this.document, {
9515				mousedown: "_closeOnClickOutside"
9516			});
9517		},
9518
9519		_resizeMenu: function () {
9520			var ul = this.menu.element;
9521			ul.outerWidth(Math.max(
9522
9523				// Firefox wraps long text (possibly a rounding bug)
9524				// so we add 1px to avoid the wrapping (#7513)
9525				ul.width("").outerWidth() + 1,
9526				this.element.outerWidth()
9527			));
9528		},
9529
9530		_renderMenu: function (ul, items) {
9531			var that = this;
9532			$.each(items, function (index, item) {
9533				that._renderItemData(ul, item);
9534			});
9535		},
9536
9537		_renderItemData: function (ul, item) {
9538			return this._renderItem(ul, item).data("ui-autocomplete-item", item);
9539		},
9540
9541		_renderItem: function (ul, item) {
9542			return $("<li>")
9543				.append($("<div>").text(item.label))
9544				.appendTo(ul);
9545		},
9546
9547		_move: function (direction, event) {
9548			if (!this.menu.element.is(":visible")) {
9549				this.search(null, event);
9550				return;
9551			}
9552			if (this.menu.isFirstItem() && /^previous/.test(direction) ||
9553				this.menu.isLastItem() && /^next/.test(direction)) {
9554
9555				if (!this.isMultiLine) {
9556					this._value(this.term);
9557				}
9558
9559				this.menu.blur();
9560				return;
9561			}
9562			this.menu[direction](event);
9563		},
9564
9565		widget: function () {
9566			return this.menu.element;
9567		},
9568
9569		_value: function () {
9570			return this.valueMethod.apply(this.element, arguments);
9571		},
9572
9573		_keyEvent: function (keyEvent, event) {
9574			if (!this.isMultiLine || this.menu.element.is(":visible")) {
9575				this._move(keyEvent, event);
9576
9577				// Prevents moving cursor to beginning/end of the text field in some browsers
9578				event.preventDefault();
9579			}
9580		},
9581
vendor: 4,339 bytes, lines 9582-9731
9582		// Support: Chrome <=50
9583		// We should be able to just use this.element.prop( "isContentEditable" )
9584		// but hidden elements always report false in Chrome.
9585		// https://code.google.com/p/chromium/issues/detail?id=313082
9586		_isContentEditable: function (element) {
9587			if (!element.length) {
9588				return false;
9589			}
9590
9591			var editable = element.prop("contentEditable");
9592
9593			if (editable === "inherit") {
9594				return this._isContentEditable(element.parent());
9595			}
9596
9597			return editable === "true";
9598		}
9599	});
9600
9601	$.extend($.ui.autocomplete, {
9602		escapeRegex: function (value) {
9603			return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
9604		},
9605		filter: function (array, term) {
9606			var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
9607			return $.grep(array, function (value) {
9608				return matcher.test(value.label || value.value || value);
9609			});
9610		}
9611	});
9612
9613	// Live region extension, adding a `messages` option
9614	// NOTE: This is an experimental API. We are still investigating
9615	// a full solution for string manipulation and internationalization.
9616	$.widget("ui.autocomplete", $.ui.autocomplete, {
9617		options: {
9618			messages: {
9619				noResults: "No search results.",
9620				results: function (amount) {
9621					return amount + (amount > 1 ? " results are" : " result is") +
9622						" available, use up and down arrow keys to navigate.";
9623				}
9624			}
9625		},
9626
9627		__response: function (content) {
9628			var message;
9629			this._superApply(arguments);
9630			if (this.options.disabled || this.cancelSearch) {
9631				return;
9632			}
9633			if (content && content.length) {
9634				message = this.options.messages.results(content.length);
9635			} else {
9636				message = this.options.messages.noResults;
9637			}
9638			clearTimeout(this.liveRegionTimer);
9639			this.liveRegionTimer = this._delay(function () {
9640				this.liveRegion.html($("<div>").text(message));
9641			}, 100);
9642		}
9643	});
9644
9645	var widgetsAutocomplete = $.ui.autocomplete;
9646
9647
9648	/*!
9649	 * jQuery UI Controlgroup 1.13.1
9650	 * http://jqueryui.com
9651	 *
9652	 * Copyright jQuery Foundation and other contributors
9653	 * Released under the MIT license.
9654	 * http://jquery.org/license
9655	 */
9656
9657	//>>label: Controlgroup
9658	//>>group: Widgets
9659	//>>description: Visually groups form control widgets
9660	//>>docs: http://api.jqueryui.com/controlgroup/
9661	//>>demos: http://jqueryui.com/controlgroup/
9662	//>>css.structure: ../../themes/base/core.css
9663	//>>css.structure: ../../themes/base/controlgroup.css
9664	//>>css.theme: ../../themes/base/theme.css
9665
9666
9667	var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
9668
9669	var widgetsControlgroup = $.widget("ui.controlgroup", {
9670		version: "1.13.1",
9671		defaultElement: "<div>",
9672		options: {
9673			direction: "horizontal",
9674			disabled: null,
9675			onlyVisible: true,
9676			items: {
9677				"button": "input[type=button], input[type=submit], input[type=reset], button, a",
9678				"controlgroupLabel": ".ui-controlgroup-label",
9679				"checkboxradio": "input[type='checkbox'], input[type='radio']",
9680				"selectmenu": "select",
9681				"spinner": ".ui-spinner-input"
9682			}
9683		},
9684
9685		_create: function () {
9686			this._enhance();
9687		},
9688
9689		// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
9690		_enhance: function () {
9691			this.element.attr("role", "toolbar");
9692			this.refresh();
9693		},
9694
9695		_destroy: function () {
9696			this._callChildMethod("destroy");
9697			this.childWidgets.removeData("ui-controlgroup-data");
9698			this.element.removeAttr("role");
9699			if (this.options.items.controlgroupLabel) {
9700				this.element
9701					.find(this.options.items.controlgroupLabel)
9702					.find(".ui-controlgroup-label-contents")
9703					.contents().unwrap();
9704			}
9705		},
9706
9707		_initWidgets: function () {
9708			var that = this,
9709				childWidgets = [];
9710
9711			// First we iterate over each of the items options
9712			$.each(this.options.items, function (widget, selector) {
9713				var labels;
9714				var options = {};
9715
9716				// Make sure the widget has a selector set
9717				if (!selector) {
9718					return;
9719				}
9720
9721				if (widget === "controlgroupLabel") {
9722					labels = that.element.find(selector);
9723					labels.each(function () {
9724						var element = $(this);
9725
9726						if (element.children(".ui-controlgroup-label-contents").length) {
9727							return;
9728						}
9729						element.contents()
9730							.wrapAll("<span class='ui-controlgroup-label-contents'></span>");
9731					});
vendor: 4,936 bytes, lines 9732-9888
9732					that._addClass(labels, null, "ui-widget ui-widget-content ui-state-default");
9733					childWidgets = childWidgets.concat(labels.get());
9734					return;
9735				}
9736
9737				// Make sure the widget actually exists
9738				if (!$.fn[widget]) {
9739					return;
9740				}
9741
9742				// We assume everything is in the middle to start because we can't determine
9743				// first / last elements until all enhancments are done.
9744				if (that["_" + widget + "Options"]) {
9745					options = that["_" + widget + "Options"]("middle");
9746				} else {
9747					options = { classes: {} };
9748				}
9749
9750				// Find instances of this widget inside controlgroup and init them
9751				that.element
9752					.find(selector)
9753					.each(function () {
9754						var element = $(this);
9755						var instance = element[widget]("instance");
9756
9757						// We need to clone the default options for this type of widget to avoid
9758						// polluting the variable options which has a wider scope than a single widget.
9759						var instanceOptions = $.widget.extend({}, options);
9760
9761						// If the button is the child of a spinner ignore it
9762						// TODO: Find a more generic solution
9763						if (widget === "button" && element.parent(".ui-spinner").length) {
9764							return;
9765						}
9766
9767						// Create the widget if it doesn't exist
9768						if (!instance) {
9769							instance = element[widget]()[widget]("instance");
9770						}
9771						if (instance) {
9772							instanceOptions.classes =
9773								that._resolveClassesValues(instanceOptions.classes, instance);
9774						}
9775						element[widget](instanceOptions);
9776
9777						// Store an instance of the controlgroup to be able to reference
9778						// from the outermost element for changing options and refresh
9779						var widgetElement = element[widget]("widget");
9780						$.data(widgetElement[0], "ui-controlgroup-data",
9781							instance ? instance : element[widget]("instance"));
9782
9783						childWidgets.push(widgetElement[0]);
9784					});
9785			});
9786
9787			this.childWidgets = $($.uniqueSort(childWidgets));
9788			this._addClass(this.childWidgets, "ui-controlgroup-item");
9789		},
9790
9791		_callChildMethod: function (method) {
9792			this.childWidgets.each(function () {
9793				var element = $(this),
9794					data = element.data("ui-controlgroup-data");
9795				if (data && data[method]) {
9796					data[method]();
9797				}
9798			});
9799		},
9800
9801		_updateCornerClass: function (element, position) {
9802			var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
9803			var add = this._buildSimpleOptions(position, "label").classes.label;
9804
9805			this._removeClass(element, null, remove);
9806			this._addClass(element, null, add);
9807		},
9808
9809		_buildSimpleOptions: function (position, key) {
9810			var direction = this.options.direction === "vertical";
9811			var result = {
9812				classes: {}
9813			};
9814			result.classes[key] = {
9815				"middle": "",
9816				"first": "ui-corner-" + (direction ? "top" : "left"),
9817				"last": "ui-corner-" + (direction ? "bottom" : "right"),
9818				"only": "ui-corner-all"
9819			}[position];
9820
9821			return result;
9822		},
9823
9824		_spinnerOptions: function (position) {
9825			var options = this._buildSimpleOptions(position, "ui-spinner");
9826
9827			options.classes["ui-spinner-up"] = "";
9828			options.classes["ui-spinner-down"] = "";
9829
9830			return options;
9831		},
9832
9833		_buttonOptions: function (position) {
9834			return this._buildSimpleOptions(position, "ui-button");
9835		},
9836
9837		_checkboxradioOptions: function (position) {
9838			return this._buildSimpleOptions(position, "ui-checkboxradio-label");
9839		},
9840
9841		_selectmenuOptions: function (position) {
9842			var direction = this.options.direction === "vertical";
9843			return {
9844				width: direction ? "auto" : false,
9845				classes: {
9846					middle: {
9847						"ui-selectmenu-button-open": "",
9848						"ui-selectmenu-button-closed": ""
9849					},
9850					first: {
9851						"ui-selectmenu-button-open": "ui-corner-" + (direction ? "top" : "tl"),
9852						"ui-selectmenu-button-closed": "ui-corner-" + (direction ? "top" : "left")
9853					},
9854					last: {
9855						"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
9856						"ui-selectmenu-button-closed": "ui-corner-" + (direction ? "bottom" : "right")
9857					},
9858					only: {
9859						"ui-selectmenu-button-open": "ui-corner-top",
9860						"ui-selectmenu-button-closed": "ui-corner-all"
9861					}
9862
9863				}[position]
9864			};
9865		},
9866
9867		_resolveClassesValues: function (classes, instance) {
9868			var result = {};
9869			$.each(classes, function (key) {
9870				var current = instance.options.classes[key] || "";
9871				current = String.prototype.trim.call(current.replace(controlgroupCornerRegex, ""));
9872				result[key] = (current + " " + classes[key]).replace(/\s+/g, " ");
9873			});
9874			return result;
9875		},
9876
9877		_setOption: function (key, value) {
9878			if (key === "direction") {
9879				this._removeClass("ui-controlgroup-" + this.options.direction);
9880			}
9881
9882			this._super(key, value);
9883			if (key === "disabled") {
9884				this._callChildMethod(value ? "disable" : "enable");
9885				return;
9886			}
9887
9888			this.refresh();
vendor: 4,850 bytes, lines 9889-10048
9889		},
9890
9891		refresh: function () {
9892			var children,
9893				that = this;
9894
9895			this._addClass("ui-controlgroup ui-controlgroup-" + this.options.direction);
9896
9897			if (this.options.direction === "horizontal") {
9898				this._addClass(null, "ui-helper-clearfix");
9899			}
9900			this._initWidgets();
9901
9902			children = this.childWidgets;
9903
9904			// We filter here because we need to track all childWidgets not just the visible ones
9905			if (this.options.onlyVisible) {
9906				children = children.filter(":visible");
9907			}
9908
9909			if (children.length) {
9910
9911				// We do this last because we need to make sure all enhancment is done
9912				// before determining first and last
9913				$.each(["first", "last"], function (index, value) {
9914					var instance = children[value]().data("ui-controlgroup-data");
9915
9916					if (instance && that["_" + instance.widgetName + "Options"]) {
9917						var options = that["_" + instance.widgetName + "Options"](
9918							children.length === 1 ? "only" : value
9919						);
9920						options.classes = that._resolveClassesValues(options.classes, instance);
9921						instance.element[instance.widgetName](options);
9922					} else {
9923						that._updateCornerClass(children[value](), value);
9924					}
9925				});
9926
9927				// Finally call the refresh method on each of the child widgets.
9928				this._callChildMethod("refresh");
9929			}
9930		}
9931	});
9932
9933	/*!
9934	 * jQuery UI Checkboxradio 1.13.1
9935	 * http://jqueryui.com
9936	 *
9937	 * Copyright jQuery Foundation and other contributors
9938	 * Released under the MIT license.
9939	 * http://jquery.org/license
9940	 */
9941
9942	//>>label: Checkboxradio
9943	//>>group: Widgets
9944	//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
9945	//>>docs: http://api.jqueryui.com/checkboxradio/
9946	//>>demos: http://jqueryui.com/checkboxradio/
9947	//>>css.structure: ../../themes/base/core.css
9948	//>>css.structure: ../../themes/base/button.css
9949	//>>css.structure: ../../themes/base/checkboxradio.css
9950	//>>css.theme: ../../themes/base/theme.css
9951
9952
9953	$.widget("ui.checkboxradio", [$.ui.formResetMixin, {
9954		version: "1.13.1",
9955		options: {
9956			disabled: null,
9957			label: null,
9958			icon: true,
9959			classes: {
9960				"ui-checkboxradio-label": "ui-corner-all",
9961				"ui-checkboxradio-icon": "ui-corner-all"
9962			}
9963		},
9964
9965		_getCreateOptions: function () {
9966			var disabled, labels;
9967			var that = this;
9968			var options = this._super() || {};
9969
9970			// We read the type here, because it makes more sense to throw a element type error first,
9971			// rather then the error for lack of a label. Often if its the wrong type, it
9972			// won't have a label (e.g. calling on a div, btn, etc)
9973			this._readType();
9974
9975			labels = this.element.labels();
9976
9977			// If there are multiple labels, use the last one
9978			this.label = $(labels[labels.length - 1]);
9979			if (!this.label.length) {
9980				$.error("No label found for checkboxradio widget");
9981			}
9982
9983			this.originalLabel = "";
9984
9985			// We need to get the label text but this may also need to make sure it does not contain the
9986			// input itself.
9987			this.label.contents().not(this.element[0]).each(function () {
9988
9989				// The label contents could be text, html, or a mix. We concat each element to get a
9990				// string representation of the label, without the input as part of it.
9991				that.originalLabel += this.nodeType === 3 ? $(this).text() : this.outerHTML;
9992			});
9993
9994			// Set the label option if we found label text
9995			if (this.originalLabel) {
9996				options.label = this.originalLabel;
9997			}
9998
9999			disabled = this.element[0].disabled;
10000			if (disabled != null) {
10001				options.disabled = disabled;
10002			}
10003			return options;
10004		},
10005
10006		_create: function () {
10007			var checked = this.element[0].checked;
10008
10009			this._bindFormResetHandler();
10010
10011			if (this.options.disabled == null) {
10012				this.options.disabled = this.element[0].disabled;
10013			}
10014
10015			this._setOption("disabled", this.options.disabled);
10016			this._addClass("ui-checkboxradio", "ui-helper-hidden-accessible");
10017			this._addClass(this.label, "ui-checkboxradio-label", "ui-button ui-widget");
10018
10019			if (this.type === "radio") {
10020				this._addClass(this.label, "ui-checkboxradio-radio-label");
10021			}
10022
10023			if (this.options.label && this.options.label !== this.originalLabel) {
10024				this._updateLabel();
10025			} else if (this.originalLabel) {
10026				this.options.label = this.originalLabel;
10027			}
10028
10029			this._enhance();
10030
10031			if (checked) {
10032				this._addClass(this.label, "ui-checkboxradio-checked", "ui-state-active");
10033			}
10034
10035			this._on({
10036				change: "_toggleClasses",
10037				focus: function () {
10038					this._addClass(this.label, null, "ui-state-focus ui-visual-focus");
10039				},
10040				blur: function () {
10041					this._removeClass(this.label, null, "ui-state-focus ui-visual-focus");
10042				}
10043			});
10044		},
10045
10046		_readType: function () {
10047			var nodeName = this.element[0].nodeName.toLowerCase();
10048			this.type = this.element[0].type;
vendor: 2,386 bytes, lines 10049-10142
10049			if (nodeName !== "input" || !/radio|checkbox/.test(this.type)) {
10050				$.error("Can't create checkboxradio on element.nodeName=" + nodeName +
10051					" and element.type=" + this.type);
10052			}
10053		},
10054
10055		// Support jQuery Mobile enhanced option
10056		_enhance: function () {
10057			this._updateIcon(this.element[0].checked);
10058		},
10059
10060		widget: function () {
10061			return this.label;
10062		},
10063
10064		_getRadioGroup: function () {
10065			var group;
10066			var name = this.element[0].name;
10067			var nameSelector = "input[name='" + $.escapeSelector(name) + "']";
10068
10069			if (!name) {
10070				return $([]);
10071			}
10072
10073			if (this.form.length) {
10074				group = $(this.form[0].elements).filter(nameSelector);
10075			} else {
10076
10077				// Not inside a form, check all inputs that also are not inside a form
10078				group = $(nameSelector).filter(function () {
10079					return $(this)._form().length === 0;
10080				});
10081			}
10082
10083			return group.not(this.element);
10084		},
10085
10086		_toggleClasses: function () {
10087			var checked = this.element[0].checked;
10088			this._toggleClass(this.label, "ui-checkboxradio-checked", "ui-state-active", checked);
10089
10090			if (this.options.icon && this.type === "checkbox") {
10091				this._toggleClass(this.icon, null, "ui-icon-check ui-state-checked", checked)
10092					._toggleClass(this.icon, null, "ui-icon-blank", !checked);
10093			}
10094
10095			if (this.type === "radio") {
10096				this._getRadioGroup()
10097					.each(function () {
10098						var instance = $(this).checkboxradio("instance");
10099
10100						if (instance) {
10101							instance._removeClass(instance.label,
10102								"ui-checkboxradio-checked", "ui-state-active");
10103						}
10104					});
10105			}
10106		},
10107
10108		_destroy: function () {
10109			this._unbindFormResetHandler();
10110
10111			if (this.icon) {
10112				this.icon.remove();
10113				this.iconSpace.remove();
10114			}
10115		},
10116
10117		_setOption: function (key, value) {
10118
10119			// We don't allow the value to be set to nothing
10120			if (key === "label" && !value) {
10121				return;
10122			}
10123
10124			this._super(key, value);
10125
10126			if (key === "disabled") {
10127				this._toggleClass(this.label, null, "ui-state-disabled", value);
10128				this.element[0].disabled = value;
10129
10130				// Don't refresh when setting disabled
10131				return;
10132			}
10133			this.refresh();
10134		},
10135
10136		_updateIcon: function (checked) {
10137			var toAdd = "ui-icon ui-icon-background ";
10138
10139			if (this.options.icon) {
10140				if (!this.icon) {
10141					this.icon = $("<span>");
10142					this.iconSpace = $("<span> </span>");
vendor: 5,778 bytes, lines 10143-10349
10143					this._addClass(this.iconSpace, "ui-checkboxradio-icon-space");
10144				}
10145
10146				if (this.type === "checkbox") {
10147					toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
10148					this._removeClass(this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check");
10149				} else {
10150					toAdd += "ui-icon-blank";
10151				}
10152				this._addClass(this.icon, "ui-checkboxradio-icon", toAdd);
10153				if (!checked) {
10154					this._removeClass(this.icon, null, "ui-icon-check ui-state-checked");
10155				}
10156				this.icon.prependTo(this.label).after(this.iconSpace);
10157			} else if (this.icon !== undefined) {
10158				this.icon.remove();
10159				this.iconSpace.remove();
10160				delete this.icon;
10161			}
10162		},
10163
10164		_updateLabel: function () {
10165
10166			// Remove the contents of the label ( minus the icon, icon space, and input )
10167			var contents = this.label.contents().not(this.element[0]);
10168			if (this.icon) {
10169				contents = contents.not(this.icon[0]);
10170			}
10171			if (this.iconSpace) {
10172				contents = contents.not(this.iconSpace[0]);
10173			}
10174			contents.remove();
10175
10176			this.label.append(this.options.label);
10177		},
10178
10179		refresh: function () {
10180			var checked = this.element[0].checked,
10181				isDisabled = this.element[0].disabled;
10182
10183			this._updateIcon(checked);
10184			this._toggleClass(this.label, "ui-checkboxradio-checked", "ui-state-active", checked);
10185			if (this.options.label !== null) {
10186				this._updateLabel();
10187			}
10188
10189			if (isDisabled !== this.options.disabled) {
10190				this._setOptions({ "disabled": isDisabled });
10191			}
10192		}
10193
10194	}]);
10195
10196	var widgetsCheckboxradio = $.ui.checkboxradio;
10197
10198
10199	/*!
10200	 * jQuery UI Button 1.13.1
10201	 * http://jqueryui.com
10202	 *
10203	 * Copyright jQuery Foundation and other contributors
10204	 * Released under the MIT license.
10205	 * http://jquery.org/license
10206	 */
10207
10208	//>>label: Button
10209	//>>group: Widgets
10210	//>>description: Enhances a form with themeable buttons.
10211	//>>docs: http://api.jqueryui.com/button/
10212	//>>demos: http://jqueryui.com/button/
10213	//>>css.structure: ../../themes/base/core.css
10214	//>>css.structure: ../../themes/base/button.css
10215	//>>css.theme: ../../themes/base/theme.css
10216
10217
10218	$.widget("ui.button", {
10219		version: "1.13.1",
10220		defaultElement: "<button>",
10221		options: {
10222			classes: {
10223				"ui-button": "ui-corner-all"
10224			},
10225			disabled: null,
10226			icon: null,
10227			iconPosition: "beginning",
10228			label: null,
10229			showLabel: true
10230		},
10231
10232		_getCreateOptions: function () {
10233			var disabled,
10234
10235				// This is to support cases like in jQuery Mobile where the base widget does have
10236				// an implementation of _getCreateOptions
10237				options = this._super() || {};
10238
10239			this.isInput = this.element.is("input");
10240
10241			disabled = this.element[0].disabled;
10242			if (disabled != null) {
10243				options.disabled = disabled;
10244			}
10245
10246			this.originalLabel = this.isInput ? this.element.val() : this.element.html();
10247			if (this.originalLabel) {
10248				options.label = this.originalLabel;
10249			}
10250
10251			return options;
10252		},
10253
10254		_create: function () {
10255			if (!this.option.showLabel & !this.options.icon) {
10256				this.options.showLabel = true;
10257			}
10258
10259			// We have to check the option again here even though we did in _getCreateOptions,
10260			// because null may have been passed on init which would override what was set in
10261			// _getCreateOptions
10262			if (this.options.disabled == null) {
10263				this.options.disabled = this.element[0].disabled || false;
10264			}
10265
10266			this.hasTitle = !!this.element.attr("title");
10267
10268			// Check to see if the label needs to be set or if its already correct
10269			if (this.options.label && this.options.label !== this.originalLabel) {
10270				if (this.isInput) {
10271					this.element.val(this.options.label);
10272				} else {
10273					this.element.html(this.options.label);
10274				}
10275			}
10276			this._addClass("ui-button", "ui-widget");
10277			this._setOption("disabled", this.options.disabled);
10278			this._enhance();
10279
10280			if (this.element.is("a")) {
10281				this._on({
10282					"keyup": function (event) {
10283						if (event.keyCode === $.ui.keyCode.SPACE) {
10284							event.preventDefault();
10285
10286							// Support: PhantomJS <= 1.9, IE 8 Only
10287							// If a native click is available use it so we actually cause navigation
10288							// otherwise just trigger a click event
10289							if (this.element[0].click) {
10290								this.element[0].click();
10291							} else {
10292								this.element.trigger("click");
10293							}
10294						}
10295					}
10296				});
10297			}
10298		},
10299
10300		_enhance: function () {
10301			if (!this.element.is("button")) {
10302				this.element.attr("role", "button");
10303			}
10304
10305			if (this.options.icon) {
10306				this._updateIcon("icon", this.options.icon);
10307				this._updateTooltip();
10308			}
10309		},
10310
10311		_updateTooltip: function () {
10312			this.title = this.element.attr("title");
10313
10314			if (!this.options.showLabel && !this.title) {
10315				this.element.attr("title", this.options.label);
10316			}
10317		},
10318
10319		_updateIcon: function (option, value) {
10320			var icon = option !== "iconPosition",
10321				position = icon ? this.options.iconPosition : value,
10322				displayBlock = position === "top" || position === "bottom";
10323
10324			// Create icon
10325			if (!this.icon) {
10326				this.icon = $("<span>");
10327
10328				this._addClass(this.icon, "ui-button-icon", "ui-icon");
10329
10330				if (!this.options.showLabel) {
10331					this._addClass("ui-button-icon-only");
10332				}
10333			} else if (icon) {
10334
10335				// If we are updating the icon remove the old icon class
10336				this._removeClass(this.icon, null, this.options.icon);
10337			}
10338
10339			// If we are updating the icon add the new icon class
10340			if (icon) {
10341				this._addClass(this.icon, null, value);
10342			}
10343
10344			this._attachIcon(position);
10345
10346			// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
10347			// the iconSpace if there is one.
10348			if (displayBlock) {
10349				this._addClass(this.icon, null, "ui-widget-icon-block");
vendor: 6,075 bytes, lines 10350-10567
10350				if (this.iconSpace) {
10351					this.iconSpace.remove();
10352				}
10353			} else {
10354
10355				// Position is beginning or end so remove the ui-widget-icon-block class and add the
10356				// space if it does not exist
10357				if (!this.iconSpace) {
10358					this.iconSpace = $("<span> </span>");
10359					this._addClass(this.iconSpace, "ui-button-icon-space");
10360				}
10361				this._removeClass(this.icon, null, "ui-wiget-icon-block");
10362				this._attachIconSpace(position);
10363			}
10364		},
10365
10366		_destroy: function () {
10367			this.element.removeAttr("role");
10368
10369			if (this.icon) {
10370				this.icon.remove();
10371			}
10372			if (this.iconSpace) {
10373				this.iconSpace.remove();
10374			}
10375			if (!this.hasTitle) {
10376				this.element.removeAttr("title");
10377			}
10378		},
10379
10380		_attachIconSpace: function (iconPosition) {
10381			this.icon[/^(?:end|bottom)/.test(iconPosition) ? "before" : "after"](this.iconSpace);
10382		},
10383
10384		_attachIcon: function (iconPosition) {
10385			this.element[/^(?:end|bottom)/.test(iconPosition) ? "append" : "prepend"](this.icon);
10386		},
10387
10388		_setOptions: function (options) {
10389			var newShowLabel = options.showLabel === undefined ?
10390				this.options.showLabel :
10391				options.showLabel,
10392				newIcon = options.icon === undefined ? this.options.icon : options.icon;
10393
10394			if (!newShowLabel && !newIcon) {
10395				options.showLabel = true;
10396			}
10397			this._super(options);
10398		},
10399
10400		_setOption: function (key, value) {
10401			if (key === "icon") {
10402				if (value) {
10403					this._updateIcon(key, value);
10404				} else if (this.icon) {
10405					this.icon.remove();
10406					if (this.iconSpace) {
10407						this.iconSpace.remove();
10408					}
10409				}
10410			}
10411
10412			if (key === "iconPosition") {
10413				this._updateIcon(key, value);
10414			}
10415
10416			// Make sure we can't end up with a button that has neither text nor icon
10417			if (key === "showLabel") {
10418				this._toggleClass("ui-button-icon-only", null, !value);
10419				this._updateTooltip();
10420			}
10421
10422			if (key === "label") {
10423				if (this.isInput) {
10424					this.element.val(value);
10425				} else {
10426
10427					// If there is an icon, append it, else nothing then append the value
10428					// this avoids removal of the icon when setting label text
10429					this.element.html(value);
10430					if (this.icon) {
10431						this._attachIcon(this.options.iconPosition);
10432						this._attachIconSpace(this.options.iconPosition);
10433					}
10434				}
10435			}
10436
10437			this._super(key, value);
10438
10439			if (key === "disabled") {
10440				this._toggleClass(null, "ui-state-disabled", value);
10441				this.element[0].disabled = value;
10442				if (value) {
10443					this.element.trigger("blur");
10444				}
10445			}
10446		},
10447
10448		refresh: function () {
10449
10450			// Make sure to only check disabled if its an element that supports this otherwise
10451			// check for the disabled class to determine state
10452			var isDisabled = this.element.is("input, button") ?
10453				this.element[0].disabled : this.element.hasClass("ui-button-disabled");
10454
10455			if (isDisabled !== this.options.disabled) {
10456				this._setOptions({ disabled: isDisabled });
10457			}
10458
10459			this._updateTooltip();
10460		}
10461	});
10462
10463	// DEPRECATED
10464	if ($.uiBackCompat !== false) {
10465
10466		// Text and Icons options
10467		$.widget("ui.button", $.ui.button, {
10468			options: {
10469				text: true,
10470				icons: {
10471					primary: null,
10472					secondary: null
10473				}
10474			},
10475
10476			_create: function () {
10477				if (this.options.showLabel && !this.options.text) {
10478					this.options.showLabel = this.options.text;
10479				}
10480				if (!this.options.showLabel && this.options.text) {
10481					this.options.text = this.options.showLabel;
10482				}
10483				if (!this.options.icon && (this.options.icons.primary ||
10484					this.options.icons.secondary)) {
10485					if (this.options.icons.primary) {
10486						this.options.icon = this.options.icons.primary;
10487					} else {
10488						this.options.icon = this.options.icons.secondary;
10489						this.options.iconPosition = "end";
10490					}
10491				} else if (this.options.icon) {
10492					this.options.icons.primary = this.options.icon;
10493				}
10494				this._super();
10495			},
10496
10497			_setOption: function (key, value) {
10498				if (key === "text") {
10499					this._super("showLabel", value);
10500					return;
10501				}
10502				if (key === "showLabel") {
10503					this.options.text = value;
10504				}
10505				if (key === "icon") {
10506					this.options.icons.primary = value;
10507				}
10508				if (key === "icons") {
10509					if (value.primary) {
10510						this._super("icon", value.primary);
10511						this._super("iconPosition", "beginning");
10512					} else if (value.secondary) {
10513						this._super("icon", value.secondary);
10514						this._super("iconPosition", "end");
10515					}
10516				}
10517				this._superApply(arguments);
10518			}
10519		});
10520
10521		$.fn.button = (function (orig) {
10522			return function (options) {
10523				var isMethodCall = typeof options === "string";
10524				var args = Array.prototype.slice.call(arguments, 1);
10525				var returnValue = this;
10526
10527				if (isMethodCall) {
10528
10529					// If this is an empty collection, we need to have the instance method
10530					// return undefined instead of the jQuery instance
10531					if (!this.length && options === "instance") {
10532						returnValue = undefined;
10533					} else {
10534						this.each(function () {
10535							var methodValue;
10536							var type = $(this).attr("type");
10537							var name = type !== "checkbox" && type !== "radio" ?
10538								"button" :
10539								"checkboxradio";
10540							var instance = $.data(this, "ui-" + name);
10541
10542							if (options === "instance") {
10543								returnValue = instance;
10544								return false;
10545							}
10546
10547							if (!instance) {
10548								return $.error("cannot call methods on button" +
10549									" prior to initialization; " +
10550									"attempted to call method '" + options + "'");
10551							}
10552
10553							if (typeof instance[options] !== "function" ||
10554								options.charAt(0) === "_") {
10555								return $.error("no such method '" + options + "' for button" +
10556									" widget instance");
10557							}
10558
10559							methodValue = instance[options].apply(instance, args);
10560
10561							if (methodValue !== instance && methodValue !== undefined) {
10562								returnValue = methodValue && methodValue.jquery ?
10563									returnValue.pushStack(methodValue.get()) :
10564									methodValue;
10565								return false;
10566							}
10567						});
vendor: 5,001 bytes, lines 10568-10699
10568					}
10569				} else {
10570
10571					// Allow multiple hashes to be passed on init
10572					if (args.length) {
10573						options = $.widget.extend.apply(null, [options].concat(args));
10574					}
10575
10576					this.each(function () {
10577						var type = $(this).attr("type");
10578						var name = type !== "checkbox" && type !== "radio" ? "button" : "checkboxradio";
10579						var instance = $.data(this, "ui-" + name);
10580
10581						if (instance) {
10582							instance.option(options || {});
10583							if (instance._init) {
10584								instance._init();
10585							}
10586						} else {
10587							if (name === "button") {
10588								orig.call($(this), options);
10589								return;
10590							}
10591
10592							$(this).checkboxradio($.extend({ icon: false }, options));
10593						}
10594					});
10595				}
10596
10597				return returnValue;
10598			};
10599		})($.fn.button);
10600
10601		$.fn.buttonset = function () {
10602			if (!$.ui.controlgroup) {
10603				$.error("Controlgroup widget missing");
10604			}
10605			if (arguments[0] === "option" && arguments[1] === "items" && arguments[2]) {
10606				return this.controlgroup.apply(this,
10607					[arguments[0], "items.button", arguments[2]]);
10608			}
10609			if (arguments[0] === "option" && arguments[1] === "items") {
10610				return this.controlgroup.apply(this, [arguments[0], "items.button"]);
10611			}
10612			if (typeof arguments[0] === "object" && arguments[0].items) {
10613				arguments[0].items = {
10614					button: arguments[0].items
10615				};
10616			}
10617			return this.controlgroup.apply(this, arguments);
10618		};
10619	}
10620
10621	var widgetsButton = $.ui.button;
10622
10623
10624	/* eslint-disable max-len, camelcase */
10625	/*!
10626	 * jQuery UI Datepicker 1.13.1
10627	 * http://jqueryui.com
10628	 *
10629	 * Copyright jQuery Foundation and other contributors
10630	 * Released under the MIT license.
10631	 * http://jquery.org/license
10632	 */
10633
10634	//>>label: Datepicker
10635	//>>group: Widgets
10636	//>>description: Displays a calendar from an input or inline for selecting dates.
10637	//>>docs: http://api.jqueryui.com/datepicker/
10638	//>>demos: http://jqueryui.com/datepicker/
10639	//>>css.structure: ../../themes/base/core.css
10640	//>>css.structure: ../../themes/base/datepicker.css
10641	//>>css.theme: ../../themes/base/theme.css
10642
10643
10644	$.extend($.ui, { datepicker: { version: "1.13.1" } });
10645
10646	var datepicker_instActive;
10647
10648	function datepicker_getZindex(elem) {
10649		var position, value;
10650		while (elem.length && elem[0] !== document) {
10651
10652			// Ignore z-index if position is set to a value where z-index is ignored by the browser
10653			// This makes behavior of this function consistent across browsers
10654			// WebKit always returns auto if the element is positioned
10655			position = elem.css("position");
10656			if (position === "absolute" || position === "relative" || position === "fixed") {
10657
10658				// IE returns 0 when zIndex is not specified
10659				// other browsers return a string
10660				// we ignore the case of nested elements with an explicit value of 0
10661				// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
10662				value = parseInt(elem.css("zIndex"), 10);
10663				if (!isNaN(value) && value !== 0) {
10664					return value;
10665				}
10666			}
10667			elem = elem.parent();
10668		}
10669
10670		return 0;
10671	}
10672
10673	/* Date picker manager.
10674	   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
10675	   Settings for (groups of) date pickers are maintained in an instance object,
10676	   allowing multiple different settings on the same page. */
10677
10678	function Datepicker() {
10679		this._curInst = null; // The current instance in use
10680		this._keyEvent = false; // If the last event was a key event
10681		this._disabledInputs = []; // List of date picker inputs that have been disabled
10682		this._datepickerShowing = false; // True if the popup picker is showing , false if not
10683		this._inDialog = false; // True if showing within a "dialog", false if not
10684		this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
10685		this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
10686		this._appendClass = "ui-datepicker-append"; // The name of the append marker class
10687		this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
10688		this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
10689		this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
10690		this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
10691		this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
10692		this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
10693		this.regional = []; // Available regional settings, indexed by language code
10694		this.regional[""] = { // Default regional settings
10695			closeText: "Done", // Display text for close link
10696			prevText: "Prev", // Display text for previous month link
10697			nextText: "Next", // Display text for next month link
10698			currentText: "Today", // Display text for current month link
10699			monthNames: ["January", "February", "March", "April", "May", "June",
10700				"July", "August", "September", "October", "November", "December"], // Names of months for drop-down and formatting
10701			monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
10702			dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
10703			dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
10704			dayNamesMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], // Column headings for days starting at Sunday
10705			weekHeader: "Wk", // Column header for week of the year
10706			dateFormat: "mm/dd/yy", // See format options on parseDate
10707			firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
10708			isRTL: false, // True if right-to-left language, false if left-to-right
10709			showMonthAfterYear: false, // True if the year select precedes month, false for month then year
10710			yearSuffix: "", // Additional text to append to the year in the month headers,
10711			selectMonthLabel: "Select month", // Invisible label for month selector
10712			selectYearLabel: "Select year" // Invisible label for year selector
10713		};
10714		this._defaults = { // Global defaults for all the date picker instances
10715			showOn: "focus", // "focus" for popup on focus,
10716			// "button" for trigger button, or "both" for either
10717			showAnim: "fadeIn", // Name of jQuery animation for popup
10718			showOptions: {}, // Options for enhanced animations
10719			defaultDate: null, // Used when field is blank: actual date,
10720			// +/-number for offset from today, null for today
10721			appendText: "", // Display text following the input box, e.g. showing the format
10722			buttonText: "...", // Text for trigger button
10723			buttonImage: "", // URL for trigger button image
10724			buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
10725			hideIfNoPrevNext: false, // True to hide next/previous month links
10726			// if not applicable, false to just disable them
10727			navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
10728			gotoCurrent: false, // True if today link goes back to current selection instead
10729			changeMonth: false, // True if month can be selected directly, false if only prev/next
10730			changeYear: false, // True if year can be selected directly, false if only prev/next
10731			yearRange: "c-10:c+10", // Range of years to display in drop-down,
10732			// either relative to today's year (-nn:+nn), relative to currently displayed year
10733			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
10734			showOtherMonths: false, // True to show dates in other months, false to leave blank
10735			selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
10736			showWeek: false, // True to show week of the year, false to not show it
10737			calculateWeek: this.iso8601Week, // How to calculate the week of the year,
10738			// takes a Date and returns the number of the week for it
10739			shortYearCutoff: "+10", // Short year values < this are in the current century,
10740			// > this are in the previous century,
10741			// string value starting with "+" for current year + value
10742			minDate: null, // The earliest selectable date, or null for no limit
10743			maxDate: null, // The latest selectable date, or null for no limit
10744			duration: "fast", // Duration of display/closure
10745			beforeShowDay: null, // Function that takes a date and returns an array with
10746			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
10747			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
10748			beforeShow: null, // Function that takes an input field and
10749			// returns a set of custom settings for the date picker
10750			onSelect: null, // Define a callback function when a date is selected
10751			onChangeMonthYear: null, // Define a callback function when the month or year is changed
10752			onClose: null, // Define a callback function when the datepicker is closed
vendor: 10,578 bytes, lines 10753-11033
10753			onUpdateDatepicker: null, // Define a callback function when the datepicker is updated
10754			numberOfMonths: 1, // Number of months to show at a time
10755			showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
10756			stepMonths: 1, // Number of months to step back/forward
10757			stepBigMonths: 12, // Number of months to step back/forward for the big links
10758			altField: "", // Selector for an alternate field to store selected dates into
10759			altFormat: "", // The date format to use for the alternate field
10760			constrainInput: true, // The input is constrained by the current date format
10761			showButtonPanel: false, // True to show button panel, false to not show it
10762			autoSize: false, // True to size the input for the date format, false to leave as is
10763			disabled: false // The initial disabled state
10764		};
10765		$.extend(this._defaults, this.regional[""]);
10766		this.regional.en = $.extend(true, {}, this.regional[""]);
10767		this.regional["en-US"] = $.extend(true, {}, this.regional.en);
10768		this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
10769	}
10770
10771	$.extend(Datepicker.prototype, {
10772
10773		/* Class name added to elements to indicate already configured with a date picker. */
10774		markerClassName: "hasDatepicker",
10775
10776		//Keep track of the maximum number of rows displayed (see #7043)
10777		maxRows: 4,
10778
10779		// TODO rename to "widget" when switching to widget factory
10780		_widgetDatepicker: function () {
10781			return this.dpDiv;
10782		},
10783
10784		/* Override the default settings for all instances of the date picker.
10785		 * @param  settings  object - the new settings to use as defaults (anonymous object)
10786		 * @return the manager object
10787		 */
10788		setDefaults: function (settings) {
10789			datepicker_extendRemove(this._defaults, settings || {});
10790			return this;
10791		},
10792
10793		/* Attach the date picker to a jQuery selection.
10794		 * @param  target	element - the target input field or division or span
10795		 * @param  settings  object - the new settings to use for this date picker instance (anonymous)
10796		 */
10797		_attachDatepicker: function (target, settings) {
10798			var nodeName, inline, inst;
10799			nodeName = target.nodeName.toLowerCase();
10800			inline = (nodeName === "div" || nodeName === "span");
10801			if (!target.id) {
10802				this.uuid += 1;
10803				target.id = "dp" + this.uuid;
10804			}
10805			inst = this._newInst($(target), inline);
10806			inst.settings = $.extend({}, settings || {});
10807			if (nodeName === "input") {
10808				this._connectDatepicker(target, inst);
10809			} else if (inline) {
10810				this._inlineDatepicker(target, inst);
10811			}
10812		},
10813
10814		/* Create a new instance object. */
10815		_newInst: function (target, inline) {
10816			var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
10817			return {
10818				id: id, input: target, // associated target
10819				selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
10820				drawMonth: 0, drawYear: 0, // month being drawn
10821				inline: inline, // is datepicker inline or not
10822				dpDiv: (!inline ? this.dpDiv : // presentation div
10823					datepicker_bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))
10824			};
10825		},
10826
10827		/* Attach the date picker to an input field. */
10828		_connectDatepicker: function (target, inst) {
10829			var input = $(target);
10830			inst.append = $([]);
10831			inst.trigger = $([]);
10832			if (input.hasClass(this.markerClassName)) {
10833				return;
10834			}
10835			this._attachments(input, inst);
10836			input.addClass(this.markerClassName).on("keydown", this._doKeyDown).
10837				on("keypress", this._doKeyPress).on("keyup", this._doKeyUp);
10838			this._autoSize(inst);
10839			$.data(target, "datepicker", inst);
10840
10841			//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
10842			if (inst.settings.disabled) {
10843				this._disableDatepicker(target);
10844			}
10845		},
10846
10847		/* Make attachments based on settings. */
10848		_attachments: function (input, inst) {
10849			var showOn, buttonText, buttonImage,
10850				appendText = this._get(inst, "appendText"),
10851				isRTL = this._get(inst, "isRTL");
10852
10853			if (inst.append) {
10854				inst.append.remove();
10855			}
10856			if (appendText) {
10857				inst.append = $("<span>")
10858					.addClass(this._appendClass)
10859					.text(appendText);
10860				input[isRTL ? "before" : "after"](inst.append);
10861			}
10862
10863			input.off("focus", this._showDatepicker);
10864
10865			if (inst.trigger) {
10866				inst.trigger.remove();
10867			}
10868
10869			showOn = this._get(inst, "showOn");
10870			if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
10871				input.on("focus", this._showDatepicker);
10872			}
10873			if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
10874				buttonText = this._get(inst, "buttonText");
10875				buttonImage = this._get(inst, "buttonImage");
10876
10877				if (this._get(inst, "buttonImageOnly")) {
10878					inst.trigger = $("<img>")
10879						.addClass(this._triggerClass)
10880						.attr({
10881							src: buttonImage,
10882							alt: buttonText,
10883							title: buttonText
10884						});
10885				} else {
10886					inst.trigger = $("<button type='button'>")
10887						.addClass(this._triggerClass);
10888					if (buttonImage) {
10889						inst.trigger.html(
10890							$("<img>")
10891								.attr({
10892									src: buttonImage,
10893									alt: buttonText,
10894									title: buttonText
10895								})
10896						);
10897					} else {
10898						inst.trigger.text(buttonText);
10899					}
10900				}
10901
10902				input[isRTL ? "before" : "after"](inst.trigger);
10903				inst.trigger.on("click", function () {
10904					if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
10905						$.datepicker._hideDatepicker();
10906					} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
10907						$.datepicker._hideDatepicker();
10908						$.datepicker._showDatepicker(input[0]);
10909					} else {
10910						$.datepicker._showDatepicker(input[0]);
10911					}
10912					return false;
10913				});
10914			}
10915		},
10916
10917		/* Apply the maximum length for the date format. */
10918		_autoSize: function (inst) {
10919			if (this._get(inst, "autoSize") && !inst.inline) {
10920				var findMax, max, maxI, i,
10921					date = new Date(2009, 12 - 1, 20), // Ensure double digits
10922					dateFormat = this._get(inst, "dateFormat");
10923
10924				if (dateFormat.match(/[DM]/)) {
10925					findMax = function (names) {
10926						max = 0;
10927						maxI = 0;
10928						for (i = 0; i < names.length; i++) {
10929							if (names[i].length > max) {
10930								max = names[i].length;
10931								maxI = i;
10932							}
10933						}
10934						return maxI;
10935					};
10936					date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
10937						"monthNames" : "monthNamesShort"))));
10938					date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
10939						"dayNames" : "dayNamesShort"))) + 20 - date.getDay());
10940				}
10941				inst.input.attr("size", this._formatDate(inst, date).length);
10942			}
10943		},
10944
10945		/* Attach an inline date picker to a div. */
10946		_inlineDatepicker: function (target, inst) {
10947			var divSpan = $(target);
10948			if (divSpan.hasClass(this.markerClassName)) {
10949				return;
10950			}
10951			divSpan.addClass(this.markerClassName).append(inst.dpDiv);
10952			$.data(target, "datepicker", inst);
10953			this._setDate(inst, this._getDefaultDate(inst), true);
10954			this._updateDatepicker(inst);
10955			this._updateAlternate(inst);
10956
10957			//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
10958			if (inst.settings.disabled) {
10959				this._disableDatepicker(target);
10960			}
10961
10962			// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
10963			// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
10964			inst.dpDiv.css("display", "block");
10965		},
10966
10967		/* Pop-up the date picker in a "dialog" box.
10968		 * @param  input element - ignored
10969		 * @param  date	string or Date - the initial date to display
10970		 * @param  onSelect  function - the function to call when a date is selected
10971		 * @param  settings  object - update the dialog date picker instance's settings (anonymous object)
10972		 * @param  pos int[2] - coordinates for the dialog's position within the screen or
10973		 *					event - with x/y coordinates or
10974		 *					leave empty for default (screen centre)
10975		 * @return the manager object
10976		 */
10977		_dialogDatepicker: function (input, date, onSelect, settings, pos) {
10978			var id, browserWidth, browserHeight, scrollX, scrollY,
10979				inst = this._dialogInst; // internal instance
10980
10981			if (!inst) {
10982				this.uuid += 1;
10983				id = "dp" + this.uuid;
10984				this._dialogInput = $("<input type='text' id='" + id +
10985					"' style='position: absolute; top: -100px; width: 0px;'/>");
10986				this._dialogInput.on("keydown", this._doKeyDown);
10987				$("body").append(this._dialogInput);
10988				inst = this._dialogInst = this._newInst(this._dialogInput, false);
10989				inst.settings = {};
10990				$.data(this._dialogInput[0], "datepicker", inst);
10991			}
10992			datepicker_extendRemove(inst.settings, settings || {});
10993			date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
10994			this._dialogInput.val(date);
10995
10996			this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
10997			if (!this._pos) {
10998				browserWidth = document.documentElement.clientWidth;
10999				browserHeight = document.documentElement.clientHeight;
11000				scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
11001				scrollY = document.documentElement.scrollTop || document.body.scrollTop;
11002				this._pos = // should use actual width/height below
11003					[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
11004			}
11005
11006			// Move input on screen for focus, but hidden behind dialog
11007			this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
11008			inst.settings.onSelect = onSelect;
11009			this._inDialog = true;
11010			this.dpDiv.addClass(this._dialogClass);
11011			this._showDatepicker(this._dialogInput[0]);
11012			if ($.blockUI) {
11013				$.blockUI(this.dpDiv);
11014			}
11015			$.data(this._dialogInput[0], "datepicker", inst);
11016			return this;
11017		},
11018
11019		/* Detach a datepicker from its control.
11020		 * @param  target	element - the target input field or division or span
11021		 */
11022		_destroyDatepicker: function (target) {
11023			var nodeName,
11024				$target = $(target),
11025				inst = $.data(target, "datepicker");
11026
11027			if (!$target.hasClass(this.markerClassName)) {
11028				return;
11029			}
11030
11031			nodeName = target.nodeName.toLowerCase();
11032			$.removeData(target, "datepicker");
11033			if (nodeName === "input") {
vendor: 12,085 bytes, lines 11034-11385
11034				inst.append.remove();
11035				inst.trigger.remove();
11036				$target.removeClass(this.markerClassName).
11037					off("focus", this._showDatepicker).
11038					off("keydown", this._doKeyDown).
11039					off("keypress", this._doKeyPress).
11040					off("keyup", this._doKeyUp);
11041			} else if (nodeName === "div" || nodeName === "span") {
11042				$target.removeClass(this.markerClassName).empty();
11043			}
11044
11045			if (datepicker_instActive === inst) {
11046				datepicker_instActive = null;
11047				this._curInst = null;
11048			}
11049		},
11050
11051		/* Enable the date picker to a jQuery selection.
11052		 * @param  target	element - the target input field or division or span
11053		 */
11054		_enableDatepicker: function (target) {
11055			var nodeName, inline,
11056				$target = $(target),
11057				inst = $.data(target, "datepicker");
11058
11059			if (!$target.hasClass(this.markerClassName)) {
11060				return;
11061			}
11062
11063			nodeName = target.nodeName.toLowerCase();
11064			if (nodeName === "input") {
11065				target.disabled = false;
11066				inst.trigger.filter("button").
11067					each(function () {
11068						this.disabled = false;
11069					}).end().
11070					filter("img").css({ opacity: "1.0", cursor: "" });
11071			} else if (nodeName === "div" || nodeName === "span") {
11072				inline = $target.children("." + this._inlineClass);
11073				inline.children().removeClass("ui-state-disabled");
11074				inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
11075					prop("disabled", false);
11076			}
11077			this._disabledInputs = $.map(this._disabledInputs,
11078
11079				// Delete entry
11080				function (value) {
11081					return (value === target ? null : value);
11082				});
11083		},
11084
11085		/* Disable the date picker to a jQuery selection.
11086		 * @param  target	element - the target input field or division or span
11087		 */
11088		_disableDatepicker: function (target) {
11089			var nodeName, inline,
11090				$target = $(target),
11091				inst = $.data(target, "datepicker");
11092
11093			if (!$target.hasClass(this.markerClassName)) {
11094				return;
11095			}
11096
11097			nodeName = target.nodeName.toLowerCase();
11098			if (nodeName === "input") {
11099				target.disabled = true;
11100				inst.trigger.filter("button").
11101					each(function () {
11102						this.disabled = true;
11103					}).end().
11104					filter("img").css({ opacity: "0.5", cursor: "default" });
11105			} else if (nodeName === "div" || nodeName === "span") {
11106				inline = $target.children("." + this._inlineClass);
11107				inline.children().addClass("ui-state-disabled");
11108				inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
11109					prop("disabled", true);
11110			}
11111			this._disabledInputs = $.map(this._disabledInputs,
11112
11113				// Delete entry
11114				function (value) {
11115					return (value === target ? null : value);
11116				});
11117			this._disabledInputs[this._disabledInputs.length] = target;
11118		},
11119
11120		/* Is the first field in a jQuery collection disabled as a datepicker?
11121		 * @param  target	element - the target input field or division or span
11122		 * @return boolean - true if disabled, false if enabled
11123		 */
11124		_isDisabledDatepicker: function (target) {
11125			if (!target) {
11126				return false;
11127			}
11128			for (var i = 0; i < this._disabledInputs.length; i++) {
11129				if (this._disabledInputs[i] === target) {
11130					return true;
11131				}
11132			}
11133			return false;
11134		},
11135
11136		/* Retrieve the instance data for the target control.
11137		 * @param  target  element - the target input field or division or span
11138		 * @return  object - the associated instance data
11139		 * @throws  error if a jQuery problem getting data
11140		 */
11141		_getInst: function (target) {
11142			try {
11143				return $.data(target, "datepicker");
11144			} catch (err) {
11145				throw "Missing instance data for this datepicker";
11146			}
11147		},
11148
11149		/* Update or retrieve the settings for a date picker attached to an input field or division.
11150		 * @param  target  element - the target input field or division or span
11151		 * @param  name	object - the new settings to update or
11152		 *				string - the name of the setting to change or retrieve,
11153		 *				when retrieving also "all" for all instance settings or
11154		 *				"defaults" for all global defaults
11155		 * @param  value   any - the new value for the setting
11156		 *				(omit if above is an object or to retrieve a value)
11157		 */
11158		_optionDatepicker: function (target, name, value) {
11159			var settings, date, minDate, maxDate,
11160				inst = this._getInst(target);
11161
11162			if (arguments.length === 2 && typeof name === "string") {
11163				return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
11164					(inst ? (name === "all" ? $.extend({}, inst.settings) :
11165						this._get(inst, name)) : null));
11166			}
11167
11168			settings = name || {};
11169			if (typeof name === "string") {
11170				settings = {};
11171				settings[name] = value;
11172			}
11173
11174			if (inst) {
11175				if (this._curInst === inst) {
11176					this._hideDatepicker();
11177				}
11178
11179				date = this._getDateDatepicker(target, true);
11180				minDate = this._getMinMaxDate(inst, "min");
11181				maxDate = this._getMinMaxDate(inst, "max");
11182				datepicker_extendRemove(inst.settings, settings);
11183
11184				// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
11185				if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
11186					inst.settings.minDate = this._formatDate(inst, minDate);
11187				}
11188				if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
11189					inst.settings.maxDate = this._formatDate(inst, maxDate);
11190				}
11191				if ("disabled" in settings) {
11192					if (settings.disabled) {
11193						this._disableDatepicker(target);
11194					} else {
11195						this._enableDatepicker(target);
11196					}
11197				}
11198				this._attachments($(target), inst);
11199				this._autoSize(inst);
11200				this._setDate(inst, date);
11201				this._updateAlternate(inst);
11202				this._updateDatepicker(inst);
11203			}
11204		},
11205
11206		// Change method deprecated
11207		_changeDatepicker: function (target, name, value) {
11208			this._optionDatepicker(target, name, value);
11209		},
11210
11211		/* Redraw the date picker attached to an input field or division.
11212		 * @param  target  element - the target input field or division or span
11213		 */
11214		_refreshDatepicker: function (target) {
11215			var inst = this._getInst(target);
11216			if (inst) {
11217				this._updateDatepicker(inst);
11218			}
11219		},
11220
11221		/* Set the dates for a jQuery selection.
11222		 * @param  target element - the target input field or division or span
11223		 * @param  date	Date - the new date
11224		 */
11225		_setDateDatepicker: function (target, date) {
11226			var inst = this._getInst(target);
11227			if (inst) {
11228				this._setDate(inst, date);
11229				this._updateDatepicker(inst);
11230				this._updateAlternate(inst);
11231			}
11232		},
11233
11234		/* Get the date(s) for the first entry in a jQuery selection.
11235		 * @param  target element - the target input field or division or span
11236		 * @param  noDefault boolean - true if no default date is to be used
11237		 * @return Date - the current date
11238		 */
11239		_getDateDatepicker: function (target, noDefault) {
11240			var inst = this._getInst(target);
11241			if (inst && !inst.inline) {
11242				this._setDateFromField(inst, noDefault);
11243			}
11244			return (inst ? this._getDate(inst) : null);
11245		},
11246
11247		/* Handle keystrokes. */
11248		_doKeyDown: function (event) {
11249			var onSelect, dateStr, sel,
11250				inst = $.datepicker._getInst(event.target),
11251				handled = true,
11252				isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
11253
11254			inst._keyEvent = true;
11255			if ($.datepicker._datepickerShowing) {
11256				switch (event.keyCode) {
11257					case 9: $.datepicker._hideDatepicker();
11258						handled = false;
11259						break; // hide on tab out
11260					case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
11261						$.datepicker._currentClass + ")", inst.dpDiv);
11262						if (sel[0]) {
11263							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
11264						}
11265
11266						onSelect = $.datepicker._get(inst, "onSelect");
11267						if (onSelect) {
11268							dateStr = $.datepicker._formatDate(inst);
11269
11270							// Trigger custom callback
11271							onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
11272						} else {
11273							$.datepicker._hideDatepicker();
11274						}
11275
11276						return false; // don't submit the form
11277					case 27: $.datepicker._hideDatepicker();
11278						break; // hide on escape
11279					case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
11280						-$.datepicker._get(inst, "stepBigMonths") :
11281						-$.datepicker._get(inst, "stepMonths")), "M");
11282						break; // previous month/year on page up/+ ctrl
11283					case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
11284						+$.datepicker._get(inst, "stepBigMonths") :
11285						+$.datepicker._get(inst, "stepMonths")), "M");
11286						break; // next month/year on page down/+ ctrl
11287					case 35: if (event.ctrlKey || event.metaKey) {
11288						$.datepicker._clearDate(event.target);
11289					}
11290						handled = event.ctrlKey || event.metaKey;
11291						break; // clear on ctrl or command +end
11292					case 36: if (event.ctrlKey || event.metaKey) {
11293						$.datepicker._gotoToday(event.target);
11294					}
11295						handled = event.ctrlKey || event.metaKey;
11296						break; // current on ctrl or command +home
11297					case 37: if (event.ctrlKey || event.metaKey) {
11298						$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
11299					}
11300						handled = event.ctrlKey || event.metaKey;
11301
11302						// -1 day on ctrl or command +left
11303						if (event.originalEvent.altKey) {
11304							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
11305								-$.datepicker._get(inst, "stepBigMonths") :
11306								-$.datepicker._get(inst, "stepMonths")), "M");
11307						}
11308
11309						// next month/year on alt +left on Mac
11310						break;
11311					case 38: if (event.ctrlKey || event.metaKey) {
11312						$.datepicker._adjustDate(event.target, -7, "D");
11313					}
11314						handled = event.ctrlKey || event.metaKey;
11315						break; // -1 week on ctrl or command +up
11316					case 39: if (event.ctrlKey || event.metaKey) {
11317						$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
11318					}
11319						handled = event.ctrlKey || event.metaKey;
11320
11321						// +1 day on ctrl or command +right
11322						if (event.originalEvent.altKey) {
11323							$.datepicker._adjustDate(event.target, (event.ctrlKey ?
11324								+$.datepicker._get(inst, "stepBigMonths") :
11325								+$.datepicker._get(inst, "stepMonths")), "M");
11326						}
11327
11328						// next month/year on alt +right
11329						break;
11330					case 40: if (event.ctrlKey || event.metaKey) {
11331						$.datepicker._adjustDate(event.target, +7, "D");
11332					}
11333						handled = event.ctrlKey || event.metaKey;
11334						break; // +1 week on ctrl or command +down
11335					default: handled = false;
11336				}
11337			} else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
11338				$.datepicker._showDatepicker(this);
11339			} else {
11340				handled = false;
11341			}
11342
11343			if (handled) {
11344				event.preventDefault();
11345				event.stopPropagation();
11346			}
11347		},
11348
11349		/* Filter entered characters - based on date format. */
11350		_doKeyPress: function (event) {
11351			var chars, chr,
11352				inst = $.datepicker._getInst(event.target);
11353
11354			if ($.datepicker._get(inst, "constrainInput")) {
11355				chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
11356				chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
11357				return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
11358			}
11359		},
11360
11361		/* Synchronise manual entry and field/alternate field. */
11362		_doKeyUp: function (event) {
11363			var date,
11364				inst = $.datepicker._getInst(event.target);
11365
11366			if (inst.input.val() !== inst.lastVal) {
11367				try {
11368					date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
11369						(inst.input ? inst.input.val() : null),
11370						$.datepicker._getFormatConfig(inst));
11371
11372					if (date) { // only if valid
11373						$.datepicker._setDateFromField(inst);
11374						$.datepicker._updateAlternate(inst);
11375						$.datepicker._updateDatepicker(inst);
11376					}
11377				} catch (err) {
11378				}
11379			}
11380			return true;
11381		},
11382
11383		/* Pop-up the date picker for a given input field.
11384		 * If false returned from beforeShow event handler do not show.
11385		 * @param  input  element - the input field attached to the date picker or
vendor: 4,409 bytes, lines 11386-11510
11386		 *					event - if triggered by focus
11387		 */
11388		_showDatepicker: function (input) {
11389			input = input.target || input;
11390			if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
11391				input = $("input", input.parentNode)[0];
11392			}
11393
11394			if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
11395				return;
11396			}
11397
11398			var inst, beforeShow, beforeShowSettings, isFixed,
11399				offset, showAnim, duration;
11400
11401			inst = $.datepicker._getInst(input);
11402			if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
11403				$.datepicker._curInst.dpDiv.stop(true, true);
11404				if (inst && $.datepicker._datepickerShowing) {
11405					$.datepicker._hideDatepicker($.datepicker._curInst.input[0]);
11406				}
11407			}
11408
11409			beforeShow = $.datepicker._get(inst, "beforeShow");
11410			beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
11411			if (beforeShowSettings === false) {
11412				return;
11413			}
11414			datepicker_extendRemove(inst.settings, beforeShowSettings);
11415
11416			inst.lastVal = null;
11417			$.datepicker._lastInput = input;
11418			$.datepicker._setDateFromField(inst);
11419
11420			if ($.datepicker._inDialog) { // hide cursor
11421				input.value = "";
11422			}
11423			if (!$.datepicker._pos) { // position below input
11424				$.datepicker._pos = $.datepicker._findPos(input);
11425				$.datepicker._pos[1] += input.offsetHeight; // add the height
11426			}
11427
11428			isFixed = false;
11429			$(input).parents().each(function () {
11430				isFixed |= $(this).css("position") === "fixed";
11431				return !isFixed;
11432			});
11433
11434			offset = { left: $.datepicker._pos[0], top: $.datepicker._pos[1] };
11435			$.datepicker._pos = null;
11436
11437			//to avoid flashes on Firefox
11438			inst.dpDiv.empty();
11439
11440			// determine sizing offscreen
11441			inst.dpDiv.css({ position: "absolute", display: "block", top: "-1000px" });
11442			$.datepicker._updateDatepicker(inst);
11443
11444			// fix width for dynamic number of date pickers
11445			// and adjust position before showing
11446			offset = $.datepicker._checkOffset(inst, offset, isFixed);
11447			inst.dpDiv.css({
11448				position: ($.datepicker._inDialog && $.blockUI ?
11449					"static" : (isFixed ? "fixed" : "absolute")), display: "none",
11450				left: offset.left + "px", top: offset.top + "px"
11451			});
11452
11453			if (!inst.inline) {
11454				showAnim = $.datepicker._get(inst, "showAnim");
11455				duration = $.datepicker._get(inst, "duration");
11456				inst.dpDiv.css("z-index", datepicker_getZindex($(input)) + 1);
11457				$.datepicker._datepickerShowing = true;
11458
11459				if ($.effects && $.effects.effect[showAnim]) {
11460					inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
11461				} else {
11462					inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
11463				}
11464
11465				if ($.datepicker._shouldFocusInput(inst)) {
11466					inst.input.trigger("focus");
11467				}
11468
11469				$.datepicker._curInst = inst;
11470			}
11471		},
11472
11473		/* Generate the date picker content. */
11474		_updateDatepicker: function (inst) {
11475			this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
11476			datepicker_instActive = inst; // for delegate hover events
11477			inst.dpDiv.empty().append(this._generateHTML(inst));
11478			this._attachHandlers(inst);
11479
11480			var origyearshtml,
11481				numMonths = this._getNumberOfMonths(inst),
11482				cols = numMonths[1],
11483				width = 17,
11484				activeCell = inst.dpDiv.find("." + this._dayOverClass + " a"),
11485				onUpdateDatepicker = $.datepicker._get(inst, "onUpdateDatepicker");
11486
11487			if (activeCell.length > 0) {
11488				datepicker_handleMouseover.apply(activeCell.get(0));
11489			}
11490
11491			inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
11492			if (cols > 1) {
11493				inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
11494			}
11495			inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
11496				"Class"]("ui-datepicker-multi");
11497			inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
11498				"Class"]("ui-datepicker-rtl");
11499
11500			if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput(inst)) {
11501				inst.input.trigger("focus");
11502			}
11503
11504			// Deffered render of the years select (to avoid flashes on Firefox)
11505			if (inst.yearshtml) {
11506				origyearshtml = inst.yearshtml;
11507				setTimeout(function () {
11508
11509					//assure that inst.yearshtml didn't change.
11510					if (origyearshtml === inst.yearshtml && inst.yearshtml) {
vendor: 5,592 bytes, lines 11511-11669
11511						inst.dpDiv.find("select.ui-datepicker-year").first().replaceWith(inst.yearshtml);
11512					}
11513					origyearshtml = inst.yearshtml = null;
11514				}, 0);
11515			}
11516
11517			if (onUpdateDatepicker) {
11518				onUpdateDatepicker.apply((inst.input ? inst.input[0] : null), [inst]);
11519			}
11520		},
11521
11522		// #6694 - don't focus the input if it's already focused
11523		// this breaks the change event in IE
11524		// Support: IE and jQuery <1.9
11525		_shouldFocusInput: function (inst) {
11526			return inst.input && inst.input.is(":visible") && !inst.input.is(":disabled") && !inst.input.is(":focus");
11527		},
11528
11529		/* Check positioning to remain on screen. */
11530		_checkOffset: function (inst, offset, isFixed) {
11531			var dpWidth = inst.dpDiv.outerWidth(),
11532				dpHeight = inst.dpDiv.outerHeight(),
11533				inputWidth = inst.input ? inst.input.outerWidth() : 0,
11534				inputHeight = inst.input ? inst.input.outerHeight() : 0,
11535				viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
11536				viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
11537
11538			offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
11539			offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
11540			offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
11541
11542			// Now check if datepicker is showing outside window viewport - move to a better place if so.
11543			offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
11544				Math.abs(offset.left + dpWidth - viewWidth) : 0);
11545			offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
11546				Math.abs(dpHeight + inputHeight) : 0);
11547
11548			return offset;
11549		},
11550
11551		/* Find an object's position on the screen. */
11552		_findPos: function (obj) {
11553			var position,
11554				inst = this._getInst(obj),
11555				isRTL = this._get(inst, "isRTL");
11556
11557			while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.pseudos.hidden(obj))) {
11558				obj = obj[isRTL ? "previousSibling" : "nextSibling"];
11559			}
11560
11561			position = $(obj).offset();
11562			return [position.left, position.top];
11563		},
11564
11565		/* Hide the date picker from view.
11566		 * @param  input  element - the input field attached to the date picker
11567		 */
11568		_hideDatepicker: function (input) {
11569			var showAnim, duration, postProcess, onClose,
11570				inst = this._curInst;
11571
11572			if (!inst || (input && inst !== $.data(input, "datepicker"))) {
11573				return;
11574			}
11575
11576			if (this._datepickerShowing) {
11577				showAnim = this._get(inst, "showAnim");
11578				duration = this._get(inst, "duration");
11579				postProcess = function () {
11580					$.datepicker._tidyDialog(inst);
11581				};
11582
11583				// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
11584				if ($.effects && ($.effects.effect[showAnim] || $.effects[showAnim])) {
11585					inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
11586				} else {
11587					inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
11588						(showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
11589				}
11590
11591				if (!showAnim) {
11592					postProcess();
11593				}
11594				this._datepickerShowing = false;
11595
11596				onClose = this._get(inst, "onClose");
11597				if (onClose) {
11598					onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
11599				}
11600
11601				this._lastInput = null;
11602				if (this._inDialog) {
11603					this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
11604					if ($.blockUI) {
11605						$.unblockUI();
11606						$("body").append(this.dpDiv);
11607					}
11608				}
11609				this._inDialog = false;
11610			}
11611		},
11612
11613		/* Tidy up after a dialog display. */
11614		_tidyDialog: function (inst) {
11615			inst.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar");
11616		},
11617
11618		/* Close date picker if clicked elsewhere. */
11619		_checkExternalClick: function (event) {
11620			if (!$.datepicker._curInst) {
11621				return;
11622			}
11623
11624			var $target = $(event.target),
11625				inst = $.datepicker._getInst($target[0]);
11626
11627			if ((($target[0].id !== $.datepicker._mainDivId &&
11628				$target.parents("#" + $.datepicker._mainDivId).length === 0 &&
11629				!$target.hasClass($.datepicker.markerClassName) &&
11630				!$target.closest("." + $.datepicker._triggerClass).length &&
11631				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))) ||
11632				($target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst)) {
11633				$.datepicker._hideDatepicker();
11634			}
11635		},
11636
11637		/* Adjust one of the date sub-fields. */
11638		_adjustDate: function (id, offset, period) {
11639			var target = $(id),
11640				inst = this._getInst(target[0]);
11641
11642			if (this._isDisabledDatepicker(target[0])) {
11643				return;
11644			}
11645			this._adjustInstDate(inst, offset, period);
11646			this._updateDatepicker(inst);
11647		},
11648
11649		/* Action for current link. */
11650		_gotoToday: function (id) {
11651			var date,
11652				target = $(id),
11653				inst = this._getInst(target[0]);
11654
11655			if (this._get(inst, "gotoCurrent") && inst.currentDay) {
11656				inst.selectedDay = inst.currentDay;
11657				inst.drawMonth = inst.selectedMonth = inst.currentMonth;
11658				inst.drawYear = inst.selectedYear = inst.currentYear;
11659			} else {
11660				date = new Date();
11661				inst.selectedDay = date.getDate();
11662				inst.drawMonth = inst.selectedMonth = date.getMonth();
11663				inst.drawYear = inst.selectedYear = date.getFullYear();
11664			}
11665			this._notifyChange(inst);
11666			this._adjustDate(target);
11667		},
11668
11669		/* Action for selecting a new month/year. */
vendor: 43,825 bytes, lines 11670-12854
11670		_selectMonthYear: function (id, select, period) {
11671			var target = $(id),
11672				inst = this._getInst(target[0]);
11673
11674			inst["selected" + (period === "M" ? "Month" : "Year")] =
11675				inst["draw" + (period === "M" ? "Month" : "Year")] =
11676				parseInt(select.options[select.selectedIndex].value, 10);
11677
11678			this._notifyChange(inst);
11679			this._adjustDate(target);
11680		},
11681
11682		/* Action for selecting a day. */
11683		_selectDay: function (id, month, year, td) {
11684			var inst,
11685				target = $(id);
11686
11687			if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
11688				return;
11689			}
11690
11691			inst = this._getInst(target[0]);
11692			inst.selectedDay = inst.currentDay = parseInt($("a", td).attr("data-date"));
11693			inst.selectedMonth = inst.currentMonth = month;
11694			inst.selectedYear = inst.currentYear = year;
11695			this._selectDate(id, this._formatDate(inst,
11696				inst.currentDay, inst.currentMonth, inst.currentYear));
11697		},
11698
11699		/* Erase the input field and hide the date picker. */
11700		_clearDate: function (id) {
11701			var target = $(id);
11702			this._selectDate(target, "");
11703		},
11704
11705		/* Update the input field with the selected date. */
11706		_selectDate: function (id, dateStr) {
11707			var onSelect,
11708				target = $(id),
11709				inst = this._getInst(target[0]);
11710
11711			dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
11712			if (inst.input) {
11713				inst.input.val(dateStr);
11714			}
11715			this._updateAlternate(inst);
11716
11717			onSelect = this._get(inst, "onSelect");
11718			if (onSelect) {
11719				onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
11720			} else if (inst.input) {
11721				inst.input.trigger("change"); // fire the change event
11722			}
11723
11724			if (inst.inline) {
11725				this._updateDatepicker(inst);
11726			} else {
11727				this._hideDatepicker();
11728				this._lastInput = inst.input[0];
11729				if (typeof (inst.input[0]) !== "object") {
11730					inst.input.trigger("focus"); // restore focus
11731				}
11732				this._lastInput = null;
11733			}
11734		},
11735
11736		/* Update any alternate field to synchronise with the main field. */
11737		_updateAlternate: function (inst) {
11738			var altFormat, date, dateStr,
11739				altField = this._get(inst, "altField");
11740
11741			if (altField) { // update alternate field too
11742				altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
11743				date = this._getDate(inst);
11744				dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
11745				$(document).find(altField).val(dateStr);
11746			}
11747		},
11748
11749		/* Set as beforeShowDay function to prevent selection of weekends.
11750		 * @param  date  Date - the date to customise
11751		 * @return [boolean, string] - is this date selectable?, what is its CSS class?
11752		 */
11753		noWeekends: function (date) {
11754			var day = date.getDay();
11755			return [(day > 0 && day < 6), ""];
11756		},
11757
11758		/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
11759		 * @param  date  Date - the date to get the week for
11760		 * @return  number - the number of the week within the year that contains this date
11761		 */
11762		iso8601Week: function (date) {
11763			var time,
11764				checkDate = new Date(date.getTime());
11765
11766			// Find Thursday of this week starting on Monday
11767			checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
11768
11769			time = checkDate.getTime();
11770			checkDate.setMonth(0); // Compare with Jan 1
11771			checkDate.setDate(1);
11772			return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
11773		},
11774
11775		/* Parse a string value into a date object.
11776		 * See formatDate below for the possible formats.
11777		 *
11778		 * @param  format string - the expected format of the date
11779		 * @param  value string - the date in the above format
11780		 * @param  settings Object - attributes include:
11781		 *					shortYearCutoff  number - the cutoff year for determining the century (optional)
11782		 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
11783		 *					dayNames		string[7] - names of the days from Sunday (optional)
11784		 *					monthNamesShort string[12] - abbreviated names of the months (optional)
11785		 *					monthNames		string[12] - names of the months (optional)
11786		 * @return  Date - the extracted date value or null if value is blank
11787		 */
11788		parseDate: function (format, value, settings) {
11789			if (format == null || value == null) {
11790				throw "Invalid arguments";
11791			}
11792
11793			value = (typeof value === "object" ? value.toString() : value + "");
11794			if (value === "") {
11795				return null;
11796			}
11797
11798			var iFormat, dim, extra,
11799				iValue = 0,
11800				shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
11801				shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
11802					new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
11803				dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
11804				dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
11805				monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
11806				monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
11807				year = -1,
11808				month = -1,
11809				day = -1,
11810				doy = -1,
11811				literal = false,
11812				date,
11813
11814				// Check whether a format character is doubled
11815				lookAhead = function (match) {
11816					var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
11817					if (matches) {
11818						iFormat++;
11819					}
11820					return matches;
11821				},
11822
11823				// Extract a number from the string value
11824				getNumber = function (match) {
11825					var isDoubled = lookAhead(match),
11826						size = (match === "@" ? 14 : (match === "!" ? 20 :
11827							(match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
11828						minSize = (match === "y" ? size : 1),
11829						digits = new RegExp("^\\d{" + minSize + "," + size + "}"),
11830						num = value.substring(iValue).match(digits);
11831					if (!num) {
11832						throw "Missing number at position " + iValue;
11833					}
11834					iValue += num[0].length;
11835					return parseInt(num[0], 10);
11836				},
11837
11838				// Extract a name from the string value and convert to an index
11839				getName = function (match, shortNames, longNames) {
11840					var index = -1,
11841						names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
11842							return [[k, v]];
11843						}).sort(function (a, b) {
11844							return -(a[1].length - b[1].length);
11845						});
11846
11847					$.each(names, function (i, pair) {
11848						var name = pair[1];
11849						if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
11850							index = pair[0];
11851							iValue += name.length;
11852							return false;
11853						}
11854					});
11855					if (index !== -1) {
11856						return index + 1;
11857					} else {
11858						throw "Unknown name at position " + iValue;
11859					}
11860				},
11861
11862				// Confirm that a literal character matches the string value
11863				checkLiteral = function () {
11864					if (value.charAt(iValue) !== format.charAt(iFormat)) {
11865						throw "Unexpected literal at position " + iValue;
11866					}
11867					iValue++;
11868				};
11869
11870			for (iFormat = 0; iFormat < format.length; iFormat++) {
11871				if (literal) {
11872					if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
11873						literal = false;
11874					} else {
11875						checkLiteral();
11876					}
11877				} else {
11878					switch (format.charAt(iFormat)) {
11879						case "d":
11880							day = getNumber("d");
11881							break;
11882						case "D":
11883							getName("D", dayNamesShort, dayNames);
11884							break;
11885						case "o":
11886							doy = getNumber("o");
11887							break;
11888						case "m":
11889							month = getNumber("m");
11890							break;
11891						case "M":
11892							month = getName("M", monthNamesShort, monthNames);
11893							break;
11894						case "y":
11895							year = getNumber("y");
11896							break;
11897						case "@":
11898							date = new Date(getNumber("@"));
11899							year = date.getFullYear();
11900							month = date.getMonth() + 1;
11901							day = date.getDate();
11902							break;
11903						case "!":
11904							date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
11905							year = date.getFullYear();
11906							month = date.getMonth() + 1;
11907							day = date.getDate();
11908							break;
11909						case "'":
11910							if (lookAhead("'")) {
11911								checkLiteral();
11912							} else {
11913								literal = true;
11914							}
11915							break;
11916						default:
11917							checkLiteral();
11918					}
11919				}
11920			}
11921
11922			if (iValue < value.length) {
11923				extra = value.substr(iValue);
11924				if (!/^\s+/.test(extra)) {
11925					throw "Extra/unparsed characters found in date: " + extra;
11926				}
11927			}
11928
11929			if (year === -1) {
11930				year = new Date().getFullYear();
11931			} else if (year < 100) {
11932				year += new Date().getFullYear() - new Date().getFullYear() % 100 +
11933					(year <= shortYearCutoff ? 0 : -100);
11934			}
11935
11936			if (doy > -1) {
11937				month = 1;
11938				day = doy;
11939				do {
11940					dim = this._getDaysInMonth(year, month - 1);
11941					if (day <= dim) {
11942						break;
11943					}
11944					month++;
11945					day -= dim;
11946				} while (true);
11947			}
11948
11949			date = this._daylightSavingAdjust(new Date(year, month - 1, day));
11950			if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
11951				throw "Invalid date"; // E.g. 31/02/00
11952			}
11953			return date;
11954		},
11955
11956		/* Standard date formats. */
11957		ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
11958		COOKIE: "D, dd M yy",
11959		ISO_8601: "yy-mm-dd",
11960		RFC_822: "D, d M y",
11961		RFC_850: "DD, dd-M-y",
11962		RFC_1036: "D, d M y",
11963		RFC_1123: "D, d M yy",
11964		RFC_2822: "D, d M yy",
11965		RSS: "D, d M y", // RFC 822
11966		TICKS: "!",
11967		TIMESTAMP: "@",
11968		W3C: "yy-mm-dd", // ISO 8601
11969
11970		_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
11971			Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
11972
11973		/* Format a date object into a string value.
11974		 * The format can be combinations of the following:
11975		 * d  - day of month (no leading zero)
11976		 * dd - day of month (two digit)
11977		 * o  - day of year (no leading zeros)
11978		 * oo - day of year (three digit)
11979		 * D  - day name short
11980		 * DD - day name long
11981		 * m  - month of year (no leading zero)
11982		 * mm - month of year (two digit)
11983		 * M  - month name short
11984		 * MM - month name long
11985		 * y  - year (two digit)
11986		 * yy - year (four digit)
11987		 * @ - Unix timestamp (ms since 01/01/1970)
11988		 * ! - Windows ticks (100ns since 01/01/0001)
11989		 * "..." - literal text
11990		 * '' - single quote
11991		 *
11992		 * @param  format string - the desired format of the date
11993		 * @param  date Date - the date value to format
11994		 * @param  settings Object - attributes include:
11995		 *					dayNamesShort	string[7] - abbreviated names of the days from Sunday (optional)
11996		 *					dayNames		string[7] - names of the days from Sunday (optional)
11997		 *					monthNamesShort string[12] - abbreviated names of the months (optional)
11998		 *					monthNames		string[12] - names of the months (optional)
11999		 * @return  string - the date in the above format
12000		 */
12001		formatDate: function (format, date, settings) {
12002			if (!date) {
12003				return "";
12004			}
12005
12006			var iFormat,
12007				dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
12008				dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
12009				monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
12010				monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
12011
12012				// Check whether a format character is doubled
12013				lookAhead = function (match) {
12014					var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
12015					if (matches) {
12016						iFormat++;
12017					}
12018					return matches;
12019				},
12020
12021				// Format a number, with leading zero if necessary
12022				formatNumber = function (match, value, len) {
12023					var num = "" + value;
12024					if (lookAhead(match)) {
12025						while (num.length < len) {
12026							num = "0" + num;
12027						}
12028					}
12029					return num;
12030				},
12031
12032				// Format a name, short or long as requested
12033				formatName = function (match, value, shortNames, longNames) {
12034					return (lookAhead(match) ? longNames[value] : shortNames[value]);
12035				},
12036				output = "",
12037				literal = false;
12038
12039			if (date) {
12040				for (iFormat = 0; iFormat < format.length; iFormat++) {
12041					if (literal) {
12042						if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
12043							literal = false;
12044						} else {
12045							output += format.charAt(iFormat);
12046						}
12047					} else {
12048						switch (format.charAt(iFormat)) {
12049							case "d":
12050								output += formatNumber("d", date.getDate(), 2);
12051								break;
12052							case "D":
12053								output += formatName("D", date.getDay(), dayNamesShort, dayNames);
12054								break;
12055							case "o":
12056								output += formatNumber("o",
12057									Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
12058								break;
12059							case "m":
12060								output += formatNumber("m", date.getMonth() + 1, 2);
12061								break;
12062							case "M":
12063								output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
12064								break;
12065							case "y":
12066								output += (lookAhead("y") ? date.getFullYear() :
12067									(date.getFullYear() % 100 < 10 ? "0" : "") + date.getFullYear() % 100);
12068								break;
12069							case "@":
12070								output += date.getTime();
12071								break;
12072							case "!":
12073								output += date.getTime() * 10000 + this._ticksTo1970;
12074								break;
12075							case "'":
12076								if (lookAhead("'")) {
12077									output += "'";
12078								} else {
12079									literal = true;
12080								}
12081								break;
12082							default:
12083								output += format.charAt(iFormat);
12084						}
12085					}
12086				}
12087			}
12088			return output;
12089		},
12090
12091		/* Extract all possible characters from the date format. */
12092		_possibleChars: function (format) {
12093			var iFormat,
12094				chars = "",
12095				literal = false,
12096
12097				// Check whether a format character is doubled
12098				lookAhead = function (match) {
12099					var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
12100					if (matches) {
12101						iFormat++;
12102					}
12103					return matches;
12104				};
12105
12106			for (iFormat = 0; iFormat < format.length; iFormat++) {
12107				if (literal) {
12108					if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
12109						literal = false;
12110					} else {
12111						chars += format.charAt(iFormat);
12112					}
12113				} else {
12114					switch (format.charAt(iFormat)) {
12115						case "d": case "m": case "y": case "@":
12116							chars += "0123456789";
12117							break;
12118						case "D": case "M":
12119							return null; // Accept anything
12120						case "'":
12121							if (lookAhead("'")) {
12122								chars += "'";
12123							} else {
12124								literal = true;
12125							}
12126							break;
12127						default:
12128							chars += format.charAt(iFormat);
12129					}
12130				}
12131			}
12132			return chars;
12133		},
12134
12135		/* Get a setting value, defaulting if necessary. */
12136		_get: function (inst, name) {
12137			return inst.settings[name] !== undefined ?
12138				inst.settings[name] : this._defaults[name];
12139		},
12140
12141		/* Parse existing date and initialise date picker. */
12142		_setDateFromField: function (inst, noDefault) {
12143			if (inst.input.val() === inst.lastVal) {
12144				return;
12145			}
12146
12147			var dateFormat = this._get(inst, "dateFormat"),
12148				dates = inst.lastVal = inst.input ? inst.input.val() : null,
12149				defaultDate = this._getDefaultDate(inst),
12150				date = defaultDate,
12151				settings = this._getFormatConfig(inst);
12152
12153			try {
12154				date = this.parseDate(dateFormat, dates, settings) || defaultDate;
12155			} catch (event) {
12156				dates = (noDefault ? "" : dates);
12157			}
12158			inst.selectedDay = date.getDate();
12159			inst.drawMonth = inst.selectedMonth = date.getMonth();
12160			inst.drawYear = inst.selectedYear = date.getFullYear();
12161			inst.currentDay = (dates ? date.getDate() : 0);
12162			inst.currentMonth = (dates ? date.getMonth() : 0);
12163			inst.currentYear = (dates ? date.getFullYear() : 0);
12164			this._adjustInstDate(inst);
12165		},
12166
12167		/* Retrieve the default date shown on opening. */
12168		_getDefaultDate: function (inst) {
12169			return this._restrictMinMax(inst,
12170				this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
12171		},
12172
12173		/* A date may be specified as an exact value or a relative one. */
12174		_determineDate: function (inst, date, defaultDate) {
12175			var offsetNumeric = function (offset) {
12176				var date = new Date();
12177				date.setDate(date.getDate() + offset);
12178				return date;
12179			},
12180				offsetString = function (offset) {
12181					try {
12182						return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
12183							offset, $.datepicker._getFormatConfig(inst));
12184					} catch (e) {
12185
12186						// Ignore
12187					}
12188
12189					var date = (offset.toLowerCase().match(/^c/) ?
12190						$.datepicker._getDate(inst) : null) || new Date(),
12191						year = date.getFullYear(),
12192						month = date.getMonth(),
12193						day = date.getDate(),
12194						pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
12195						matches = pattern.exec(offset);
12196
12197					while (matches) {
12198						switch (matches[2] || "d") {
12199							case "d": case "D":
12200								day += parseInt(matches[1], 10); break;
12201							case "w": case "W":
12202								day += parseInt(matches[1], 10) * 7; break;
12203							case "m": case "M":
12204								month += parseInt(matches[1], 10);
12205								day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
12206								break;
12207							case "y": case "Y":
12208								year += parseInt(matches[1], 10);
12209								day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
12210								break;
12211						}
12212						matches = pattern.exec(offset);
12213					}
12214					return new Date(year, month, day);
12215				},
12216				newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
12217					(typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
12218
12219			newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
12220			if (newDate) {
12221				newDate.setHours(0);
12222				newDate.setMinutes(0);
12223				newDate.setSeconds(0);
12224				newDate.setMilliseconds(0);
12225			}
12226			return this._daylightSavingAdjust(newDate);
12227		},
12228
12229		/* Handle switch to/from daylight saving.
12230		 * Hours may be non-zero on daylight saving cut-over:
12231		 * > 12 when midnight changeover, but then cannot generate
12232		 * midnight datetime, so jump to 1AM, otherwise reset.
12233		 * @param  date  (Date) the date to check
12234		 * @return  (Date) the corrected date
12235		 */
12236		_daylightSavingAdjust: function (date) {
12237			if (!date) {
12238				return null;
12239			}
12240			date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
12241			return date;
12242		},
12243
12244		/* Set the date(s) directly. */
12245		_setDate: function (inst, date, noChange) {
12246			var clear = !date,
12247				origMonth = inst.selectedMonth,
12248				origYear = inst.selectedYear,
12249				newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
12250
12251			inst.selectedDay = inst.currentDay = newDate.getDate();
12252			inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
12253			inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
12254			if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
12255				this._notifyChange(inst);
12256			}
12257			this._adjustInstDate(inst);
12258			if (inst.input) {
12259				inst.input.val(clear ? "" : this._formatDate(inst));
12260			}
12261		},
12262
12263		/* Retrieve the date(s) directly. */
12264		_getDate: function (inst) {
12265			var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
12266				this._daylightSavingAdjust(new Date(
12267					inst.currentYear, inst.currentMonth, inst.currentDay)));
12268			return startDate;
12269		},
12270
12271		/* Attach the onxxx handlers.  These are declared statically so
12272		 * they work with static code transformers like Caja.
12273		 */
12274		_attachHandlers: function (inst) {
12275			var stepMonths = this._get(inst, "stepMonths"),
12276				id = "#" + inst.id.replace(/\\\\/g, "\\");
12277			inst.dpDiv.find("[data-handler]").map(function () {
12278				var handler = {
12279					prev: function () {
12280						$.datepicker._adjustDate(id, -stepMonths, "M");
12281					},
12282					next: function () {
12283						$.datepicker._adjustDate(id, +stepMonths, "M");
12284					},
12285					hide: function () {
12286						$.datepicker._hideDatepicker();
12287					},
12288					today: function () {
12289						$.datepicker._gotoToday(id);
12290					},
12291					selectDay: function () {
12292						$.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
12293						return false;
12294					},
12295					selectMonth: function () {
12296						$.datepicker._selectMonthYear(id, this, "M");
12297						return false;
12298					},
12299					selectYear: function () {
12300						$.datepicker._selectMonthYear(id, this, "Y");
12301						return false;
12302					}
12303				};
12304				$(this).on(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
12305			});
12306		},
12307
12308		/* Generate the HTML for the current state of the date picker. */
12309		_generateHTML: function (inst) {
12310			var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
12311				controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
12312				monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
12313				selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
12314				cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
12315				printDate, dRow, tbody, daySettings, otherMonth, unselectable,
12316				tempDate = new Date(),
12317				today = this._daylightSavingAdjust(
12318					new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
12319				isRTL = this._get(inst, "isRTL"),
12320				showButtonPanel = this._get(inst, "showButtonPanel"),
12321				hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
12322				navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
12323				numMonths = this._getNumberOfMonths(inst),
12324				showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
12325				stepMonths = this._get(inst, "stepMonths"),
12326				isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
12327				currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
12328					new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
12329				minDate = this._getMinMaxDate(inst, "min"),
12330				maxDate = this._getMinMaxDate(inst, "max"),
12331				drawMonth = inst.drawMonth - showCurrentAtPos,
12332				drawYear = inst.drawYear;
12333
12334			if (drawMonth < 0) {
12335				drawMonth += 12;
12336				drawYear--;
12337			}
12338			if (maxDate) {
12339				maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
12340					maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
12341				maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
12342				while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
12343					drawMonth--;
12344					if (drawMonth < 0) {
12345						drawMonth = 11;
12346						drawYear--;
12347					}
12348				}
12349			}
12350			inst.drawMonth = drawMonth;
12351			inst.drawYear = drawYear;
12352
12353			prevText = this._get(inst, "prevText");
12354			prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
12355				this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
12356				this._getFormatConfig(inst)));
12357
12358			if (this._canAdjustMonth(inst, -1, drawYear, drawMonth)) {
12359				prev = $("<a>")
12360					.attr({
12361						"class": "ui-datepicker-prev ui-corner-all",
12362						"data-handler": "prev",
12363						"data-event": "click",
12364						title: prevText
12365					})
12366					.append(
12367						$("<span>")
12368							.addClass("ui-icon ui-icon-circle-triangle-" +
12369								(isRTL ? "e" : "w"))
12370							.text(prevText)
12371					)[0].outerHTML;
12372			} else if (hideIfNoPrevNext) {
12373				prev = "";
12374			} else {
12375				prev = $("<a>")
12376					.attr({
12377						"class": "ui-datepicker-prev ui-corner-all ui-state-disabled",
12378						title: prevText
12379					})
12380					.append(
12381						$("<span>")
12382							.addClass("ui-icon ui-icon-circle-triangle-" +
12383								(isRTL ? "e" : "w"))
12384							.text(prevText)
12385					)[0].outerHTML;
12386			}
12387
12388			nextText = this._get(inst, "nextText");
12389			nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
12390				this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
12391				this._getFormatConfig(inst)));
12392
12393			if (this._canAdjustMonth(inst, +1, drawYear, drawMonth)) {
12394				next = $("<a>")
12395					.attr({
12396						"class": "ui-datepicker-next ui-corner-all",
12397						"data-handler": "next",
12398						"data-event": "click",
12399						title: nextText
12400					})
12401					.append(
12402						$("<span>")
12403							.addClass("ui-icon ui-icon-circle-triangle-" +
12404								(isRTL ? "w" : "e"))
12405							.text(nextText)
12406					)[0].outerHTML;
12407			} else if (hideIfNoPrevNext) {
12408				next = "";
12409			} else {
12410				next = $("<a>")
12411					.attr({
12412						"class": "ui-datepicker-next ui-corner-all ui-state-disabled",
12413						title: nextText
12414					})
12415					.append(
12416						$("<span>")
12417							.attr("class", "ui-icon ui-icon-circle-triangle-" +
12418								(isRTL ? "w" : "e"))
12419							.text(nextText)
12420					)[0].outerHTML;
12421			}
12422
12423			currentText = this._get(inst, "currentText");
12424			gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
12425			currentText = (!navigationAsDateFormat ? currentText :
12426				this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
12427
12428			controls = "";
12429			if (!inst.inline) {
12430				controls = $("<button>")
12431					.attr({
12432						type: "button",
12433						"class": "ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all",
12434						"data-handler": "hide",
12435						"data-event": "click"
12436					})
12437					.text(this._get(inst, "closeText"))[0].outerHTML;
12438			}
12439
12440			buttonPanel = "";
12441			if (showButtonPanel) {
12442				buttonPanel = $("<div class='ui-datepicker-buttonpane ui-widget-content'>")
12443					.append(isRTL ? controls : "")
12444					.append(this._isInRange(inst, gotoDate) ?
12445						$("<button>")
12446							.attr({
12447								type: "button",
12448								"class": "ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all",
12449								"data-handler": "today",
12450								"data-event": "click"
12451							})
12452							.text(currentText) :
12453						"")
12454					.append(isRTL ? "" : controls)[0].outerHTML;
12455			}
12456
12457			firstDay = parseInt(this._get(inst, "firstDay"), 10);
12458			firstDay = (isNaN(firstDay) ? 0 : firstDay);
12459
12460			showWeek = this._get(inst, "showWeek");
12461			dayNames = this._get(inst, "dayNames");
12462			dayNamesMin = this._get(inst, "dayNamesMin");
12463			monthNames = this._get(inst, "monthNames");
12464			monthNamesShort = this._get(inst, "monthNamesShort");
12465			beforeShowDay = this._get(inst, "beforeShowDay");
12466			showOtherMonths = this._get(inst, "showOtherMonths");
12467			selectOtherMonths = this._get(inst, "selectOtherMonths");
12468			defaultDate = this._getDefaultDate(inst);
12469			html = "";
12470
12471			for (row = 0; row < numMonths[0]; row++) {
12472				group = "";
12473				this.maxRows = 4;
12474				for (col = 0; col < numMonths[1]; col++) {
12475					selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
12476					cornerClass = " ui-corner-all";
12477					calender = "";
12478					if (isMultiMonth) {
12479						calender += "<div class='ui-datepicker-group";
12480						if (numMonths[1] > 1) {
12481							switch (col) {
12482								case 0: calender += " ui-datepicker-group-first";
12483									cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
12484								case numMonths[1] - 1: calender += " ui-datepicker-group-last";
12485									cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
12486								default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
12487							}
12488						}
12489						calender += "'>";
12490					}
12491					calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
12492						(/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
12493						(/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
12494						this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
12495							row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
12496						"</div><table class='ui-datepicker-calendar'><thead>" +
12497						"<tr>";
12498					thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
12499					for (dow = 0; dow < 7; dow++) { // days of the week
12500						day = (dow + firstDay) % 7;
12501						thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
12502							"<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
12503					}
12504					calender += thead + "</tr></thead><tbody>";
12505					daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
12506					if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
12507						inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
12508					}
12509					leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
12510					curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
12511					numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
12512					this.maxRows = numRows;
12513					printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
12514					for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
12515						calender += "<tr>";
12516						tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
12517							this._get(inst, "calculateWeek")(printDate) + "</td>");
12518						for (dow = 0; dow < 7; dow++) { // create date picker days
12519							daySettings = (beforeShowDay ?
12520								beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
12521							otherMonth = (printDate.getMonth() !== drawMonth);
12522							unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
12523								(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
12524							tbody += "<td class='" +
12525								((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
12526								(otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
12527								((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
12528									(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
12529
12530									// or defaultDate is current printedDate and defaultDate is selectedDate
12531									" " + this._dayOverClass : "") + // highlight selected day
12532								(unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "") +  // highlight unselectable days
12533								(otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
12534									(printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
12535									(printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
12536								((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
12537								(unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
12538								(otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
12539									(unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
12540										(printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
12541										(printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
12542										(otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
12543										"' href='#' aria-current='" + (printDate.getTime() === currentDate.getTime() ? "true" : "false") + // mark date as selected for screen reader
12544										"' data-date='" + printDate.getDate() + // store date as data
12545										"'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
12546							printDate.setDate(printDate.getDate() + 1);
12547							printDate = this._daylightSavingAdjust(printDate);
12548						}
12549						calender += tbody + "</tr>";
12550					}
12551					drawMonth++;
12552					if (drawMonth > 11) {
12553						drawMonth = 0;
12554						drawYear++;
12555					}
12556					calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
12557						((numMonths[0] > 0 && col === numMonths[1] - 1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
12558					group += calender;
12559				}
12560				html += group;
12561			}
12562			html += buttonPanel;
12563			inst._keyEvent = false;
12564			return html;
12565		},
12566
12567		/* Generate the month and year header. */
12568		_generateMonthYearHeader: function (inst, drawMonth, drawYear, minDate, maxDate,
12569			secondary, monthNames, monthNamesShort) {
12570
12571			var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
12572				changeMonth = this._get(inst, "changeMonth"),
12573				changeYear = this._get(inst, "changeYear"),
12574				showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
12575				selectMonthLabel = this._get(inst, "selectMonthLabel"),
12576				selectYearLabel = this._get(inst, "selectYearLabel"),
12577				html = "<div class='ui-datepicker-title'>",
12578				monthHtml = "";
12579
12580			// Month selection
12581			if (secondary || !changeMonth) {
12582				monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
12583			} else {
12584				inMinYear = (minDate && minDate.getFullYear() === drawYear);
12585				inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
12586				monthHtml += "<select class='ui-datepicker-month' aria-label='" + selectMonthLabel + "' data-handler='selectMonth' data-event='change'>";
12587				for (month = 0; month < 12; month++) {
12588					if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
12589						monthHtml += "<option value='" + month + "'" +
12590							(month === drawMonth ? " selected='selected'" : "") +
12591							">" + monthNamesShort[month] + "</option>";
12592					}
12593				}
12594				monthHtml += "</select>";
12595			}
12596
12597			if (!showMonthAfterYear) {
12598				html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "");
12599			}
12600
12601			// Year selection
12602			if (!inst.yearshtml) {
12603				inst.yearshtml = "";
12604				if (secondary || !changeYear) {
12605					html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
12606				} else {
12607
12608					// determine range of years to display
12609					years = this._get(inst, "yearRange").split(":");
12610					thisYear = new Date().getFullYear();
12611					determineYear = function (value) {
12612						var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
12613							(value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
12614								parseInt(value, 10)));
12615						return (isNaN(year) ? thisYear : year);
12616					};
12617					year = determineYear(years[0]);
12618					endYear = Math.max(year, determineYear(years[1] || ""));
12619					year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
12620					endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
12621					inst.yearshtml += "<select class='ui-datepicker-year' aria-label='" + selectYearLabel + "' data-handler='selectYear' data-event='change'>";
12622					for (; year <= endYear; year++) {
12623						inst.yearshtml += "<option value='" + year + "'" +
12624							(year === drawYear ? " selected='selected'" : "") +
12625							">" + year + "</option>";
12626					}
12627					inst.yearshtml += "</select>";
12628
12629					html += inst.yearshtml;
12630					inst.yearshtml = null;
12631				}
12632			}
12633
12634			html += this._get(inst, "yearSuffix");
12635			if (showMonthAfterYear) {
12636				html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml;
12637			}
12638			html += "</div>"; // Close datepicker_header
12639			return html;
12640		},
12641
12642		/* Adjust one of the date sub-fields. */
12643		_adjustInstDate: function (inst, offset, period) {
12644			var year = inst.selectedYear + (period === "Y" ? offset : 0),
12645				month = inst.selectedMonth + (period === "M" ? offset : 0),
12646				day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
12647				date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
12648
12649			inst.selectedDay = date.getDate();
12650			inst.drawMonth = inst.selectedMonth = date.getMonth();
12651			inst.drawYear = inst.selectedYear = date.getFullYear();
12652			if (period === "M" || period === "Y") {
12653				this._notifyChange(inst);
12654			}
12655		},
12656
12657		/* Ensure a date is within any min/max bounds. */
12658		_restrictMinMax: function (inst, date) {
12659			var minDate = this._getMinMaxDate(inst, "min"),
12660				maxDate = this._getMinMaxDate(inst, "max"),
12661				newDate = (minDate && date < minDate ? minDate : date);
12662			return (maxDate && newDate > maxDate ? maxDate : newDate);
12663		},
12664
12665		/* Notify change of month/year. */
12666		_notifyChange: function (inst) {
12667			var onChange = this._get(inst, "onChangeMonthYear");
12668			if (onChange) {
12669				onChange.apply((inst.input ? inst.input[0] : null),
12670					[inst.selectedYear, inst.selectedMonth + 1, inst]);
12671			}
12672		},
12673
12674		/* Determine the number of months to show. */
12675		_getNumberOfMonths: function (inst) {
12676			var numMonths = this._get(inst, "numberOfMonths");
12677			return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
12678		},
12679
12680		/* Determine the current maximum date - ensure no time components are set. */
12681		_getMinMaxDate: function (inst, minMax) {
12682			return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
12683		},
12684
12685		/* Find the number of days in a given month. */
12686		_getDaysInMonth: function (year, month) {
12687			return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
12688		},
12689
12690		/* Find the day of the week of the first of a month. */
12691		_getFirstDayOfMonth: function (year, month) {
12692			return new Date(year, month, 1).getDay();
12693		},
12694
12695		/* Determines if we should allow a "next/prev" month display change. */
12696		_canAdjustMonth: function (inst, offset, curYear, curMonth) {
12697			var numMonths = this._getNumberOfMonths(inst),
12698				date = this._daylightSavingAdjust(new Date(curYear,
12699					curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
12700
12701			if (offset < 0) {
12702				date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
12703			}
12704			return this._isInRange(inst, date);
12705		},
12706
12707		/* Is the given date in the accepted range? */
12708		_isInRange: function (inst, date) {
12709			var yearSplit, currentYear,
12710				minDate = this._getMinMaxDate(inst, "min"),
12711				maxDate = this._getMinMaxDate(inst, "max"),
12712				minYear = null,
12713				maxYear = null,
12714				years = this._get(inst, "yearRange");
12715			if (years) {
12716				yearSplit = years.split(":");
12717				currentYear = new Date().getFullYear();
12718				minYear = parseInt(yearSplit[0], 10);
12719				maxYear = parseInt(yearSplit[1], 10);
12720				if (yearSplit[0].match(/[+\-].*/)) {
12721					minYear += currentYear;
12722				}
12723				if (yearSplit[1].match(/[+\-].*/)) {
12724					maxYear += currentYear;
12725				}
12726			}
12727
12728			return ((!minDate || date.getTime() >= minDate.getTime()) &&
12729				(!maxDate || date.getTime() <= maxDate.getTime()) &&
12730				(!minYear || date.getFullYear() >= minYear) &&
12731				(!maxYear || date.getFullYear() <= maxYear));
12732		},
12733
12734		/* Provide the configuration settings for formatting/parsing. */
12735		_getFormatConfig: function (inst) {
12736			var shortYearCutoff = this._get(inst, "shortYearCutoff");
12737			shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
12738				new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
12739			return {
12740				shortYearCutoff: shortYearCutoff,
12741				dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
12742				monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")
12743			};
12744		},
12745
12746		/* Format the given date for display. */
12747		_formatDate: function (inst, day, month, year) {
12748			if (!day) {
12749				inst.currentDay = inst.selectedDay;
12750				inst.currentMonth = inst.selectedMonth;
12751				inst.currentYear = inst.selectedYear;
12752			}
12753			var date = (day ? (typeof day === "object" ? day :
12754				this._daylightSavingAdjust(new Date(year, month, day))) :
12755				this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
12756			return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
12757		}
12758	});
12759
12760	/*
12761	 * Bind hover events for datepicker elements.
12762	 * Done via delegate so the binding only occurs once in the lifetime of the parent div.
12763	 * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
12764	 */
12765	function datepicker_bindHover(dpDiv) {
12766		var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
12767		return dpDiv.on("mouseout", selector, function () {
12768			$(this).removeClass("ui-state-hover");
12769			if (this.className.indexOf("ui-datepicker-prev") !== -1) {
12770				$(this).removeClass("ui-datepicker-prev-hover");
12771			}
12772			if (this.className.indexOf("ui-datepicker-next") !== -1) {
12773				$(this).removeClass("ui-datepicker-next-hover");
12774			}
12775		})
12776			.on("mouseover", selector, datepicker_handleMouseover);
12777	}
12778
12779	function datepicker_handleMouseover() {
12780		if (!$.datepicker._isDisabledDatepicker(datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
12781			$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
12782			$(this).addClass("ui-state-hover");
12783			if (this.className.indexOf("ui-datepicker-prev") !== -1) {
12784				$(this).addClass("ui-datepicker-prev-hover");
12785			}
12786			if (this.className.indexOf("ui-datepicker-next") !== -1) {
12787				$(this).addClass("ui-datepicker-next-hover");
12788			}
12789		}
12790	}
12791
12792	/* jQuery extend now ignores nulls! */
12793	function datepicker_extendRemove(target, props) {
12794		$.extend(target, props);
12795		for (var name in props) {
12796			if (props[name] == null) {
12797				target[name] = props[name];
12798			}
12799		}
12800		return target;
12801	}
12802
12803	/* Invoke the datepicker functionality.
12804	   @param  options  string - a command, optionally followed by additional parameters or
12805						Object - settings for attaching new datepicker functionality
12806	   @return  jQuery object */
12807	$.fn.datepicker = function (options) {
12808
12809		/* Verify an empty collection wasn't passed - Fixes #6976 */
12810		if (!this.length) {
12811			return this;
12812		}
12813
12814		/* Initialise the date picker. */
12815		if (!$.datepicker.initialized) {
12816			$(document).on("mousedown", $.datepicker._checkExternalClick);
12817			$.datepicker.initialized = true;
12818		}
12819
12820		/* Append datepicker main container to body if not exist. */
12821		if ($("#" + $.datepicker._mainDivId).length === 0) {
12822			$("body").append($.datepicker.dpDiv);
12823		}
12824
12825		var otherArgs = Array.prototype.slice.call(arguments, 1);
12826		if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
12827			return $.datepicker["_" + options + "Datepicker"].
12828				apply($.datepicker, [this[0]].concat(otherArgs));
12829		}
12830		if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
12831			return $.datepicker["_" + options + "Datepicker"].
12832				apply($.datepicker, [this[0]].concat(otherArgs));
12833		}
12834		return this.each(function () {
12835			if (typeof options === "string") {
12836				$.datepicker["_" + options + "Datepicker"]
12837					.apply($.datepicker, [this].concat(otherArgs));
12838			} else {
12839				$.datepicker._attachDatepicker(this, options);
12840			}
12841		});
12842	};
12843
12844	$.datepicker = new Datepicker(); // singleton instance
12845	$.datepicker.initialized = false;
12846	$.datepicker.uuid = new Date().getTime();
12847	$.datepicker.version = "1.13.1";
12848
12849	var widgetsDatepicker = $.datepicker;
12850
12851
12852	/*!
12853	 * jQuery UI Dialog 1.13.1
12854	 * http://jqueryui.com
vendor: 28,232 bytes, lines 12855-13922
12855	 *
12856	 * Copyright jQuery Foundation and other contributors
12857	 * Released under the MIT license.
12858	 * http://jquery.org/license
12859	 */
12860
12861	//>>label: Dialog
12862	//>>group: Widgets
12863	//>>description: Displays customizable dialog windows.
12864	//>>docs: http://api.jqueryui.com/dialog/
12865	//>>demos: http://jqueryui.com/dialog/
12866	//>>css.structure: ../../themes/base/core.css
12867	//>>css.structure: ../../themes/base/dialog.css
12868	//>>css.theme: ../../themes/base/theme.css
12869
12870
12871	$.widget("ui.dialog", {
12872		version: "1.13.1",
12873		options: {
12874			appendTo: "body",
12875			autoOpen: true,
12876			buttons: [],
12877			classes: {
12878				"ui-dialog": "ui-corner-all",
12879				"ui-dialog-titlebar": "ui-corner-all"
12880			},
12881			closeOnEscape: true,
12882			closeText: "Close",
12883			draggable: true,
12884			hide: null,
12885			height: "auto",
12886			maxHeight: null,
12887			maxWidth: null,
12888			minHeight: 150,
12889			minWidth: 150,
12890			modal: false,
12891			position: {
12892				my: "center",
12893				at: "center",
12894				of: window,
12895				collision: "fit",
12896
12897				// Ensure the titlebar is always visible
12898				using: function (pos) {
12899					var topOffset = $(this).css(pos).offset().top;
12900					if (topOffset < 0) {
12901						$(this).css("top", pos.top - topOffset);
12902					}
12903				}
12904			},
12905			resizable: true,
12906			show: null,
12907			title: null,
12908			width: 300,
12909
12910			// Callbacks
12911			beforeClose: null,
12912			close: null,
12913			drag: null,
12914			dragStart: null,
12915			dragStop: null,
12916			focus: null,
12917			open: null,
12918			resize: null,
12919			resizeStart: null,
12920			resizeStop: null
12921		},
12922
12923		sizeRelatedOptions: {
12924			buttons: true,
12925			height: true,
12926			maxHeight: true,
12927			maxWidth: true,
12928			minHeight: true,
12929			minWidth: true,
12930			width: true
12931		},
12932
12933		resizableRelatedOptions: {
12934			maxHeight: true,
12935			maxWidth: true,
12936			minHeight: true,
12937			minWidth: true
12938		},
12939
12940		_create: function () {
12941			this.originalCss = {
12942				display: this.element[0].style.display,
12943				width: this.element[0].style.width,
12944				minHeight: this.element[0].style.minHeight,
12945				maxHeight: this.element[0].style.maxHeight,
12946				height: this.element[0].style.height
12947			};
12948			this.originalPosition = {
12949				parent: this.element.parent(),
12950				index: this.element.parent().children().index(this.element)
12951			};
12952			this.originalTitle = this.element.attr("title");
12953			if (this.options.title == null && this.originalTitle != null) {
12954				this.options.title = this.originalTitle;
12955			}
12956
12957			// Dialogs can't be disabled
12958			if (this.options.disabled) {
12959				this.options.disabled = false;
12960			}
12961
12962			this._createWrapper();
12963
12964			this.element
12965				.show()
12966				.removeAttr("title")
12967				.appendTo(this.uiDialog);
12968
12969			this._addClass("ui-dialog-content", "ui-widget-content");
12970
12971			this._createTitlebar();
12972			this._createButtonPane();
12973
12974			if (this.options.draggable && $.fn.draggable) {
12975				this._makeDraggable();
12976			}
12977			if (this.options.resizable && $.fn.resizable) {
12978				this._makeResizable();
12979			}
12980
12981			this._isOpen = false;
12982
12983			this._trackFocus();
12984		},
12985
12986		_init: function () {
12987			if (this.options.autoOpen) {
12988				this.open();
12989			}
12990		},
12991
12992		_appendTo: function () {
12993			var element = this.options.appendTo;
12994			if (element && (element.jquery || element.nodeType)) {
12995				return $(element);
12996			}
12997			return this.document.find(element || "body").eq(0);
12998		},
12999
13000		_destroy: function () {
13001			var next,
13002				originalPosition = this.originalPosition;
13003
13004			this._untrackInstance();
13005			this._destroyOverlay();
13006
13007			this.element
13008				.removeUniqueId()
13009				.css(this.originalCss)
13010
13011				// Without detaching first, the following becomes really slow
13012				.detach();
13013
13014			this.uiDialog.remove();
13015
13016			if (this.originalTitle) {
13017				this.element.attr("title", this.originalTitle);
13018			}
13019
13020			next = originalPosition.parent.children().eq(originalPosition.index);
13021
13022			// Don't try to place the dialog next to itself (#8613)
13023			if (next.length && next[0] !== this.element[0]) {
13024				next.before(this.element);
13025			} else {
13026				originalPosition.parent.append(this.element);
13027			}
13028		},
13029
13030		widget: function () {
13031			return this.uiDialog;
13032		},
13033
13034		disable: $.noop,
13035		enable: $.noop,
13036
13037		close: function (event) {
13038			var that = this;
13039
13040			if (!this._isOpen || this._trigger("beforeClose", event) === false) {
13041				return;
13042			}
13043
13044			this._isOpen = false;
13045			this._focusedElement = null;
13046			this._destroyOverlay();
13047			this._untrackInstance();
13048
13049			if (!this.opener.filter(":focusable").trigger("focus").length) {
13050
13051				// Hiding a focused element doesn't trigger blur in WebKit
13052				// so in case we have nothing to focus on, explicitly blur the active element
13053				// https://bugs.webkit.org/show_bug.cgi?id=47182
13054				$.ui.safeBlur($.ui.safeActiveElement(this.document[0]));
13055			}
13056
13057			this._hide(this.uiDialog, this.options.hide, function () {
13058				that._trigger("close", event);
13059			});
13060		},
13061
13062		isOpen: function () {
13063			return this._isOpen;
13064		},
13065
13066		moveToTop: function () {
13067			this._moveToTop();
13068		},
13069
13070		_moveToTop: function (event, silent) {
13071			var moved = false,
13072				zIndices = this.uiDialog.siblings(".ui-front:visible").map(function () {
13073					return +$(this).css("z-index");
13074				}).get(),
13075				zIndexMax = Math.max.apply(null, zIndices);
13076
13077			if (zIndexMax >= +this.uiDialog.css("z-index")) {
13078				this.uiDialog.css("z-index", zIndexMax + 1);
13079				moved = true;
13080			}
13081
13082			if (moved && !silent) {
13083				this._trigger("focus", event);
13084			}
13085			return moved;
13086		},
13087
13088		open: function () {
13089			var that = this;
13090			if (this._isOpen) {
13091				if (this._moveToTop()) {
13092					this._focusTabbable();
13093				}
13094				return;
13095			}
13096
13097			this._isOpen = true;
13098			this.opener = $($.ui.safeActiveElement(this.document[0]));
13099
13100			this._size();
13101			this._position();
13102			this._createOverlay();
13103			this._moveToTop(null, true);
13104
13105			// Ensure the overlay is moved to the top with the dialog, but only when
13106			// opening. The overlay shouldn't move after the dialog is open so that
13107			// modeless dialogs opened after the modal dialog stack properly.
13108			if (this.overlay) {
13109				this.overlay.css("z-index", this.uiDialog.css("z-index") - 1);
13110			}
13111
13112			this._show(this.uiDialog, this.options.show, function () {
13113				that._focusTabbable();
13114				that._trigger("focus");
13115			});
13116
13117			// Track the dialog immediately upon opening in case a focus event
13118			// somehow occurs outside of the dialog before an element inside the
13119			// dialog is focused (#10152)
13120			this._makeFocusTarget();
13121
13122			this._trigger("open");
13123		},
13124
13125		_focusTabbable: function () {
13126
13127			// Set focus to the first match:
13128			// 1. An element that was focused previously
13129			// 2. First element inside the dialog matching [autofocus]
13130			// 3. Tabbable element inside the content element
13131			// 4. Tabbable element inside the buttonpane
13132			// 5. The close button
13133			// 6. The dialog itself
13134			var hasFocus = this._focusedElement;
13135			if (!hasFocus) {
13136				hasFocus = this.element.find("[autofocus]");
13137			}
13138			if (!hasFocus.length) {
13139				hasFocus = this.element.find(":tabbable");
13140			}
13141			if (!hasFocus.length) {
13142				hasFocus = this.uiDialogButtonPane.find(":tabbable");
13143			}
13144			if (!hasFocus.length) {
13145				hasFocus = this.uiDialogTitlebarClose.filter(":tabbable");
13146			}
13147			if (!hasFocus.length) {
13148				hasFocus = this.uiDialog;
13149			}
13150			hasFocus.eq(0).trigger("focus");
13151		},
13152
13153		_restoreTabbableFocus: function () {
13154			var activeElement = $.ui.safeActiveElement(this.document[0]),
13155				isActive = this.uiDialog[0] === activeElement ||
13156					$.contains(this.uiDialog[0], activeElement);
13157			if (!isActive) {
13158				this._focusTabbable();
13159			}
13160		},
13161
13162		_keepFocus: function (event) {
13163			event.preventDefault();
13164			this._restoreTabbableFocus();
13165
13166			// support: IE
13167			// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
13168			// so we check again later
13169			this._delay(this._restoreTabbableFocus);
13170		},
13171
13172		_createWrapper: function () {
13173			this.uiDialog = $("<div>")
13174				.hide()
13175				.attr({
13176
13177					// Setting tabIndex makes the div focusable
13178					tabIndex: -1,
13179					role: "dialog"
13180				})
13181				.appendTo(this._appendTo());
13182
13183			this._addClass(this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front");
13184			this._on(this.uiDialog, {
13185				keydown: function (event) {
13186					if (this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
13187						event.keyCode === $.ui.keyCode.ESCAPE) {
13188						event.preventDefault();
13189						this.close(event);
13190						return;
13191					}
13192
13193					// Prevent tabbing out of dialogs
13194					if (event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented()) {
13195						return;
13196					}
13197					var tabbables = this.uiDialog.find(":tabbable"),
13198						first = tabbables.first(),
13199						last = tabbables.last();
13200
13201					if ((event.target === last[0] || event.target === this.uiDialog[0]) &&
13202						!event.shiftKey) {
13203						this._delay(function () {
13204							first.trigger("focus");
13205						});
13206						event.preventDefault();
13207					} else if ((event.target === first[0] ||
13208						event.target === this.uiDialog[0]) && event.shiftKey) {
13209						this._delay(function () {
13210							last.trigger("focus");
13211						});
13212						event.preventDefault();
13213					}
13214				},
13215				mousedown: function (event) {
13216					if (this._moveToTop(event)) {
13217						this._focusTabbable();
13218					}
13219				}
13220			});
13221
13222			// We assume that any existing aria-describedby attribute means
13223			// that the dialog content is marked up properly
13224			// otherwise we brute force the content as the description
13225			if (!this.element.find("[aria-describedby]").length) {
13226				this.uiDialog.attr({
13227					"aria-describedby": this.element.uniqueId().attr("id")
13228				});
13229			}
13230		},
13231
13232		_createTitlebar: function () {
13233			var uiDialogTitle;
13234
13235			this.uiDialogTitlebar = $("<div>");
13236			this._addClass(this.uiDialogTitlebar,
13237				"ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix");
13238			this._on(this.uiDialogTitlebar, {
13239				mousedown: function (event) {
13240
13241					// Don't prevent click on close button (#8838)
13242					// Focusing a dialog that is partially scrolled out of view
13243					// causes the browser to scroll it into view, preventing the click event
13244					if (!$(event.target).closest(".ui-dialog-titlebar-close")) {
13245
13246						// Dialog isn't getting focus when dragging (#8063)
13247						this.uiDialog.trigger("focus");
13248					}
13249				}
13250			});
13251
13252			// Support: IE
13253			// Use type="button" to prevent enter keypresses in textboxes from closing the
13254			// dialog in IE (#9312)
13255			this.uiDialogTitlebarClose = $("<button type='button'></button>")
13256				.button({
13257					label: $("<a>").text(this.options.closeText).html(),
13258					icon: "ui-icon-closethick",
13259					showLabel: false
13260				})
13261				.appendTo(this.uiDialogTitlebar);
13262
13263			this._addClass(this.uiDialogTitlebarClose, "ui-dialog-titlebar-close");
13264			this._on(this.uiDialogTitlebarClose, {
13265				click: function (event) {
13266					event.preventDefault();
13267					this.close(event);
13268				}
13269			});
13270
13271			uiDialogTitle = $("<span>").uniqueId().prependTo(this.uiDialogTitlebar);
13272			this._addClass(uiDialogTitle, "ui-dialog-title");
13273			this._title(uiDialogTitle);
13274
13275			this.uiDialogTitlebar.prependTo(this.uiDialog);
13276
13277			this.uiDialog.attr({
13278				"aria-labelledby": uiDialogTitle.attr("id")
13279			});
13280		},
13281
13282		_title: function (title) {
13283			if (this.options.title) {
13284				title.text(this.options.title);
13285			} else {
13286				title.html("&#160;");
13287			}
13288		},
13289
13290		_createButtonPane: function () {
13291			this.uiDialogButtonPane = $("<div>");
13292			this._addClass(this.uiDialogButtonPane, "ui-dialog-buttonpane",
13293				"ui-widget-content ui-helper-clearfix");
13294
13295			this.uiButtonSet = $("<div>")
13296				.appendTo(this.uiDialogButtonPane);
13297			this._addClass(this.uiButtonSet, "ui-dialog-buttonset");
13298
13299			this._createButtons();
13300		},
13301
13302		_createButtons: function () {
13303			var that = this,
13304				buttons = this.options.buttons;
13305
13306			// If we already have a button pane, remove it
13307			this.uiDialogButtonPane.remove();
13308			this.uiButtonSet.empty();
13309
13310			if ($.isEmptyObject(buttons) || (Array.isArray(buttons) && !buttons.length)) {
13311				this._removeClass(this.uiDialog, "ui-dialog-buttons");
13312				return;
13313			}
13314
13315			$.each(buttons, function (name, props) {
13316				var click, buttonOptions;
13317				props = typeof props === "function" ?
13318					{ click: props, text: name } :
13319					props;
13320
13321				// Default to a non-submitting button
13322				props = $.extend({ type: "button" }, props);
13323
13324				// Change the context for the click callback to be the main element
13325				click = props.click;
13326				buttonOptions = {
13327					icon: props.icon,
13328					iconPosition: props.iconPosition,
13329					showLabel: props.showLabel,
13330
13331					// Deprecated options
13332					icons: props.icons,
13333					text: props.text
13334				};
13335
13336				delete props.click;
13337				delete props.icon;
13338				delete props.iconPosition;
13339				delete props.showLabel;
13340
13341				// Deprecated options
13342				delete props.icons;
13343				if (typeof props.text === "boolean") {
13344					delete props.text;
13345				}
13346
13347				$("<button></button>", props)
13348					.button(buttonOptions)
13349					.appendTo(that.uiButtonSet)
13350					.on("click", function () {
13351						click.apply(that.element[0], arguments);
13352					});
13353			});
13354			this._addClass(this.uiDialog, "ui-dialog-buttons");
13355			this.uiDialogButtonPane.appendTo(this.uiDialog);
13356		},
13357
13358		_makeDraggable: function () {
13359			var that = this,
13360				options = this.options;
13361
13362			function filteredUi(ui) {
13363				return {
13364					position: ui.position,
13365					offset: ui.offset
13366				};
13367			}
13368
13369			this.uiDialog.draggable({
13370				cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
13371				handle: ".ui-dialog-titlebar",
13372				containment: "document",
13373				start: function (event, ui) {
13374					that._addClass($(this), "ui-dialog-dragging");
13375					that._blockFrames();
13376					that._trigger("dragStart", event, filteredUi(ui));
13377				},
13378				drag: function (event, ui) {
13379					that._trigger("drag", event, filteredUi(ui));
13380				},
13381				stop: function (event, ui) {
13382					var left = ui.offset.left - that.document.scrollLeft(),
13383						top = ui.offset.top - that.document.scrollTop();
13384
13385					options.position = {
13386						my: "left top",
13387						at: "left" + (left >= 0 ? "+" : "") + left + " " +
13388							"top" + (top >= 0 ? "+" : "") + top,
13389						of: that.window
13390					};
13391					that._removeClass($(this), "ui-dialog-dragging");
13392					that._unblockFrames();
13393					that._trigger("dragStop", event, filteredUi(ui));
13394				}
13395			});
13396		},
13397
13398		_makeResizable: function () {
13399			var that = this,
13400				options = this.options,
13401				handles = options.resizable,
13402
13403				// .ui-resizable has position: relative defined in the stylesheet
13404				// but dialogs have to use absolute or fixed positioning
13405				position = this.uiDialog.css("position"),
13406				resizeHandles = typeof handles === "string" ?
13407					handles :
13408					"n,e,s,w,se,sw,ne,nw";
13409
13410			function filteredUi(ui) {
13411				return {
13412					originalPosition: ui.originalPosition,
13413					originalSize: ui.originalSize,
13414					position: ui.position,
13415					size: ui.size
13416				};
13417			}
13418
13419			this.uiDialog.resizable({
13420				cancel: ".ui-dialog-content",
13421				containment: "document",
13422				alsoResize: this.element,
13423				maxWidth: options.maxWidth,
13424				maxHeight: options.maxHeight,
13425				minWidth: options.minWidth,
13426				minHeight: this._minHeight(),
13427				handles: resizeHandles,
13428				start: function (event, ui) {
13429					that._addClass($(this), "ui-dialog-resizing");
13430					that._blockFrames();
13431					that._trigger("resizeStart", event, filteredUi(ui));
13432				},
13433				resize: function (event, ui) {
13434					that._trigger("resize", event, filteredUi(ui));
13435				},
13436				stop: function (event, ui) {
13437					var offset = that.uiDialog.offset(),
13438						left = offset.left - that.document.scrollLeft(),
13439						top = offset.top - that.document.scrollTop();
13440
13441					options.height = that.uiDialog.height();
13442					options.width = that.uiDialog.width();
13443					options.position = {
13444						my: "left top",
13445						at: "left" + (left >= 0 ? "+" : "") + left + " " +
13446							"top" + (top >= 0 ? "+" : "") + top,
13447						of: that.window
13448					};
13449					that._removeClass($(this), "ui-dialog-resizing");
13450					that._unblockFrames();
13451					that._trigger("resizeStop", event, filteredUi(ui));
13452				}
13453			})
13454				.css("position", position);
13455		},
13456
13457		_trackFocus: function () {
13458			this._on(this.widget(), {
13459				focusin: function (event) {
13460					this._makeFocusTarget();
13461					this._focusedElement = $(event.target);
13462				}
13463			});
13464		},
13465
13466		_makeFocusTarget: function () {
13467			this._untrackInstance();
13468			this._trackingInstances().unshift(this);
13469		},
13470
13471		_untrackInstance: function () {
13472			var instances = this._trackingInstances(),
13473				exists = $.inArray(this, instances);
13474			if (exists !== -1) {
13475				instances.splice(exists, 1);
13476			}
13477		},
13478
13479		_trackingInstances: function () {
13480			var instances = this.document.data("ui-dialog-instances");
13481			if (!instances) {
13482				instances = [];
13483				this.document.data("ui-dialog-instances", instances);
13484			}
13485			return instances;
13486		},
13487
13488		_minHeight: function () {
13489			var options = this.options;
13490
13491			return options.height === "auto" ?
13492				options.minHeight :
13493				Math.min(options.minHeight, options.height);
13494		},
13495
13496		_position: function () {
13497
13498			// Need to show the dialog to get the actual offset in the position plugin
13499			var isVisible = this.uiDialog.is(":visible");
13500			if (!isVisible) {
13501				this.uiDialog.show();
13502			}
13503			this.uiDialog.position(this.options.position);
13504			if (!isVisible) {
13505				this.uiDialog.hide();
13506			}
13507		},
13508
13509		_setOptions: function (options) {
13510			var that = this,
13511				resize = false,
13512				resizableOptions = {};
13513
13514			$.each(options, function (key, value) {
13515				that._setOption(key, value);
13516
13517				if (key in that.sizeRelatedOptions) {
13518					resize = true;
13519				}
13520				if (key in that.resizableRelatedOptions) {
13521					resizableOptions[key] = value;
13522				}
13523			});
13524
13525			if (resize) {
13526				this._size();
13527				this._position();
13528			}
13529			if (this.uiDialog.is(":data(ui-resizable)")) {
13530				this.uiDialog.resizable("option", resizableOptions);
13531			}
13532		},
13533
13534		_setOption: function (key, value) {
13535			var isDraggable, isResizable,
13536				uiDialog = this.uiDialog;
13537
13538			if (key === "disabled") {
13539				return;
13540			}
13541
13542			this._super(key, value);
13543
13544			if (key === "appendTo") {
13545				this.uiDialog.appendTo(this._appendTo());
13546			}
13547
13548			if (key === "buttons") {
13549				this._createButtons();
13550			}
13551
13552			if (key === "closeText") {
13553				this.uiDialogTitlebarClose.button({
13554
13555					// Ensure that we always pass a string
13556					label: $("<a>").text("" + this.options.closeText).html()
13557				});
13558			}
13559
13560			if (key === "draggable") {
13561				isDraggable = uiDialog.is(":data(ui-draggable)");
13562				if (isDraggable && !value) {
13563					uiDialog.draggable("destroy");
13564				}
13565
13566				if (!isDraggable && value) {
13567					this._makeDraggable();
13568				}
13569			}
13570
13571			if (key === "position") {
13572				this._position();
13573			}
13574
13575			if (key === "resizable") {
13576
13577				// currently resizable, becoming non-resizable
13578				isResizable = uiDialog.is(":data(ui-resizable)");
13579				if (isResizable && !value) {
13580					uiDialog.resizable("destroy");
13581				}
13582
13583				// Currently resizable, changing handles
13584				if (isResizable && typeof value === "string") {
13585					uiDialog.resizable("option", "handles", value);
13586				}
13587
13588				// Currently non-resizable, becoming resizable
13589				if (!isResizable && value !== false) {
13590					this._makeResizable();
13591				}
13592			}
13593
13594			if (key === "title") {
13595				this._title(this.uiDialogTitlebar.find(".ui-dialog-title"));
13596			}
13597		},
13598
13599		_size: function () {
13600
13601			// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
13602			// divs will both have width and height set, so we need to reset them
13603			var nonContentHeight, minContentHeight, maxContentHeight,
13604				options = this.options;
13605
13606			// Reset content sizing
13607			this.element.show().css({
13608				width: "auto",
13609				minHeight: 0,
13610				maxHeight: "none",
13611				height: 0
13612			});
13613
13614			if (options.minWidth > options.width) {
13615				options.width = options.minWidth;
13616			}
13617
13618			// Reset wrapper sizing
13619			// determine the height of all the non-content elements
13620			nonContentHeight = this.uiDialog.css({
13621				height: "auto",
13622				width: options.width
13623			})
13624				.outerHeight();
13625			minContentHeight = Math.max(0, options.minHeight - nonContentHeight);
13626			maxContentHeight = typeof options.maxHeight === "number" ?
13627				Math.max(0, options.maxHeight - nonContentHeight) :
13628				"none";
13629
13630			if (options.height === "auto") {
13631				this.element.css({
13632					minHeight: minContentHeight,
13633					maxHeight: maxContentHeight,
13634					height: "auto"
13635				});
13636			} else {
13637				this.element.height(Math.max(0, options.height - nonContentHeight));
13638			}
13639
13640			if (this.uiDialog.is(":data(ui-resizable)")) {
13641				this.uiDialog.resizable("option", "minHeight", this._minHeight());
13642			}
13643		},
13644
13645		_blockFrames: function () {
13646			this.iframeBlocks = this.document.find("iframe").map(function () {
13647				var iframe = $(this);
13648
13649				return $("<div>")
13650					.css({
13651						position: "absolute",
13652						width: iframe.outerWidth(),
13653						height: iframe.outerHeight()
13654					})
13655					.appendTo(iframe.parent())
13656					.offset(iframe.offset())[0];
13657			});
13658		},
13659
13660		_unblockFrames: function () {
13661			if (this.iframeBlocks) {
13662				this.iframeBlocks.remove();
13663				delete this.iframeBlocks;
13664			}
13665		},
13666
13667		_allowInteraction: function (event) {
13668			if ($(event.target).closest(".ui-dialog").length) {
13669				return true;
13670			}
13671
13672			// TODO: Remove hack when datepicker implements
13673			// the .ui-front logic (#8989)
13674			return !!$(event.target).closest(".ui-datepicker").length;
13675		},
13676
13677		_createOverlay: function () {
13678			if (!this.options.modal) {
13679				return;
13680			}
13681
13682			var jqMinor = $.fn.jquery.substring(0, 4);
13683
13684			// We use a delay in case the overlay is created from an
13685			// event that we're going to be cancelling (#2804)
13686			var isOpening = true;
13687			this._delay(function () {
13688				isOpening = false;
13689			});
13690
13691			if (!this.document.data("ui-dialog-overlays")) {
13692
13693				// Prevent use of anchors and inputs
13694				// This doesn't use `_on()` because it is a shared event handler
13695				// across all open modal dialogs.
13696				this.document.on("focusin.ui-dialog", function (event) {
13697					if (isOpening) {
13698						return;
13699					}
13700
13701					var instance = this._trackingInstances()[0];
13702					if (!instance._allowInteraction(event)) {
13703						event.preventDefault();
13704						instance._focusTabbable();
13705
13706						// Support: jQuery >=3.4 <3.6 only
13707						// Focus re-triggering in jQuery 3.4/3.5 makes the original element
13708						// have its focus event propagated last, breaking the re-targeting.
13709						// Trigger focus in a delay in addition if needed to avoid the issue
13710						// See https://github.com/jquery/jquery/issues/4382
13711						if (jqMinor === "3.4." || jqMinor === "3.5.") {
13712							instance._delay(instance._restoreTabbableFocus);
13713						}
13714					}
13715				}.bind(this));
13716			}
13717
13718			this.overlay = $("<div>")
13719				.appendTo(this._appendTo());
13720
13721			this._addClass(this.overlay, null, "ui-widget-overlay ui-front");
13722			this._on(this.overlay, {
13723				mousedown: "_keepFocus"
13724			});
13725			this.document.data("ui-dialog-overlays",
13726				(this.document.data("ui-dialog-overlays") || 0) + 1);
13727		},
13728
13729		_destroyOverlay: function () {
13730			if (!this.options.modal) {
13731				return;
13732			}
13733
13734			if (this.overlay) {
13735				var overlays = this.document.data("ui-dialog-overlays") - 1;
13736
13737				if (!overlays) {
13738					this.document.off("focusin.ui-dialog");
13739					this.document.removeData("ui-dialog-overlays");
13740				} else {
13741					this.document.data("ui-dialog-overlays", overlays);
13742				}
13743
13744				this.overlay.remove();
13745				this.overlay = null;
13746			}
13747		}
13748	});
13749
13750	// DEPRECATED
13751	// TODO: switch return back to widget declaration at top of file when this is removed
13752	if ($.uiBackCompat !== false) {
13753
13754		// Backcompat for dialogClass option
13755		$.widget("ui.dialog", $.ui.dialog, {
13756			options: {
13757				dialogClass: ""
13758			},
13759			_createWrapper: function () {
13760				this._super();
13761				this.uiDialog.addClass(this.options.dialogClass);
13762			},
13763			_setOption: function (key, value) {
13764				if (key === "dialogClass") {
13765					this.uiDialog
13766						.removeClass(this.options.dialogClass)
13767						.addClass(value);
13768				}
13769				this._superApply(arguments);
13770			}
13771		});
13772	}
13773
13774	var widgetsDialog = $.ui.dialog;
13775
13776
13777	/*!
13778	 * jQuery UI Selectmenu 1.13.1
13779	 * http://jqueryui.com
13780	 *
13781	 * Copyright jQuery Foundation and other contributors
13782	 * Released under the MIT license.
13783	 * http://jquery.org/license
13784	 */
13785
13786	//>>label: Selectmenu
13787	//>>group: Widgets
13788	/* eslint-disable max-len */
13789	//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.
13790	/* eslint-enable max-len */
13791	//>>docs: http://api.jqueryui.com/selectmenu/
13792	//>>demos: http://jqueryui.com/selectmenu/
13793	//>>css.structure: ../../themes/base/core.css
13794	//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css
13795	//>>css.theme: ../../themes/base/theme.css
13796
13797
13798	var widgetsSelectmenu = $.widget("ui.selectmenu", [$.ui.formResetMixin, {
13799		version: "1.13.1",
13800		defaultElement: "<select>",
13801		options: {
13802			appendTo: null,
13803			classes: {
13804				"ui-selectmenu-button-open": "ui-corner-top",
13805				"ui-selectmenu-button-closed": "ui-corner-all"
13806			},
13807			disabled: null,
13808			icons: {
13809				button: "ui-icon-triangle-1-s"
13810			},
13811			position: {
13812				my: "left top",
13813				at: "left bottom",
13814				collision: "none"
13815			},
13816			width: false,
13817
13818			// Callbacks
13819			change: null,
13820			close: null,
13821			focus: null,
13822			open: null,
13823			select: null
13824		},
13825
13826		_create: function () {
13827			var selectmenuId = this.element.uniqueId().attr("id");
13828			this.ids = {
13829				element: selectmenuId,
13830				button: selectmenuId + "-button",
13831				menu: selectmenuId + "-menu"
13832			};
13833
13834			this._drawButton();
13835			this._drawMenu();
13836			this._bindFormResetHandler();
13837
13838			this._rendered = false;
13839			this.menuItems = $();
13840		},
13841
13842		_drawButton: function () {
13843			var icon,
13844				that = this,
13845				item = this._parseOption(
13846					this.element.find("option:selected"),
13847					this.element[0].selectedIndex
13848				);
13849
13850			// Associate existing label with the new button
13851			this.labels = this.element.labels().attr("for", this.ids.button);
13852			this._on(this.labels, {
13853				click: function (event) {
13854					this.button.trigger("focus");
13855					event.preventDefault();
13856				}
13857			});
13858
13859			// Hide original select element
13860			this.element.hide();
13861
13862			// Create button
13863			this.button = $("<span>", {
13864				tabindex: this.options.disabled ? -1 : 0,
13865				id: this.ids.button,
13866				role: "combobox",
13867				"aria-expanded": "false",
13868				"aria-autocomplete": "list",
13869				"aria-owns": this.ids.menu,
13870				"aria-haspopup": "true",
13871				title: this.element.attr("title")
13872			})
13873				.insertAfter(this.element);
13874
13875			this._addClass(this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
13876				"ui-button ui-widget");
13877
13878			icon = $("<span>").appendTo(this.button);
13879			this._addClass(icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button);
13880			this.buttonItem = this._renderButtonItem(item)
13881				.appendTo(this.button);
13882
13883			if (this.options.width !== false) {
13884				this._resizeButton();
13885			}
13886
13887			this._on(this.button, this._buttonEvents);
13888			this.button.one("focusin", function () {
13889
13890				// Delay rendering the menu items until the button receives focus.
13891				// The menu may have already been rendered via a programmatic open.
13892				if (!that._rendered) {
13893					that._refreshMenu();
13894				}
13895			});
13896		},
13897
13898		_drawMenu: function () {
13899			var that = this;
13900
13901			// Create menu
13902			this.menu = $("<ul>", {
13903				"aria-hidden": "true",
13904				"aria-labelledby": this.ids.button,
13905				id: this.ids.menu
13906			});
13907
13908			// Wrap menu
13909			this.menuWrap = $("<div>").append(this.menu);
13910			this._addClass(this.menuWrap, "ui-selectmenu-menu", "ui-front");
13911			this.menuWrap.appendTo(this._appendTo());
13912
13913			// Initialize menu widget
13914			this.menuInstance = this.menu
13915				.menu({
13916					classes: {
13917						"ui-menu": "ui-corner-bottom"
13918					},
13919					role: "listbox",
13920					select: function (event, ui) {
13921						event.preventDefault();
13922
vendor: 11,594 bytes, lines 13923-14393
13923						// Support: IE8
13924						// If the item was selected via a click, the text selection
13925						// will be destroyed in IE
13926						that._setSelection();
13927
13928						that._select(ui.item.data("ui-selectmenu-item"), event);
13929					},
13930					focus: function (event, ui) {
13931						var item = ui.item.data("ui-selectmenu-item");
13932
13933						// Prevent inital focus from firing and check if its a newly focused item
13934						if (that.focusIndex != null && item.index !== that.focusIndex) {
13935							that._trigger("focus", event, { item: item });
13936							if (!that.isOpen) {
13937								that._select(item, event);
13938							}
13939						}
13940						that.focusIndex = item.index;
13941
13942						that.button.attr("aria-activedescendant",
13943							that.menuItems.eq(item.index).attr("id"));
13944					}
13945				})
13946				.menu("instance");
13947
13948			// Don't close the menu on mouseleave
13949			this.menuInstance._off(this.menu, "mouseleave");
13950
13951			// Cancel the menu's collapseAll on document click
13952			this.menuInstance._closeOnDocumentClick = function () {
13953				return false;
13954			};
13955
13956			// Selects often contain empty items, but never contain dividers
13957			this.menuInstance._isDivider = function () {
13958				return false;
13959			};
13960		},
13961
13962		refresh: function () {
13963			this._refreshMenu();
13964			this.buttonItem.replaceWith(
13965				this.buttonItem = this._renderButtonItem(
13966
13967					// Fall back to an empty object in case there are no options
13968					this._getSelectedItem().data("ui-selectmenu-item") || {}
13969				)
13970			);
13971			if (this.options.width === null) {
13972				this._resizeButton();
13973			}
13974		},
13975
13976		_refreshMenu: function () {
13977			var item,
13978				options = this.element.find("option");
13979
13980			this.menu.empty();
13981
13982			this._parseOptions(options);
13983			this._renderMenu(this.menu, this.items);
13984
13985			this.menuInstance.refresh();
13986			this.menuItems = this.menu.find("li")
13987				.not(".ui-selectmenu-optgroup")
13988				.find(".ui-menu-item-wrapper");
13989
13990			this._rendered = true;
13991
13992			if (!options.length) {
13993				return;
13994			}
13995
13996			item = this._getSelectedItem();
13997
13998			// Update the menu to have the correct item focused
13999			this.menuInstance.focus(null, item);
14000			this._setAria(item.data("ui-selectmenu-item"));
14001
14002			// Set disabled state
14003			this._setOption("disabled", this.element.prop("disabled"));
14004		},
14005
14006		open: function (event) {
14007			if (this.options.disabled) {
14008				return;
14009			}
14010
14011			// If this is the first time the menu is being opened, render the items
14012			if (!this._rendered) {
14013				this._refreshMenu();
14014			} else {
14015
14016				// Menu clears focus on close, reset focus to selected item
14017				this._removeClass(this.menu.find(".ui-state-active"), null, "ui-state-active");
14018				this.menuInstance.focus(null, this._getSelectedItem());
14019			}
14020
14021			// If there are no options, don't open the menu
14022			if (!this.menuItems.length) {
14023				return;
14024			}
14025
14026			this.isOpen = true;
14027			this._toggleAttr();
14028			this._resizeMenu();
14029			this._position();
14030
14031			this._on(this.document, this._documentClick);
14032
14033			this._trigger("open", event);
14034		},
14035
14036		_position: function () {
14037			this.menuWrap.position($.extend({ of: this.button }, this.options.position));
14038		},
14039
14040		close: function (event) {
14041			if (!this.isOpen) {
14042				return;
14043			}
14044
14045			this.isOpen = false;
14046			this._toggleAttr();
14047
14048			this.range = null;
14049			this._off(this.document);
14050
14051			this._trigger("close", event);
14052		},
14053
14054		widget: function () {
14055			return this.button;
14056		},
14057
14058		menuWidget: function () {
14059			return this.menu;
14060		},
14061
14062		_renderButtonItem: function (item) {
14063			var buttonItem = $("<span>");
14064
14065			this._setText(buttonItem, item.label);
14066			this._addClass(buttonItem, "ui-selectmenu-text");
14067
14068			return buttonItem;
14069		},
14070
14071		_renderMenu: function (ul, items) {
14072			var that = this,
14073				currentOptgroup = "";
14074
14075			$.each(items, function (index, item) {
14076				var li;
14077
14078				if (item.optgroup !== currentOptgroup) {
14079					li = $("<li>", {
14080						text: item.optgroup
14081					});
14082					that._addClass(li, "ui-selectmenu-optgroup", "ui-menu-divider" +
14083						(item.element.parent("optgroup").prop("disabled") ?
14084							" ui-state-disabled" :
14085							""));
14086
14087					li.appendTo(ul);
14088
14089					currentOptgroup = item.optgroup;
14090				}
14091
14092				that._renderItemData(ul, item);
14093			});
14094		},
14095
14096		_renderItemData: function (ul, item) {
14097			return this._renderItem(ul, item).data("ui-selectmenu-item", item);
14098		},
14099
14100		_renderItem: function (ul, item) {
14101			var li = $("<li>"),
14102				wrapper = $("<div>", {
14103					title: item.element.attr("title")
14104				});
14105
14106			if (item.disabled) {
14107				this._addClass(li, null, "ui-state-disabled");
14108			}
14109			this._setText(wrapper, item.label);
14110
14111			return li.append(wrapper).appendTo(ul);
14112		},
14113
14114		_setText: function (element, value) {
14115			if (value) {
14116				element.text(value);
14117			} else {
14118				element.html("&#160;");
14119			}
14120		},
14121
14122		_move: function (direction, event) {
14123			var item, next,
14124				filter = ".ui-menu-item";
14125
14126			if (this.isOpen) {
14127				item = this.menuItems.eq(this.focusIndex).parent("li");
14128			} else {
14129				item = this.menuItems.eq(this.element[0].selectedIndex).parent("li");
14130				filter += ":not(.ui-state-disabled)";
14131			}
14132
14133			if (direction === "first" || direction === "last") {
14134				next = item[direction === "first" ? "prevAll" : "nextAll"](filter).eq(-1);
14135			} else {
14136				next = item[direction + "All"](filter).eq(0);
14137			}
14138
14139			if (next.length) {
14140				this.menuInstance.focus(event, next);
14141			}
14142		},
14143
14144		_getSelectedItem: function () {
14145			return this.menuItems.eq(this.element[0].selectedIndex).parent("li");
14146		},
14147
14148		_toggle: function (event) {
14149			this[this.isOpen ? "close" : "open"](event);
14150		},
14151
14152		_setSelection: function () {
14153			var selection;
14154
14155			if (!this.range) {
14156				return;
14157			}
14158
14159			if (window.getSelection) {
14160				selection = window.getSelection();
14161				selection.removeAllRanges();
14162				selection.addRange(this.range);
14163
14164				// Support: IE8
14165			} else {
14166				this.range.select();
14167			}
14168
14169			// Support: IE
14170			// Setting the text selection kills the button focus in IE, but
14171			// restoring the focus doesn't kill the selection.
14172			this.button.focus();
14173		},
14174
14175		_documentClick: {
14176			mousedown: function (event) {
14177				if (!this.isOpen) {
14178					return;
14179				}
14180
14181				if (!$(event.target).closest(".ui-selectmenu-menu, #" +
14182					$.escapeSelector(this.ids.button)).length) {
14183					this.close(event);
14184				}
14185			}
14186		},
14187
14188		_buttonEvents: {
14189
14190			// Prevent text selection from being reset when interacting with the selectmenu (#10144)
14191			mousedown: function () {
14192				var selection;
14193
14194				if (window.getSelection) {
14195					selection = window.getSelection();
14196					if (selection.rangeCount) {
14197						this.range = selection.getRangeAt(0);
14198					}
14199
14200					// Support: IE8
14201				} else {
14202					this.range = document.selection.createRange();
14203				}
14204			},
14205
14206			click: function (event) {
14207				this._setSelection();
14208				this._toggle(event);
14209			},
14210
14211			keydown: function (event) {
14212				var preventDefault = true;
14213				switch (event.keyCode) {
14214					case $.ui.keyCode.TAB:
14215					case $.ui.keyCode.ESCAPE:
14216						this.close(event);
14217						preventDefault = false;
14218						break;
14219					case $.ui.keyCode.ENTER:
14220						if (this.isOpen) {
14221							this._selectFocusedItem(event);
14222						}
14223						break;
14224					case $.ui.keyCode.UP:
14225						if (event.altKey) {
14226							this._toggle(event);
14227						} else {
14228							this._move("prev", event);
14229						}
14230						break;
14231					case $.ui.keyCode.DOWN:
14232						if (event.altKey) {
14233							this._toggle(event);
14234						} else {
14235							this._move("next", event);
14236						}
14237						break;
14238					case $.ui.keyCode.SPACE:
14239						if (this.isOpen) {
14240							this._selectFocusedItem(event);
14241						} else {
14242							this._toggle(event);
14243						}
14244						break;
14245					case $.ui.keyCode.LEFT:
14246						this._move("prev", event);
14247						break;
14248					case $.ui.keyCode.RIGHT:
14249						this._move("next", event);
14250						break;
14251					case $.ui.keyCode.HOME:
14252					case $.ui.keyCode.PAGE_UP:
14253						this._move("first", event);
14254						break;
14255					case $.ui.keyCode.END:
14256					case $.ui.keyCode.PAGE_DOWN:
14257						this._move("last", event);
14258						break;
14259					default:
14260						this.menu.trigger(event);
14261						preventDefault = false;
14262				}
14263
14264				if (preventDefault) {
14265					event.preventDefault();
14266				}
14267			}
14268		},
14269
14270		_selectFocusedItem: function (event) {
14271			var item = this.menuItems.eq(this.focusIndex).parent("li");
14272			if (!item.hasClass("ui-state-disabled")) {
14273				this._select(item.data("ui-selectmenu-item"), event);
14274			}
14275		},
14276
14277		_select: function (item, event) {
14278			var oldIndex = this.element[0].selectedIndex;
14279
14280			// Change native select element
14281			this.element[0].selectedIndex = item.index;
14282			this.buttonItem.replaceWith(this.buttonItem = this._renderButtonItem(item));
14283			this._setAria(item);
14284			this._trigger("select", event, { item: item });
14285
14286			if (item.index !== oldIndex) {
14287				this._trigger("change", event, { item: item });
14288			}
14289
14290			this.close(event);
14291		},
14292
14293		_setAria: function (item) {
14294			var id = this.menuItems.eq(item.index).attr("id");
14295
14296			this.button.attr({
14297				"aria-labelledby": id,
14298				"aria-activedescendant": id
14299			});
14300			this.menu.attr("aria-activedescendant", id);
14301		},
14302
14303		_setOption: function (key, value) {
14304			if (key === "icons") {
14305				var icon = this.button.find("span.ui-icon");
14306				this._removeClass(icon, null, this.options.icons.button)
14307					._addClass(icon, null, value.button);
14308			}
14309
14310			this._super(key, value);
14311
14312			if (key === "appendTo") {
14313				this.menuWrap.appendTo(this._appendTo());
14314			}
14315
14316			if (key === "width") {
14317				this._resizeButton();
14318			}
14319		},
14320
14321		_setOptionDisabled: function (value) {
14322			this._super(value);
14323
14324			this.menuInstance.option("disabled", value);
14325			this.button.attr("aria-disabled", value);
14326			this._toggleClass(this.button, null, "ui-state-disabled", value);
14327
14328			this.element.prop("disabled", value);
14329			if (value) {
14330				this.button.attr("tabindex", -1);
14331				this.close();
14332			} else {
14333				this.button.attr("tabindex", 0);
14334			}
14335		},
14336
14337		_appendTo: function () {
14338			var element = this.options.appendTo;
14339
14340			if (element) {
14341				element = element.jquery || element.nodeType ?
14342					$(element) :
14343					this.document.find(element).eq(0);
14344			}
14345
14346			if (!element || !element[0]) {
14347				element = this.element.closest(".ui-front, dialog");
14348			}
14349
14350			if (!element.length) {
14351				element = this.document[0].body;
14352			}
14353
14354			return element;
14355		},
14356
14357		_toggleAttr: function () {
14358			this.button.attr("aria-expanded", this.isOpen);
14359
14360			// We can't use two _toggleClass() calls here, because we need to make sure
14361			// we always remove classes first and add them second, otherwise if both classes have the
14362			// same theme class, it will be removed after we add it.
14363			this._removeClass(this.button, "ui-selectmenu-button-" +
14364				(this.isOpen ? "closed" : "open"))
14365				._addClass(this.button, "ui-selectmenu-button-" +
14366					(this.isOpen ? "open" : "closed"))
14367				._toggleClass(this.menuWrap, "ui-selectmenu-open", null, this.isOpen);
14368
14369			this.menu.attr("aria-hidden", !this.isOpen);
14370		},
14371
14372		_resizeButton: function () {
14373			var width = this.options.width;
14374
14375			// For `width: false`, just remove inline style and stop
14376			if (width === false) {
14377				this.button.css("width", "");
14378				return;
14379			}
14380
14381			// For `width: null`, match the width of the original element
14382			if (width === null) {
14383				width = this.element.show().outerWidth();
14384				this.element.hide();
14385			}
14386
14387			this.button.outerWidth(width);
14388		},
14389
14390		_resizeMenu: function () {
14391			this.menu.outerWidth(Math.max(
14392				this.button.outerWidth(),
14393
vendor: 1,163 bytes, lines 14394-14448
14394				// Support: IE10
14395				// IE10 wraps long text (possibly a rounding bug)
14396				// so we add 1px to avoid the wrapping
14397				this.menu.width("").outerWidth() + 1
14398			));
14399		},
14400
14401		_getCreateOptions: function () {
14402			var options = this._super();
14403
14404			options.disabled = this.element.prop("disabled");
14405
14406			return options;
14407		},
14408
14409		_parseOptions: function (options) {
14410			var that = this,
14411				data = [];
14412			options.each(function (index, item) {
14413				if (item.hidden) {
14414					return;
14415				}
14416
14417				data.push(that._parseOption($(item), index));
14418			});
14419			this.items = data;
14420		},
14421
14422		_parseOption: function (option, index) {
14423			var optgroup = option.parent("optgroup");
14424
14425			return {
14426				element: option,
14427				index: index,
14428				value: option.val(),
14429				label: option.text(),
14430				optgroup: optgroup.attr("label") || "",
14431				disabled: optgroup.prop("disabled") || option.prop("disabled")
14432			};
14433		},
14434
14435		_destroy: function () {
14436			this._unbindFormResetHandler();
14437			this.menuWrap.remove();
14438			this.button.remove();
14439			this.element.show();
14440			this.element.removeUniqueId();
14441			this.labels.attr("for", this.ids.element);
14442		}
14443	}]);
14444
14445
14446
14447
14448});

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.