]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Update dependencies.
authorBardi Harborow <bardi@bardiharborow.com>
Sat, 15 Jul 2017 09:23:36 +0000 (09:23 +0000)
committerBardi Harborow <bardi@bardiharborow.com>
Sun, 16 Jul 2017 03:51:16 +0000 (13:51 +1000)
Gemfile
Gemfile.lock
assets/js/vendor/anchor.min.js
assets/js/vendor/clipboard.min.js
assets/js/vendor/jquery-slim.min.js
js/tests/vendor/qunit.css
js/tests/vendor/qunit.js
package.json

diff --git a/Gemfile b/Gemfile
index 2fa340d111936c3076cfbc2bc6863a2163f5a38e..e32e222391dba03fbd68d55ca440c25bdefaf366 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,9 +1,9 @@
 source 'https://rubygems.org'
 
 group :development, :test do
-  gem 'jekyll', '~> 3.4.3'
+  gem 'jekyll', '~> 3.4.5'
   gem 'jekyll-redirect-from', '~> 0.12.1'
   gem 'jekyll-sitemap', '~> 1.1.1'
   gem 'jekyll-toc', '~> 0.3.0.pre1'
-  gem 'scss_lint', '~> 0.53.0'
+  gem 'scss_lint', '~> 0.54.0'
 end
index 5b894b564f96d2c772c8b001733418f392342f22..118a3e83ebfe5792c4af1cee5ee099a8624d21d8 100644 (file)
@@ -7,7 +7,7 @@ GEM
     ffi (1.9.18)
     ffi (1.9.18-x64-mingw32)
     forwardable-extended (2.6.0)
-    jekyll (3.4.3)
+    jekyll (3.4.5)
       addressable (~> 2.4)
       colorator (~> 1.0)
       jekyll-sass-converter (~> 1.0)
@@ -28,26 +28,28 @@ GEM
       nokogiri (~> 1.6)
     jekyll-watch (1.5.0)
       listen (~> 3.0, < 3.1)
-    kramdown (1.13.2)
+    kramdown (1.14.0)
     liquid (3.0.6)
     listen (3.0.8)
       rb-fsevent (~> 0.9, >= 0.9.4)
       rb-inotify (~> 0.9, >= 0.9.7)
     mercenary (0.3.6)
-    mini_portile2 (2.1.0)
-    nokogiri (1.7.2)
-      mini_portile2 (~> 2.1.0)
+    mini_portile2 (2.2.0)
+    nokogiri (1.8.0)
+      mini_portile2 (~> 2.2.0)
+    nokogiri (1.8.0-x64-mingw32)
+      mini_portile2 (~> 2.2.0)
     pathutil (0.14.0)
       forwardable-extended (~> 2.6)
     public_suffix (2.0.5)
     rake (12.0.0)
-    rb-fsevent (0.9.8)
-    rb-inotify (0.9.8)
-      ffi (>= 0.5.0)
+    rb-fsevent (0.10.2)
+    rb-inotify (0.9.10)
+      ffi (>= 0.5.0, < 2)
     rouge (1.11.1)
     safe_yaml (1.0.4)
-    sass (3.4.24)
-    scss_lint (0.53.0)
+    sass (3.4.25)
+    scss_lint (0.54.0)
       rake (>= 0.9, < 13)
       sass (~> 3.4.20)
 
@@ -56,11 +58,11 @@ PLATFORMS
   x64-mingw32
 
 DEPENDENCIES
-  jekyll (~> 3.4.3)
+  jekyll (~> 3.4.5)
   jekyll-redirect-from (~> 0.12.1)
   jekyll-sitemap (~> 1.1.1)
   jekyll-toc (~> 0.3.0.pre1)
-  scss_lint (~> 0.53.0)
+  scss_lint (~> 0.54.0)
 
 BUNDLED WITH
-   1.15.0
+   1.15.1
index 7f34489fbe37d5d10267b2b6f78a0b438d58d7d2..35575f1cc30658747238d3af88ab8692e3fdffc1 100644 (file)
@@ -1,6 +1,6 @@
 /**
- * AnchorJS - v3.2.2 - 2016-10-05
+ * AnchorJS - v4.0.0 - 2017-06-02
  * https://github.com/bryanbraun/anchorjs
- * Copyright (c) 2016 Bryan Braun; Licensed MIT
+ * Copyright (c) 2017 Bryan Braun; Licensed MIT
  */
-!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";function A(A){function e(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function t(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}function n(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style"),t=" .anchorjs-link {   opacity: 0;   text-decoration: none;   -webkit-font-smoothing: antialiased;   -moz-osx-font-smoothing: grayscale; }",n=" *:hover > .anchorjs-link, .anchorjs-link:focus  {   opacity: 1; }",i=' @font-face {   font-family: "anchorjs-icons";   src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',o=" [data-anchorjs-icon]::after {   content: attr(data-anchorjs-icon); }";e.className="anchorjs",e.appendChild(document.createTextNode("")),A=document.head.querySelector('[rel="stylesheet"], style'),void 0===A?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(t,e.sheet.cssRules.length),e.sheet.insertRule(n,e.sheet.cssRules.length),e.sheet.insertRule(o,e.sheet.cssRules.length),e.sheet.insertRule(i,e.sheet.cssRules.length)}}this.options=A||{},this.elements=[],e(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var i,o,s,c,r,a,h,l,u,d,f,p,w=[];if(e(this.options),p=this.options.visible,"touch"===p&&(p=this.isTouchDevice()?"always":"hover"),A||(A="h1, h2, h3, h4, h5, h6"),i=t(A),0===i.length)return!1;for(n(),o=document.querySelectorAll("[id]"),s=[].map.call(o,function(A){return A.id}),r=0;r<i.length;r++)if(this.hasAnchorJSLink(i[r]))w.push(r);else{if(i[r].hasAttribute("id"))c=i[r].getAttribute("id");else{l=this.urlify(i[r].textContent),u=l,h=0;do void 0!==a&&(u=l+"-"+h),a=s.indexOf(u),h+=1;while(-1!==a);a=void 0,s.push(u),i[r].setAttribute("id",u),c=u}d=c.replace(/-/g," "),f=document.createElement("a"),f.className="anchorjs-link "+this.options.class,f.href="#"+c,f.setAttribute("aria-label","Anchor link for: "+d),f.setAttribute("data-anchorjs-icon",this.options.icon),"always"===p&&(f.style.opacity="1"),""===this.options.icon&&(f.style.font="1em/1 anchorjs-icons","left"===this.options.placement&&(f.style.lineHeight="inherit")),"left"===this.options.placement?(f.style.position="absolute",f.style.marginLeft="-1em",f.style.paddingRight="0.5em",i[r].insertBefore(f,i[r].firstChild)):(f.style.paddingLeft="0.375em",i[r].appendChild(f))}for(r=0;r<w.length;r++)i.splice(w[r]-r,1);return this.elements=this.elements.concat(i),this},this.remove=function(A){for(var e,n,i=t(A),o=0;o<i.length;o++)n=i[o].querySelector(".anchorjs-link"),n&&(e=this.elements.indexOf(i[o]),-1!==e&&this.elements.splice(e,1),i[o].removeChild(n));return this},this.removeAll=function(){this.remove(this.elements)},this.urlify=function(A){var t,n=/[& +$,:;=?@"#{}|^~[`%!'\]\.\/\(\)\*\\]/g;return this.options.truncate||e(this.options),t=A.trim().replace(/\'/gi,"").replace(n,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&(" "+A.firstChild.className+" ").indexOf(" anchorjs-link ")>-1,t=A.lastChild&&(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ")>-1;return e||t||!1}}return A});
+!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";function A(A){function e(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function t(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}function n(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style");e.className="anchorjs",e.appendChild(document.createTextNode("")),void 0===(A=document.head.querySelector('[rel="stylesheet"], style'))?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(" .anchorjs-link {   opacity: 0;   text-decoration: none;   -webkit-font-smoothing: antialiased;   -moz-osx-font-smoothing: grayscale; }",e.sheet.cssRules.length),e.sheet.insertRule(" *:hover > .anchorjs-link, .anchorjs-link:focus  {   opacity: 1; }",e.sheet.cssRules.length),e.sheet.insertRule(" [data-anchorjs-icon]::after {   content: attr(data-anchorjs-icon); }",e.sheet.cssRules.length),e.sheet.insertRule(' @font-face {   font-family: "anchorjs-icons";   src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',e.sheet.cssRules.length)}}this.options=A||{},this.elements=[],e(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var i,o,s,c,r,a,h,l,u,d,f,g,p=[];if(e(this.options),"touch"===(g=this.options.visible)&&(g=this.isTouchDevice()?"always":"hover"),A||(A="h2, h3, h4, h5, h6"),0===(i=t(A)).length)return this;for(n(),o=document.querySelectorAll("[id]"),s=[].map.call(o,function(A){return A.id}),r=0;r<i.length;r++)if(this.hasAnchorJSLink(i[r]))p.push(r);else{if(i[r].hasAttribute("id"))c=i[r].getAttribute("id");else if(i[r].hasAttribute("data-anchor-id"))c=i[r].getAttribute("data-anchor-id");else{u=l=this.urlify(i[r].textContent),h=0;do{void 0!==a&&(u=l+"-"+h),a=s.indexOf(u),h+=1}while(-1!==a);a=void 0,s.push(u),i[r].setAttribute("id",u),c=u}d=c.replace(/-/g," "),(f=document.createElement("a")).className="anchorjs-link "+this.options.class,f.href="#"+c,f.setAttribute("aria-label","Anchor link for: "+d),f.setAttribute("data-anchorjs-icon",this.options.icon),"always"===g&&(f.style.opacity="1"),""===this.options.icon&&(f.style.font="1em/1 anchorjs-icons","left"===this.options.placement&&(f.style.lineHeight="inherit")),"left"===this.options.placement?(f.style.position="absolute",f.style.marginLeft="-1em",f.style.paddingRight="0.5em",i[r].insertBefore(f,i[r].firstChild)):(f.style.paddingLeft="0.375em",i[r].appendChild(f))}for(r=0;r<p.length;r++)i.splice(p[r]-r,1);return this.elements=this.elements.concat(i),this},this.remove=function(A){for(var e,n,i=t(A),o=0;o<i.length;o++)(n=i[o].querySelector(".anchorjs-link"))&&(-1!==(e=this.elements.indexOf(i[o]))&&this.elements.splice(e,1),i[o].removeChild(n));return this},this.removeAll=function(){this.remove(this.elements)},this.urlify=function(A){var t=/[& +$,:;=?@"#{}|^~[`%!'<>\]\.\/\(\)\*\\]/g;return this.options.truncate||e(this.options),A.trim().replace(/\'/gi,"").replace(t,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&(" "+A.firstChild.className+" ").indexOf(" anchorjs-link ")>-1,t=A.lastChild&&(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ")>-1;return e||t||!1}}return A});
\ No newline at end of file
index 1993676f9928815d7c7fe8afe5c9a9ef09097333..90fd15b1c06ab11571aceb625f76512bbc2b67ad 100644 (file)
@@ -1,7 +1,7 @@
 /*!
- * clipboard.js v1.6.1
+ * clipboard.js v1.7.1
  * https://zenorocha.github.io/clipboard.js
  *
  * Licensed MIT © Zeno Rocha
  */
-!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Clipboard=e()}}(function(){var e,t,n;return function e(t,n,o){function i(a,c){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!c&&l)return l(a,!0);if(r)return r(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var s=n[a]={exports:{}};t[a][0].call(s.exports,function(e){var n=t[a][1][e];return i(n?n:e)},s,s.exports,e,t,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a<o.length;a++)i(o[a]);return i}({1:[function(e,t,n){function o(e,t){for(;e&&e.nodeType!==i;){if(e.matches(t))return e;e=e.parentNode}}var i=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}t.exports=o},{}],2:[function(e,t,n){function o(e,t,n,o,r){var a=i.apply(this,arguments);return e.addEventListener(n,a,r),{destroy:function(){e.removeEventListener(n,a,r)}}}function i(e,t,n,o){return function(n){n.delegateTarget=r(n.target,t),n.delegateTarget&&o.call(e,n)}}var r=e("./closest");t.exports=o},{"./closest":1}],3:[function(e,t,n){n.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},n.nodeList=function(e){var t=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===t||"[object HTMLCollection]"===t)&&"length"in e&&(0===e.length||n.node(e[0]))},n.string=function(e){return"string"==typeof e||e instanceof String},n.fn=function(e){var t=Object.prototype.toString.call(e);return"[object Function]"===t}},{}],4:[function(e,t,n){function o(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!c.string(t))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(e))return i(e,t,n);if(c.nodeList(e))return r(e,t,n);if(c.string(e))return a(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}function r(e,t,n){return Array.prototype.forEach.call(e,function(e){e.addEventListener(t,n)}),{destroy:function(){Array.prototype.forEach.call(e,function(e){e.removeEventListener(t,n)})}}}function a(e,t,n){return l(document.body,e,t,n)}var c=e("./is"),l=e("delegate");t.exports=o},{"./is":3,delegate:2}],5:[function(e,t,n){function o(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var o=window.getSelection(),i=document.createRange();i.selectNodeContents(e),o.removeAllRanges(),o.addRange(i),t=o.toString()}return t}t.exports=o},{}],6:[function(e,t,n){function o(){}o.prototype={on:function(e,t,n){var o=this.e||(this.e={});return(o[e]||(o[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){function o(){i.off(e,o),t.apply(n,arguments)}var i=this;return o._=t,this.on(e,o,n)},emit:function(e){var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),o=0,i=n.length;for(o;o<i;o++)n[o].fn.apply(n[o].ctx,t);return this},off:function(e,t){var n=this.e||(this.e={}),o=n[e],i=[];if(o&&t)for(var r=0,a=o.length;r<a;r++)o[r].fn!==t&&o[r].fn._!==t&&i.push(o[r]);return i.length?n[e]=i:delete n[e],this}},t.exports=o},{}],7:[function(t,n,o){!function(i,r){if("function"==typeof e&&e.amd)e(["module","select"],r);else if("undefined"!=typeof o)r(n,t("select"));else{var a={exports:{}};r(a,i.select),i.clipboardAction=a.exports}}(this,function(e,t){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=n(t),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),c=function(){function e(t){o(this,e),this.resolveOptions(t),this.initSelection()}return a(e,[{key:"resolveOptions",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function e(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function e(){var t=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=document.body.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=o+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function e(){this.fakeHandler&&(document.body.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function e(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function e(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function e(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function e(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function e(){this.removeFake()}},{key:"action",set:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function e(){return this._action}},{key:"target",set:function e(t){if(void 0!==t){if(!t||"object"!==("undefined"==typeof t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function e(){return this._target}}]),e}();e.exports=c})},{select:5}],8:[function(t,n,o){!function(i,r){if("function"==typeof e&&e.amd)e(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if("undefined"!=typeof o)r(n,t("./clipboard-action"),t("tiny-emitter"),t("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(e,t,n,o){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}var u=i(t),s=i(n),f=i(o),d=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),h=function(e){function t(e,n){r(this,t);var o=a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return o.resolveOptions(n),o.listenClick(e),o}return c(t,e),d(t,[{key:"resolveOptions",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText}},{key:"listenClick",value:function e(t){var n=this;this.listener=(0,f.default)(t,"click",function(e){return n.onClick(e)})}},{key:"onClick",value:function e(t){var n=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new u.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})}},{key:"defaultAction",value:function e(t){return l("action",t)}},{key:"defaultTarget",value:function e(t){var n=l("target",t);if(n)return document.querySelector(n)}},{key:"defaultText",value:function e(t){return l("text",t)}},{key:"destroy",value:function e(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],n="string"==typeof t?[t]:t,o=!!document.queryCommandSupported;return n.forEach(function(e){o=o&&!!document.queryCommandSupported(e)}),o}}]),t}(s.default);e.exports=h})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)});
\ No newline at end of file
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function i(a,c){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!c&&l)return l(a,!0);if(r)return r(a,!0);var s=new Error("Cannot find module '"+a+"'");throw s.code="MODULE_NOT_FOUND",s}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return i(n||t)},u,u.exports,t,e,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a<o.length;a++)i(o[a]);return i}({1:[function(t,e,n){function o(t,e){for(;t&&t.nodeType!==i;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var i=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}e.exports=o},{}],2:[function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function i(t,e,n,o){return function(n){n.delegateTarget=r(n.target,e),n.delegateTarget&&o.call(t,n)}}var r=t("./closest");e.exports=o},{"./closest":1}],3:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},{}],4:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return i(t,e,n);if(c.nodeList(t))return r(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function r(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return l(document.body,t,e,n)}var c=t("./is"),l=t("delegate");e.exports=o},{"./is":3,delegate:2}],5:[function(t,e,n){function o(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),i=document.createRange();i.selectNodeContents(t),o.removeAllRanges(),o.addRange(i),e=o.toString()}return e}e.exports=o},{}],6:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){i.off(t,o),e.apply(n,arguments)}var i=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,i=n.length;for(o;o<i;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,a=o.length;r<a;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],7:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","select"],r);else if(void 0!==o)r(n,e("select"));else{var a={exports:{}};r(a,i.select),i.clipboardAction=a.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=n(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),c=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return a(t,[{key:"resolveOptions",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function t(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=o+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function t(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function t(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function t(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function t(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function t(){this.removeFake()}},{key:"action",set:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":r(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=c})},{select:5}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if(void 0!==o)r(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(t,e,n,o){"use strict";function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var s=i(e),u=i(n),f=i(o),d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),p=function(t){function e(t,n){r(this,e);var o=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return o.resolveOptions(n),o.listenClick(t),o}return c(e,t),h(e,[{key:"resolveOptions",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===d(e.container)?e.container:document.body}},{key:"listenClick",value:function t(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})}},{key:"onClick",value:function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new s.default({action:this.action(n),target:this.target(n),text:this.text(n),container:this.container,trigger:n,emitter:this})}},{key:"defaultAction",value:function t(e){return l("action",e)}},{key:"defaultTarget",value:function t(e){var n=l("target",e);if(n)return document.querySelector(n)}},{key:"defaultText",value:function t(e){return l("text",e)}},{key:"destroy",value:function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],n="string"==typeof e?[e]:e,o=!!document.queryCommandSupported;return n.forEach(function(t){o=o&&!!document.queryCommandSupported(t)}),o}}]),e}(u.default);t.exports=p})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)});
\ No newline at end of file
index 6cdf1eecf0d71337fc68d442073511809c05f204..105d00e61dc2185c1f9dab1f4f0a0efe3e0fb0ae 100644 (file)
-/*!
- * jQuery JavaScript Library v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2017-03-20T19:00Z
- */
-( function( global, factory ) {
-
-       "use strict";
-
-       if ( typeof module === "object" && typeof module.exports === "object" ) {
-
-               // For CommonJS and CommonJS-like environments where a proper `window`
-               // is present, execute the factory and get jQuery.
-               // For environments that do not have a `window` with a `document`
-               // (such as Node.js), expose a factory as module.exports.
-               // This accentuates the need for the creation of a real `window`.
-               // e.g. var jQuery = require("jquery")(window);
-               // See ticket #14549 for more info.
-               module.exports = global.document ?
-                       factory( global, true ) :
-                       function( w ) {
-                               if ( !w.document ) {
-                                       throw new Error( "jQuery requires a window with a document" );
-                               }
-                               return factory( w );
-                       };
-       } else {
-               factory( global );
-       }
-
-// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
-// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
-// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
-// enough that all such attempts are guarded in a try block.
-"use strict";
-
-var arr = [];
-
-var document = window.document;
-
-var getProto = Object.getPrototypeOf;
-
-var slice = arr.slice;
-
-var concat = arr.concat;
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call( Object );
-
-var support = {};
-
-
-
-       function DOMEval( code, doc ) {
-               doc = doc || document;
-
-               var script = doc.createElement( "script" );
-
-               script.text = code;
-               doc.head.appendChild( script ).parentNode.removeChild( script );
-       }
-/* global Symbol */
-// Defining this global in .eslintrc.json would create a danger of using the global
-// unguarded in another place, it seems safer to define global only for this module
-
-
-
-var
-       version = "3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",
-
-       // Define a local copy of jQuery
-       jQuery = function( selector, context ) {
-
-               // The jQuery object is actually just the init constructor 'enhanced'
-               // Need init if jQuery is called (just allow error to be thrown if not included)
-               return new jQuery.fn.init( selector, context );
-       },
-
-       // Support: Android <=4.0 only
-       // Make sure we trim BOM and NBSP
-       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-       // Matches dashed string for camelizing
-       rmsPrefix = /^-ms-/,
-       rdashAlpha = /-([a-z])/g,
-
-       // Used by jQuery.camelCase as callback to replace()
-       fcamelCase = function( all, letter ) {
-               return letter.toUpperCase();
-       };
-
-jQuery.fn = jQuery.prototype = {
-
-       // The current version of jQuery being used
-       jquery: version,
-
-       constructor: jQuery,
-
-       // The default length of a jQuery object is 0
-       length: 0,
-
-       toArray: function() {
-               return slice.call( this );
-       },
-
-       // Get the Nth element in the matched element set OR
-       // Get the whole matched element set as a clean array
-       get: function( num ) {
-
-               // Return all the elements in a clean array
-               if ( num == null ) {
-                       return slice.call( this );
-               }
-
-               // Return just the one element from the set
-               return num < 0 ? this[ num + this.length ] : this[ num ];
-       },
-
-       // Take an array of elements and push it onto the stack
-       // (returning the new matched element set)
-       pushStack: function( elems ) {
-
-               // Build a new jQuery matched element set
-               var ret = jQuery.merge( this.constructor(), elems );
-
-               // Add the old object onto the stack (as a reference)
-               ret.prevObject = this;
-
-               // Return the newly-formed element set
-               return ret;
-       },
-
-       // Execute a callback for every element in the matched set.
-       each: function( callback ) {
-               return jQuery.each( this, callback );
-       },
-
-       map: function( callback ) {
-               return this.pushStack( jQuery.map( this, function( elem, i ) {
-                       return callback.call( elem, i, elem );
-               } ) );
-       },
-
-       slice: function() {
-               return this.pushStack( slice.apply( this, arguments ) );
-       },
-
-       first: function() {
-               return this.eq( 0 );
-       },
-
-       last: function() {
-               return this.eq( -1 );
-       },
-
-       eq: function( i ) {
-               var len = this.length,
-                       j = +i + ( i < 0 ? len : 0 );
-               return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
-       },
-
-       end: function() {
-               return this.prevObject || this.constructor();
-       },
-
-       // For internal use only.
-       // Behaves like an Array's method, not like a jQuery method.
-       push: push,
-       sort: arr.sort,
-       splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
-       var options, name, src, copy, copyIsArray, clone,
-               target = arguments[ 0 ] || {},
-               i = 1,
-               length = arguments.length,
-               deep = false;
-
-       // Handle a deep copy situation
-       if ( typeof target === "boolean" ) {
-               deep = target;
-
-               // Skip the boolean and the target
-               target = arguments[ i ] || {};
-               i++;
-       }
-
-       // Handle case when target is a string or something (possible in deep copy)
-       if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
-               target = {};
-       }
-
-       // Extend jQuery itself if only one argument is passed
-       if ( i === length ) {
-               target = this;
-               i--;
-       }
-
-       for ( ; i < length; i++ ) {
-
-               // Only deal with non-null/undefined values
-               if ( ( options = arguments[ i ] ) != null ) {
-
-                       // Extend the base object
-                       for ( name in options ) {
-                               src = target[ name ];
-                               copy = options[ name ];
-
-                               // Prevent never-ending loop
-                               if ( target === copy ) {
-                                       continue;
-                               }
-
-                               // Recurse if we're merging plain objects or arrays
-                               if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
-                                       ( copyIsArray = Array.isArray( copy ) ) ) ) {
-
-                                       if ( copyIsArray ) {
-                                               copyIsArray = false;
-                                               clone = src && Array.isArray( src ) ? src : [];
-
-                                       } else {
-                                               clone = src && jQuery.isPlainObject( src ) ? src : {};
-                                       }
-
-                                       // Never move original objects, clone them
-                                       target[ name ] = jQuery.extend( deep, clone, copy );
-
-                               // Don't bring in undefined values
-                               } else if ( copy !== undefined ) {
-                                       target[ name ] = copy;
-                               }
-                       }
-               }
-       }
-
-       // Return the modified object
-       return target;
-};
-
-jQuery.extend( {
-
-       // Unique for each copy of jQuery on the page
-       expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
-       // Assume jQuery is ready without the ready module
-       isReady: true,
-
-       error: function( msg ) {
-               throw new Error( msg );
-       },
-
-       noop: function() {},
-
-       isFunction: function( obj ) {
-               return jQuery.type( obj ) === "function";
-       },
-
-       isWindow: function( obj ) {
-               return obj != null && obj === obj.window;
-       },
-
-       isNumeric: function( obj ) {
-
-               // As of jQuery 3.0, isNumeric is limited to
-               // strings and numbers (primitives or objects)
-               // that can be coerced to finite numbers (gh-2662)
-               var type = jQuery.type( obj );
-               return ( type === "number" || type === "string" ) &&
-
-                       // parseFloat NaNs numeric-cast false positives ("")
-                       // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-                       // subtraction forces infinities to NaN
-                       !isNaN( obj - parseFloat( obj ) );
-       },
-
-       isPlainObject: function( obj ) {
-               var proto, Ctor;
-
-               // Detect obvious negatives
-               // Use toString instead of jQuery.type to catch host objects
-               if ( !obj || toString.call( obj ) !== "[object Object]" ) {
-                       return false;
-               }
-
-               proto = getProto( obj );
-
-               // Objects with no prototype (e.g., `Object.create( null )`) are plain
-               if ( !proto ) {
-                       return true;
-               }
-
-               // Objects with prototype are plain iff they were constructed by a global Object function
-               Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
-               return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
-       },
-
-       isEmptyObject: function( obj ) {
-
-               /* eslint-disable no-unused-vars */
-               // See https://github.com/eslint/eslint/issues/6125
-               var name;
-
-               for ( name in obj ) {
-                       return false;
-               }
-               return true;
-       },
-
-       type: function( obj ) {
-               if ( obj == null ) {
-                       return obj + "";
-               }
-
-               // Support: Android <=2.3 only (functionish RegExp)
-               return typeof obj === "object" || typeof obj === "function" ?
-                       class2type[ toString.call( obj ) ] || "object" :
-                       typeof obj;
-       },
-
-       // Evaluates a script in a global context
-       globalEval: function( code ) {
-               DOMEval( code );
-       },
-
-       // Convert dashed to camelCase; used by the css and data modules
-       // Support: IE <=9 - 11, Edge 12 - 13
-       // Microsoft forgot to hump their vendor prefix (#9572)
-       camelCase: function( string ) {
-               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-       },
-
-       each: function( obj, callback ) {
-               var length, i = 0;
-
-               if ( isArrayLike( obj ) ) {
-                       length = obj.length;
-                       for ( ; i < length; i++ ) {
-                               if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-                                       break;
-                               }
-                       }
-               } else {
-                       for ( i in obj ) {
-                               if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-                                       break;
-                               }
-                       }
-               }
-
-               return obj;
-       },
-
-       // Support: Android <=4.0 only
-       trim: function( text ) {
-               return text == null ?
-                       "" :
-                       ( text + "" ).replace( rtrim, "" );
-       },
-
-       // results is for internal usage only
-       makeArray: function( arr, results ) {
-               var ret = results || [];
-
-               if ( arr != null ) {
-                       if ( isArrayLike( Object( arr ) ) ) {
-                               jQuery.merge( ret,
-                                       typeof arr === "string" ?
-                                       [ arr ] : arr
-                               );
-                       } else {
-                               push.call( ret, arr );
-                       }
-               }
-
-               return ret;
-       },
-
-       inArray: function( elem, arr, i ) {
-               return arr == null ? -1 : indexOf.call( arr, elem, i );
-       },
-
-       // Support: Android <=4.0 only, PhantomJS 1 only
-       // push.apply(_, arraylike) throws on ancient WebKit
-       merge: function( first, second ) {
-               var len = +second.length,
-                       j = 0,
-                       i = first.length;
-
-               for ( ; j < len; j++ ) {
-                       first[ i++ ] = second[ j ];
-               }
-
-               first.length = i;
-
-               return first;
-       },
-
-       grep: function( elems, callback, invert ) {
-               var callbackInverse,
-                       matches = [],
-                       i = 0,
-                       length = elems.length,
-                       callbackExpect = !invert;
-
-               // Go through the array, only saving the items
-               // that pass the validator function
-               for ( ; i < length; i++ ) {
-                       callbackInverse = !callback( elems[ i ], i );
-                       if ( callbackInverse !== callbackExpect ) {
-                               matches.push( elems[ i ] );
-                       }
-               }
-
-               return matches;
-       },
-
-       // arg is for internal usage only
-       map: function( elems, callback, arg ) {
-               var length, value,
-                       i = 0,
-                       ret = [];
-
-               // Go through the array, translating each of the items to their new values
-               if ( isArrayLike( elems ) ) {
-                       length = elems.length;
-                       for ( ; i < length; i++ ) {
-                               value = callback( elems[ i ], i, arg );
-
-                               if ( value != null ) {
-                                       ret.push( value );
-                               }
-                       }
-
-               // Go through every key on the object,
-               } else {
-                       for ( i in elems ) {
-                               value = callback( elems[ i ], i, arg );
-
-                               if ( value != null ) {
-                                       ret.push( value );
-                               }
-                       }
-               }
-
-               // Flatten any nested arrays
-               return concat.apply( [], ret );
-       },
-
-       // A global GUID counter for objects
-       guid: 1,
-
-       // Bind a function to a context, optionally partially applying any
-       // arguments.
-       proxy: function( fn, context ) {
-               var tmp, args, proxy;
-
-               if ( typeof context === "string" ) {
-                       tmp = fn[ context ];
-                       context = fn;
-                       fn = tmp;
-               }
-
-               // Quick check to determine if target is callable, in the spec
-               // this throws a TypeError, but we will just return undefined.
-               if ( !jQuery.isFunction( fn ) ) {
-                       return undefined;
-               }
-
-               // Simulated bind
-               args = slice.call( arguments, 2 );
-               proxy = function() {
-                       return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
-               };
-
-               // Set the guid of unique handler to the same of original handler, so it can be removed
-               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-               return proxy;
-       },
-
-       now: Date.now,
-
-       // jQuery.support is not used in Core but other projects attach their
-       // properties to it so it needs to exist.
-       support: support
-} );
-
-if ( typeof Symbol === "function" ) {
-       jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
-       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
-       // Support: real iOS 8.2 only (not reproducible in simulator)
-       // `in` check used to prevent JIT error (gh-2145)
-       // hasOwn isn't used here due to false negatives
-       // regarding Nodelist length in IE
-       var length = !!obj && "length" in obj && obj.length,
-               type = jQuery.type( obj );
-
-       if ( type === "function" || jQuery.isWindow( obj ) ) {
-               return false;
-       }
-
-       return type === "array" || length === 0 ||
-               typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.3.3
- * https://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-08-08
- */
-(function( window ) {
-
-var i,
-       support,
-       Expr,
-       getText,
-       isXML,
-       tokenize,
-       compile,
-       select,
-       outermostContext,
-       sortInput,
-       hasDuplicate,
-
-       // Local document vars
-       setDocument,
-       document,
-       docElem,
-       documentIsHTML,
-       rbuggyQSA,
-       rbuggyMatches,
-       matches,
-       contains,
-
-       // Instance-specific data
-       expando = "sizzle" + 1 * new Date(),
-       preferredDoc = window.document,
-       dirruns = 0,
-       done = 0,
-       classCache = createCache(),
-       tokenCache = createCache(),
-       compilerCache = createCache(),
-       sortOrder = function( a, b ) {
-               if ( a === b ) {
-                       hasDuplicate = true;
-               }
-               return 0;
-       },
-
-       // Instance methods
-       hasOwn = ({}).hasOwnProperty,
-       arr = [],
-       pop = arr.pop,
-       push_native = arr.push,
-       push = arr.push,
-       slice = arr.slice,
-       // Use a stripped-down indexOf as it's faster than native
-       // https://jsperf.com/thor-indexof-vs-for/5
-       indexOf = function( list, elem ) {
-               var i = 0,
-                       len = list.length;
-               for ( ; i < len; i++ ) {
-                       if ( list[i] === elem ) {
-                               return i;
-                       }
-               }
-               return -1;
-       },
-
-       booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-       // Regular expressions
-
-       // http://www.w3.org/TR/css3-selectors/#whitespace
-       whitespace = "[\\x20\\t\\r\\n\\f]",
-
-       // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-       identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
-
-       // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
-       attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-               // Operator (capture 2)
-               "*([*^$|!~]?=)" + whitespace +
-               // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
-               "*\\]",
-
-       pseudos = ":(" + identifier + ")(?:\\((" +
-               // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
-               // 1. quoted (capture 3; capture 4 or capture 5)
-               "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-               // 2. simple (capture 6)
-               "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-               // 3. anything else (capture 2)
-               ".*" +
-               ")\\)|)",
-
-       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-       rwhitespace = new RegExp( whitespace + "+", "g" ),
-       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
-       rpseudo = new RegExp( pseudos ),
-       ridentifier = new RegExp( "^" + identifier + "$" ),
-
-       matchExpr = {
-               "ID": new RegExp( "^#(" + identifier + ")" ),
-               "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
-               "TAG": new RegExp( "^(" + identifier + "|[*])" ),
-               "ATTR": new RegExp( "^" + attributes ),
-               "PSEUDO": new RegExp( "^" + pseudos ),
-               "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-               "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-               // For use in libraries implementing .is()
-               // We use this for POS matching in `select`
-               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-                       whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-       },
-
-       rinputs = /^(?:input|select|textarea|button)$/i,
-       rheader = /^h\d$/i,
-
-       rnative = /^[^{]+\{\s*\[native \w/,
-
-       // Easily-parseable/retrievable ID or TAG or CLASS selectors
-       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-       rsibling = /[+~]/,
-
-       // CSS escapes
-       // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-       runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
-       funescape = function( _, escaped, escapedWhitespace ) {
-               var high = "0x" + escaped - 0x10000;
-               // NaN means non-codepoint
-               // Support: Firefox<24
-               // Workaround erroneous numeric interpretation of +"0x"
-               return high !== high || escapedWhitespace ?
-                       escaped :
-                       high < 0 ?
-                               // BMP codepoint
-                               String.fromCharCode( high + 0x10000 ) :
-                               // Supplemental Plane codepoint (surrogate pair)
-                               String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-       },
-
-       // CSS string/identifier serialization
-       // https://drafts.csswg.org/cssom/#common-serializing-idioms
-       rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
-       fcssescape = function( ch, asCodePoint ) {
-               if ( asCodePoint ) {
-
-                       // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
-                       if ( ch === "\0" ) {
-                               return "\uFFFD";
-                       }
-
-                       // Control characters and (dependent upon position) numbers get escaped as code points
-                       return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
-               }
-
-               // Other potentially-special ASCII characters get backslash-escaped
-               return "\\" + ch;
-       },
-
-       // Used for iframes
-       // See setDocument()
-       // Removing the function wrapper causes a "Permission Denied"
-       // error in IE
-       unloadHandler = function() {
-               setDocument();
-       },
-
-       disabledAncestor = addCombinator(
-               function( elem ) {
-                       return elem.disabled === true && ("form" in elem || "label" in elem);
-               },
-               { dir: "parentNode", next: "legend" }
-       );
-
-// Optimize for push.apply( _, NodeList )
-try {
-       push.apply(
-               (arr = slice.call( preferredDoc.childNodes )),
-               preferredDoc.childNodes
-       );
-       // Support: Android<4.0
-       // Detect silently failing push.apply
-       arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
-       push = { apply: arr.length ?
-
-               // Leverage slice if possible
-               function( target, els ) {
-                       push_native.apply( target, slice.call(els) );
-               } :
-
-               // Support: IE<9
-               // Otherwise append directly
-               function( target, els ) {
-                       var j = target.length,
-                               i = 0;
-                       // Can't trust NodeList.length
-                       while ( (target[j++] = els[i++]) ) {}
-                       target.length = j - 1;
-               }
-       };
-}
-
-function Sizzle( selector, context, results, seed ) {
-       var m, i, elem, nid, match, groups, newSelector,
-               newContext = context && context.ownerDocument,
-
-               // nodeType defaults to 9, since context defaults to document
-               nodeType = context ? context.nodeType : 9;
-
-       results = results || [];
-
-       // Return early from calls with invalid selector or context
-       if ( typeof selector !== "string" || !selector ||
-               nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
-               return results;
-       }
-
-       // Try to shortcut find operations (as opposed to filters) in HTML documents
-       if ( !seed ) {
-
-               if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-                       setDocument( context );
-               }
-               context = context || document;
-
-               if ( documentIsHTML ) {
-
-                       // If the selector is sufficiently simple, try using a "get*By*" DOM method
-                       // (excepting DocumentFragment context, where the methods don't exist)
-                       if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
-                               // ID selector
-                               if ( (m = match[1]) ) {
-
-                                       // Document context
-                                       if ( nodeType === 9 ) {
-                                               if ( (elem = context.getElementById( m )) ) {
-
-                                                       // Support: IE, Opera, Webkit
-                                                       // TODO: identify versions
-                                                       // getElementById can match elements by name instead of ID
-                                                       if ( elem.id === m ) {
-                                                               results.push( elem );
-                                                               return results;
-                                                       }
-                                               } else {
-                                                       return results;
-                                               }
-
-                                       // Element context
-                                       } else {
-
-                                               // Support: IE, Opera, Webkit
-                                               // TODO: identify versions
-                                               // getElementById can match elements by name instead of ID
-                                               if ( newContext && (elem = newContext.getElementById( m )) &&
-                                                       contains( context, elem ) &&
-                                                       elem.id === m ) {
-
-                                                       results.push( elem );
-                                                       return results;
-                                               }
-                                       }
-
-                               // Type selector
-                               } else if ( match[2] ) {
-                                       push.apply( results, context.getElementsByTagName( selector ) );
-                                       return results;
-
-                               // Class selector
-                               } else if ( (m = match[3]) && support.getElementsByClassName &&
-                                       context.getElementsByClassName ) {
-
-                                       push.apply( results, context.getElementsByClassName( m ) );
-                                       return results;
-                               }
-                       }
-
-                       // Take advantage of querySelectorAll
-                       if ( support.qsa &&
-                               !compilerCache[ selector + " " ] &&
-                               (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
-                               if ( nodeType !== 1 ) {
-                                       newContext = context;
-                                       newSelector = selector;
-
-                               // qSA looks outside Element context, which is not what we want
-                               // Thanks to Andrew Dupont for this workaround technique
-                               // Support: IE <=8
-                               // Exclude object elements
-                               } else if ( context.nodeName.toLowerCase() !== "object" ) {
-
-                                       // Capture the context ID, setting it first if necessary
-                                       if ( (nid = context.getAttribute( "id" )) ) {
-                                               nid = nid.replace( rcssescape, fcssescape );
-                                       } else {
-                                               context.setAttribute( "id", (nid = expando) );
-                                       }
-
-                                       // Prefix every selector in the list
-                                       groups = tokenize( selector );
-                                       i = groups.length;
-                                       while ( i-- ) {
-                                               groups[i] = "#" + nid + " " + toSelector( groups[i] );
-                                       }
-                                       newSelector = groups.join( "," );
-
-                                       // Expand context for sibling selectors
-                                       newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
-                                               context;
-                               }
-
-                               if ( newSelector ) {
-                                       try {
-                                               push.apply( results,
-                                                       newContext.querySelectorAll( newSelector )
-                                               );
-                                               return results;
-                                       } catch ( qsaError ) {
-                                       } finally {
-                                               if ( nid === expando ) {
-                                                       context.removeAttribute( "id" );
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       // All others
-       return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- *     property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *     deleting the oldest entry
- */
-function createCache() {
-       var keys = [];
-
-       function cache( key, value ) {
-               // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-               if ( keys.push( key + " " ) > Expr.cacheLength ) {
-                       // Only keep the most recent entries
-                       delete cache[ keys.shift() ];
-               }
-               return (cache[ key + " " ] = value);
-       }
-       return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-       fn[ expando ] = true;
-       return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created element and returns a boolean result
- */
-function assert( fn ) {
-       var el = document.createElement("fieldset");
-
-       try {
-               return !!fn( el );
-       } catch (e) {
-               return false;
-       } finally {
-               // Remove from its parent by default
-               if ( el.parentNode ) {
-                       el.parentNode.removeChild( el );
-               }
-               // release memory in IE
-               el = null;
-       }
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
-       var arr = attrs.split("|"),
-               i = arr.length;
-
-       while ( i-- ) {
-               Expr.attrHandle[ arr[i] ] = handler;
-       }
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
-       var cur = b && a,
-               diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
-                       a.sourceIndex - b.sourceIndex;
-
-       // Use IE sourceIndex if available on both nodes
-       if ( diff ) {
-               return diff;
-       }
-
-       // Check if b follows a
-       if ( cur ) {
-               while ( (cur = cur.nextSibling) ) {
-                       if ( cur === b ) {
-                               return -1;
-                       }
-               }
-       }
-
-       return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
-       return function( elem ) {
-               var name = elem.nodeName.toLowerCase();
-               return name === "input" && elem.type === type;
-       };
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
-       return function( elem ) {
-               var name = elem.nodeName.toLowerCase();
-               return (name === "input" || name === "button") && elem.type === type;
-       };
-}
-
-/**
- * Returns a function to use in pseudos for :enabled/:disabled
- * @param {Boolean} disabled true for :disabled; false for :enabled
- */
-function createDisabledPseudo( disabled ) {
-
-       // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
-       return function( elem ) {
-
-               // Only certain elements can match :enabled or :disabled
-               // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
-               // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
-               if ( "form" in elem ) {
-
-                       // Check for inherited disabledness on relevant non-disabled elements:
-                       // * listed form-associated elements in a disabled fieldset
-                       //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
-                       //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
-                       // * option elements in a disabled optgroup
-                       //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
-                       // All such elements have a "form" property.
-                       if ( elem.parentNode && elem.disabled === false ) {
-
-                               // Option elements defer to a parent optgroup if present
-                               if ( "label" in elem ) {
-                                       if ( "label" in elem.parentNode ) {
-                                               return elem.parentNode.disabled === disabled;
-                                       } else {
-                                               return elem.disabled === disabled;
-                                       }
-                               }
-
-                               // Support: IE 6 - 11
-                               // Use the isDisabled shortcut property to check for disabled fieldset ancestors
-                               return elem.isDisabled === disabled ||
-
-                                       // Where there is no isDisabled, check manually
-                                       /* jshint -W018 */
-                                       elem.isDisabled !== !disabled &&
-                                               disabledAncestor( elem ) === disabled;
-                       }
-
-                       return elem.disabled === disabled;
-
-               // Try to winnow out elements that can't be disabled before trusting the disabled property.
-               // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
-               // even exist on them, let alone have a boolean value.
-               } else if ( "label" in elem ) {
-                       return elem.disabled === disabled;
-               }
-
-               // Remaining elements are neither :enabled nor :disabled
-               return false;
-       };
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
-       return markFunction(function( argument ) {
-               argument = +argument;
-               return markFunction(function( seed, matches ) {
-                       var j,
-                               matchIndexes = fn( [], seed.length, argument ),
-                               i = matchIndexes.length;
-
-                       // Match elements found at the specified indexes
-                       while ( i-- ) {
-                               if ( seed[ (j = matchIndexes[i]) ] ) {
-                                       seed[j] = !(matches[j] = seed[j]);
-                               }
-                       }
-               });
-       });
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
-       return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
-       // documentElement is verified for cases where it doesn't yet exist
-       // (such as loading iframes in IE - #4833)
-       var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-       return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-       var hasCompare, subWindow,
-               doc = node ? node.ownerDocument || node : preferredDoc;
-
-       // Return early if doc is invalid or already selected
-       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-               return document;
-       }
-
-       // Update global variables
-       document = doc;
-       docElem = document.documentElement;
-       documentIsHTML = !isXML( document );
-
-       // Support: IE 9-11, Edge
-       // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
-       if ( preferredDoc !== document &&
-               (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
-
-               // Support: IE 11, Edge
-               if ( subWindow.addEventListener ) {
-                       subWindow.addEventListener( "unload", unloadHandler, false );
-
-               // Support: IE 9 - 10 only
-               } else if ( subWindow.attachEvent ) {
-                       subWindow.attachEvent( "onunload", unloadHandler );
-               }
-       }
-
-       /* Attributes
-       ---------------------------------------------------------------------- */
-
-       // Support: IE<8
-       // Verify that getAttribute really returns attributes and not properties
-       // (excepting IE8 booleans)
-       support.attributes = assert(function( el ) {
-               el.className = "i";
-               return !el.getAttribute("className");
-       });
-
-       /* getElement(s)By*
-       ---------------------------------------------------------------------- */
-
-       // Check if getElementsByTagName("*") returns only elements
-       support.getElementsByTagName = assert(function( el ) {
-               el.appendChild( document.createComment("") );
-               return !el.getElementsByTagName("*").length;
-       });
-
-       // Support: IE<9
-       support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
-       // Support: IE<10
-       // Check if getElementById returns elements by name
-       // The broken getElementById methods don't pick up programmatically-set names,
-       // so use a roundabout getElementsByName test
-       support.getById = assert(function( el ) {
-               docElem.appendChild( el ).id = expando;
-               return !document.getElementsByName || !document.getElementsByName( expando ).length;
-       });
-
-       // ID filter and find
-       if ( support.getById ) {
-               Expr.filter["ID"] = function( id ) {
-                       var attrId = id.replace( runescape, funescape );
-                       return function( elem ) {
-                               return elem.getAttribute("id") === attrId;
-                       };
-               };
-               Expr.find["ID"] = function( id, context ) {
-                       if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-                               var elem = context.getElementById( id );
-                               return elem ? [ elem ] : [];
-                       }
-               };
-       } else {
-               Expr.filter["ID"] =  function( id ) {
-                       var attrId = id.replace( runescape, funescape );
-                       return function( elem ) {
-                               var node = typeof elem.getAttributeNode !== "undefined" &&
-                                       elem.getAttributeNode("id");
-                               return node && node.value === attrId;
-                       };
-               };
-
-               // Support: IE 6 - 7 only
-               // getElementById is not reliable as a find shortcut
-               Expr.find["ID"] = function( id, context ) {
-                       if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-                               var node, i, elems,
-                                       elem = context.getElementById( id );
-
-                               if ( elem ) {
-
-                                       // Verify the id attribute
-                                       node = elem.getAttributeNode("id");
-                                       if ( node && node.value === id ) {
-                                               return [ elem ];
-                                       }
-
-                                       // Fall back on getElementsByName
-                                       elems = context.getElementsByName( id );
-                                       i = 0;
-                                       while ( (elem = elems[i++]) ) {
-                                               node = elem.getAttributeNode("id");
-                                               if ( node && node.value === id ) {
-                                                       return [ elem ];
-                                               }
-                                       }
-                               }
-
-                               return [];
-                       }
-               };
-       }
-
-       // Tag
-       Expr.find["TAG"] = support.getElementsByTagName ?
-               function( tag, context ) {
-                       if ( typeof context.getElementsByTagName !== "undefined" ) {
-                               return context.getElementsByTagName( tag );
-
-                       // DocumentFragment nodes don't have gEBTN
-                       } else if ( support.qsa ) {
-                               return context.querySelectorAll( tag );
-                       }
-               } :
-
-               function( tag, context ) {
-                       var elem,
-                               tmp = [],
-                               i = 0,
-                               // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
-                               results = context.getElementsByTagName( tag );
-
-                       // Filter out possible comments
-                       if ( tag === "*" ) {
-                               while ( (elem = results[i++]) ) {
-                                       if ( elem.nodeType === 1 ) {
-                                               tmp.push( elem );
-                                       }
-                               }
-
-                               return tmp;
-                       }
-                       return results;
-               };
-
-       // Class
-       Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-               if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
-                       return context.getElementsByClassName( className );
-               }
-       };
-
-       /* QSA/matchesSelector
-       ---------------------------------------------------------------------- */
-
-       // QSA and matchesSelector support
-
-       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-       rbuggyMatches = [];
-
-       // qSa(:focus) reports false when true (Chrome 21)
-       // We allow this because of a bug in IE8/9 that throws an error
-       // whenever `document.activeElement` is accessed on an iframe
-       // So, we allow :focus to pass through QSA all the time to avoid the IE error
-       // See https://bugs.jquery.com/ticket/13378
-       rbuggyQSA = [];
-
-       if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
-               // Build QSA regex
-               // Regex strategy adopted from Diego Perini
-               assert(function( el ) {
-                       // Select is set to empty string on purpose
-                       // This is to test IE's treatment of not explicitly
-                       // setting a boolean content attribute,
-                       // since its presence should be enough
-                       // https://bugs.jquery.com/ticket/12359
-                       docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
-                               "<select id='" + expando + "-\r\\' msallowcapture=''>" +
-                               "<option selected=''></option></select>";
-
-                       // Support: IE8, Opera 11-12.16
-                       // Nothing should be selected when empty strings follow ^= or $= or *=
-                       // The test attribute must be unknown in Opera but "safe" for WinRT
-                       // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-                       if ( el.querySelectorAll("[msallowcapture^='']").length ) {
-                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
-                       }
-
-                       // Support: IE8
-                       // Boolean attributes and "value" are not treated correctly
-                       if ( !el.querySelectorAll("[selected]").length ) {
-                               rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
-                       }
-
-                       // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
-                       if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
-                               rbuggyQSA.push("~=");
-                       }
-
-                       // Webkit/Opera - :checked should return selected option elements
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-                       // IE8 throws error here and will not see later tests
-                       if ( !el.querySelectorAll(":checked").length ) {
-                               rbuggyQSA.push(":checked");
-                       }
-
-                       // Support: Safari 8+, iOS 8+
-                       // https://bugs.webkit.org/show_bug.cgi?id=136851
-                       // In-page `selector#id sibling-combinator selector` fails
-                       if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
-                               rbuggyQSA.push(".#.+[+~]");
-                       }
-               });
-
-               assert(function( el ) {
-                       el.innerHTML = "<a href='' disabled='disabled'></a>" +
-                               "<select disabled='disabled'><option/></select>";
-
-                       // Support: Windows 8 Native Apps
-                       // The type and name attributes are restricted during .innerHTML assignment
-                       var input = document.createElement("input");
-                       input.setAttribute( "type", "hidden" );
-                       el.appendChild( input ).setAttribute( "name", "D" );
-
-                       // Support: IE8
-                       // Enforce case-sensitivity of name attribute
-                       if ( el.querySelectorAll("[name=d]").length ) {
-                               rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
-                       }
-
-                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-                       // IE8 throws error here and will not see later tests
-                       if ( el.querySelectorAll(":enabled").length !== 2 ) {
-                               rbuggyQSA.push( ":enabled", ":disabled" );
-                       }
-
-                       // Support: IE9-11+
-                       // IE's :disabled selector does not pick up the children of disabled fieldsets
-                       docElem.appendChild( el ).disabled = true;
-                       if ( el.querySelectorAll(":disabled").length !== 2 ) {
-                               rbuggyQSA.push( ":enabled", ":disabled" );
-                       }
-
-                       // Opera 10-11 does not throw on post-comma invalid pseudos
-                       el.querySelectorAll("*,:x");
-                       rbuggyQSA.push(",.*:");
-               });
-       }
-
-       if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
-               docElem.webkitMatchesSelector ||
-               docElem.mozMatchesSelector ||
-               docElem.oMatchesSelector ||
-               docElem.msMatchesSelector) )) ) {
-
-               assert(function( el ) {
-                       // Check to see if it's possible to do matchesSelector
-                       // on a disconnected node (IE 9)
-                       support.disconnectedMatch = matches.call( el, "*" );
-
-                       // This should fail with an exception
-                       // Gecko does not error, returns false instead
-                       matches.call( el, "[s!='']:x" );
-                       rbuggyMatches.push( "!=", pseudos );
-               });
-       }
-
-       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-       rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
-       /* Contains
-       ---------------------------------------------------------------------- */
-       hasCompare = rnative.test( docElem.compareDocumentPosition );
-
-       // Element contains another
-       // Purposefully self-exclusive
-       // As in, an element does not contain itself
-       contains = hasCompare || rnative.test( docElem.contains ) ?
-               function( a, b ) {
-                       var adown = a.nodeType === 9 ? a.documentElement : a,
-                               bup = b && b.parentNode;
-                       return a === bup || !!( bup && bup.nodeType === 1 && (
-                               adown.contains ?
-                                       adown.contains( bup ) :
-                                       a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-                       ));
-               } :
-               function( a, b ) {
-                       if ( b ) {
-                               while ( (b = b.parentNode) ) {
-                                       if ( b === a ) {
-                                               return true;
-                                       }
-                               }
-                       }
-                       return false;
-               };
-
-       /* Sorting
-       ---------------------------------------------------------------------- */
-
-       // Document order sorting
-       sortOrder = hasCompare ?
-       function( a, b ) {
-
-               // Flag for duplicate removal
-               if ( a === b ) {
-                       hasDuplicate = true;
-                       return 0;
-               }
-
-               // Sort on method existence if only one input has compareDocumentPosition
-               var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
-               if ( compare ) {
-                       return compare;
-               }
-
-               // Calculate position if both inputs belong to the same document
-               compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
-                       a.compareDocumentPosition( b ) :
-
-                       // Otherwise we know they are disconnected
-                       1;
-
-               // Disconnected nodes
-               if ( compare & 1 ||
-                       (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
-                       // Choose the first element that is related to our preferred document
-                       if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
-                               return -1;
-                       }
-                       if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
-                               return 1;
-                       }
-
-                       // Maintain original order
-                       return sortInput ?
-                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-                               0;
-               }
-
-               return compare & 4 ? -1 : 1;
-       } :
-       function( a, b ) {
-               // Exit early if the nodes are identical
-               if ( a === b ) {
-                       hasDuplicate = true;
-                       return 0;
-               }
-
-               var cur,
-                       i = 0,
-                       aup = a.parentNode,
-                       bup = b.parentNode,
-                       ap = [ a ],
-                       bp = [ b ];
-
-               // Parentless nodes are either documents or disconnected
-               if ( !aup || !bup ) {
-                       return a === document ? -1 :
-                               b === document ? 1 :
-                               aup ? -1 :
-                               bup ? 1 :
-                               sortInput ?
-                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-                               0;
-
-               // If the nodes are siblings, we can do a quick check
-               } else if ( aup === bup ) {
-                       return siblingCheck( a, b );
-               }
-
-               // Otherwise we need full lists of their ancestors for comparison
-               cur = a;
-               while ( (cur = cur.parentNode) ) {
-                       ap.unshift( cur );
-               }
-               cur = b;
-               while ( (cur = cur.parentNode) ) {
-                       bp.unshift( cur );
-               }
-
-               // Walk down the tree looking for a discrepancy
-               while ( ap[i] === bp[i] ) {
-                       i++;
-               }
-
-               return i ?
-                       // Do a sibling check if the nodes have a common ancestor
-                       siblingCheck( ap[i], bp[i] ) :
-
-                       // Otherwise nodes in our document sort first
-                       ap[i] === preferredDoc ? -1 :
-                       bp[i] === preferredDoc ? 1 :
-                       0;
-       };
-
-       return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
-       return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-       // Set document vars if needed
-       if ( ( elem.ownerDocument || elem ) !== document ) {
-               setDocument( elem );
-       }
-
-       // Make sure that attribute selectors are quoted
-       expr = expr.replace( rattributeQuotes, "='$1']" );
-
-       if ( support.matchesSelector && documentIsHTML &&
-               !compilerCache[ expr + " " ] &&
-               ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
-               ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
-
-               try {
-                       var ret = matches.call( elem, expr );
-
-                       // IE 9's matchesSelector returns false on disconnected nodes
-                       if ( ret || support.disconnectedMatch ||
-                                       // As well, disconnected nodes are said to be in a document
-                                       // fragment in IE 9
-                                       elem.document && elem.document.nodeType !== 11 ) {
-                               return ret;
-                       }
-               } catch (e) {}
-       }
-
-       return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-       // Set document vars if needed
-       if ( ( context.ownerDocument || context ) !== document ) {
-               setDocument( context );
-       }
-       return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-       // Set document vars if needed
-       if ( ( elem.ownerDocument || elem ) !== document ) {
-               setDocument( elem );
-       }
-
-       var fn = Expr.attrHandle[ name.toLowerCase() ],
-               // Don't get fooled by Object.prototype properties (jQuery #13807)
-               val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
-                       fn( elem, name, !documentIsHTML ) :
-                       undefined;
-
-       return val !== undefined ?
-               val :
-               support.attributes || !documentIsHTML ?
-                       elem.getAttribute( name ) :
-                       (val = elem.getAttributeNode(name)) && val.specified ?
-                               val.value :
-                               null;
-};
-
-Sizzle.escape = function( sel ) {
-       return (sel + "").replace( rcssescape, fcssescape );
-};
-
-Sizzle.error = function( msg ) {
-       throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
-       var elem,
-               duplicates = [],
-               j = 0,
-               i = 0;
-
-       // Unless we *know* we can detect duplicates, assume their presence
-       hasDuplicate = !support.detectDuplicates;
-       sortInput = !support.sortStable && results.slice( 0 );
-       results.sort( sortOrder );
-
-       if ( hasDuplicate ) {
-               while ( (elem = results[i++]) ) {
-                       if ( elem === results[ i ] ) {
-                               j = duplicates.push( i );
-                       }
-               }
-               while ( j-- ) {
-                       results.splice( duplicates[ j ], 1 );
-               }
-       }
-
-       // Clear input after sorting to release objects
-       // See https://github.com/jquery/sizzle/pull/225
-       sortInput = null;
-
-       return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-       var node,
-               ret = "",
-               i = 0,
-               nodeType = elem.nodeType;
-
-       if ( !nodeType ) {
-               // If no nodeType, this is expected to be an array
-               while ( (node = elem[i++]) ) {
-                       // Do not traverse comment nodes
-                       ret += getText( node );
-               }
-       } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-               // Use textContent for elements
-               // innerText usage removed for consistency of new lines (jQuery #11153)
-               if ( typeof elem.textContent === "string" ) {
-                       return elem.textContent;
-               } else {
-                       // Traverse its children
-                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-                               ret += getText( elem );
-                       }
-               }
-       } else if ( nodeType === 3 || nodeType === 4 ) {
-               return elem.nodeValue;
-       }
-       // Do not include comment or processing instruction nodes
-
-       return ret;
-};
-
-Expr = Sizzle.selectors = {
-
-       // Can be adjusted by the user
-       cacheLength: 50,
-
-       createPseudo: markFunction,
-
-       match: matchExpr,
-
-       attrHandle: {},
-
-       find: {},
-
-       relative: {
-               ">": { dir: "parentNode", first: true },
-               " ": { dir: "parentNode" },
-               "+": { dir: "previousSibling", first: true },
-               "~": { dir: "previousSibling" }
-       },
-
-       preFilter: {
-               "ATTR": function( match ) {
-                       match[1] = match[1].replace( runescape, funescape );
-
-                       // Move the given value to match[3] whether quoted or unquoted
-                       match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
-
-                       if ( match[2] === "~=" ) {
-                               match[3] = " " + match[3] + " ";
-                       }
-
-                       return match.slice( 0, 4 );
-               },
-
-               "CHILD": function( match ) {
-                       /* matches from matchExpr["CHILD"]
-                               1 type (only|nth|...)
-                               2 what (child|of-type)
-                               3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-                               4 xn-component of xn+y argument ([+-]?\d*n|)
-                               5 sign of xn-component
-                               6 x of xn-component
-                               7 sign of y-component
-                               8 y of y-component
-                       */
-                       match[1] = match[1].toLowerCase();
-
-                       if ( match[1].slice( 0, 3 ) === "nth" ) {
-                               // nth-* requires argument
-                               if ( !match[3] ) {
-                                       Sizzle.error( match[0] );
-                               }
-
-                               // numeric x and y parameters for Expr.filter.CHILD
-                               // remember that false/true cast respectively to 0/1
-                               match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-                               match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-                       // other types prohibit arguments
-                       } else if ( match[3] ) {
-                               Sizzle.error( match[0] );
-                       }
-
-                       return match;
-               },
-
-               "PSEUDO": function( match ) {
-                       var excess,
-                               unquoted = !match[6] && match[2];
-
-                       if ( matchExpr["CHILD"].test( match[0] ) ) {
-                               return null;
-                       }
-
-                       // Accept quoted arguments as-is
-                       if ( match[3] ) {
-                               match[2] = match[4] || match[5] || "";
-
-                       // Strip excess characters from unquoted arguments
-                       } else if ( unquoted && rpseudo.test( unquoted ) &&
-                               // Get excess from tokenize (recursively)
-                               (excess = tokenize( unquoted, true )) &&
-                               // advance to the next closing parenthesis
-                               (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-                               // excess is a negative index
-                               match[0] = match[0].slice( 0, excess );
-                               match[2] = unquoted.slice( 0, excess );
-                       }
-
-                       // Return only captures needed by the pseudo filter method (type and argument)
-                       return match.slice( 0, 3 );
-               }
-       },
-
-       filter: {
-
-               "TAG": function( nodeNameSelector ) {
-                       var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
-                       return nodeNameSelector === "*" ?
-                               function() { return true; } :
-                               function( elem ) {
-                                       return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-                               };
-               },
-
-               "CLASS": function( className ) {
-                       var pattern = classCache[ className + " " ];
-
-                       return pattern ||
-                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-                               classCache( className, function( elem ) {
-                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
-                               });
-               },
-
-               "ATTR": function( name, operator, check ) {
-                       return function( elem ) {
-                               var result = Sizzle.attr( elem, name );
-
-                               if ( result == null ) {
-                                       return operator === "!=";
-                               }
-                               if ( !operator ) {
-                                       return true;
-                               }
-
-                               result += "";
-
-                               return operator === "=" ? result === check :
-                                       operator === "!=" ? result !== check :
-                                       operator === "^=" ? check && result.indexOf( check ) === 0 :
-                                       operator === "*=" ? check && result.indexOf( check ) > -1 :
-                                       operator === "$=" ? check && result.slice( -check.length ) === check :
-                                       operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
-                                       operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-                                       false;
-                       };
-               },
-
-               "CHILD": function( type, what, argument, first, last ) {
-                       var simple = type.slice( 0, 3 ) !== "nth",
-                               forward = type.slice( -4 ) !== "last",
-                               ofType = what === "of-type";
-
-                       return first === 1 && last === 0 ?
-
-                               // Shortcut for :nth-*(n)
-                               function( elem ) {
-                                       return !!elem.parentNode;
-                               } :
-
-                               function( elem, context, xml ) {
-                                       var cache, uniqueCache, outerCache, node, nodeIndex, start,
-                                               dir = simple !== forward ? "nextSibling" : "previousSibling",
-                                               parent = elem.parentNode,
-                                               name = ofType && elem.nodeName.toLowerCase(),
-                                               useCache = !xml && !ofType,
-                                               diff = false;
-
-                                       if ( parent ) {
-
-                                               // :(first|last|only)-(child|of-type)
-                                               if ( simple ) {
-                                                       while ( dir ) {
-                                                               node = elem;
-                                                               while ( (node = node[ dir ]) ) {
-                                                                       if ( ofType ?
-                                                                               node.nodeName.toLowerCase() === name :
-                                                                               node.nodeType === 1 ) {
-
-                                                                               return false;
-                                                                       }
-                                                               }
-                                                               // Reverse direction for :only-* (if we haven't yet done so)
-                                                               start = dir = type === "only" && !start && "nextSibling";
-                                                       }
-                                                       return true;
-                                               }
-
-                                               start = [ forward ? parent.firstChild : parent.lastChild ];
-
-                                               // non-xml :nth-child(...) stores cache data on `parent`
-                                               if ( forward && useCache ) {
-
-                                                       // Seek `elem` from a previously-cached index
-
-                                                       // ...in a gzip-friendly way
-                                                       node = parent;
-                                                       outerCache = node[ expando ] || (node[ expando ] = {});
-
-                                                       // Support: IE <9 only
-                                                       // Defend against cloned attroperties (jQuery gh-1709)
-                                                       uniqueCache = outerCache[ node.uniqueID ] ||
-                                                               (outerCache[ node.uniqueID ] = {});
-
-                                                       cache = uniqueCache[ type ] || [];
-                                                       nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-                                                       diff = nodeIndex && cache[ 2 ];
-                                                       node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-                                                               // Fallback to seeking `elem` from the start
-                                                               (diff = nodeIndex = 0) || start.pop()) ) {
-
-                                                               // When found, cache indexes on `parent` and break
-                                                               if ( node.nodeType === 1 && ++diff && node === elem ) {
-                                                                       uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
-                                                                       break;
-                                                               }
-                                                       }
-
-                                               } else {
-                                                       // Use previously-cached element index if available
-                                                       if ( useCache ) {
-                                                               // ...in a gzip-friendly way
-                                                               node = elem;
-                                                               outerCache = node[ expando ] || (node[ expando ] = {});
-
-                                                               // Support: IE <9 only
-                                                               // Defend against cloned attroperties (jQuery gh-1709)
-                                                               uniqueCache = outerCache[ node.uniqueID ] ||
-                                                                       (outerCache[ node.uniqueID ] = {});
-
-                                                               cache = uniqueCache[ type ] || [];
-                                                               nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-                                                               diff = nodeIndex;
-                                                       }
-
-                                                       // xml :nth-child(...)
-                                                       // or :nth-last-child(...) or :nth(-last)?-of-type(...)
-                                                       if ( diff === false ) {
-                                                               // Use the same loop as above to seek `elem` from the start
-                                                               while ( (node = ++nodeIndex && node && node[ dir ] ||
-                                                                       (diff = nodeIndex = 0) || start.pop()) ) {
-
-                                                                       if ( ( ofType ?
-                                                                               node.nodeName.toLowerCase() === name :
-                                                                               node.nodeType === 1 ) &&
-                                                                               ++diff ) {
-
-                                                                               // Cache the index of each encountered element
-                                                                               if ( useCache ) {
-                                                                                       outerCache = node[ expando ] || (node[ expando ] = {});
-
-                                                                                       // Support: IE <9 only
-                                                                                       // Defend against cloned attroperties (jQuery gh-1709)
-                                                                                       uniqueCache = outerCache[ node.uniqueID ] ||
-                                                                                               (outerCache[ node.uniqueID ] = {});
-
-                                                                                       uniqueCache[ type ] = [ dirruns, diff ];
-                                                                               }
-
-                                                                               if ( node === elem ) {
-                                                                                       break;
-                                                                               }
-                                                                       }
-                                                               }
-                                                       }
-                                               }
-
-                                               // Incorporate the offset, then check against cycle size
-                                               diff -= last;
-                                               return diff === first || ( diff % first === 0 && diff / first >= 0 );
-                                       }
-                               };
-               },
-
-               "PSEUDO": function( pseudo, argument ) {
-                       // pseudo-class names are case-insensitive
-                       // http://www.w3.org/TR/selectors/#pseudo-classes
-                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-                       // Remember that setFilters inherits from pseudos
-                       var args,
-                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-                                       Sizzle.error( "unsupported pseudo: " + pseudo );
-
-                       // The user may use createPseudo to indicate that
-                       // arguments are needed to create the filter function
-                       // just as Sizzle does
-                       if ( fn[ expando ] ) {
-                               return fn( argument );
-                       }
-
-                       // But maintain support for old signatures
-                       if ( fn.length > 1 ) {
-                               args = [ pseudo, pseudo, "", argument ];
-                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-                                       markFunction(function( seed, matches ) {
-                                               var idx,
-                                                       matched = fn( seed, argument ),
-                                                       i = matched.length;
-                                               while ( i-- ) {
-                                                       idx = indexOf( seed, matched[i] );
-                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );
-                                               }
-                                       }) :
-                                       function( elem ) {
-                                               return fn( elem, 0, args );
-                                       };
-                       }
-
-                       return fn;
-               }
-       },
-
-       pseudos: {
-               // Potentially complex pseudos
-               "not": markFunction(function( selector ) {
-                       // Trim the selector passed to compile
-                       // to avoid treating leading and trailing
-                       // spaces as combinators
-                       var input = [],
-                               results = [],
-                               matcher = compile( selector.replace( rtrim, "$1" ) );
-
-                       return matcher[ expando ] ?
-                               markFunction(function( seed, matches, context, xml ) {
-                                       var elem,
-                                               unmatched = matcher( seed, null, xml, [] ),
-                                               i = seed.length;
-
-                                       // Match elements unmatched by `matcher`
-                                       while ( i-- ) {
-                                               if ( (elem = unmatched[i]) ) {
-                                                       seed[i] = !(matches[i] = elem);
-                                               }
-                                       }
-                               }) :
-                               function( elem, context, xml ) {
-                                       input[0] = elem;
-                                       matcher( input, null, xml, results );
-                                       // Don't keep the element (issue #299)
-                                       input[0] = null;
-                                       return !results.pop();
-                               };
-               }),
-
-               "has": markFunction(function( selector ) {
-                       return function( elem ) {
-                               return Sizzle( selector, elem ).length > 0;
-                       };
-               }),
-
-               "contains": markFunction(function( text ) {
-                       text = text.replace( runescape, funescape );
-                       return function( elem ) {
-                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-                       };
-               }),
-
-               // "Whether an element is represented by a :lang() selector
-               // is based solely on the element's language value
-               // being equal to the identifier C,
-               // or beginning with the identifier C immediately followed by "-".
-               // The matching of C against the element's language value is performed case-insensitively.
-               // The identifier C does not have to be a valid language name."
-               // http://www.w3.org/TR/selectors/#lang-pseudo
-               "lang": markFunction( function( lang ) {
-                       // lang value must be a valid identifier
-                       if ( !ridentifier.test(lang || "") ) {
-                               Sizzle.error( "unsupported lang: " + lang );
-                       }
-                       lang = lang.replace( runescape, funescape ).toLowerCase();
-                       return function( elem ) {
-                               var elemLang;
-                               do {
-                                       if ( (elemLang = documentIsHTML ?
-                                               elem.lang :
-                                               elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
-                                               elemLang = elemLang.toLowerCase();
-                                               return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-                                       }
-                               } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-                               return false;
-                       };
-               }),
-
-               // Miscellaneous
-               "target": function( elem ) {
-                       var hash = window.location && window.location.hash;
-                       return hash && hash.slice( 1 ) === elem.id;
-               },
-
-               "root": function( elem ) {
-                       return elem === docElem;
-               },
-
-               "focus": function( elem ) {
-                       return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-               },
-
-               // Boolean properties
-               "enabled": createDisabledPseudo( false ),
-               "disabled": createDisabledPseudo( true ),
-
-               "checked": function( elem ) {
-                       // In CSS3, :checked should return both checked and selected elements
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-                       var nodeName = elem.nodeName.toLowerCase();
-                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-               },
-
-               "selected": function( elem ) {
-                       // Accessing this property makes selected-by-default
-                       // options in Safari work properly
-                       if ( elem.parentNode ) {
-                               elem.parentNode.selectedIndex;
-                       }
-
-                       return elem.selected === true;
-               },
-
-               // Contents
-               "empty": function( elem ) {
-                       // http://www.w3.org/TR/selectors/#empty-pseudo
-                       // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
-                       //   but not by others (comment: 8; processing instruction: 7; etc.)
-                       // nodeType < 6 works because attributes (2) do not appear as children
-                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-                               if ( elem.nodeType < 6 ) {
-                                       return false;
-                               }
-                       }
-                       return true;
-               },
-
-               "parent": function( elem ) {
-                       return !Expr.pseudos["empty"]( elem );
-               },
-
-               // Element/input types
-               "header": function( elem ) {
-                       return rheader.test( elem.nodeName );
-               },
-
-               "input": function( elem ) {
-                       return rinputs.test( elem.nodeName );
-               },
-
-               "button": function( elem ) {
-                       var name = elem.nodeName.toLowerCase();
-                       return name === "input" && elem.type === "button" || name === "button";
-               },
-
-               "text": function( elem ) {
-                       var attr;
-                       return elem.nodeName.toLowerCase() === "input" &&
-                               elem.type === "text" &&
-
-                               // Support: IE<8
-                               // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
-                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
-               },
-
-               // Position-in-collection
-               "first": createPositionalPseudo(function() {
-                       return [ 0 ];
-               }),
-
-               "last": createPositionalPseudo(function( matchIndexes, length ) {
-                       return [ length - 1 ];
-               }),
-
-               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-                       return [ argument < 0 ? argument + length : argument ];
-               }),
-
-               "even": createPositionalPseudo(function( matchIndexes, length ) {
-                       var i = 0;
-                       for ( ; i < length; i += 2 ) {
-                               matchIndexes.push( i );
-                       }
-                       return matchIndexes;
-               }),
-
-               "odd": createPositionalPseudo(function( matchIndexes, length ) {
-                       var i = 1;
-                       for ( ; i < length; i += 2 ) {
-                               matchIndexes.push( i );
-                       }
-                       return matchIndexes;
-               }),
-
-               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-                       var i = argument < 0 ? argument + length : argument;
-                       for ( ; --i >= 0; ) {
-                               matchIndexes.push( i );
-                       }
-                       return matchIndexes;
-               }),
-
-               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-                       var i = argument < 0 ? argument + length : argument;
-                       for ( ; ++i < length; ) {
-                               matchIndexes.push( i );
-                       }
-                       return matchIndexes;
-               })
-       }
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-       Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-       Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
-       var matched, match, tokens, type,
-               soFar, groups, preFilters,
-               cached = tokenCache[ selector + " " ];
-
-       if ( cached ) {
-               return parseOnly ? 0 : cached.slice( 0 );
-       }
-
-       soFar = selector;
-       groups = [];
-       preFilters = Expr.preFilter;
-
-       while ( soFar ) {
-
-               // Comma and first run
-               if ( !matched || (match = rcomma.exec( soFar )) ) {
-                       if ( match ) {
-                               // Don't consume trailing commas as valid
-                               soFar = soFar.slice( match[0].length ) || soFar;
-                       }
-                       groups.push( (tokens = []) );
-               }
-
-               matched = false;
-
-               // Combinators
-               if ( (match = rcombinators.exec( soFar )) ) {
-                       matched = match.shift();
-                       tokens.push({
-                               value: matched,
-                               // Cast descendant combinators to space
-                               type: match[0].replace( rtrim, " " )
-                       });
-                       soFar = soFar.slice( matched.length );
-               }
-
-               // Filters
-               for ( type in Expr.filter ) {
-                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-                               (match = preFilters[ type ]( match ))) ) {
-                               matched = match.shift();
-                               tokens.push({
-                                       value: matched,
-                                       type: type,
-                                       matches: match
-                               });
-                               soFar = soFar.slice( matched.length );
-                       }
-               }
-
-               if ( !matched ) {
-                       break;
-               }
-       }
-
-       // Return the length of the invalid excess
-       // if we're just parsing
-       // Otherwise, throw an error or return tokens
-       return parseOnly ?
-               soFar.length :
-               soFar ?
-                       Sizzle.error( selector ) :
-                       // Cache the tokens
-                       tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
-       var i = 0,
-               len = tokens.length,
-               selector = "";
-       for ( ; i < len; i++ ) {
-               selector += tokens[i].value;
-       }
-       return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
-       var dir = combinator.dir,
-               skip = combinator.next,
-               key = skip || dir,
-               checkNonElements = base && key === "parentNode",
-               doneName = done++;
-
-       return combinator.first ?
-               // Check against closest ancestor/preceding element
-               function( elem, context, xml ) {
-                       while ( (elem = elem[ dir ]) ) {
-                               if ( elem.nodeType === 1 || checkNonElements ) {
-                                       return matcher( elem, context, xml );
-                               }
-                       }
-                       return false;
-               } :
-
-               // Check against all ancestor/preceding elements
-               function( elem, context, xml ) {
-                       var oldCache, uniqueCache, outerCache,
-                               newCache = [ dirruns, doneName ];
-
-                       // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
-                       if ( xml ) {
-                               while ( (elem = elem[ dir ]) ) {
-                                       if ( elem.nodeType === 1 || checkNonElements ) {
-                                               if ( matcher( elem, context, xml ) ) {
-                                                       return true;
-                                               }
-                                       }
-                               }
-                       } else {
-                               while ( (elem = elem[ dir ]) ) {
-                                       if ( elem.nodeType === 1 || checkNonElements ) {
-                                               outerCache = elem[ expando ] || (elem[ expando ] = {});
-
-                                               // Support: IE <9 only
-                                               // Defend against cloned attroperties (jQuery gh-1709)
-                                               uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
-                                               if ( skip && skip === elem.nodeName.toLowerCase() ) {
-                                                       elem = elem[ dir ] || elem;
-                                               } else if ( (oldCache = uniqueCache[ key ]) &&
-                                                       oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
-                                                       // Assign to newCache so results back-propagate to previous elements
-                                                       return (newCache[ 2 ] = oldCache[ 2 ]);
-                                               } else {
-                                                       // Reuse newcache so results back-propagate to previous elements
-                                                       uniqueCache[ key ] = newCache;
-
-                                                       // A match means we're done; a fail means we have to keep checking
-                                                       if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
-                                                               return true;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-                       return false;
-               };
-}
-
-function elementMatcher( matchers ) {
-       return matchers.length > 1 ?
-               function( elem, context, xml ) {
-                       var i = matchers.length;
-                       while ( i-- ) {
-                               if ( !matchers[i]( elem, context, xml ) ) {
-                                       return false;
-                               }
-                       }
-                       return true;
-               } :
-               matchers[0];
-}
-
-function multipleContexts( selector, contexts, results ) {
-       var i = 0,
-               len = contexts.length;
-       for ( ; i < len; i++ ) {
-               Sizzle( selector, contexts[i], results );
-       }
-       return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
-       var elem,
-               newUnmatched = [],
-               i = 0,
-               len = unmatched.length,
-               mapped = map != null;
-
-       for ( ; i < len; i++ ) {
-               if ( (elem = unmatched[i]) ) {
-                       if ( !filter || filter( elem, context, xml ) ) {
-                               newUnmatched.push( elem );
-                               if ( mapped ) {
-                                       map.push( i );
-                               }
-                       }
-               }
-       }
-
-       return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-       if ( postFilter && !postFilter[ expando ] ) {
-               postFilter = setMatcher( postFilter );
-       }
-       if ( postFinder && !postFinder[ expando ] ) {
-               postFinder = setMatcher( postFinder, postSelector );
-       }
-       return markFunction(function( seed, results, context, xml ) {
-               var temp, i, elem,
-                       preMap = [],
-                       postMap = [],
-                       preexisting = results.length,
-
-                       // Get initial elements from seed or context
-                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-                       // Prefilter to get matcher input, preserving a map for seed-results synchronization
-                       matcherIn = preFilter && ( seed || !selector ) ?
-                               condense( elems, preMap, preFilter, context, xml ) :
-                               elems,
-
-                       matcherOut = matcher ?
-                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-                                       // ...intermediate processing is necessary
-                                       [] :
-
-                                       // ...otherwise use results directly
-                                       results :
-                               matcherIn;
-
-               // Find primary matches
-               if ( matcher ) {
-                       matcher( matcherIn, matcherOut, context, xml );
-               }
-
-               // Apply postFilter
-               if ( postFilter ) {
-                       temp = condense( matcherOut, postMap );
-                       postFilter( temp, [], context, xml );
-
-                       // Un-match failing elements by moving them back to matcherIn
-                       i = temp.length;
-                       while ( i-- ) {
-                               if ( (elem = temp[i]) ) {
-                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-                               }
-                       }
-               }
-
-               if ( seed ) {
-                       if ( postFinder || preFilter ) {
-                               if ( postFinder ) {
-                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts
-                                       temp = [];
-                                       i = matcherOut.length;
-                                       while ( i-- ) {
-                                               if ( (elem = matcherOut[i]) ) {
-                                                       // Restore matcherIn since elem is not yet a final match
-                                                       temp.push( (matcherIn[i] = elem) );
-                                               }
-                                       }
-                                       postFinder( null, (matcherOut = []), temp, xml );
-                               }
-
-                               // Move matched elements from seed to results to keep them synchronized
-                               i = matcherOut.length;
-                               while ( i-- ) {
-                                       if ( (elem = matcherOut[i]) &&
-                                               (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
-
-                                               seed[temp] = !(results[temp] = elem);
-                                       }
-                               }
-                       }
-
-               // Add elements to results, through postFinder if defined
-               } else {
-                       matcherOut = condense(
-                               matcherOut === results ?
-                                       matcherOut.splice( preexisting, matcherOut.length ) :
-                                       matcherOut
-                       );
-                       if ( postFinder ) {
-                               postFinder( null, results, matcherOut, xml );
-                       } else {
-                               push.apply( results, matcherOut );
-                       }
-               }
-       });
-}
-
-function matcherFromTokens( tokens ) {
-       var checkContext, matcher, j,
-               len = tokens.length,
-               leadingRelative = Expr.relative[ tokens[0].type ],
-               implicitRelative = leadingRelative || Expr.relative[" "],
-               i = leadingRelative ? 1 : 0,
-
-               // The foundational matcher ensures that elements are reachable from top-level context(s)
-               matchContext = addCombinator( function( elem ) {
-                       return elem === checkContext;
-               }, implicitRelative, true ),
-               matchAnyContext = addCombinator( function( elem ) {
-                       return indexOf( checkContext, elem ) > -1;
-               }, implicitRelative, true ),
-               matchers = [ function( elem, context, xml ) {
-                       var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-                               (checkContext = context).nodeType ?
-                                       matchContext( elem, context, xml ) :
-                                       matchAnyContext( elem, context, xml ) );
-                       // Avoid hanging onto element (issue #299)
-                       checkContext = null;
-                       return ret;
-               } ];
-
-       for ( ; i < len; i++ ) {
-               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-                       matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-               } else {
-                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-                       // Return special upon seeing a positional matcher
-                       if ( matcher[ expando ] ) {
-                               // Find the next relative operator (if any) for proper handling
-                               j = ++i;
-                               for ( ; j < len; j++ ) {
-                                       if ( Expr.relative[ tokens[j].type ] ) {
-                                               break;
-                                       }
-                               }
-                               return setMatcher(
-                                       i > 1 && elementMatcher( matchers ),
-                                       i > 1 && toSelector(
-                                               // If the preceding token was a descendant combinator, insert an implicit any-element `*`
-                                               tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
-                                       ).replace( rtrim, "$1" ),
-                                       matcher,
-                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),
-                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-                                       j < len && toSelector( tokens )
-                               );
-                       }
-                       matchers.push( matcher );
-               }
-       }
-
-       return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-       var bySet = setMatchers.length > 0,
-               byElement = elementMatchers.length > 0,
-               superMatcher = function( seed, context, xml, results, outermost ) {
-                       var elem, j, matcher,
-                               matchedCount = 0,
-                               i = "0",
-                               unmatched = seed && [],
-                               setMatched = [],
-                               contextBackup = outermostContext,
-                               // We must always have either seed elements or outermost context
-                               elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
-                               // Use integer dirruns iff this is the outermost matcher
-                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
-                               len = elems.length;
-
-                       if ( outermost ) {
-                               outermostContext = context === document || context || outermost;
-                       }
-
-                       // Add elements passing elementMatchers directly to results
-                       // Support: IE<9, Safari
-                       // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
-                       for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
-                               if ( byElement && elem ) {
-                                       j = 0;
-                                       if ( !context && elem.ownerDocument !== document ) {
-                                               setDocument( elem );
-                                               xml = !documentIsHTML;
-                                       }
-                                       while ( (matcher = elementMatchers[j++]) ) {
-                                               if ( matcher( elem, context || document, xml) ) {
-                                                       results.push( elem );
-                                                       break;
-                                               }
-                                       }
-                                       if ( outermost ) {
-                                               dirruns = dirrunsUnique;
-                                       }
-                               }
-
-                               // Track unmatched elements for set filters
-                               if ( bySet ) {
-                                       // They will have gone through all possible matchers
-                                       if ( (elem = !matcher && elem) ) {
-                                               matchedCount--;
-                                       }
-
-                                       // Lengthen the array for every element, matched or not
-                                       if ( seed ) {
-                                               unmatched.push( elem );
-                                       }
-                               }
-                       }
-
-                       // `i` is now the count of elements visited above, and adding it to `matchedCount`
-                       // makes the latter nonnegative.
-                       matchedCount += i;
-
-                       // Apply set filters to unmatched elements
-                       // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
-                       // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
-                       // no element matchers and no seed.
-                       // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
-                       // case, which will result in a "00" `matchedCount` that differs from `i` but is also
-                       // numerically zero.
-                       if ( bySet && i !== matchedCount ) {
-                               j = 0;
-                               while ( (matcher = setMatchers[j++]) ) {
-                                       matcher( unmatched, setMatched, context, xml );
-                               }
-
-                               if ( seed ) {
-                                       // Reintegrate element matches to eliminate the need for sorting
-                                       if ( matchedCount > 0 ) {
-                                               while ( i-- ) {
-                                                       if ( !(unmatched[i] || setMatched[i]) ) {
-                                                               setMatched[i] = pop.call( results );
-                                                       }
-                                               }
-                                       }
-
-                                       // Discard index placeholder values to get only actual matches
-                                       setMatched = condense( setMatched );
-                               }
-
-                               // Add matches to results
-                               push.apply( results, setMatched );
-
-                               // Seedless set matches succeeding multiple successful matchers stipulate sorting
-                               if ( outermost && !seed && setMatched.length > 0 &&
-                                       ( matchedCount + setMatchers.length ) > 1 ) {
-
-                                       Sizzle.uniqueSort( results );
-                               }
-                       }
-
-                       // Override manipulation of globals by nested matchers
-                       if ( outermost ) {
-                               dirruns = dirrunsUnique;
-                               outermostContext = contextBackup;
-                       }
-
-                       return unmatched;
-               };
-
-       return bySet ?
-               markFunction( superMatcher ) :
-               superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
-       var i,
-               setMatchers = [],
-               elementMatchers = [],
-               cached = compilerCache[ selector + " " ];
-
-       if ( !cached ) {
-               // Generate a function of recursive functions that can be used to check each element
-               if ( !match ) {
-                       match = tokenize( selector );
-               }
-               i = match.length;
-               while ( i-- ) {
-                       cached = matcherFromTokens( match[i] );
-                       if ( cached[ expando ] ) {
-                               setMatchers.push( cached );
-                       } else {
-                               elementMatchers.push( cached );
-                       }
-               }
-
-               // Cache the compiled function
-               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
-               // Save selector and tokenization
-               cached.selector = selector;
-       }
-       return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- *  selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- *  selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
-       var i, tokens, token, type, find,
-               compiled = typeof selector === "function" && selector,
-               match = !seed && tokenize( (selector = compiled.selector || selector) );
-
-       results = results || [];
-
-       // Try to minimize operations if there is only one selector in the list and no seed
-       // (the latter of which guarantees us context)
-       if ( match.length === 1 ) {
-
-               // Reduce context if the leading compound selector is an ID
-               tokens = match[0] = match[0].slice( 0 );
-               if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-                               context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
-
-                       context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-                       if ( !context ) {
-                               return results;
-
-                       // Precompiled matchers will still verify ancestry, so step up a level
-                       } else if ( compiled ) {
-                               context = context.parentNode;
-                       }
-
-                       selector = selector.slice( tokens.shift().value.length );
-               }
-
-               // Fetch a seed set for right-to-left matching
-               i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-               while ( i-- ) {
-                       token = tokens[i];
-
-                       // Abort if we hit a combinator
-                       if ( Expr.relative[ (type = token.type) ] ) {
-                               break;
-                       }
-                       if ( (find = Expr.find[ type ]) ) {
-                               // Search, expanding context for leading sibling combinators
-                               if ( (seed = find(
-                                       token.matches[0].replace( runescape, funescape ),
-                                       rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
-                               )) ) {
-
-                                       // If seed is empty or no tokens remain, we can return early
-                                       tokens.splice( i, 1 );
-                                       selector = seed.length && toSelector( tokens );
-                                       if ( !selector ) {
-                                               push.apply( results, seed );
-                                               return results;
-                                       }
-
-                                       break;
-                               }
-                       }
-               }
-       }
-
-       // Compile and execute a filtering function if one is not provided
-       // Provide `match` to avoid retokenization if we modified the selector above
-       ( compiled || compile( selector, match ) )(
-               seed,
-               context,
-               !documentIsHTML,
-               results,
-               !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
-       );
-       return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( el ) {
-       // Should return 1, but returns 4 (following)
-       return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( el ) {
-       el.innerHTML = "<a href='#'></a>";
-       return el.firstChild.getAttribute("href") === "#" ;
-}) ) {
-       addHandle( "type|href|height|width", function( elem, name, isXML ) {
-               if ( !isXML ) {
-                       return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-               }
-       });
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( el ) {
-       el.innerHTML = "<input/>";
-       el.firstChild.setAttribute( "value", "" );
-       return el.firstChild.getAttribute( "value" ) === "";
-}) ) {
-       addHandle( "value", function( elem, name, isXML ) {
-               if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
-                       return elem.defaultValue;
-               }
-       });
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( el ) {
-       return el.getAttribute("disabled") == null;
-}) ) {
-       addHandle( booleans, function( elem, name, isXML ) {
-               var val;
-               if ( !isXML ) {
-                       return elem[ name ] === true ? name.toLowerCase() :
-                                       (val = elem.getAttributeNode( name )) && val.specified ?
-                                       val.value :
-                               null;
-               }
-       });
-}
-
-return Sizzle;
-
-})( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-
-// Deprecated
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-jQuery.escapeSelector = Sizzle.escape;
-
-
-
-
-var dir = function( elem, dir, until ) {
-       var matched = [],
-               truncate = until !== undefined;
-
-       while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
-               if ( elem.nodeType === 1 ) {
-                       if ( truncate && jQuery( elem ).is( until ) ) {
-                               break;
-                       }
-                       matched.push( elem );
-               }
-       }
-       return matched;
-};
-
-
-var siblings = function( n, elem ) {
-       var matched = [];
-
-       for ( ; n; n = n.nextSibling ) {
-               if ( n.nodeType === 1 && n !== elem ) {
-                       matched.push( n );
-               }
-       }
-
-       return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-
-
-function nodeName( elem, name ) {
-
-  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-
-};
-var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
-
-
-
-var risSimple = /^.[^:#\[\.,]*$/;
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
-       if ( jQuery.isFunction( qualifier ) ) {
-               return jQuery.grep( elements, function( elem, i ) {
-                       return !!qualifier.call( elem, i, elem ) !== not;
-               } );
-       }
-
-       // Single element
-       if ( qualifier.nodeType ) {
-               return jQuery.grep( elements, function( elem ) {
-                       return ( elem === qualifier ) !== not;
-               } );
-       }
-
-       // Arraylike of elements (jQuery, arguments, Array)
-       if ( typeof qualifier !== "string" ) {
-               return jQuery.grep( elements, function( elem ) {
-                       return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
-               } );
-       }
-
-       // Simple selector that can be filtered directly, removing non-Elements
-       if ( risSimple.test( qualifier ) ) {
-               return jQuery.filter( qualifier, elements, not );
-       }
-
-       // Complex selector, compare the two sets, removing non-Elements
-       qualifier = jQuery.filter( qualifier, elements );
-       return jQuery.grep( elements, function( elem ) {
-               return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
-       } );
-}
-
-jQuery.filter = function( expr, elems, not ) {
-       var elem = elems[ 0 ];
-
-       if ( not ) {
-               expr = ":not(" + expr + ")";
-       }
-
-       if ( elems.length === 1 && elem.nodeType === 1 ) {
-               return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
-       }
-
-       return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
-               return elem.nodeType === 1;
-       } ) );
-};
-
-jQuery.fn.extend( {
-       find: function( selector ) {
-               var i, ret,
-                       len = this.length,
-                       self = this;
-
-               if ( typeof selector !== "string" ) {
-                       return this.pushStack( jQuery( selector ).filter( function() {
-                               for ( i = 0; i < len; i++ ) {
-                                       if ( jQuery.contains( self[ i ], this ) ) {
-                                               return true;
-                                       }
-                               }
-                       } ) );
-               }
-
-               ret = this.pushStack( [] );
-
-               for ( i = 0; i < len; i++ ) {
-                       jQuery.find( selector, self[ i ], ret );
-               }
-
-               return len > 1 ? jQuery.uniqueSort( ret ) : ret;
-       },
-       filter: function( selector ) {
-               return this.pushStack( winnow( this, selector || [], false ) );
-       },
-       not: function( selector ) {
-               return this.pushStack( winnow( this, selector || [], true ) );
-       },
-       is: function( selector ) {
-               return !!winnow(
-                       this,
-
-                       // If this is a positional/relative selector, check membership in the returned set
-                       // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                       typeof selector === "string" && rneedsContext.test( selector ) ?
-                               jQuery( selector ) :
-                               selector || [],
-                       false
-               ).length;
-       }
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
-       // A simple way to check for HTML strings
-       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-       // Strict HTML recognition (#11290: must start with <)
-       // Shortcut simple #id case for speed
-       rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
-
-       init = jQuery.fn.init = function( selector, context, root ) {
-               var match, elem;
-
-               // HANDLE: $(""), $(null), $(undefined), $(false)
-               if ( !selector ) {
-                       return this;
-               }
-
-               // Method init() accepts an alternate rootjQuery
-               // so migrate can support jQuery.sub (gh-2101)
-               root = root || rootjQuery;
-
-               // Handle HTML strings
-               if ( typeof selector === "string" ) {
-                       if ( selector[ 0 ] === "<" &&
-                               selector[ selector.length - 1 ] === ">" &&
-                               selector.length >= 3 ) {
-
-                               // Assume that strings that start and end with <> are HTML and skip the regex check
-                               match = [ null, selector, null ];
-
-                       } else {
-                               match = rquickExpr.exec( selector );
-                       }
-
-                       // Match html or make sure no context is specified for #id
-                       if ( match && ( match[ 1 ] || !context ) ) {
-
-                               // HANDLE: $(html) -> $(array)
-                               if ( match[ 1 ] ) {
-                                       context = context instanceof jQuery ? context[ 0 ] : context;
-
-                                       // Option to run scripts is true for back-compat
-                                       // Intentionally let the error be thrown if parseHTML is not present
-                                       jQuery.merge( this, jQuery.parseHTML(
-                                               match[ 1 ],
-                                               context && context.nodeType ? context.ownerDocument || context : document,
-                                               true
-                                       ) );
-
-                                       // HANDLE: $(html, props)
-                                       if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
-                                               for ( match in context ) {
-
-                                                       // Properties of context are called as methods if possible
-                                                       if ( jQuery.isFunction( this[ match ] ) ) {
-                                                               this[ match ]( context[ match ] );
-
-                                                       // ...and otherwise set as attributes
-                                                       } else {
-                                                               this.attr( match, context[ match ] );
-                                                       }
-                                               }
-                                       }
-
-                                       return this;
-
-                               // HANDLE: $(#id)
-                               } else {
-                                       elem = document.getElementById( match[ 2 ] );
-
-                                       if ( elem ) {
-
-                                               // Inject the element directly into the jQuery object
-                                               this[ 0 ] = elem;
-                                               this.length = 1;
-                                       }
-                                       return this;
-                               }
-
-                       // HANDLE: $(expr, $(...))
-                       } else if ( !context || context.jquery ) {
-                               return ( context || root ).find( selector );
-
-                       // HANDLE: $(expr, context)
-                       // (which is just equivalent to: $(context).find(expr)
-                       } else {
-                               return this.constructor( context ).find( selector );
-                       }
-
-               // HANDLE: $(DOMElement)
-               } else if ( selector.nodeType ) {
-                       this[ 0 ] = selector;
-                       this.length = 1;
-                       return this;
-
-               // HANDLE: $(function)
-               // Shortcut for document ready
-               } else if ( jQuery.isFunction( selector ) ) {
-                       return root.ready !== undefined ?
-                               root.ready( selector ) :
-
-                               // Execute immediately if ready is not present
-                               selector( jQuery );
-               }
-
-               return jQuery.makeArray( selector, this );
-       };
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
-       // Methods guaranteed to produce a unique set when starting from a unique set
-       guaranteedUnique = {
-               children: true,
-               contents: true,
-               next: true,
-               prev: true
-       };
-
-jQuery.fn.extend( {
-       has: function( target ) {
-               var targets = jQuery( target, this ),
-                       l = targets.length;
-
-               return this.filter( function() {
-                       var i = 0;
-                       for ( ; i < l; i++ ) {
-                               if ( jQuery.contains( this, targets[ i ] ) ) {
-                                       return true;
-                               }
-                       }
-               } );
-       },
-
-       closest: function( selectors, context ) {
-               var cur,
-                       i = 0,
-                       l = this.length,
-                       matched = [],
-                       targets = typeof selectors !== "string" && jQuery( selectors );
-
-               // Positional selectors never match, since there's no _selection_ context
-               if ( !rneedsContext.test( selectors ) ) {
-                       for ( ; i < l; i++ ) {
-                               for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
-                                       // Always skip document fragments
-                                       if ( cur.nodeType < 11 && ( targets ?
-                                               targets.index( cur ) > -1 :
-
-                                               // Don't pass non-elements to Sizzle
-                                               cur.nodeType === 1 &&
-                                                       jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
-                                               matched.push( cur );
-                                               break;
-                                       }
-                               }
-                       }
-               }
-
-               return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
-       },
-
-       // Determine the position of an element within the set
-       index: function( elem ) {
-
-               // No argument, return index in parent
-               if ( !elem ) {
-                       return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
-               }
-
-               // Index in selector
-               if ( typeof elem === "string" ) {
-                       return indexOf.call( jQuery( elem ), this[ 0 ] );
-               }
-
-               // Locate the position of the desired element
-               return indexOf.call( this,
-
-                       // If it receives a jQuery object, the first element is used
-                       elem.jquery ? elem[ 0 ] : elem
-               );
-       },
-
-       add: function( selector, context ) {
-               return this.pushStack(
-                       jQuery.uniqueSort(
-                               jQuery.merge( this.get(), jQuery( selector, context ) )
-                       )
-               );
-       },
-
-       addBack: function( selector ) {
-               return this.add( selector == null ?
-                       this.prevObject : this.prevObject.filter( selector )
-               );
-       }
-} );
-
-function sibling( cur, dir ) {
-       while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
-       return cur;
-}
-
-jQuery.each( {
-       parent: function( elem ) {
-               var parent = elem.parentNode;
-               return parent && parent.nodeType !== 11 ? parent : null;
-       },
-       parents: function( elem ) {
-               return dir( elem, "parentNode" );
-       },
-       parentsUntil: function( elem, i, until ) {
-               return dir( elem, "parentNode", until );
-       },
-       next: function( elem ) {
-               return sibling( elem, "nextSibling" );
-       },
-       prev: function( elem ) {
-               return sibling( elem, "previousSibling" );
-       },
-       nextAll: function( elem ) {
-               return dir( elem, "nextSibling" );
-       },
-       prevAll: function( elem ) {
-               return dir( elem, "previousSibling" );
-       },
-       nextUntil: function( elem, i, until ) {
-               return dir( elem, "nextSibling", until );
-       },
-       prevUntil: function( elem, i, until ) {
-               return dir( elem, "previousSibling", until );
-       },
-       siblings: function( elem ) {
-               return siblings( ( elem.parentNode || {} ).firstChild, elem );
-       },
-       children: function( elem ) {
-               return siblings( elem.firstChild );
-       },
-       contents: function( elem ) {
-        if ( nodeName( elem, "iframe" ) ) {
-            return elem.contentDocument;
-        }
-
-        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
-        // Treat the template element as a regular one in browsers that
-        // don't support it.
-        if ( nodeName( elem, "template" ) ) {
-            elem = elem.content || elem;
-        }
-
-        return jQuery.merge( [], elem.childNodes );
-       }
-}, function( name, fn ) {
-       jQuery.fn[ name ] = function( until, selector ) {
-               var matched = jQuery.map( this, fn, until );
-
-               if ( name.slice( -5 ) !== "Until" ) {
-                       selector = until;
-               }
-
-               if ( selector && typeof selector === "string" ) {
-                       matched = jQuery.filter( selector, matched );
-               }
-
-               if ( this.length > 1 ) {
-
-                       // Remove duplicates
-                       if ( !guaranteedUnique[ name ] ) {
-                               jQuery.uniqueSort( matched );
-                       }
-
-                       // Reverse order for parents* and prev-derivatives
-                       if ( rparentsprev.test( name ) ) {
-                               matched.reverse();
-                       }
-               }
-
-               return this.pushStack( matched );
-       };
-} );
-var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
-       var object = {};
-       jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
-               object[ flag ] = true;
-       } );
-       return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *     options: an optional list of space-separated options that will change how
- *                     the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *     once:                   will ensure the callback list can only be fired once (like a Deferred)
- *
- *     memory:                 will keep track of previous values and will call any callback added
- *                                     after the list has been fired right away with the latest "memorized"
- *                                     values (like a Deferred)
- *
- *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
- *
- *     stopOnFalse:    interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-       // Convert options from String-formatted to Object-formatted if needed
-       // (we check in cache first)
-       options = typeof options === "string" ?
-               createOptions( options ) :
-               jQuery.extend( {}, options );
-
-       var // Flag to know if list is currently firing
-               firing,
-
-               // Last fire value for non-forgettable lists
-               memory,
-
-               // Flag to know if list was already fired
-               fired,
-
-               // Flag to prevent firing
-               locked,
-
-               // Actual callback list
-               list = [],
-
-               // Queue of execution data for repeatable lists
-               queue = [],
-
-               // Index of currently firing callback (modified by add/remove as needed)
-               firingIndex = -1,
-
-               // Fire callbacks
-               fire = function() {
-
-                       // Enforce single-firing
-                       locked = locked || options.once;
-
-                       // Execute callbacks for all pending executions,
-                       // respecting firingIndex overrides and runtime changes
-                       fired = firing = true;
-                       for ( ; queue.length; firingIndex = -1 ) {
-                               memory = queue.shift();
-                               while ( ++firingIndex < list.length ) {
-
-                                       // Run callback and check for early termination
-                                       if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
-                                               options.stopOnFalse ) {
-
-                                               // Jump to end and forget the data so .add doesn't re-fire
-                                               firingIndex = list.length;
-                                               memory = false;
-                                       }
-                               }
-                       }
-
-                       // Forget the data if we're done with it
-                       if ( !options.memory ) {
-                               memory = false;
-                       }
-
-                       firing = false;
-
-                       // Clean up if we're done firing for good
-                       if ( locked ) {
-
-                               // Keep an empty list if we have data for future add calls
-                               if ( memory ) {
-                                       list = [];
-
-                               // Otherwise, this object is spent
-                               } else {
-                                       list = "";
-                               }
-                       }
-               },
-
-               // Actual Callbacks object
-               self = {
-
-                       // Add a callback or a collection of callbacks to the list
-                       add: function() {
-                               if ( list ) {
-
-                                       // If we have memory from a past run, we should fire after adding
-                                       if ( memory && !firing ) {
-                                               firingIndex = list.length - 1;
-                                               queue.push( memory );
-                                       }
-
-                                       ( function add( args ) {
-                                               jQuery.each( args, function( _, arg ) {
-                                                       if ( jQuery.isFunction( arg ) ) {
-                                                               if ( !options.unique || !self.has( arg ) ) {
-                                                                       list.push( arg );
-                                                               }
-                                                       } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
-
-                                                               // Inspect recursively
-                                                               add( arg );
-                                                       }
-                                               } );
-                                       } )( arguments );
-
-                                       if ( memory && !firing ) {
-                                               fire();
-                                       }
-                               }
-                               return this;
-                       },
-
-                       // Remove a callback from the list
-                       remove: function() {
-                               jQuery.each( arguments, function( _, arg ) {
-                                       var index;
-                                       while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-                                               list.splice( index, 1 );
-
-                                               // Handle firing indexes
-                                               if ( index <= firingIndex ) {
-                                                       firingIndex--;
-                                               }
-                                       }
-                               } );
-                               return this;
-                       },
-
-                       // Check if a given callback is in the list.
-                       // If no argument is given, return whether or not list has callbacks attached.
-                       has: function( fn ) {
-                               return fn ?
-                                       jQuery.inArray( fn, list ) > -1 :
-                                       list.length > 0;
-                       },
-
-                       // Remove all callbacks from the list
-                       empty: function() {
-                               if ( list ) {
-                                       list = [];
-                               }
-                               return this;
-                       },
-
-                       // Disable .fire and .add
-                       // Abort any current/pending executions
-                       // Clear all callbacks and values
-                       disable: function() {
-                               locked = queue = [];
-                               list = memory = "";
-                               return this;
-                       },
-                       disabled: function() {
-                               return !list;
-                       },
-
-                       // Disable .fire
-                       // Also disable .add unless we have memory (since it would have no effect)
-                       // Abort any pending executions
-                       lock: function() {
-                               locked = queue = [];
-                               if ( !memory && !firing ) {
-                                       list = memory = "";
-                               }
-                               return this;
-                       },
-                       locked: function() {
-                               return !!locked;
-                       },
-
-                       // Call all callbacks with the given context and arguments
-                       fireWith: function( context, args ) {
-                               if ( !locked ) {
-                                       args = args || [];
-                                       args = [ context, args.slice ? args.slice() : args ];
-                                       queue.push( args );
-                                       if ( !firing ) {
-                                               fire();
-                                       }
-                               }
-                               return this;
-                       },
-
-                       // Call all the callbacks with the given arguments
-                       fire: function() {
-                               self.fireWith( this, arguments );
-                               return this;
-                       },
-
-                       // To know if the callbacks have already been called at least once
-                       fired: function() {
-                               return !!fired;
-                       }
-               };
-
-       return self;
-};
-
-
-function Identity( v ) {
-       return v;
-}
-function Thrower( ex ) {
-       throw ex;
-}
-
-function adoptValue( value, resolve, reject, noValue ) {
-       var method;
-
-       try {
-
-               // Check for promise aspect first to privilege synchronous behavior
-               if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
-                       method.call( value ).done( resolve ).fail( reject );
-
-               // Other thenables
-               } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
-                       method.call( value, resolve, reject );
-
-               // Other non-thenables
-               } else {
-
-                       // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
-                       // * false: [ value ].slice( 0 ) => resolve( value )
-                       // * true: [ value ].slice( 1 ) => resolve()
-                       resolve.apply( undefined, [ value ].slice( noValue ) );
-               }
-
-       // For Promises/A+, convert exceptions into rejections
-       // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
-       // Deferred#then to conditionally suppress rejection.
-       } catch ( value ) {
-
-               // Support: Android 4.0 only
-               // Strict mode functions invoked without .call/.apply get global-object context
-               reject.apply( undefined, [ value ] );
-       }
-}
-
-jQuery.extend( {
-
-       Deferred: function( func ) {
-               var tuples = [
-
-                               // action, add listener, callbacks,
-                               // ... .then handlers, argument index, [final state]
-                               [ "notify", "progress", jQuery.Callbacks( "memory" ),
-                                       jQuery.Callbacks( "memory" ), 2 ],
-                               [ "resolve", "done", jQuery.Callbacks( "once memory" ),
-                                       jQuery.Callbacks( "once memory" ), 0, "resolved" ],
-                               [ "reject", "fail", jQuery.Callbacks( "once memory" ),
-                                       jQuery.Callbacks( "once memory" ), 1, "rejected" ]
-                       ],
-                       state = "pending",
-                       promise = {
-                               state: function() {
-                                       return state;
-                               },
-                               always: function() {
-                                       deferred.done( arguments ).fail( arguments );
-                                       return this;
-                               },
-                               "catch": function( fn ) {
-                                       return promise.then( null, fn );
-                               },
-
-                               // Keep pipe for back-compat
-                               pipe: function( /* fnDone, fnFail, fnProgress */ ) {
-                                       var fns = arguments;
-
-                                       return jQuery.Deferred( function( newDefer ) {
-                                               jQuery.each( tuples, function( i, tuple ) {
-
-                                                       // Map tuples (progress, done, fail) to arguments (done, fail, progress)
-                                                       var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
-
-                                                       // deferred.progress(function() { bind to newDefer or newDefer.notify })
-                                                       // deferred.done(function() { bind to newDefer or newDefer.resolve })
-                                                       // deferred.fail(function() { bind to newDefer or newDefer.reject })
-                                                       deferred[ tuple[ 1 ] ]( function() {
-                                                               var returned = fn && fn.apply( this, arguments );
-                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                                       returned.promise()
-                                                                               .progress( newDefer.notify )
-                                                                               .done( newDefer.resolve )
-                                                                               .fail( newDefer.reject );
-                                                               } else {
-                                                                       newDefer[ tuple[ 0 ] + "With" ](
-                                                                               this,
-                                                                               fn ? [ returned ] : arguments
-                                                                       );
-                                                               }
-                                                       } );
-                                               } );
-                                               fns = null;
-                                       } ).promise();
-                               },
-                               then: function( onFulfilled, onRejected, onProgress ) {
-                                       var maxDepth = 0;
-                                       function resolve( depth, deferred, handler, special ) {
-                                               return function() {
-                                                       var that = this,
-                                                               args = arguments,
-                                                               mightThrow = function() {
-                                                                       var returned, then;
-
-                                                                       // Support: Promises/A+ section 2.3.3.3.3
-                                                                       // https://promisesaplus.com/#point-59
-                                                                       // Ignore double-resolution attempts
-                                                                       if ( depth < maxDepth ) {
-                                                                               return;
-                                                                       }
-
-                                                                       returned = handler.apply( that, args );
-
-                                                                       // Support: Promises/A+ section 2.3.1
-                                                                       // https://promisesaplus.com/#point-48
-                                                                       if ( returned === deferred.promise() ) {
-                                                                               throw new TypeError( "Thenable self-resolution" );
-                                                                       }
-
-                                                                       // Support: Promises/A+ sections 2.3.3.1, 3.5
-                                                                       // https://promisesaplus.com/#point-54
-                                                                       // https://promisesaplus.com/#point-75
-                                                                       // Retrieve `then` only once
-                                                                       then = returned &&
-
-                                                                               // Support: Promises/A+ section 2.3.4
-                                                                               // https://promisesaplus.com/#point-64
-                                                                               // Only check objects and functions for thenability
-                                                                               ( typeof returned === "object" ||
-                                                                                       typeof returned === "function" ) &&
-                                                                               returned.then;
-
-                                                                       // Handle a returned thenable
-                                                                       if ( jQuery.isFunction( then ) ) {
-
-                                                                               // Special processors (notify) just wait for resolution
-                                                                               if ( special ) {
-                                                                                       then.call(
-                                                                                               returned,
-                                                                                               resolve( maxDepth, deferred, Identity, special ),
-                                                                                               resolve( maxDepth, deferred, Thrower, special )
-                                                                                       );
-
-                                                                               // Normal processors (resolve) also hook into progress
-                                                                               } else {
-
-                                                                                       // ...and disregard older resolution values
-                                                                                       maxDepth++;
-
-                                                                                       then.call(
-                                                                                               returned,
-                                                                                               resolve( maxDepth, deferred, Identity, special ),
-                                                                                               resolve( maxDepth, deferred, Thrower, special ),
-                                                                                               resolve( maxDepth, deferred, Identity,
-                                                                                                       deferred.notifyWith )
-                                                                                       );
-                                                                               }
-
-                                                                       // Handle all other returned values
-                                                                       } else {
-
-                                                                               // Only substitute handlers pass on context
-                                                                               // and multiple values (non-spec behavior)
-                                                                               if ( handler !== Identity ) {
-                                                                                       that = undefined;
-                                                                                       args = [ returned ];
-                                                                               }
-
-                                                                               // Process the value(s)
-                                                                               // Default process is resolve
-                                                                               ( special || deferred.resolveWith )( that, args );
-                                                                       }
-                                                               },
-
-                                                               // Only normal processors (resolve) catch and reject exceptions
-                                                               process = special ?
-                                                                       mightThrow :
-                                                                       function() {
-                                                                               try {
-                                                                                       mightThrow();
-                                                                               } catch ( e ) {
-
-                                                                                       if ( jQuery.Deferred.exceptionHook ) {
-                                                                                               jQuery.Deferred.exceptionHook( e,
-                                                                                                       process.stackTrace );
-                                                                                       }
-
-                                                                                       // Support: Promises/A+ section 2.3.3.3.4.1
-                                                                                       // https://promisesaplus.com/#point-61
-                                                                                       // Ignore post-resolution exceptions
-                                                                                       if ( depth + 1 >= maxDepth ) {
-
-                                                                                               // Only substitute handlers pass on context
-                                                                                               // and multiple values (non-spec behavior)
-                                                                                               if ( handler !== Thrower ) {
-                                                                                                       that = undefined;
-                                                                                                       args = [ e ];
-                                                                                               }
-
-                                                                                               deferred.rejectWith( that, args );
-                                                                                       }
-                                                                               }
-                                                                       };
-
-                                                       // Support: Promises/A+ section 2.3.3.3.1
-                                                       // https://promisesaplus.com/#point-57
-                                                       // Re-resolve promises immediately to dodge false rejection from
-                                                       // subsequent errors
-                                                       if ( depth ) {
-                                                               process();
-                                                       } else {
-
-                                                               // Call an optional hook to record the stack, in case of exception
-                                                               // since it's otherwise lost when execution goes async
-                                                               if ( jQuery.Deferred.getStackHook ) {
-                                                                       process.stackTrace = jQuery.Deferred.getStackHook();
-                                                               }
-                                                               window.setTimeout( process );
-                                                       }
-                                               };
-                                       }
-
-                                       return jQuery.Deferred( function( newDefer ) {
-
-                                               // progress_handlers.add( ... )
-                                               tuples[ 0 ][ 3 ].add(
-                                                       resolve(
-                                                               0,
-                                                               newDefer,
-                                                               jQuery.isFunction( onProgress ) ?
-                                                                       onProgress :
-                                                                       Identity,
-                                                               newDefer.notifyWith
-                                                       )
-                                               );
-
-                                               // fulfilled_handlers.add( ... )
-                                               tuples[ 1 ][ 3 ].add(
-                                                       resolve(
-                                                               0,
-                                                               newDefer,
-                                                               jQuery.isFunction( onFulfilled ) ?
-                                                                       onFulfilled :
-                                                                       Identity
-                                                       )
-                                               );
-
-                                               // rejected_handlers.add( ... )
-                                               tuples[ 2 ][ 3 ].add(
-                                                       resolve(
-                                                               0,
-                                                               newDefer,
-                                                               jQuery.isFunction( onRejected ) ?
-                                                                       onRejected :
-                                                                       Thrower
-                                                       )
-                                               );
-                                       } ).promise();
-                               },
-
-                               // Get a promise for this deferred
-                               // If obj is provided, the promise aspect is added to the object
-                               promise: function( obj ) {
-                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
-                               }
-                       },
-                       deferred = {};
-
-               // Add list-specific methods
-               jQuery.each( tuples, function( i, tuple ) {
-                       var list = tuple[ 2 ],
-                               stateString = tuple[ 5 ];
-
-                       // promise.progress = list.add
-                       // promise.done = list.add
-                       // promise.fail = list.add
-                       promise[ tuple[ 1 ] ] = list.add;
-
-                       // Handle state
-                       if ( stateString ) {
-                               list.add(
-                                       function() {
-
-                                               // state = "resolved" (i.e., fulfilled)
-                                               // state = "rejected"
-                                               state = stateString;
-                                       },
-
-                                       // rejected_callbacks.disable
-                                       // fulfilled_callbacks.disable
-                                       tuples[ 3 - i ][ 2 ].disable,
-
-                                       // progress_callbacks.lock
-                                       tuples[ 0 ][ 2 ].lock
-                               );
-                       }
-
-                       // progress_handlers.fire
-                       // fulfilled_handlers.fire
-                       // rejected_handlers.fire
-                       list.add( tuple[ 3 ].fire );
-
-                       // deferred.notify = function() { deferred.notifyWith(...) }
-                       // deferred.resolve = function() { deferred.resolveWith(...) }
-                       // deferred.reject = function() { deferred.rejectWith(...) }
-                       deferred[ tuple[ 0 ] ] = function() {
-                               deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
-                               return this;
-                       };
-
-                       // deferred.notifyWith = list.fireWith
-                       // deferred.resolveWith = list.fireWith
-                       // deferred.rejectWith = list.fireWith
-                       deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
-               } );
-
-               // Make the deferred a promise
-               promise.promise( deferred );
-
-               // Call given func if any
-               if ( func ) {
-                       func.call( deferred, deferred );
-               }
-
-               // All done!
-               return deferred;
-       },
-
-       // Deferred helper
-       when: function( singleValue ) {
-               var
-
-                       // count of uncompleted subordinates
-                       remaining = arguments.length,
-
-                       // count of unprocessed arguments
-                       i = remaining,
-
-                       // subordinate fulfillment data
-                       resolveContexts = Array( i ),
-                       resolveValues = slice.call( arguments ),
-
-                       // the master Deferred
-                       master = jQuery.Deferred(),
-
-                       // subordinate callback factory
-                       updateFunc = function( i ) {
-                               return function( value ) {
-                                       resolveContexts[ i ] = this;
-                                       resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
-                                       if ( !( --remaining ) ) {
-                                               master.resolveWith( resolveContexts, resolveValues );
-                                       }
-                               };
-                       };
-
-               // Single- and empty arguments are adopted like Promise.resolve
-               if ( remaining <= 1 ) {
-                       adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
-                               !remaining );
-
-                       // Use .then() to unwrap secondary thenables (cf. gh-3000)
-                       if ( master.state() === "pending" ||
-                               jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
-
-                               return master.then();
-                       }
-               }
-
-               // Multiple arguments are aggregated like Promise.all array elements
-               while ( i-- ) {
-                       adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
-               }
-
-               return master.promise();
-       }
-} );
-
-
-// These usually indicate a programmer mistake during development,
-// warn about them ASAP rather than swallowing them by default.
-var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-
-jQuery.Deferred.exceptionHook = function( error, stack ) {
-
-       // Support: IE 8 - 9 only
-       // Console exists when dev tools are open, which can happen at any time
-       if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
-               window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
-       }
-};
-
-
-
-
-jQuery.readyException = function( error ) {
-       window.setTimeout( function() {
-               throw error;
-       } );
-};
-
-
-
-
-// The deferred used on DOM ready
-var readyList = jQuery.Deferred();
-
-jQuery.fn.ready = function( fn ) {
-
-       readyList
-               .then( fn )
-
-               // Wrap jQuery.readyException in a function so that the lookup
-               // happens at the time of error handling instead of callback
-               // registration.
-               .catch( function( error ) {
-                       jQuery.readyException( error );
-               } );
-
-       return this;
-};
-
-jQuery.extend( {
-
-       // Is the DOM ready to be used? Set to true once it occurs.
-       isReady: false,
-
-       // A counter to track how many items to wait for before
-       // the ready event fires. See #6781
-       readyWait: 1,
-
-       // Handle when the DOM is ready
-       ready: function( wait ) {
-
-               // Abort if there are pending holds or we're already ready
-               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-                       return;
-               }
-
-               // Remember that the DOM is ready
-               jQuery.isReady = true;
-
-               // If a normal DOM Ready event fired, decrement, and wait if need be
-               if ( wait !== true && --jQuery.readyWait > 0 ) {
-                       return;
-               }
-
-               // If there are functions bound, to execute
-               readyList.resolveWith( document, [ jQuery ] );
-       }
-} );
-
-jQuery.ready.then = readyList.then;
-
-// The ready event handler and self cleanup method
-function completed() {
-       document.removeEventListener( "DOMContentLoaded", completed );
-       window.removeEventListener( "load", completed );
-       jQuery.ready();
-}
-
-// Catch cases where $(document).ready() is called
-// after the browser event has already occurred.
-// Support: IE <=9 - 10 only
-// Older IE sometimes signals "interactive" too soon
-if ( document.readyState === "complete" ||
-       ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
-       // Handle it asynchronously to allow scripts the opportunity to delay ready
-       window.setTimeout( jQuery.ready );
-
-} else {
-
-       // Use the handy event callback
-       document.addEventListener( "DOMContentLoaded", completed );
-
-       // A fallback to window.onload, that will always work
-       window.addEventListener( "load", completed );
-}
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
-       var i = 0,
-               len = elems.length,
-               bulk = key == null;
-
-       // Sets many values
-       if ( jQuery.type( key ) === "object" ) {
-               chainable = true;
-               for ( i in key ) {
-                       access( elems, fn, i, key[ i ], true, emptyGet, raw );
-               }
-
-       // Sets one value
-       } else if ( value !== undefined ) {
-               chainable = true;
-
-               if ( !jQuery.isFunction( value ) ) {
-                       raw = true;
-               }
-
-               if ( bulk ) {
-
-                       // Bulk operations run against the entire set
-                       if ( raw ) {
-                               fn.call( elems, value );
-                               fn = null;
-
-                       // ...except when executing function values
-                       } else {
-                               bulk = fn;
-                               fn = function( elem, key, value ) {
-                                       return bulk.call( jQuery( elem ), value );
-                               };
-                       }
-               }
-
-               if ( fn ) {
-                       for ( ; i < len; i++ ) {
-                               fn(
-                                       elems[ i ], key, raw ?
-                                       value :
-                                       value.call( elems[ i ], i, fn( elems[ i ], key ) )
-                               );
-                       }
-               }
-       }
-
-       if ( chainable ) {
-               return elems;
-       }
-
-       // Gets
-       if ( bulk ) {
-               return fn.call( elems );
-       }
-
-       return len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-var acceptData = function( owner ) {
-
-       // Accepts only:
-       //  - Node
-       //    - Node.ELEMENT_NODE
-       //    - Node.DOCUMENT_NODE
-       //  - Object
-       //    - Any
-       return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-
-
-
-function Data() {
-       this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
-       cache: function( owner ) {
-
-               // Check if the owner object already has a cache
-               var value = owner[ this.expando ];
-
-               // If not, create one
-               if ( !value ) {
-                       value = {};
-
-                       // We can accept data for non-element nodes in modern browsers,
-                       // but we should not, see #8335.
-                       // Always return an empty object.
-                       if ( acceptData( owner ) ) {
-
-                               // If it is a node unlikely to be stringify-ed or looped over
-                               // use plain assignment
-                               if ( owner.nodeType ) {
-                                       owner[ this.expando ] = value;
-
-                               // Otherwise secure it in a non-enumerable property
-                               // configurable must be true to allow the property to be
-                               // deleted when data is removed
-                               } else {
-                                       Object.defineProperty( owner, this.expando, {
-                                               value: value,
-                                               configurable: true
-                                       } );
-                               }
-                       }
-               }
-
-               return value;
-       },
-       set: function( owner, data, value ) {
-               var prop,
-                       cache = this.cache( owner );
-
-               // Handle: [ owner, key, value ] args
-               // Always use camelCase key (gh-2257)
-               if ( typeof data === "string" ) {
-                       cache[ jQuery.camelCase( data ) ] = value;
-
-               // Handle: [ owner, { properties } ] args
-               } else {
-
-                       // Copy the properties one-by-one to the cache object
-                       for ( prop in data ) {
-                               cache[ jQuery.camelCase( prop ) ] = data[ prop ];
-                       }
-               }
-               return cache;
-       },
-       get: function( owner, key ) {
-               return key === undefined ?
-                       this.cache( owner ) :
-
-                       // Always use camelCase key (gh-2257)
-                       owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
-       },
-       access: function( owner, key, value ) {
-
-               // In cases where either:
-               //
-               //   1. No key was specified
-               //   2. A string key was specified, but no value provided
-               //
-               // Take the "read" path and allow the get method to determine
-               // which value to return, respectively either:
-               //
-               //   1. The entire cache object
-               //   2. The data stored at the key
-               //
-               if ( key === undefined ||
-                               ( ( key && typeof key === "string" ) && value === undefined ) ) {
-
-                       return this.get( owner, key );
-               }
-
-               // When the key is not a string, or both a key and value
-               // are specified, set or extend (existing objects) with either:
-               //
-               //   1. An object of properties
-               //   2. A key and value
-               //
-               this.set( owner, key, value );
-
-               // Since the "set" path can have two possible entry points
-               // return the expected data based on which path was taken[*]
-               return value !== undefined ? value : key;
-       },
-       remove: function( owner, key ) {
-               var i,
-                       cache = owner[ this.expando ];
-
-               if ( cache === undefined ) {
-                       return;
-               }
-
-               if ( key !== undefined ) {
-
-                       // Support array or space separated string of keys
-                       if ( Array.isArray( key ) ) {
-
-                               // If key is an array of keys...
-                               // We always set camelCase keys, so remove that.
-                               key = key.map( jQuery.camelCase );
-                       } else {
-                               key = jQuery.camelCase( key );
-
-                               // If a key with the spaces exists, use it.
-                               // Otherwise, create an array by matching non-whitespace
-                               key = key in cache ?
-                                       [ key ] :
-                                       ( key.match( rnothtmlwhite ) || [] );
-                       }
-
-                       i = key.length;
-
-                       while ( i-- ) {
-                               delete cache[ key[ i ] ];
-                       }
-               }
-
-               // Remove the expando if there's no more data
-               if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
-                       // Support: Chrome <=35 - 45
-                       // Webkit & Blink performance suffers when deleting properties
-                       // from DOM nodes, so set to undefined instead
-                       // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
-                       if ( owner.nodeType ) {
-                               owner[ this.expando ] = undefined;
-                       } else {
-                               delete owner[ this.expando ];
-                       }
-               }
-       },
-       hasData: function( owner ) {
-               var cache = owner[ this.expando ];
-               return cache !== undefined && !jQuery.isEmptyObject( cache );
-       }
-};
-var dataPriv = new Data();
-
-var dataUser = new Data();
-
-
-
-//     Implementation Summary
-//
-//     1. Enforce API surface and semantic compatibility with 1.9.x branch
-//     2. Improve the module's maintainability by reducing the storage
-//             paths to a single mechanism.
-//     3. Use the same single mechanism to support "private" and "user" data.
-//     4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-//     5. Avoid exposing implementation details on user objects (eg. expando properties)
-//     6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
-       rmultiDash = /[A-Z]/g;
-
-function getData( data ) {
-       if ( data === "true" ) {
-               return true;
-       }
-
-       if ( data === "false" ) {
-               return false;
-       }
-
-       if ( data === "null" ) {
-               return null;
-       }
-
-       // Only convert to a number if it doesn't change the string
-       if ( data === +data + "" ) {
-               return +data;
-       }
-
-       if ( rbrace.test( data ) ) {
-               return JSON.parse( data );
-       }
-
-       return data;
-}
-
-function dataAttr( elem, key, data ) {
-       var name;
-
-       // If nothing was found internally, try to fetch any
-       // data from the HTML5 data-* attribute
-       if ( data === undefined && elem.nodeType === 1 ) {
-               name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
-               data = elem.getAttribute( name );
-
-               if ( typeof data === "string" ) {
-                       try {
-                               data = getData( data );
-                       } catch ( e ) {}
-
-                       // Make sure we set the data so it isn't changed later
-                       dataUser.set( elem, key, data );
-               } else {
-                       data = undefined;
-               }
-       }
-       return data;
-}
-
-jQuery.extend( {
-       hasData: function( elem ) {
-               return dataUser.hasData( elem ) || dataPriv.hasData( elem );
-       },
-
-       data: function( elem, name, data ) {
-               return dataUser.access( elem, name, data );
-       },
-
-       removeData: function( elem, name ) {
-               dataUser.remove( elem, name );
-       },
-
-       // TODO: Now that all calls to _data and _removeData have been replaced
-       // with direct calls to dataPriv methods, these can be deprecated.
-       _data: function( elem, name, data ) {
-               return dataPriv.access( elem, name, data );
-       },
-
-       _removeData: function( elem, name ) {
-               dataPriv.remove( elem, name );
-       }
-} );
-
-jQuery.fn.extend( {
-       data: function( key, value ) {
-               var i, name, data,
-                       elem = this[ 0 ],
-                       attrs = elem && elem.attributes;
-
-               // Gets all values
-               if ( key === undefined ) {
-                       if ( this.length ) {
-                               data = dataUser.get( elem );
-
-                               if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
-                                       i = attrs.length;
-                                       while ( i-- ) {
-
-                                               // Support: IE 11 only
-                                               // The attrs elements can be null (#14894)
-                                               if ( attrs[ i ] ) {
-                                                       name = attrs[ i ].name;
-                                                       if ( name.indexOf( "data-" ) === 0 ) {
-                                                               name = jQuery.camelCase( name.slice( 5 ) );
-                                                               dataAttr( elem, name, data[ name ] );
-                                                       }
-                                               }
-                                       }
-                                       dataPriv.set( elem, "hasDataAttrs", true );
-                               }
-                       }
-
-                       return data;
-               }
-
-               // Sets multiple values
-               if ( typeof key === "object" ) {
-                       return this.each( function() {
-                               dataUser.set( this, key );
-                       } );
-               }
-
-               return access( this, function( value ) {
-                       var data;
-
-                       // The calling jQuery object (element matches) is not empty
-                       // (and therefore has an element appears at this[ 0 ]) and the
-                       // `value` parameter was not undefined. An empty jQuery object
-                       // will result in `undefined` for elem = this[ 0 ] which will
-                       // throw an exception if an attempt to read a data cache is made.
-                       if ( elem && value === undefined ) {
-
-                               // Attempt to get data from the cache
-                               // The key will always be camelCased in Data
-                               data = dataUser.get( elem, key );
-                               if ( data !== undefined ) {
-                                       return data;
-                               }
-
-                               // Attempt to "discover" the data in
-                               // HTML5 custom data-* attrs
-                               data = dataAttr( elem, key );
-                               if ( data !== undefined ) {
-                                       return data;
-                               }
-
-                               // We tried really hard, but the data doesn't exist.
-                               return;
-                       }
-
-                       // Set the data...
-                       this.each( function() {
-
-                               // We always store the camelCased key
-                               dataUser.set( this, key, value );
-                       } );
-               }, null, value, arguments.length > 1, null, true );
-       },
-
-       removeData: function( key ) {
-               return this.each( function() {
-                       dataUser.remove( this, key );
-               } );
-       }
-} );
-
-
-jQuery.extend( {
-       queue: function( elem, type, data ) {
-               var queue;
-
-               if ( elem ) {
-                       type = ( type || "fx" ) + "queue";
-                       queue = dataPriv.get( elem, type );
-
-                       // Speed up dequeue by getting out quickly if this is just a lookup
-                       if ( data ) {
-                               if ( !queue || Array.isArray( data ) ) {
-                                       queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
-                               } else {
-                                       queue.push( data );
-                               }
-                       }
-                       return queue || [];
-               }
-       },
-
-       dequeue: function( elem, type ) {
-               type = type || "fx";
-
-               var queue = jQuery.queue( elem, type ),
-                       startLength = queue.length,
-                       fn = queue.shift(),
-                       hooks = jQuery._queueHooks( elem, type ),
-                       next = function() {
-                               jQuery.dequeue( elem, type );
-                       };
-
-               // If the fx queue is dequeued, always remove the progress sentinel
-               if ( fn === "inprogress" ) {
-                       fn = queue.shift();
-                       startLength--;
-               }
-
-               if ( fn ) {
-
-                       // Add a progress sentinel to prevent the fx queue from being
-                       // automatically dequeued
-                       if ( type === "fx" ) {
-                               queue.unshift( "inprogress" );
-                       }
-
-                       // Clear up the last queue stop function
-                       delete hooks.stop;
-                       fn.call( elem, next, hooks );
-               }
-
-               if ( !startLength && hooks ) {
-                       hooks.empty.fire();
-               }
-       },
-
-       // Not public - generate a queueHooks object, or return the current one
-       _queueHooks: function( elem, type ) {
-               var key = type + "queueHooks";
-               return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
-                       empty: jQuery.Callbacks( "once memory" ).add( function() {
-                               dataPriv.remove( elem, [ type + "queue", key ] );
-                       } )
-               } );
-       }
-} );
-
-jQuery.fn.extend( {
-       queue: function( type, data ) {
-               var setter = 2;
-
-               if ( typeof type !== "string" ) {
-                       data = type;
-                       type = "fx";
-                       setter--;
-               }
-
-               if ( arguments.length < setter ) {
-                       return jQuery.queue( this[ 0 ], type );
-               }
-
-               return data === undefined ?
-                       this :
-                       this.each( function() {
-                               var queue = jQuery.queue( this, type, data );
-
-                               // Ensure a hooks for this queue
-                               jQuery._queueHooks( this, type );
-
-                               if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
-                                       jQuery.dequeue( this, type );
-                               }
-                       } );
-       },
-       dequeue: function( type ) {
-               return this.each( function() {
-                       jQuery.dequeue( this, type );
-               } );
-       },
-       clearQueue: function( type ) {
-               return this.queue( type || "fx", [] );
-       },
-
-       // Get a promise resolved when queues of a certain type
-       // are emptied (fx is the type by default)
-       promise: function( type, obj ) {
-               var tmp,
-                       count = 1,
-                       defer = jQuery.Deferred(),
-                       elements = this,
-                       i = this.length,
-                       resolve = function() {
-                               if ( !( --count ) ) {
-                                       defer.resolveWith( elements, [ elements ] );
-                               }
-                       };
-
-               if ( typeof type !== "string" ) {
-                       obj = type;
-                       type = undefined;
-               }
-               type = type || "fx";
-
-               while ( i-- ) {
-                       tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
-                       if ( tmp && tmp.empty ) {
-                               count++;
-                               tmp.empty.add( resolve );
-                       }
-               }
-               resolve();
-               return defer.promise( obj );
-       }
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var isHiddenWithinTree = function( elem, el ) {
-
-               // isHiddenWithinTree might be called from jQuery#filter function;
-               // in that case, element will be second argument
-               elem = el || elem;
-
-               // Inline style trumps all
-               return elem.style.display === "none" ||
-                       elem.style.display === "" &&
-
-                       // Otherwise, check computed style
-                       // Support: Firefox <=43 - 45
-                       // Disconnected elements can have computed display: none, so first confirm that elem is
-                       // in the document.
-                       jQuery.contains( elem.ownerDocument, elem ) &&
-
-                       jQuery.css( elem, "display" ) === "none";
-       };
-
-var swap = function( elem, options, callback, args ) {
-       var ret, name,
-               old = {};
-
-       // Remember the old values, and insert the new ones
-       for ( name in options ) {
-               old[ name ] = elem.style[ name ];
-               elem.style[ name ] = options[ name ];
-       }
-
-       ret = callback.apply( elem, args || [] );
-
-       // Revert the old values
-       for ( name in options ) {
-               elem.style[ name ] = old[ name ];
-       }
-
-       return ret;
-};
-
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
-       var adjusted,
-               scale = 1,
-               maxIterations = 20,
-               currentValue = tween ?
-                       function() {
-                               return tween.cur();
-                       } :
-                       function() {
-                               return jQuery.css( elem, prop, "" );
-                       },
-               initial = currentValue(),
-               unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
-               // Starting value computation is required for potential unit mismatches
-               initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
-                       rcssNum.exec( jQuery.css( elem, prop ) );
-
-       if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
-               // Trust units reported by jQuery.css
-               unit = unit || initialInUnit[ 3 ];
-
-               // Make sure we update the tween properties later on
-               valueParts = valueParts || [];
-
-               // Iteratively approximate from a nonzero starting point
-               initialInUnit = +initial || 1;
-
-               do {
-
-                       // If previous iteration zeroed out, double until we get *something*.
-                       // Use string for doubling so we don't accidentally see scale as unchanged below
-                       scale = scale || ".5";
-
-                       // Adjust and apply
-                       initialInUnit = initialInUnit / scale;
-                       jQuery.style( elem, prop, initialInUnit + unit );
-
-               // Update scale, tolerating zero or NaN from tween.cur()
-               // Break the loop if scale is unchanged or perfect, or if we've just had enough.
-               } while (
-                       scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
-               );
-       }
-
-       if ( valueParts ) {
-               initialInUnit = +initialInUnit || +initial || 0;
-
-               // Apply relative offset (+=/-=) if specified
-               adjusted = valueParts[ 1 ] ?
-                       initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
-                       +valueParts[ 2 ];
-               if ( tween ) {
-                       tween.unit = unit;
-                       tween.start = initialInUnit;
-                       tween.end = adjusted;
-               }
-       }
-       return adjusted;
-}
-
-
-var defaultDisplayMap = {};
-
-function getDefaultDisplay( elem ) {
-       var temp,
-               doc = elem.ownerDocument,
-               nodeName = elem.nodeName,
-               display = defaultDisplayMap[ nodeName ];
-
-       if ( display ) {
-               return display;
-       }
-
-       temp = doc.body.appendChild( doc.createElement( nodeName ) );
-       display = jQuery.css( temp, "display" );
-
-       temp.parentNode.removeChild( temp );
-
-       if ( display === "none" ) {
-               display = "block";
-       }
-       defaultDisplayMap[ nodeName ] = display;
-
-       return display;
-}
-
-function showHide( elements, show ) {
-       var display, elem,
-               values = [],
-               index = 0,
-               length = elements.length;
-
-       // Determine new display value for elements that need to change
-       for ( ; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-
-               display = elem.style.display;
-               if ( show ) {
-
-                       // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
-                       // check is required in this first loop unless we have a nonempty display value (either
-                       // inline or about-to-be-restored)
-                       if ( display === "none" ) {
-                               values[ index ] = dataPriv.get( elem, "display" ) || null;
-                               if ( !values[ index ] ) {
-                                       elem.style.display = "";
-                               }
-                       }
-                       if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
-                               values[ index ] = getDefaultDisplay( elem );
-                       }
-               } else {
-                       if ( display !== "none" ) {
-                               values[ index ] = "none";
-
-                               // Remember what we're overwriting
-                               dataPriv.set( elem, "display", display );
-                       }
-               }
-       }
-
-       // Set the display of the elements in a second loop to avoid constant reflow
-       for ( index = 0; index < length; index++ ) {
-               if ( values[ index ] != null ) {
-                       elements[ index ].style.display = values[ index ];
-               }
-       }
-
-       return elements;
-}
-
-jQuery.fn.extend( {
-       show: function() {
-               return showHide( this, true );
-       },
-       hide: function() {
-               return showHide( this );
-       },
-       toggle: function( state ) {
-               if ( typeof state === "boolean" ) {
-                       return state ? this.show() : this.hide();
-               }
-
-               return this.each( function() {
-                       if ( isHiddenWithinTree( this ) ) {
-                               jQuery( this ).show();
-                       } else {
-                               jQuery( this ).hide();
-                       }
-               } );
-       }
-} );
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
-
-var rscriptType = ( /^$|\/(?:java|ecma)script/i );
-
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
-       // Support: IE <=9 only
-       option: [ 1, "<select multiple='multiple'>", "</select>" ],
-
-       // XHTML parsers do not magically insert elements in the
-       // same way that tag soup parsers do. So we cannot shorten
-       // this by omitting <tbody> or other required elements.
-       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, "", "" ]
-};
-
-// Support: IE <=9 only
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-
-function getAll( context, tag ) {
-
-       // Support: IE <=9 - 11 only
-       // Use typeof to avoid zero-argument method invocation on host objects (#15151)
-       var ret;
-
-       if ( typeof context.getElementsByTagName !== "undefined" ) {
-               ret = context.getElementsByTagName( tag || "*" );
-
-       } else if ( typeof context.querySelectorAll !== "undefined" ) {
-               ret = context.querySelectorAll( tag || "*" );
-
-       } else {
-               ret = [];
-       }
-
-       if ( tag === undefined || tag && nodeName( context, tag ) ) {
-               return jQuery.merge( [ context ], ret );
-       }
-
-       return ret;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-       var i = 0,
-               l = elems.length;
-
-       for ( ; i < l; i++ ) {
-               dataPriv.set(
-                       elems[ i ],
-                       "globalEval",
-                       !refElements || dataPriv.get( refElements[ i ], "globalEval" )
-               );
-       }
-}
-
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
-       var elem, tmp, tag, wrap, contains, j,
-               fragment = context.createDocumentFragment(),
-               nodes = [],
-               i = 0,
-               l = elems.length;
-
-       for ( ; i < l; i++ ) {
-               elem = elems[ i ];
-
-               if ( elem || elem === 0 ) {
-
-                       // Add nodes directly
-                       if ( jQuery.type( elem ) === "object" ) {
-
-                               // Support: Android <=4.0 only, PhantomJS 1 only
-                               // push.apply(_, arraylike) throws on ancient WebKit
-                               jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-                       // Convert non-html into a text node
-                       } else if ( !rhtml.test( elem ) ) {
-                               nodes.push( context.createTextNode( elem ) );
-
-                       // Convert html into DOM nodes
-                       } else {
-                               tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
-                               // Deserialize a standard representation
-                               tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
-                               wrap = wrapMap[ tag ] || wrapMap._default;
-                               tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
-                               // Descend through wrappers to the right content
-                               j = wrap[ 0 ];
-                               while ( j-- ) {
-                                       tmp = tmp.lastChild;
-                               }
-
-                               // Support: Android <=4.0 only, PhantomJS 1 only
-                               // push.apply(_, arraylike) throws on ancient WebKit
-                               jQuery.merge( nodes, tmp.childNodes );
-
-                               // Remember the top-level container
-                               tmp = fragment.firstChild;
-
-                               // Ensure the created nodes are orphaned (#12392)
-                               tmp.textContent = "";
-                       }
-               }
-       }
-
-       // Remove wrapper from fragment
-       fragment.textContent = "";
-
-       i = 0;
-       while ( ( elem = nodes[ i++ ] ) ) {
-
-               // Skip elements already in the context collection (trac-4087)
-               if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
-                       if ( ignored ) {
-                               ignored.push( elem );
-                       }
-                       continue;
-               }
-
-               contains = jQuery.contains( elem.ownerDocument, elem );
-
-               // Append to fragment
-               tmp = getAll( fragment.appendChild( elem ), "script" );
-
-               // Preserve script evaluation history
-               if ( contains ) {
-                       setGlobalEval( tmp );
-               }
-
-               // Capture executables
-               if ( scripts ) {
-                       j = 0;
-                       while ( ( elem = tmp[ j++ ] ) ) {
-                               if ( rscriptType.test( elem.type || "" ) ) {
-                                       scripts.push( elem );
-                               }
-                       }
-               }
-       }
-
-       return fragment;
-}
-
-
-( function() {
-       var fragment = document.createDocumentFragment(),
-               div = fragment.appendChild( document.createElement( "div" ) ),
-               input = document.createElement( "input" );
-
-       // Support: Android 4.0 - 4.3 only
-       // Check state lost if the name is set (#11217)
-       // Support: Windows Web Apps (WWA)
-       // `name` and `type` must use .setAttribute for WWA (#14901)
-       input.setAttribute( "type", "radio" );
-       input.setAttribute( "checked", "checked" );
-       input.setAttribute( "name", "t" );
-
-       div.appendChild( input );
-
-       // Support: Android <=4.1 only
-       // Older WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-       // Support: IE <=11 only
-       // Make sure textarea (and checkbox) defaultValue is properly cloned
-       div.innerHTML = "<textarea>x</textarea>";
-       support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-var documentElement = document.documentElement;
-
-
-
-var
-       rkeyEvent = /^key/,
-       rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-       rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
-       return true;
-}
-
-function returnFalse() {
-       return false;
-}
-
-// Support: IE <=9 only
-// See #13393 for more info
-function safeActiveElement() {
-       try {
-               return document.activeElement;
-       } catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
-       var origFn, type;
-
-       // Types can be a map of types/handlers
-       if ( typeof types === "object" ) {
-
-               // ( types-Object, selector, data )
-               if ( typeof selector !== "string" ) {
-
-                       // ( types-Object, data )
-                       data = data || selector;
-                       selector = undefined;
-               }
-               for ( type in types ) {
-                       on( elem, type, selector, data, types[ type ], one );
-               }
-               return elem;
-       }
-
-       if ( data == null && fn == null ) {
-
-               // ( types, fn )
-               fn = selector;
-               data = selector = undefined;
-       } else if ( fn == null ) {
-               if ( typeof selector === "string" ) {
-
-                       // ( types, selector, fn )
-                       fn = data;
-                       data = undefined;
-               } else {
-
-                       // ( types, data, fn )
-                       fn = data;
-                       data = selector;
-                       selector = undefined;
-               }
-       }
-       if ( fn === false ) {
-               fn = returnFalse;
-       } else if ( !fn ) {
-               return elem;
-       }
-
-       if ( one === 1 ) {
-               origFn = fn;
-               fn = function( event ) {
-
-                       // Can use an empty set, since event contains the info
-                       jQuery().off( event );
-                       return origFn.apply( this, arguments );
-               };
-
-               // Use same guid so caller can remove using origFn
-               fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-       }
-       return elem.each( function() {
-               jQuery.event.add( this, types, fn, data, selector );
-       } );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-       global: {},
-
-       add: function( elem, types, handler, data, selector ) {
-
-               var handleObjIn, eventHandle, tmp,
-                       events, t, handleObj,
-                       special, handlers, type, namespaces, origType,
-                       elemData = dataPriv.get( elem );
-
-               // Don't attach events to noData or text/comment nodes (but allow plain objects)
-               if ( !elemData ) {
-                       return;
-               }
-
-               // Caller can pass in an object of custom data in lieu of the handler
-               if ( handler.handler ) {
-                       handleObjIn = handler;
-                       handler = handleObjIn.handler;
-                       selector = handleObjIn.selector;
-               }
-
-               // Ensure that invalid selectors throw exceptions at attach time
-               // Evaluate against documentElement in case elem is a non-element node (e.g., document)
-               if ( selector ) {
-                       jQuery.find.matchesSelector( documentElement, selector );
-               }
-
-               // Make sure that the handler has a unique ID, used to find/remove it later
-               if ( !handler.guid ) {
-                       handler.guid = jQuery.guid++;
-               }
-
-               // Init the element's event structure and main handler, if this is the first
-               if ( !( events = elemData.events ) ) {
-                       events = elemData.events = {};
-               }
-               if ( !( eventHandle = elemData.handle ) ) {
-                       eventHandle = elemData.handle = function( e ) {
-
-                               // Discard the second event of a jQuery.event.trigger() and
-                               // when an event is called after a page has unloaded
-                               return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
-                                       jQuery.event.dispatch.apply( elem, arguments ) : undefined;
-                       };
-               }
-
-               // Handle multiple events separated by a space
-               types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
-               t = types.length;
-               while ( t-- ) {
-                       tmp = rtypenamespace.exec( types[ t ] ) || [];
-                       type = origType = tmp[ 1 ];
-                       namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-                       // There *must* be a type, no attaching namespace-only handlers
-                       if ( !type ) {
-                               continue;
-                       }
-
-                       // If event changes its type, use the special event handlers for the changed type
-                       special = jQuery.event.special[ type ] || {};
-
-                       // If selector defined, determine special event api type, otherwise given type
-                       type = ( selector ? special.delegateType : special.bindType ) || type;
-
-                       // Update special based on newly reset type
-                       special = jQuery.event.special[ type ] || {};
-
-                       // handleObj is passed to all event handlers
-                       handleObj = jQuery.extend( {
-                               type: type,
-                               origType: origType,
-                               data: data,
-                               handler: handler,
-                               guid: handler.guid,
-                               selector: selector,
-                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-                               namespace: namespaces.join( "." )
-                       }, handleObjIn );
-
-                       // Init the event handler queue if we're the first
-                       if ( !( handlers = events[ type ] ) ) {
-                               handlers = events[ type ] = [];
-                               handlers.delegateCount = 0;
-
-                               // Only use addEventListener if the special events handler returns false
-                               if ( !special.setup ||
-                                       special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
-                                       if ( elem.addEventListener ) {
-                                               elem.addEventListener( type, eventHandle );
-                                       }
-                               }
-                       }
-
-                       if ( special.add ) {
-                               special.add.call( elem, handleObj );
-
-                               if ( !handleObj.handler.guid ) {
-                                       handleObj.handler.guid = handler.guid;
-                               }
-                       }
-
-                       // Add to the element's handler list, delegates in front
-                       if ( selector ) {
-                               handlers.splice( handlers.delegateCount++, 0, handleObj );
-                       } else {
-                               handlers.push( handleObj );
-                       }
-
-                       // Keep track of which events have ever been used, for event optimization
-                       jQuery.event.global[ type ] = true;
-               }
-
-       },
-
-       // Detach an event or set of events from an element
-       remove: function( elem, types, handler, selector, mappedTypes ) {
-
-               var j, origCount, tmp,
-                       events, t, handleObj,
-                       special, handlers, type, namespaces, origType,
-                       elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
-               if ( !elemData || !( events = elemData.events ) ) {
-                       return;
-               }
-
-               // Once for each type.namespace in types; type may be omitted
-               types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
-               t = types.length;
-               while ( t-- ) {
-                       tmp = rtypenamespace.exec( types[ t ] ) || [];
-                       type = origType = tmp[ 1 ];
-                       namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-                       // Unbind all events (on this namespace, if provided) for the element
-                       if ( !type ) {
-                               for ( type in events ) {
-                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-                               }
-                               continue;
-                       }
-
-                       special = jQuery.event.special[ type ] || {};
-                       type = ( selector ? special.delegateType : special.bindType ) || type;
-                       handlers = events[ type ] || [];
-                       tmp = tmp[ 2 ] &&
-                               new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
-                       // Remove matching events
-                       origCount = j = handlers.length;
-                       while ( j-- ) {
-                               handleObj = handlers[ j ];
-
-                               if ( ( mappedTypes || origType === handleObj.origType ) &&
-                                       ( !handler || handler.guid === handleObj.guid ) &&
-                                       ( !tmp || tmp.test( handleObj.namespace ) ) &&
-                                       ( !selector || selector === handleObj.selector ||
-                                               selector === "**" && handleObj.selector ) ) {
-                                       handlers.splice( j, 1 );
-
-                                       if ( handleObj.selector ) {
-                                               handlers.delegateCount--;
-                                       }
-                                       if ( special.remove ) {
-                                               special.remove.call( elem, handleObj );
-                                       }
-                               }
-                       }
-
-                       // Remove generic event handler if we removed something and no more handlers exist
-                       // (avoids potential for endless recursion during removal of special event handlers)
-                       if ( origCount && !handlers.length ) {
-                               if ( !special.teardown ||
-                                       special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
-                                       jQuery.removeEvent( elem, type, elemData.handle );
-                               }
-
-                               delete events[ type ];
-                       }
-               }
-
-               // Remove data and the expando if it's no longer used
-               if ( jQuery.isEmptyObject( events ) ) {
-                       dataPriv.remove( elem, "handle events" );
-               }
-       },
-
-       dispatch: function( nativeEvent ) {
-
-               // Make a writable jQuery.Event from the native event object
-               var event = jQuery.event.fix( nativeEvent );
-
-               var i, j, ret, matched, handleObj, handlerQueue,
-                       args = new Array( arguments.length ),
-                       handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
-                       special = jQuery.event.special[ event.type ] || {};
-
-               // Use the fix-ed jQuery.Event rather than the (read-only) native event
-               args[ 0 ] = event;
-
-               for ( i = 1; i < arguments.length; i++ ) {
-                       args[ i ] = arguments[ i ];
-               }
-
-               event.delegateTarget = this;
-
-               // Call the preDispatch hook for the mapped type, and let it bail if desired
-               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-                       return;
-               }
-
-               // Determine handlers
-               handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-               // Run delegates first; they may want to stop propagation beneath us
-               i = 0;
-               while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
-                       event.currentTarget = matched.elem;
-
-                       j = 0;
-                       while ( ( handleObj = matched.handlers[ j++ ] ) &&
-                               !event.isImmediatePropagationStopped() ) {
-
-                               // Triggered event must either 1) have no namespace, or 2) have namespace(s)
-                               // a subset or equal to those in the bound event (both can have no namespace).
-                               if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
-                                       event.handleObj = handleObj;
-                                       event.data = handleObj.data;
-
-                                       ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
-                                               handleObj.handler ).apply( matched.elem, args );
-
-                                       if ( ret !== undefined ) {
-                                               if ( ( event.result = ret ) === false ) {
-                                                       event.preventDefault();
-                                                       event.stopPropagation();
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               // Call the postDispatch hook for the mapped type
-               if ( special.postDispatch ) {
-                       special.postDispatch.call( this, event );
-               }
-
-               return event.result;
-       },
-
-       handlers: function( event, handlers ) {
-               var i, handleObj, sel, matchedHandlers, matchedSelectors,
-                       handlerQueue = [],
-                       delegateCount = handlers.delegateCount,
-                       cur = event.target;
-
-               // Find delegate handlers
-               if ( delegateCount &&
-
-                       // Support: IE <=9
-                       // Black-hole SVG <use> instance trees (trac-13180)
-                       cur.nodeType &&
-
-                       // Support: Firefox <=42
-                       // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
-                       // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
-                       // Support: IE 11 only
-                       // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
-                       !( event.type === "click" && event.button >= 1 ) ) {
-
-                       for ( ; cur !== this; cur = cur.parentNode || this ) {
-
-                               // Don't check non-elements (#13208)
-                               // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-                               if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
-                                       matchedHandlers = [];
-                                       matchedSelectors = {};
-                                       for ( i = 0; i < delegateCount; i++ ) {
-                                               handleObj = handlers[ i ];
-
-                                               // Don't conflict with Object.prototype properties (#13203)
-                                               sel = handleObj.selector + " ";
-
-                                               if ( matchedSelectors[ sel ] === undefined ) {
-                                                       matchedSelectors[ sel ] = handleObj.needsContext ?
-                                                               jQuery( sel, this ).index( cur ) > -1 :
-                                                               jQuery.find( sel, this, null, [ cur ] ).length;
-                                               }
-                                               if ( matchedSelectors[ sel ] ) {
-                                                       matchedHandlers.push( handleObj );
-                                               }
-                                       }
-                                       if ( matchedHandlers.length ) {
-                                               handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
-                                       }
-                               }
-                       }
-               }
-
-               // Add the remaining (directly-bound) handlers
-               cur = this;
-               if ( delegateCount < handlers.length ) {
-                       handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
-               }
-
-               return handlerQueue;
-       },
-
-       addProp: function( name, hook ) {
-               Object.defineProperty( jQuery.Event.prototype, name, {
-                       enumerable: true,
-                       configurable: true,
-
-                       get: jQuery.isFunction( hook ) ?
-                               function() {
-                                       if ( this.originalEvent ) {
-                                                       return hook( this.originalEvent );
-                                       }
-                               } :
-                               function() {
-                                       if ( this.originalEvent ) {
-                                                       return this.originalEvent[ name ];
-                                       }
-                               },
-
-                       set: function( value ) {
-                               Object.defineProperty( this, name, {
-                                       enumerable: true,
-                                       configurable: true,
-                                       writable: true,
-                                       value: value
-                               } );
-                       }
-               } );
-       },
-
-       fix: function( originalEvent ) {
-               return originalEvent[ jQuery.expando ] ?
-                       originalEvent :
-                       new jQuery.Event( originalEvent );
-       },
-
-       special: {
-               load: {
-
-                       // Prevent triggered image.load events from bubbling to window.load
-                       noBubble: true
-               },
-               focus: {
-
-                       // Fire native event if possible so blur/focus sequence is correct
-                       trigger: function() {
-                               if ( this !== safeActiveElement() && this.focus ) {
-                                       this.focus();
-                                       return false;
-                               }
-                       },
-                       delegateType: "focusin"
-               },
-               blur: {
-                       trigger: function() {
-                               if ( this === safeActiveElement() && this.blur ) {
-                                       this.blur();
-                                       return false;
-                               }
-                       },
-                       delegateType: "focusout"
-               },
-               click: {
-
-                       // For checkbox, fire native event so checked state will be right
-                       trigger: function() {
-                               if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
-                                       this.click();
-                                       return false;
-                               }
-                       },
-
-                       // For cross-browser consistency, don't fire native .click() on links
-                       _default: function( event ) {
-                               return nodeName( event.target, "a" );
-                       }
-               },
-
-               beforeunload: {
-                       postDispatch: function( event ) {
-
-                               // Support: Firefox 20+
-                               // Firefox doesn't alert if the returnValue field is not set.
-                               if ( event.result !== undefined && event.originalEvent ) {
-                                       event.originalEvent.returnValue = event.result;
-                               }
-                       }
-               }
-       }
-};
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
-       // This "if" is needed for plain objects
-       if ( elem.removeEventListener ) {
-               elem.removeEventListener( type, handle );
-       }
-};
-
-jQuery.Event = function( src, props ) {
-
-       // Allow instantiation without the 'new' keyword
-       if ( !( this instanceof jQuery.Event ) ) {
-               return new jQuery.Event( src, props );
-       }
-
-       // Event object
-       if ( src && src.type ) {
-               this.originalEvent = src;
-               this.type = src.type;
-
-               // Events bubbling up the document may have been marked as prevented
-               // by a handler lower down the tree; reflect the correct value.
-               this.isDefaultPrevented = src.defaultPrevented ||
-                               src.defaultPrevented === undefined &&
-
-                               // Support: Android <=2.3 only
-                               src.returnValue === false ?
-                       returnTrue :
-                       returnFalse;
-
-               // Create target properties
-               // Support: Safari <=6 - 7 only
-               // Target should not be a text node (#504, #13143)
-               this.target = ( src.target && src.target.nodeType === 3 ) ?
-                       src.target.parentNode :
-                       src.target;
-
-               this.currentTarget = src.currentTarget;
-               this.relatedTarget = src.relatedTarget;
-
-       // Event type
-       } else {
-               this.type = src;
-       }
-
-       // Put explicitly provided properties onto the event object
-       if ( props ) {
-               jQuery.extend( this, props );
-       }
-
-       // Create a timestamp if incoming event doesn't have one
-       this.timeStamp = src && src.timeStamp || jQuery.now();
-
-       // Mark it as fixed
-       this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-       constructor: jQuery.Event,
-       isDefaultPrevented: returnFalse,
-       isPropagationStopped: returnFalse,
-       isImmediatePropagationStopped: returnFalse,
-       isSimulated: false,
-
-       preventDefault: function() {
-               var e = this.originalEvent;
-
-               this.isDefaultPrevented = returnTrue;
-
-               if ( e && !this.isSimulated ) {
-                       e.preventDefault();
-               }
-       },
-       stopPropagation: function() {
-               var e = this.originalEvent;
-
-               this.isPropagationStopped = returnTrue;
-
-               if ( e && !this.isSimulated ) {
-                       e.stopPropagation();
-               }
-       },
-       stopImmediatePropagation: function() {
-               var e = this.originalEvent;
-
-               this.isImmediatePropagationStopped = returnTrue;
-
-               if ( e && !this.isSimulated ) {
-                       e.stopImmediatePropagation();
-               }
-
-               this.stopPropagation();
-       }
-};
-
-// Includes all common event props including KeyEvent and MouseEvent specific props
-jQuery.each( {
-       altKey: true,
-       bubbles: true,
-       cancelable: true,
-       changedTouches: true,
-       ctrlKey: true,
-       detail: true,
-       eventPhase: true,
-       metaKey: true,
-       pageX: true,
-       pageY: true,
-       shiftKey: true,
-       view: true,
-       "char": true,
-       charCode: true,
-       key: true,
-       keyCode: true,
-       button: true,
-       buttons: true,
-       clientX: true,
-       clientY: true,
-       offsetX: true,
-       offsetY: true,
-       pointerId: true,
-       pointerType: true,
-       screenX: true,
-       screenY: true,
-       targetTouches: true,
-       toElement: true,
-       touches: true,
-
-       which: function( event ) {
-               var button = event.button;
-
-               // Add which for key events
-               if ( event.which == null && rkeyEvent.test( event.type ) ) {
-                       return event.charCode != null ? event.charCode : event.keyCode;
-               }
-
-               // Add which for click: 1 === left; 2 === middle; 3 === right
-               if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
-                       if ( button & 1 ) {
-                               return 1;
-                       }
-
-                       if ( button & 2 ) {
-                               return 3;
-                       }
-
-                       if ( button & 4 ) {
-                               return 2;
-                       }
-
-                       return 0;
-               }
-
-               return event.which;
-       }
-}, jQuery.event.addProp );
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
-       mouseenter: "mouseover",
-       mouseleave: "mouseout",
-       pointerenter: "pointerover",
-       pointerleave: "pointerout"
-}, function( orig, fix ) {
-       jQuery.event.special[ orig ] = {
-               delegateType: fix,
-               bindType: fix,
-
-               handle: function( event ) {
-                       var ret,
-                               target = this,
-                               related = event.relatedTarget,
-                               handleObj = event.handleObj;
-
-                       // For mouseenter/leave call the handler if related is outside the target.
-                       // NB: No relatedTarget if the mouse left/entered the browser window
-                       if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
-                               event.type = handleObj.origType;
-                               ret = handleObj.handler.apply( this, arguments );
-                               event.type = fix;
-                       }
-                       return ret;
-               }
-       };
-} );
-
-jQuery.fn.extend( {
-
-       on: function( types, selector, data, fn ) {
-               return on( this, types, selector, data, fn );
-       },
-       one: function( types, selector, data, fn ) {
-               return on( this, types, selector, data, fn, 1 );
-       },
-       off: function( types, selector, fn ) {
-               var handleObj, type;
-               if ( types && types.preventDefault && types.handleObj ) {
-
-                       // ( event )  dispatched jQuery.Event
-                       handleObj = types.handleObj;
-                       jQuery( types.delegateTarget ).off(
-                               handleObj.namespace ?
-                                       handleObj.origType + "." + handleObj.namespace :
-                                       handleObj.origType,
-                               handleObj.selector,
-                               handleObj.handler
-                       );
-                       return this;
-               }
-               if ( typeof types === "object" ) {
-
-                       // ( types-object [, selector] )
-                       for ( type in types ) {
-                               this.off( type, selector, types[ type ] );
-                       }
-                       return this;
-               }
-               if ( selector === false || typeof selector === "function" ) {
-
-                       // ( types [, fn] )
-                       fn = selector;
-                       selector = undefined;
-               }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               }
-               return this.each( function() {
-                       jQuery.event.remove( this, types, fn, selector );
-               } );
-       }
-} );
-
-
-var
-
-       /* eslint-disable max-len */
-
-       // See https://github.com/eslint/eslint/issues/3229
-       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
-
-       /* eslint-enable */
-
-       // Support: IE <=10 - 11, Edge 12 - 13
-       // In IE/Edge using regex groups here causes severe slowdowns.
-       // See https://connect.microsoft.com/IE/feedback/details/1736512/
-       rnoInnerhtml = /<script|<style|<link/i,
-
-       // checked="checked" or checked
-       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-       rscriptTypeMasked = /^true\/(.*)/,
-       rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Prefer a tbody over its parent table for containing new rows
-function manipulationTarget( elem, content ) {
-       if ( nodeName( elem, "table" ) &&
-               nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
-
-               return jQuery( ">tbody", elem )[ 0 ] || elem;
-       }
-
-       return elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-       elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
-       return elem;
-}
-function restoreScript( elem ) {
-       var match = rscriptTypeMasked.exec( elem.type );
-
-       if ( match ) {
-               elem.type = match[ 1 ];
-       } else {
-               elem.removeAttribute( "type" );
-       }
-
-       return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-       var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
-
-       if ( dest.nodeType !== 1 ) {
-               return;
-       }
-
-       // 1. Copy private data: events, handlers, etc.
-       if ( dataPriv.hasData( src ) ) {
-               pdataOld = dataPriv.access( src );
-               pdataCur = dataPriv.set( dest, pdataOld );
-               events = pdataOld.events;
-
-               if ( events ) {
-                       delete pdataCur.handle;
-                       pdataCur.events = {};
-
-                       for ( type in events ) {
-                               for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                                       jQuery.event.add( dest, type, events[ type ][ i ] );
-                               }
-                       }
-               }
-       }
-
-       // 2. Copy user data
-       if ( dataUser.hasData( src ) ) {
-               udataOld = dataUser.access( src );
-               udataCur = jQuery.extend( {}, udataOld );
-
-               dataUser.set( dest, udataCur );
-       }
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
-       var nodeName = dest.nodeName.toLowerCase();
-
-       // Fails to persist the checked state of a cloned checkbox or radio button.
-       if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-               dest.checked = src.checked;
-
-       // Fails to return the selected option to the default selected state when cloning options
-       } else if ( nodeName === "input" || nodeName === "textarea" ) {
-               dest.defaultValue = src.defaultValue;
-       }
-}
-
-function domManip( collection, args, callback, ignored ) {
-
-       // Flatten any nested arrays
-       args = concat.apply( [], args );
-
-       var fragment, first, scripts, hasScripts, node, doc,
-               i = 0,
-               l = collection.length,
-               iNoClone = l - 1,
-               value = args[ 0 ],
-               isFunction = jQuery.isFunction( value );
-
-       // We can't cloneNode fragments that contain checked, in WebKit
-       if ( isFunction ||
-                       ( l > 1 && typeof value === "string" &&
-                               !support.checkClone && rchecked.test( value ) ) ) {
-               return collection.each( function( index ) {
-                       var self = collection.eq( index );
-                       if ( isFunction ) {
-                               args[ 0 ] = value.call( this, index, self.html() );
-                       }
-                       domManip( self, args, callback, ignored );
-               } );
-       }
-
-       if ( l ) {
-               fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
-               first = fragment.firstChild;
-
-               if ( fragment.childNodes.length === 1 ) {
-                       fragment = first;
-               }
-
-               // Require either new content or an interest in ignored elements to invoke the callback
-               if ( first || ignored ) {
-                       scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-                       hasScripts = scripts.length;
-
-                       // Use the original fragment for the last item
-                       // instead of the first because it can end up
-                       // being emptied incorrectly in certain situations (#8070).
-                       for ( ; i < l; i++ ) {
-                               node = fragment;
-
-                               if ( i !== iNoClone ) {
-                                       node = jQuery.clone( node, true, true );
-
-                                       // Keep references to cloned scripts for later restoration
-                                       if ( hasScripts ) {
-
-                                               // Support: Android <=4.0 only, PhantomJS 1 only
-                                               // push.apply(_, arraylike) throws on ancient WebKit
-                                               jQuery.merge( scripts, getAll( node, "script" ) );
-                                       }
-                               }
-
-                               callback.call( collection[ i ], node, i );
-                       }
-
-                       if ( hasScripts ) {
-                               doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-                               // Reenable scripts
-                               jQuery.map( scripts, restoreScript );
-
-                               // Evaluate executable scripts on first document insertion
-                               for ( i = 0; i < hasScripts; i++ ) {
-                                       node = scripts[ i ];
-                                       if ( rscriptType.test( node.type || "" ) &&
-                                               !dataPriv.access( node, "globalEval" ) &&
-                                               jQuery.contains( doc, node ) ) {
-
-                                               if ( node.src ) {
-
-                                                       // Optional AJAX dependency, but won't run scripts if not present
-                                                       if ( jQuery._evalUrl ) {
-                                                               jQuery._evalUrl( node.src );
-                                                       }
-                                               } else {
-                                                       DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       return collection;
-}
-
-function remove( elem, selector, keepData ) {
-       var node,
-               nodes = selector ? jQuery.filter( selector, elem ) : elem,
-               i = 0;
-
-       for ( ; ( node = nodes[ i ] ) != null; i++ ) {
-               if ( !keepData && node.nodeType === 1 ) {
-                       jQuery.cleanData( getAll( node ) );
-               }
-
-               if ( node.parentNode ) {
-                       if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
-                               setGlobalEval( getAll( node, "script" ) );
-                       }
-                       node.parentNode.removeChild( node );
-               }
-       }
-
-       return elem;
-}
-
-jQuery.extend( {
-       htmlPrefilter: function( html ) {
-               return html.replace( rxhtmlTag, "<$1></$2>" );
-       },
-
-       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var i, l, srcElements, destElements,
-                       clone = elem.cloneNode( true ),
-                       inPage = jQuery.contains( elem.ownerDocument, elem );
-
-               // Fix IE cloning issues
-               if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
-                               !jQuery.isXMLDoc( elem ) ) {
-
-                       // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
-                       destElements = getAll( clone );
-                       srcElements = getAll( elem );
-
-                       for ( i = 0, l = srcElements.length; i < l; i++ ) {
-                               fixInput( srcElements[ i ], destElements[ i ] );
-                       }
-               }
-
-               // Copy the events from the original to the clone
-               if ( dataAndEvents ) {
-                       if ( deepDataAndEvents ) {
-                               srcElements = srcElements || getAll( elem );
-                               destElements = destElements || getAll( clone );
-
-                               for ( i = 0, l = srcElements.length; i < l; i++ ) {
-                                       cloneCopyEvent( srcElements[ i ], destElements[ i ] );
-                               }
-                       } else {
-                               cloneCopyEvent( elem, clone );
-                       }
-               }
-
-               // Preserve script evaluation history
-               destElements = getAll( clone, "script" );
-               if ( destElements.length > 0 ) {
-                       setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-               }
-
-               // Return the cloned set
-               return clone;
-       },
-
-       cleanData: function( elems ) {
-               var data, elem, type,
-                       special = jQuery.event.special,
-                       i = 0;
-
-               for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
-                       if ( acceptData( elem ) ) {
-                               if ( ( data = elem[ dataPriv.expando ] ) ) {
-                                       if ( data.events ) {
-                                               for ( type in data.events ) {
-                                                       if ( special[ type ] ) {
-                                                               jQuery.event.remove( elem, type );
-
-                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
-                                                       } else {
-                                                               jQuery.removeEvent( elem, type, data.handle );
-                                                       }
-                                               }
-                                       }
-
-                                       // Support: Chrome <=35 - 45+
-                                       // Assign undefined instead of using delete, see Data#remove
-                                       elem[ dataPriv.expando ] = undefined;
-                               }
-                               if ( elem[ dataUser.expando ] ) {
-
-                                       // Support: Chrome <=35 - 45+
-                                       // Assign undefined instead of using delete, see Data#remove
-                                       elem[ dataUser.expando ] = undefined;
-                               }
-                       }
-               }
-       }
-} );
-
-jQuery.fn.extend( {
-       detach: function( selector ) {
-               return remove( this, selector, true );
-       },
-
-       remove: function( selector ) {
-               return remove( this, selector );
-       },
-
-       text: function( value ) {
-               return access( this, function( value ) {
-                       return value === undefined ?
-                               jQuery.text( this ) :
-                               this.empty().each( function() {
-                                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-                                               this.textContent = value;
-                                       }
-                               } );
-               }, null, value, arguments.length );
-       },
-
-       append: function() {
-               return domManip( this, arguments, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-                               var target = manipulationTarget( this, elem );
-                               target.appendChild( elem );
-                       }
-               } );
-       },
-
-       prepend: function() {
-               return domManip( this, arguments, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-                               var target = manipulationTarget( this, elem );
-                               target.insertBefore( elem, target.firstChild );
-                       }
-               } );
-       },
-
-       before: function() {
-               return domManip( this, arguments, function( elem ) {
-                       if ( this.parentNode ) {
-                               this.parentNode.insertBefore( elem, this );
-                       }
-               } );
-       },
-
-       after: function() {
-               return domManip( this, arguments, function( elem ) {
-                       if ( this.parentNode ) {
-                               this.parentNode.insertBefore( elem, this.nextSibling );
-                       }
-               } );
-       },
-
-       empty: function() {
-               var elem,
-                       i = 0;
-
-               for ( ; ( elem = this[ i ] ) != null; i++ ) {
-                       if ( elem.nodeType === 1 ) {
-
-                               // Prevent memory leaks
-                               jQuery.cleanData( getAll( elem, false ) );
-
-                               // Remove any remaining nodes
-                               elem.textContent = "";
-                       }
-               }
-
-               return this;
-       },
-
-       clone: function( dataAndEvents, deepDataAndEvents ) {
-               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-               return this.map( function() {
-                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-               } );
-       },
-
-       html: function( value ) {
-               return access( this, function( value ) {
-                       var elem = this[ 0 ] || {},
-                               i = 0,
-                               l = this.length;
-
-                       if ( value === undefined && elem.nodeType === 1 ) {
-                               return elem.innerHTML;
-                       }
-
-                       // See if we can take a shortcut and just use innerHTML
-                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                               !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
-                               value = jQuery.htmlPrefilter( value );
-
-                               try {
-                                       for ( ; i < l; i++ ) {
-                                               elem = this[ i ] || {};
-
-                                               // Remove element nodes and prevent memory leaks
-                                               if ( elem.nodeType === 1 ) {
-                                                       jQuery.cleanData( getAll( elem, false ) );
-                                                       elem.innerHTML = value;
-                                               }
-                                       }
-
-                                       elem = 0;
-
-                               // If using innerHTML throws an exception, use the fallback method
-                               } catch ( e ) {}
-                       }
-
-                       if ( elem ) {
-                               this.empty().append( value );
-                       }
-               }, null, value, arguments.length );
-       },
-
-       replaceWith: function() {
-               var ignored = [];
-
-               // Make the changes, replacing each non-ignored context element with the new content
-               return domManip( this, arguments, function( elem ) {
-                       var parent = this.parentNode;
-
-                       if ( jQuery.inArray( this, ignored ) < 0 ) {
-                               jQuery.cleanData( getAll( this ) );
-                               if ( parent ) {
-                                       parent.replaceChild( elem, this );
-                               }
-                       }
-
-               // Force callback invocation
-               }, ignored );
-       }
-} );
-
-jQuery.each( {
-       appendTo: "append",
-       prependTo: "prepend",
-       insertBefore: "before",
-       insertAfter: "after",
-       replaceAll: "replaceWith"
-}, function( name, original ) {
-       jQuery.fn[ name ] = function( selector ) {
-               var elems,
-                       ret = [],
-                       insert = jQuery( selector ),
-                       last = insert.length - 1,
-                       i = 0;
-
-               for ( ; i <= last; i++ ) {
-                       elems = i === last ? this : this.clone( true );
-                       jQuery( insert[ i ] )[ original ]( elems );
-
-                       // Support: Android <=4.0 only, PhantomJS 1 only
-                       // .get() because push.apply(_, arraylike) throws on ancient WebKit
-                       push.apply( ret, elems.get() );
-               }
-
-               return this.pushStack( ret );
-       };
-} );
-var rmargin = ( /^margin/ );
-
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var getStyles = function( elem ) {
-
-               // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
-               // IE throws on elements created in popups
-               // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
-               var view = elem.ownerDocument.defaultView;
-
-               if ( !view || !view.opener ) {
-                       view = window;
-               }
-
-               return view.getComputedStyle( elem );
-       };
-
-
-
-( function() {
-
-       // Executing both pixelPosition & boxSizingReliable tests require only one layout
-       // so they're executed at the same time to save the second computation.
-       function computeStyleTests() {
-
-               // This is a singleton, we need to execute it only once
-               if ( !div ) {
-                       return;
-               }
-
-               div.style.cssText =
-                       "box-sizing:border-box;" +
-                       "position:relative;display:block;" +
-                       "margin:auto;border:1px;padding:1px;" +
-                       "top:1%;width:50%";
-               div.innerHTML = "";
-               documentElement.appendChild( container );
-
-               var divStyle = window.getComputedStyle( div );
-               pixelPositionVal = divStyle.top !== "1%";
-
-               // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
-               reliableMarginLeftVal = divStyle.marginLeft === "2px";
-               boxSizingReliableVal = divStyle.width === "4px";
-
-               // Support: Android 4.0 - 4.3 only
-               // Some styles come back with percentage values, even though they shouldn't
-               div.style.marginRight = "50%";
-               pixelMarginRightVal = divStyle.marginRight === "4px";
-
-               documentElement.removeChild( container );
-
-               // Nullify the div so it wouldn't be stored in the memory and
-               // it will also be a sign that checks already performed
-               div = null;
-       }
-
-       var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
-               container = document.createElement( "div" ),
-               div = document.createElement( "div" );
-
-       // Finish early in limited (non-browser) environments
-       if ( !div.style ) {
-               return;
-       }
-
-       // Support: IE <=9 - 11 only
-       // Style of cloned element affects source element cloned (#8908)
-       div.style.backgroundClip = "content-box";
-       div.cloneNode( true ).style.backgroundClip = "";
-       support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-       container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
-               "padding:0;margin-top:1px;position:absolute";
-       container.appendChild( div );
-
-       jQuery.extend( support, {
-               pixelPosition: function() {
-                       computeStyleTests();
-                       return pixelPositionVal;
-               },
-               boxSizingReliable: function() {
-                       computeStyleTests();
-                       return boxSizingReliableVal;
-               },
-               pixelMarginRight: function() {
-                       computeStyleTests();
-                       return pixelMarginRightVal;
-               },
-               reliableMarginLeft: function() {
-                       computeStyleTests();
-                       return reliableMarginLeftVal;
-               }
-       } );
-} )();
-
-
-function curCSS( elem, name, computed ) {
-       var width, minWidth, maxWidth, ret,
-
-               // Support: Firefox 51+
-               // Retrieving style before computed somehow
-               // fixes an issue with getting wrong values
-               // on detached elements
-               style = elem.style;
-
-       computed = computed || getStyles( elem );
-
-       // getPropertyValue is needed for:
-       //   .css('filter') (IE 9 only, #12537)
-       //   .css('--customProperty) (#3144)
-       if ( computed ) {
-               ret = computed.getPropertyValue( name ) || computed[ name ];
-
-               if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-                       ret = jQuery.style( elem, name );
-               }
-
-               // A tribute to the "awesome hack by Dean Edwards"
-               // Android Browser returns percentage for some values,
-               // but width seems to be reliably pixels.
-               // This is against the CSSOM draft spec:
-               // https://drafts.csswg.org/cssom/#resolved-values
-               if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
-                       // Remember the original values
-                       width = style.width;
-                       minWidth = style.minWidth;
-                       maxWidth = style.maxWidth;
-
-                       // Put in the new values to get a computed value out
-                       style.minWidth = style.maxWidth = style.width = ret;
-                       ret = computed.width;
-
-                       // Revert the changed values
-                       style.width = width;
-                       style.minWidth = minWidth;
-                       style.maxWidth = maxWidth;
-               }
-       }
-
-       return ret !== undefined ?
-
-               // Support: IE <=9 - 11 only
-               // IE returns zIndex value as an integer.
-               ret + "" :
-               ret;
-}
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
-       // Define the hook, we'll check on the first run if it's really needed.
-       return {
-               get: function() {
-                       if ( conditionFn() ) {
-
-                               // Hook not needed (or it's not possible to use it due
-                               // to missing dependency), remove it.
-                               delete this.get;
-                               return;
-                       }
-
-                       // Hook needed; redefine it so that the support test is not executed again.
-                       return ( this.get = hookFn ).apply( this, arguments );
-               }
-       };
-}
-
-
-var
-
-       // Swappable if display is none or starts with table
-       // except "table", "table-cell", or "table-caption"
-       // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-       rcustomProp = /^--/,
-       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-       cssNormalTransform = {
-               letterSpacing: "0",
-               fontWeight: "400"
-       },
-
-       cssPrefixes = [ "Webkit", "Moz", "ms" ],
-       emptyStyle = document.createElement( "div" ).style;
-
-// Return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( name ) {
-
-       // Shortcut for names that are not vendor prefixed
-       if ( name in emptyStyle ) {
-               return name;
-       }
-
-       // Check for vendor prefixed names
-       var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
-               i = cssPrefixes.length;
-
-       while ( i-- ) {
-               name = cssPrefixes[ i ] + capName;
-               if ( name in emptyStyle ) {
-                       return name;
-               }
-       }
-}
-
-// Return a property mapped along what jQuery.cssProps suggests or to
-// a vendor prefixed property.
-function finalPropName( name ) {
-       var ret = jQuery.cssProps[ name ];
-       if ( !ret ) {
-               ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
-       }
-       return ret;
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-
-       // Any relative (+/-) values have already been
-       // normalized at this point
-       var matches = rcssNum.exec( value );
-       return matches ?
-
-               // Guard against undefined "subtract", e.g., when used as in cssHooks
-               Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
-               value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
-       var i,
-               val = 0;
-
-       // If we already have the right measurement, avoid augmentation
-       if ( extra === ( isBorderBox ? "border" : "content" ) ) {
-               i = 4;
-
-       // Otherwise initialize for horizontal or vertical properties
-       } else {
-               i = name === "width" ? 1 : 0;
-       }
-
-       for ( ; i < 4; i += 2 ) {
-
-               // Both box models exclude margin, so add it if we want it
-               if ( extra === "margin" ) {
-                       val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
-               }
-
-               if ( isBorderBox ) {
-
-                       // border-box includes padding, so remove it if we want content
-                       if ( extra === "content" ) {
-                               val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-                       }
-
-                       // At this point, extra isn't border nor margin, so remove border
-                       if ( extra !== "margin" ) {
-                               val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-                       }
-               } else {
-
-                       // At this point, extra isn't content, so add padding
-                       val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-                       // At this point, extra isn't content nor padding, so add border
-                       if ( extra !== "padding" ) {
-                               val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-                       }
-               }
-       }
-
-       return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-       // Start with computed style
-       var valueIsBorderBox,
-               styles = getStyles( elem ),
-               val = curCSS( elem, name, styles ),
-               isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
-       // Computed unit is not pixels. Stop here and return.
-       if ( rnumnonpx.test( val ) ) {
-               return val;
-       }
-
-       // Check for style in case a browser which returns unreliable values
-       // for getComputedStyle silently falls back to the reliable elem.style
-       valueIsBorderBox = isBorderBox &&
-               ( support.boxSizingReliable() || val === elem.style[ name ] );
-
-       // Fall back to offsetWidth/Height when value is "auto"
-       // This happens for inline elements with no explicit setting (gh-3571)
-       if ( val === "auto" ) {
-               val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
-       }
-
-       // Normalize "", auto, and prepare for extra
-       val = parseFloat( val ) || 0;
-
-       // Use the active box-sizing model to add/subtract irrelevant styles
-       return ( val +
-               augmentWidthOrHeight(
-                       elem,
-                       name,
-                       extra || ( isBorderBox ? "border" : "content" ),
-                       valueIsBorderBox,
-                       styles
-               )
-       ) + "px";
-}
-
-jQuery.extend( {
-
-       // Add in style property hooks for overriding the default
-       // behavior of getting and setting a style property
-       cssHooks: {
-               opacity: {
-                       get: function( elem, computed ) {
-                               if ( computed ) {
-
-                                       // We should always get a number back from opacity
-                                       var ret = curCSS( elem, "opacity" );
-                                       return ret === "" ? "1" : ret;
-                               }
-                       }
-               }
-       },
-
-       // Don't automatically add "px" to these possibly-unitless properties
-       cssNumber: {
-               "animationIterationCount": true,
-               "columnCount": true,
-               "fillOpacity": true,
-               "flexGrow": true,
-               "flexShrink": true,
-               "fontWeight": true,
-               "lineHeight": true,
-               "opacity": true,
-               "order": true,
-               "orphans": true,
-               "widows": true,
-               "zIndex": true,
-               "zoom": true
-       },
-
-       // Add in properties whose names you wish to fix before
-       // setting or getting the value
-       cssProps: {
-               "float": "cssFloat"
-       },
-
-       // Get and set the style property on a DOM Node
-       style: function( elem, name, value, extra ) {
-
-               // Don't set styles on text and comment nodes
-               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-                       return;
-               }
-
-               // Make sure that we're working with the right name
-               var ret, type, hooks,
-                       origName = jQuery.camelCase( name ),
-                       isCustomProp = rcustomProp.test( name ),
-                       style = elem.style;
-
-               // Make sure that we're working with the right name. We don't
-               // want to query the value if it is a CSS custom property
-               // since they are user-defined.
-               if ( !isCustomProp ) {
-                       name = finalPropName( origName );
-               }
-
-               // Gets hook for the prefixed version, then unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-               // Check if we're setting a value
-               if ( value !== undefined ) {
-                       type = typeof value;
-
-                       // Convert "+=" or "-=" to relative numbers (#7345)
-                       if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
-                               value = adjustCSS( elem, name, ret );
-
-                               // Fixes bug #9237
-                               type = "number";
-                       }
-
-                       // Make sure that null and NaN values aren't set (#7116)
-                       if ( value == null || value !== value ) {
-                               return;
-                       }
-
-                       // If a number was passed in, add the unit (except for certain CSS properties)
-                       if ( type === "number" ) {
-                               value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
-                       }
-
-                       // background-* props affect original clone's values
-                       if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
-                               style[ name ] = "inherit";
-                       }
-
-                       // If a hook was provided, use that value, otherwise just set the specified value
-                       if ( !hooks || !( "set" in hooks ) ||
-                               ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
-                               if ( isCustomProp ) {
-                                       style.setProperty( name, value );
-                               } else {
-                                       style[ name ] = value;
-                               }
-                       }
-
-               } else {
-
-                       // If a hook was provided get the non-computed value from there
-                       if ( hooks && "get" in hooks &&
-                               ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
-                               return ret;
-                       }
-
-                       // Otherwise just get the value from the style object
-                       return style[ name ];
-               }
-       },
-
-       css: function( elem, name, extra, styles ) {
-               var val, num, hooks,
-                       origName = jQuery.camelCase( name ),
-                       isCustomProp = rcustomProp.test( name );
-
-               // Make sure that we're working with the right name. We don't
-               // want to modify the value if it is a CSS custom property
-               // since they are user-defined.
-               if ( !isCustomProp ) {
-                       name = finalPropName( origName );
-               }
-
-               // Try prefixed name followed by the unprefixed name
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-               // If a hook was provided get the computed value from there
-               if ( hooks && "get" in hooks ) {
-                       val = hooks.get( elem, true, extra );
-               }
-
-               // Otherwise, if a way to get the computed value exists, use that
-               if ( val === undefined ) {
-                       val = curCSS( elem, name, styles );
-               }
-
-               // Convert "normal" to computed value
-               if ( val === "normal" && name in cssNormalTransform ) {
-                       val = cssNormalTransform[ name ];
-               }
-
-               // Make numeric if forced or a qualifier was provided and val looks numeric
-               if ( extra === "" || extra ) {
-                       num = parseFloat( val );
-                       return extra === true || isFinite( num ) ? num || 0 : val;
-               }
-
-               return val;
-       }
-} );
-
-jQuery.each( [ "height", "width" ], function( i, name ) {
-       jQuery.cssHooks[ name ] = {
-               get: function( elem, computed, extra ) {
-                       if ( computed ) {
-
-                               // Certain elements can have dimension info if we invisibly show them
-                               // but it must have a current display style that would benefit
-                               return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
-
-                                       // Support: Safari 8+
-                                       // Table columns in Safari have non-zero offsetWidth & zero
-                                       // getBoundingClientRect().width unless display is changed.
-                                       // Support: IE <=11 only
-                                       // Running getBoundingClientRect on a disconnected node
-                                       // in IE throws an error.
-                                       ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
-                                               swap( elem, cssShow, function() {
-                                                       return getWidthOrHeight( elem, name, extra );
-                                               } ) :
-                                               getWidthOrHeight( elem, name, extra );
-                       }
-               },
-
-               set: function( elem, value, extra ) {
-                       var matches,
-                               styles = extra && getStyles( elem ),
-                               subtract = extra && augmentWidthOrHeight(
-                                       elem,
-                                       name,
-                                       extra,
-                                       jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-                                       styles
-                               );
-
-                       // Convert to pixels if value adjustment is needed
-                       if ( subtract && ( matches = rcssNum.exec( value ) ) &&
-                               ( matches[ 3 ] || "px" ) !== "px" ) {
-
-                               elem.style[ name ] = value;
-                               value = jQuery.css( elem, name );
-                       }
-
-                       return setPositiveNumber( elem, value, subtract );
-               }
-       };
-} );
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
-       function( elem, computed ) {
-               if ( computed ) {
-                       return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
-                               elem.getBoundingClientRect().left -
-                                       swap( elem, { marginLeft: 0 }, function() {
-                                               return elem.getBoundingClientRect().left;
-                                       } )
-                               ) + "px";
-               }
-       }
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
-       margin: "",
-       padding: "",
-       border: "Width"
-}, function( prefix, suffix ) {
-       jQuery.cssHooks[ prefix + suffix ] = {
-               expand: function( value ) {
-                       var i = 0,
-                               expanded = {},
-
-                               // Assumes a single number if not a string
-                               parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
-                       for ( ; i < 4; i++ ) {
-                               expanded[ prefix + cssExpand[ i ] + suffix ] =
-                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-                       }
-
-                       return expanded;
-               }
-       };
-
-       if ( !rmargin.test( prefix ) ) {
-               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-       }
-} );
-
-jQuery.fn.extend( {
-       css: function( name, value ) {
-               return access( this, function( elem, name, value ) {
-                       var styles, len,
-                               map = {},
-                               i = 0;
-
-                       if ( Array.isArray( name ) ) {
-                               styles = getStyles( elem );
-                               len = name.length;
-
-                               for ( ; i < len; i++ ) {
-                                       map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-                               }
-
-                               return map;
-                       }
-
-                       return value !== undefined ?
-                               jQuery.style( elem, name, value ) :
-                               jQuery.css( elem, name );
-               }, name, value, arguments.length > 1 );
-       }
-} );
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
-       time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-       type = type || "fx";
-
-       return this.queue( type, function( next, hooks ) {
-               var timeout = window.setTimeout( next, time );
-               hooks.stop = function() {
-                       window.clearTimeout( timeout );
-               };
-       } );
-};
-
-
-( function() {
-       var input = document.createElement( "input" ),
-               select = document.createElement( "select" ),
-               opt = select.appendChild( document.createElement( "option" ) );
-
-       input.type = "checkbox";
-
-       // Support: Android <=4.3 only
-       // Default value for a checkbox should be "on"
-       support.checkOn = input.value !== "";
-
-       // Support: IE <=11 only
-       // Must access selectedIndex to make default options select
-       support.optSelected = opt.selected;
-
-       // Support: IE <=11 only
-       // An input loses its value after becoming a radio
-       input = document.createElement( "input" );
-       input.value = "t";
-       input.type = "radio";
-       support.radioValue = input.value === "t";
-} )();
-
-
-var boolHook,
-       attrHandle = jQuery.expr.attrHandle;
-
-jQuery.fn.extend( {
-       attr: function( name, value ) {
-               return access( this, jQuery.attr, name, value, arguments.length > 1 );
-       },
-
-       removeAttr: function( name ) {
-               return this.each( function() {
-                       jQuery.removeAttr( this, name );
-               } );
-       }
-} );
-
-jQuery.extend( {
-       attr: function( elem, name, value ) {
-               var ret, hooks,
-                       nType = elem.nodeType;
-
-               // Don't get/set attributes on text, comment and attribute nodes
-               if ( nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
-               }
-
-               // Fallback to prop when attributes are not supported
-               if ( typeof elem.getAttribute === "undefined" ) {
-                       return jQuery.prop( elem, name, value );
-               }
-
-               // Attribute hooks are determined by the lowercase version
-               // Grab necessary hook if one is defined
-               if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-                       hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
-                               ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
-               }
-
-               if ( value !== undefined ) {
-                       if ( value === null ) {
-                               jQuery.removeAttr( elem, name );
-                               return;
-                       }
-
-                       if ( hooks && "set" in hooks &&
-                               ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-                               return ret;
-                       }
-
-                       elem.setAttribute( name, value + "" );
-                       return value;
-               }
-
-               if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-                       return ret;
-               }
-
-               ret = jQuery.find.attr( elem, name );
-
-               // Non-existent attributes return null, we normalize to undefined
-               return ret == null ? undefined : ret;
-       },
-
-       attrHooks: {
-               type: {
-                       set: function( elem, value ) {
-                               if ( !support.radioValue && value === "radio" &&
-                                       nodeName( elem, "input" ) ) {
-                                       var val = elem.value;
-                                       elem.setAttribute( "type", value );
-                                       if ( val ) {
-                                               elem.value = val;
-                                       }
-                                       return value;
-                               }
-                       }
-               }
-       },
-
-       removeAttr: function( elem, value ) {
-               var name,
-                       i = 0,
-
-                       // Attribute names can contain non-HTML whitespace characters
-                       // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
-                       attrNames = value && value.match( rnothtmlwhite );
-
-               if ( attrNames && elem.nodeType === 1 ) {
-                       while ( ( name = attrNames[ i++ ] ) ) {
-                               elem.removeAttribute( name );
-                       }
-               }
-       }
-} );
-
-// Hooks for boolean attributes
-boolHook = {
-       set: function( elem, value, name ) {
-               if ( value === false ) {
-
-                       // Remove boolean attributes when set to false
-                       jQuery.removeAttr( elem, name );
-               } else {
-                       elem.setAttribute( name, name );
-               }
-               return name;
-       }
-};
-
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-       var getter = attrHandle[ name ] || jQuery.find.attr;
-
-       attrHandle[ name ] = function( elem, name, isXML ) {
-               var ret, handle,
-                       lowercaseName = name.toLowerCase();
-
-               if ( !isXML ) {
-
-                       // Avoid an infinite loop by temporarily removing this function from the getter
-                       handle = attrHandle[ lowercaseName ];
-                       attrHandle[ lowercaseName ] = ret;
-                       ret = getter( elem, name, isXML ) != null ?
-                               lowercaseName :
-                               null;
-                       attrHandle[ lowercaseName ] = handle;
-               }
-               return ret;
-       };
-} );
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button)$/i,
-       rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
-       prop: function( name, value ) {
-               return access( this, jQuery.prop, name, value, arguments.length > 1 );
-       },
-
-       removeProp: function( name ) {
-               return this.each( function() {
-                       delete this[ jQuery.propFix[ name ] || name ];
-               } );
-       }
-} );
-
-jQuery.extend( {
-       prop: function( elem, name, value ) {
-               var ret, hooks,
-                       nType = elem.nodeType;
-
-               // Don't get/set properties on text, comment and attribute nodes
-               if ( nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
-               }
-
-               if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
-                       // Fix name and attach hooks
-                       name = jQuery.propFix[ name ] || name;
-                       hooks = jQuery.propHooks[ name ];
-               }
-
-               if ( value !== undefined ) {
-                       if ( hooks && "set" in hooks &&
-                               ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-                               return ret;
-                       }
-
-                       return ( elem[ name ] = value );
-               }
-
-               if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-                       return ret;
-               }
-
-               return elem[ name ];
-       },
-
-       propHooks: {
-               tabIndex: {
-                       get: function( elem ) {
-
-                               // Support: IE <=9 - 11 only
-                               // elem.tabIndex doesn't always return the
-                               // correct value when it hasn't been explicitly set
-                               // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-                               // Use proper attribute retrieval(#12072)
-                               var tabindex = jQuery.find.attr( elem, "tabindex" );
-
-                               if ( tabindex ) {
-                                       return parseInt( tabindex, 10 );
-                               }
-
-                               if (
-                                       rfocusable.test( elem.nodeName ) ||
-                                       rclickable.test( elem.nodeName ) &&
-                                       elem.href
-                               ) {
-                                       return 0;
-                               }
-
-                               return -1;
-                       }
-               }
-       },
-
-       propFix: {
-               "for": "htmlFor",
-               "class": "className"
-       }
-} );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-// eslint rule "no-unused-expressions" is disabled for this code
-// since it considers such accessions noop
-if ( !support.optSelected ) {
-       jQuery.propHooks.selected = {
-               get: function( elem ) {
-
-                       /* eslint no-unused-expressions: "off" */
-
-                       var parent = elem.parentNode;
-                       if ( parent && parent.parentNode ) {
-                               parent.parentNode.selectedIndex;
-                       }
-                       return null;
-               },
-               set: function( elem ) {
-
-                       /* eslint no-unused-expressions: "off" */
-
-                       var parent = elem.parentNode;
-                       if ( parent ) {
-                               parent.selectedIndex;
-
-                               if ( parent.parentNode ) {
-                                       parent.parentNode.selectedIndex;
-                               }
-                       }
-               }
-       };
-}
-
-jQuery.each( [
-       "tabIndex",
-       "readOnly",
-       "maxLength",
-       "cellSpacing",
-       "cellPadding",
-       "rowSpan",
-       "colSpan",
-       "useMap",
-       "frameBorder",
-       "contentEditable"
-], function() {
-       jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-
-
-
-       // Strip and collapse whitespace according to HTML spec
-       // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
-       function stripAndCollapse( value ) {
-               var tokens = value.match( rnothtmlwhite ) || [];
-               return tokens.join( " " );
-       }
-
-
-function getClass( elem ) {
-       return elem.getAttribute && elem.getAttribute( "class" ) || "";
-}
-
-jQuery.fn.extend( {
-       addClass: function( value ) {
-               var classes, elem, cur, curValue, clazz, j, finalValue,
-                       i = 0;
-
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each( function( j ) {
-                               jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
-                       } );
-               }
-
-               if ( typeof value === "string" && value ) {
-                       classes = value.match( rnothtmlwhite ) || [];
-
-                       while ( ( elem = this[ i++ ] ) ) {
-                               curValue = getClass( elem );
-                               cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
-                               if ( cur ) {
-                                       j = 0;
-                                       while ( ( clazz = classes[ j++ ] ) ) {
-                                               if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-                                                       cur += clazz + " ";
-                                               }
-                                       }
-
-                                       // Only assign if different to avoid unneeded rendering.
-                                       finalValue = stripAndCollapse( cur );
-                                       if ( curValue !== finalValue ) {
-                                               elem.setAttribute( "class", finalValue );
-                                       }
-                               }
-                       }
-               }
-
-               return this;
-       },
-
-       removeClass: function( value ) {
-               var classes, elem, cur, curValue, clazz, j, finalValue,
-                       i = 0;
-
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each( function( j ) {
-                               jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
-                       } );
-               }
-
-               if ( !arguments.length ) {
-                       return this.attr( "class", "" );
-               }
-
-               if ( typeof value === "string" && value ) {
-                       classes = value.match( rnothtmlwhite ) || [];
-
-                       while ( ( elem = this[ i++ ] ) ) {
-                               curValue = getClass( elem );
-
-                               // This expression is here for better compressibility (see addClass)
-                               cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
-                               if ( cur ) {
-                                       j = 0;
-                                       while ( ( clazz = classes[ j++ ] ) ) {
-
-                                               // Remove *all* instances
-                                               while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
-                                                       cur = cur.replace( " " + clazz + " ", " " );
-                                               }
-                                       }
-
-                                       // Only assign if different to avoid unneeded rendering.
-                                       finalValue = stripAndCollapse( cur );
-                                       if ( curValue !== finalValue ) {
-                                               elem.setAttribute( "class", finalValue );
-                                       }
-                               }
-                       }
-               }
-
-               return this;
-       },
-
-       toggleClass: function( value, stateVal ) {
-               var type = typeof value;
-
-               if ( typeof stateVal === "boolean" && type === "string" ) {
-                       return stateVal ? this.addClass( value ) : this.removeClass( value );
-               }
-
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each( function( i ) {
-                               jQuery( this ).toggleClass(
-                                       value.call( this, i, getClass( this ), stateVal ),
-                                       stateVal
-                               );
-                       } );
-               }
-
-               return this.each( function() {
-                       var className, i, self, classNames;
-
-                       if ( type === "string" ) {
-
-                               // Toggle individual class names
-                               i = 0;
-                               self = jQuery( this );
-                               classNames = value.match( rnothtmlwhite ) || [];
-
-                               while ( ( className = classNames[ i++ ] ) ) {
-
-                                       // Check each className given, space separated list
-                                       if ( self.hasClass( className ) ) {
-                                               self.removeClass( className );
-                                       } else {
-                                               self.addClass( className );
-                                       }
-                               }
-
-                       // Toggle whole class name
-                       } else if ( value === undefined || type === "boolean" ) {
-                               className = getClass( this );
-                               if ( className ) {
-
-                                       // Store className if set
-                                       dataPriv.set( this, "__className__", className );
-                               }
-
-                               // If the element has a class name or if we're passed `false`,
-                               // then remove the whole classname (if there was one, the above saved it).
-                               // Otherwise bring back whatever was previously saved (if anything),
-                               // falling back to the empty string if nothing was stored.
-                               if ( this.setAttribute ) {
-                                       this.setAttribute( "class",
-                                               className || value === false ?
-                                               "" :
-                                               dataPriv.get( this, "__className__" ) || ""
-                                       );
-                               }
-                       }
-               } );
-       },
-
-       hasClass: function( selector ) {
-               var className, elem,
-                       i = 0;
-
-               className = " " + selector + " ";
-               while ( ( elem = this[ i++ ] ) ) {
-                       if ( elem.nodeType === 1 &&
-                               ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
-                                       return true;
-                       }
-               }
-
-               return false;
-       }
-} );
-
-
-
-
-var rreturn = /\r/g;
-
-jQuery.fn.extend( {
-       val: function( value ) {
-               var hooks, ret, isFunction,
-                       elem = this[ 0 ];
-
-               if ( !arguments.length ) {
-                       if ( elem ) {
-                               hooks = jQuery.valHooks[ elem.type ] ||
-                                       jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-                               if ( hooks &&
-                                       "get" in hooks &&
-                                       ( ret = hooks.get( elem, "value" ) ) !== undefined
-                               ) {
-                                       return ret;
-                               }
-
-                               ret = elem.value;
-
-                               // Handle most common string cases
-                               if ( typeof ret === "string" ) {
-                                       return ret.replace( rreturn, "" );
-                               }
-
-                               // Handle cases where value is null/undef or number
-                               return ret == null ? "" : ret;
-                       }
-
-                       return;
-               }
-
-               isFunction = jQuery.isFunction( value );
-
-               return this.each( function( i ) {
-                       var val;
-
-                       if ( this.nodeType !== 1 ) {
-                               return;
-                       }
-
-                       if ( isFunction ) {
-                               val = value.call( this, i, jQuery( this ).val() );
-                       } else {
-                               val = value;
-                       }
-
-                       // Treat null/undefined as ""; convert numbers to string
-                       if ( val == null ) {
-                               val = "";
-
-                       } else if ( typeof val === "number" ) {
-                               val += "";
-
-                       } else if ( Array.isArray( val ) ) {
-                               val = jQuery.map( val, function( value ) {
-                                       return value == null ? "" : value + "";
-                               } );
-                       }
-
-                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-                       // If set returns undefined, fall back to normal setting
-                       if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
-                               this.value = val;
-                       }
-               } );
-       }
-} );
-
-jQuery.extend( {
-       valHooks: {
-               option: {
-                       get: function( elem ) {
-
-                               var val = jQuery.find.attr( elem, "value" );
-                               return val != null ?
-                                       val :
-
-                                       // Support: IE <=10 - 11 only
-                                       // option.text throws exceptions (#14686, #14858)
-                                       // Strip and collapse whitespace
-                                       // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
-                                       stripAndCollapse( jQuery.text( elem ) );
-                       }
-               },
-               select: {
-                       get: function( elem ) {
-                               var value, option, i,
-                                       options = elem.options,
-                                       index = elem.selectedIndex,
-                                       one = elem.type === "select-one",
-                                       values = one ? null : [],
-                                       max = one ? index + 1 : options.length;
-
-                               if ( index < 0 ) {
-                                       i = max;
-
-                               } else {
-                                       i = one ? index : 0;
-                               }
-
-                               // Loop through all the selected options
-                               for ( ; i < max; i++ ) {
-                                       option = options[ i ];
-
-                                       // Support: IE <=9 only
-                                       // IE8-9 doesn't update selected after form reset (#2551)
-                                       if ( ( option.selected || i === index ) &&
-
-                                                       // Don't return options that are disabled or in a disabled optgroup
-                                                       !option.disabled &&
-                                                       ( !option.parentNode.disabled ||
-                                                               !nodeName( option.parentNode, "optgroup" ) ) ) {
-
-                                               // Get the specific value for the option
-                                               value = jQuery( option ).val();
-
-                                               // We don't need an array for one selects
-                                               if ( one ) {
-                                                       return value;
-                                               }
-
-                                               // Multi-Selects return an array
-                                               values.push( value );
-                                       }
-                               }
-
-                               return values;
-                       },
-
-                       set: function( elem, value ) {
-                               var optionSet, option,
-                                       options = elem.options,
-                                       values = jQuery.makeArray( value ),
-                                       i = options.length;
-
-                               while ( i-- ) {
-                                       option = options[ i ];
-
-                                       /* eslint-disable no-cond-assign */
-
-                                       if ( option.selected =
-                                               jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
-                                       ) {
-                                               optionSet = true;
-                                       }
-
-                                       /* eslint-enable no-cond-assign */
-                               }
-
-                               // Force browsers to behave consistently when non-matching value is set
-                               if ( !optionSet ) {
-                                       elem.selectedIndex = -1;
-                               }
-                               return values;
-                       }
-               }
-       }
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
-       jQuery.valHooks[ this ] = {
-               set: function( elem, value ) {
-                       if ( Array.isArray( value ) ) {
-                               return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
-                       }
-               }
-       };
-       if ( !support.checkOn ) {
-               jQuery.valHooks[ this ].get = function( elem ) {
-                       return elem.getAttribute( "value" ) === null ? "on" : elem.value;
-               };
-       }
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
-
-jQuery.extend( jQuery.event, {
-
-       trigger: function( event, data, elem, onlyHandlers ) {
-
-               var i, cur, tmp, bubbleType, ontype, handle, special,
-                       eventPath = [ elem || document ],
-                       type = hasOwn.call( event, "type" ) ? event.type : event,
-                       namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
-               cur = tmp = elem = elem || document;
-
-               // Don't do events on text and comment nodes
-               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-                       return;
-               }
-
-               // focus/blur morphs to focusin/out; ensure we're not firing them right now
-               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-                       return;
-               }
-
-               if ( type.indexOf( "." ) > -1 ) {
-
-                       // Namespaced trigger; create a regexp to match event type in handle()
-                       namespaces = type.split( "." );
-                       type = namespaces.shift();
-                       namespaces.sort();
-               }
-               ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
-               // Caller can pass in a jQuery.Event object, Object, or just an event type string
-               event = event[ jQuery.expando ] ?
-                       event :
-                       new jQuery.Event( type, typeof event === "object" && event );
-
-               // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
-               event.isTrigger = onlyHandlers ? 2 : 3;
-               event.namespace = namespaces.join( "." );
-               event.rnamespace = event.namespace ?
-                       new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
-                       null;
-
-               // Clean up the event in case it is being reused
-               event.result = undefined;
-               if ( !event.target ) {
-                       event.target = elem;
-               }
-
-               // Clone any incoming data and prepend the event, creating the handler arg list
-               data = data == null ?
-                       [ event ] :
-                       jQuery.makeArray( data, [ event ] );
-
-               // Allow special events to draw outside the lines
-               special = jQuery.event.special[ type ] || {};
-               if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-                       return;
-               }
-
-               // Determine event propagation path in advance, per W3C events spec (#9951)
-               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-                       bubbleType = special.delegateType || type;
-                       if ( !rfocusMorph.test( bubbleType + type ) ) {
-                               cur = cur.parentNode;
-                       }
-                       for ( ; cur; cur = cur.parentNode ) {
-                               eventPath.push( cur );
-                               tmp = cur;
-                       }
-
-                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
-                       if ( tmp === ( elem.ownerDocument || document ) ) {
-                               eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-                       }
-               }
-
-               // Fire handlers on the event path
-               i = 0;
-               while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-
-                       event.type = i > 1 ?
-                               bubbleType :
-                               special.bindType || type;
-
-                       // jQuery handler
-                       handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
-                               dataPriv.get( cur, "handle" );
-                       if ( handle ) {
-                               handle.apply( cur, data );
-                       }
-
-                       // Native handler
-                       handle = ontype && cur[ ontype ];
-                       if ( handle && handle.apply && acceptData( cur ) ) {
-                               event.result = handle.apply( cur, data );
-                               if ( event.result === false ) {
-                                       event.preventDefault();
-                               }
-                       }
-               }
-               event.type = type;
-
-               // If nobody prevented the default action, do it now
-               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-                       if ( ( !special._default ||
-                               special._default.apply( eventPath.pop(), data ) === false ) &&
-                               acceptData( elem ) ) {
-
-                               // Call a native DOM method on the target with the same name as the event.
-                               // Don't do default actions on window, that's where global variables be (#6170)
-                               if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
-
-                                       // Don't re-trigger an onFOO event when we call its FOO() method
-                                       tmp = elem[ ontype ];
-
-                                       if ( tmp ) {
-                                               elem[ ontype ] = null;
-                                       }
-
-                                       // Prevent re-triggering of the same event, since we already bubbled it above
-                                       jQuery.event.triggered = type;
-                                       elem[ type ]();
-                                       jQuery.event.triggered = undefined;
-
-                                       if ( tmp ) {
-                                               elem[ ontype ] = tmp;
-                                       }
-                               }
-                       }
-               }
-
-               return event.result;
-       },
-
-       // Piggyback on a donor event to simulate a different one
-       // Used only for `focus(in | out)` events
-       simulate: function( type, elem, event ) {
-               var e = jQuery.extend(
-                       new jQuery.Event(),
-                       event,
-                       {
-                               type: type,
-                               isSimulated: true
-                       }
-               );
-
-               jQuery.event.trigger( e, null, elem );
-       }
-
-} );
-
-jQuery.fn.extend( {
-
-       trigger: function( type, data ) {
-               return this.each( function() {
-                       jQuery.event.trigger( type, data, this );
-               } );
-       },
-       triggerHandler: function( type, data ) {
-               var elem = this[ 0 ];
-               if ( elem ) {
-                       return jQuery.event.trigger( type, data, elem, true );
-               }
-       }
-} );
-
-
-jQuery.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( i, name ) {
-
-       // Handle event binding
-       jQuery.fn[ name ] = function( data, fn ) {
-               return arguments.length > 0 ?
-                       this.on( name, null, data, fn ) :
-                       this.trigger( name );
-       };
-} );
-
-jQuery.fn.extend( {
-       hover: function( fnOver, fnOut ) {
-               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-       }
-} );
-
-
-
-
-support.focusin = "onfocusin" in window;
-
-
-// Support: Firefox <=44
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
-       jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-               // Attach a single capturing handler on the document while someone wants focusin/focusout
-               var handler = function( event ) {
-                       jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
-               };
-
-               jQuery.event.special[ fix ] = {
-                       setup: function() {
-                               var doc = this.ownerDocument || this,
-                                       attaches = dataPriv.access( doc, fix );
-
-                               if ( !attaches ) {
-                                       doc.addEventListener( orig, handler, true );
-                               }
-                               dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
-                       },
-                       teardown: function() {
-                               var doc = this.ownerDocument || this,
-                                       attaches = dataPriv.access( doc, fix ) - 1;
-
-                               if ( !attaches ) {
-                                       doc.removeEventListener( orig, handler, true );
-                                       dataPriv.remove( doc, fix );
-
-                               } else {
-                                       dataPriv.access( doc, fix, attaches );
-                               }
-                       }
-               };
-       } );
-}
-
-
-var
-       rbracket = /\[\]$/,
-       rCRLF = /\r?\n/g,
-       rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-       rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
-       var name;
-
-       if ( Array.isArray( obj ) ) {
-
-               // Serialize array item.
-               jQuery.each( obj, function( i, v ) {
-                       if ( traditional || rbracket.test( prefix ) ) {
-
-                               // Treat each array item as a scalar.
-                               add( prefix, v );
-
-                       } else {
-
-                               // Item is non-scalar (array or object), encode its numeric index.
-                               buildParams(
-                                       prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
-                                       v,
-                                       traditional,
-                                       add
-                               );
-                       }
-               } );
-
-       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-
-               // Serialize object item.
-               for ( name in obj ) {
-                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-               }
-
-       } else {
-
-               // Serialize scalar item.
-               add( prefix, obj );
-       }
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
-       var prefix,
-               s = [],
-               add = function( key, valueOrFunction ) {
-
-                       // If value is a function, invoke it and use its return value
-                       var value = jQuery.isFunction( valueOrFunction ) ?
-                               valueOrFunction() :
-                               valueOrFunction;
-
-                       s[ s.length ] = encodeURIComponent( key ) + "=" +
-                               encodeURIComponent( value == null ? "" : value );
-               };
-
-       // If an array was passed in, assume that it is an array of form elements.
-       if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
-               // Serialize the form elements
-               jQuery.each( a, function() {
-                       add( this.name, this.value );
-               } );
-
-       } else {
-
-               // If traditional, encode the "old" way (the way 1.3.2 or older
-               // did it), otherwise encode params recursively.
-               for ( prefix in a ) {
-                       buildParams( prefix, a[ prefix ], traditional, add );
-               }
-       }
-
-       // Return the resulting serialization
-       return s.join( "&" );
-};
-
-jQuery.fn.extend( {
-       serialize: function() {
-               return jQuery.param( this.serializeArray() );
-       },
-       serializeArray: function() {
-               return this.map( function() {
-
-                       // Can add propHook for "elements" to filter or add form elements
-                       var elements = jQuery.prop( this, "elements" );
-                       return elements ? jQuery.makeArray( elements ) : this;
-               } )
-               .filter( function() {
-                       var type = this.type;
-
-                       // Use .is( ":disabled" ) so that fieldset[disabled] works
-                       return this.name && !jQuery( this ).is( ":disabled" ) &&
-                               rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-                               ( this.checked || !rcheckableType.test( type ) );
-               } )
-               .map( function( i, elem ) {
-                       var val = jQuery( this ).val();
-
-                       if ( val == null ) {
-                               return null;
-                       }
-
-                       if ( Array.isArray( val ) ) {
-                               return jQuery.map( val, function( val ) {
-                                       return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                               } );
-                       }
-
-                       return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-               } ).get();
-       }
-} );
-
-
-jQuery.fn.extend( {
-       wrapAll: function( html ) {
-               var wrap;
-
-               if ( this[ 0 ] ) {
-                       if ( jQuery.isFunction( html ) ) {
-                               html = html.call( this[ 0 ] );
-                       }
-
-                       // The elements to wrap the target around
-                       wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
-                       if ( this[ 0 ].parentNode ) {
-                               wrap.insertBefore( this[ 0 ] );
-                       }
-
-                       wrap.map( function() {
-                               var elem = this;
-
-                               while ( elem.firstElementChild ) {
-                                       elem = elem.firstElementChild;
-                               }
-
-                               return elem;
-                       } ).append( this );
-               }
-
-               return this;
-       },
-
-       wrapInner: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each( function( i ) {
-                               jQuery( this ).wrapInner( html.call( this, i ) );
-                       } );
-               }
-
-               return this.each( function() {
-                       var self = jQuery( this ),
-                               contents = self.contents();
-
-                       if ( contents.length ) {
-                               contents.wrapAll( html );
-
-                       } else {
-                               self.append( html );
-                       }
-               } );
-       },
-
-       wrap: function( html ) {
-               var isFunction = jQuery.isFunction( html );
-
-               return this.each( function( i ) {
-                       jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
-               } );
-       },
-
-       unwrap: function( selector ) {
-               this.parent( selector ).not( "body" ).each( function() {
-                       jQuery( this ).replaceWith( this.childNodes );
-               } );
-               return this;
-       }
-} );
-
-
-jQuery.expr.pseudos.hidden = function( elem ) {
-       return !jQuery.expr.pseudos.visible( elem );
-};
-jQuery.expr.pseudos.visible = function( elem ) {
-       return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
-};
-
-
-
-
-// Support: Safari 8 only
-// In Safari 8 documents created via document.implementation.createHTMLDocument
-// collapse sibling forms: the second one becomes a child of the first one.
-// Because of that, this security measure has to be disabled in Safari 8.
-// https://bugs.webkit.org/show_bug.cgi?id=137337
-support.createHTMLDocument = ( function() {
-       var body = document.implementation.createHTMLDocument( "" ).body;
-       body.innerHTML = "<form></form><form></form>";
-       return body.childNodes.length === 2;
-} )();
-
-
-// Argument "data" should be string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
-       if ( typeof data !== "string" ) {
-               return [];
-       }
-       if ( typeof context === "boolean" ) {
-               keepScripts = context;
-               context = false;
-       }
-
-       var base, parsed, scripts;
-
-       if ( !context ) {
-
-               // Stop scripts or inline event handlers from being executed immediately
-               // by using document.implementation
-               if ( support.createHTMLDocument ) {
-                       context = document.implementation.createHTMLDocument( "" );
-
-                       // Set the base href for the created document
-                       // so any parsed elements with URLs
-                       // are based on the document's URL (gh-2965)
-                       base = context.createElement( "base" );
-                       base.href = document.location.href;
-                       context.head.appendChild( base );
-               } else {
-                       context = document;
-               }
-       }
-
-       parsed = rsingleTag.exec( data );
-       scripts = !keepScripts && [];
-
-       // Single tag
-       if ( parsed ) {
-               return [ context.createElement( parsed[ 1 ] ) ];
-       }
-
-       parsed = buildFragment( [ data ], context, scripts );
-
-       if ( scripts && scripts.length ) {
-               jQuery( scripts ).remove();
-       }
-
-       return jQuery.merge( [], parsed.childNodes );
-};
-
-
-jQuery.offset = {
-       setOffset: function( elem, options, i ) {
-               var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
-                       position = jQuery.css( elem, "position" ),
-                       curElem = jQuery( elem ),
-                       props = {};
-
-               // Set position first, in-case top/left are set even on static elem
-               if ( position === "static" ) {
-                       elem.style.position = "relative";
-               }
-
-               curOffset = curElem.offset();
-               curCSSTop = jQuery.css( elem, "top" );
-               curCSSLeft = jQuery.css( elem, "left" );
-               calculatePosition = ( position === "absolute" || position === "fixed" ) &&
-                       ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
-               // Need to be able to calculate position if either
-               // top or left is auto and position is either absolute or fixed
-               if ( calculatePosition ) {
-                       curPosition = curElem.position();
-                       curTop = curPosition.top;
-                       curLeft = curPosition.left;
-
-               } else {
-                       curTop = parseFloat( curCSSTop ) || 0;
-                       curLeft = parseFloat( curCSSLeft ) || 0;
-               }
-
-               if ( jQuery.isFunction( options ) ) {
-
-                       // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
-                       options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
-               }
-
-               if ( options.top != null ) {
-                       props.top = ( options.top - curOffset.top ) + curTop;
-               }
-               if ( options.left != null ) {
-                       props.left = ( options.left - curOffset.left ) + curLeft;
-               }
-
-               if ( "using" in options ) {
-                       options.using.call( elem, props );
-
-               } else {
-                       curElem.css( props );
-               }
-       }
-};
-
-jQuery.fn.extend( {
-       offset: function( options ) {
-
-               // Preserve chaining for setter
-               if ( arguments.length ) {
-                       return options === undefined ?
-                               this :
-                               this.each( function( i ) {
-                                       jQuery.offset.setOffset( this, options, i );
-                               } );
-               }
-
-               var doc, docElem, rect, win,
-                       elem = this[ 0 ];
-
-               if ( !elem ) {
-                       return;
-               }
-
-               // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
-               // Support: IE <=11 only
-               // Running getBoundingClientRect on a
-               // disconnected node in IE throws an error
-               if ( !elem.getClientRects().length ) {
-                       return { top: 0, left: 0 };
-               }
-
-               rect = elem.getBoundingClientRect();
-
-               doc = elem.ownerDocument;
-               docElem = doc.documentElement;
-               win = doc.defaultView;
-
-               return {
-                       top: rect.top + win.pageYOffset - docElem.clientTop,
-                       left: rect.left + win.pageXOffset - docElem.clientLeft
-               };
-       },
-
-       position: function() {
-               if ( !this[ 0 ] ) {
-                       return;
-               }
-
-               var offsetParent, offset,
-                       elem = this[ 0 ],
-                       parentOffset = { top: 0, left: 0 };
-
-               // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
-               // because it is its only offset parent
-               if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
-                       // Assume getBoundingClientRect is there when computed position is fixed
-                       offset = elem.getBoundingClientRect();
-
-               } else {
-
-                       // Get *real* offsetParent
-                       offsetParent = this.offsetParent();
-
-                       // Get correct offsets
-                       offset = this.offset();
-                       if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
-                               parentOffset = offsetParent.offset();
-                       }
-
-                       // Add offsetParent borders
-                       parentOffset = {
-                               top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
-                               left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
-                       };
-               }
-
-               // Subtract parent offsets and element margins
-               return {
-                       top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
-               };
-       },
-
-       // This method will return documentElement in the following cases:
-       // 1) For the element inside the iframe without offsetParent, this method will return
-       //    documentElement of the parent window
-       // 2) For the hidden or detached element
-       // 3) For body or html element, i.e. in case of the html node - it will return itself
-       //
-       // but those exceptions were never presented as a real life use-cases
-       // and might be considered as more preferable results.
-       //
-       // This logic, however, is not guaranteed and can change at any point in the future
-       offsetParent: function() {
-               return this.map( function() {
-                       var offsetParent = this.offsetParent;
-
-                       while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
-                               offsetParent = offsetParent.offsetParent;
-                       }
-
-                       return offsetParent || documentElement;
-               } );
-       }
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
-       var top = "pageYOffset" === prop;
-
-       jQuery.fn[ method ] = function( val ) {
-               return access( this, function( elem, method, val ) {
-
-                       // Coalesce documents and windows
-                       var win;
-                       if ( jQuery.isWindow( elem ) ) {
-                               win = elem;
-                       } else if ( elem.nodeType === 9 ) {
-                               win = elem.defaultView;
-                       }
-
-                       if ( val === undefined ) {
-                               return win ? win[ prop ] : elem[ method ];
-                       }
-
-                       if ( win ) {
-                               win.scrollTo(
-                                       !top ? val : win.pageXOffset,
-                                       top ? val : win.pageYOffset
-                               );
-
-                       } else {
-                               elem[ method ] = val;
-                       }
-               }, method, val, arguments.length );
-       };
-} );
-
-// Support: Safari <=7 - 9.1, Chrome <=37 - 49
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
-       jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
-               function( elem, computed ) {
-                       if ( computed ) {
-                               computed = curCSS( elem, prop );
-
-                               // If curCSS returns percentage, fallback to offset
-                               return rnumnonpx.test( computed ) ?
-                                       jQuery( elem ).position()[ prop ] + "px" :
-                                       computed;
-                       }
-               }
-       );
-} );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
-               function( defaultExtra, funcName ) {
-
-               // Margin is only for outerHeight, outerWidth
-               jQuery.fn[ funcName ] = function( margin, value ) {
-                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-                       return access( this, function( elem, type, value ) {
-                               var doc;
-
-                               if ( jQuery.isWindow( elem ) ) {
-
-                                       // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
-                                       return funcName.indexOf( "outer" ) === 0 ?
-                                               elem[ "inner" + name ] :
-                                               elem.document.documentElement[ "client" + name ];
-                               }
-
-                               // Get document width or height
-                               if ( elem.nodeType === 9 ) {
-                                       doc = elem.documentElement;
-
-                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
-                                       // whichever is greatest
-                                       return Math.max(
-                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
-                                               doc[ "client" + name ]
-                                       );
-                               }
-
-                               return value === undefined ?
-
-                                       // Get width or height on the element, requesting but not forcing parseFloat
-                                       jQuery.css( elem, type, extra ) :
-
-                                       // Set width or height on the element
-                                       jQuery.style( elem, type, value, extra );
-                       }, type, chainable ? margin : undefined, chainable );
-               };
-       } );
-} );
-
-
-jQuery.fn.extend( {
-
-       bind: function( types, data, fn ) {
-               return this.on( types, null, data, fn );
-       },
-       unbind: function( types, fn ) {
-               return this.off( types, null, fn );
-       },
-
-       delegate: function( selector, types, data, fn ) {
-               return this.on( types, selector, data, fn );
-       },
-       undelegate: function( selector, types, fn ) {
-
-               // ( namespace ) or ( selector, types [, fn] )
-               return arguments.length === 1 ?
-                       this.off( selector, "**" ) :
-                       this.off( types, selector || "**", fn );
-       }
-} );
-
-jQuery.holdReady = function( hold ) {
-       if ( hold ) {
-               jQuery.readyWait++;
-       } else {
-               jQuery.ready( true );
-       }
-};
-jQuery.isArray = Array.isArray;
-jQuery.parseJSON = JSON.parse;
-jQuery.nodeName = nodeName;
-
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
-       define( "jquery", [], function() {
-               return jQuery;
-       } );
-}
-
-
-
-
-var
-
-       // Map over jQuery in case of overwrite
-       _jQuery = window.jQuery,
-
-       // Map over the $ in case of overwrite
-       _$ = window.$;
-
-jQuery.noConflict = function( deep ) {
-       if ( window.$ === jQuery ) {
-               window.$ = _$;
-       }
-
-       if ( deep && window.jQuery === jQuery ) {
-               window.jQuery = _jQuery;
-       }
-
-       return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
-       window.jQuery = window.$ = jQuery;
-}
-
-
-
-
-return jQuery;
-} );
+/*! jQuery v3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector | (c) JS Foundation and other contributors | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/parseXML,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-event/ajax,-effects,-effects/Tween,-effects/animatedSelector",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a);
+}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],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,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.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,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:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}}),r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var _a,ab=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?_a:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),_a={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ab[b]||r.find.attr;ab[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ab[g],ab[g]=e,e=null!=c(a,b,d)?g:null,ab[g]=f),e}});var bb=/^(?:input|select|textarea|button)$/i,cb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function db(a){var b=a.match(L)||[];return b.join(" ")}function eb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,eb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,eb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=eb(c),d=1===c.nodeType&&" "+db(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=db(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,eb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=eb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+db(eb(c))+" ").indexOf(b)>-1)return!0;return!1}});var fb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(fb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:db(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var gb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!gb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,gb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.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(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var hb=/\[\]$/,ib=/\r?\n/g,jb=/^(?:submit|button|image|reset|file)$/i,kb=/^(?:input|select|textarea|keygen)/i;function lb(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||hb.test(a)?d(a,e):lb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d);
+});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)lb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)lb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&kb.test(this.nodeName)&&!jb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ib,"\r\n")}}):{name:b.name,value:c.replace(ib,"\r\n")}}).get()}}),r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var mb=a.jQuery,nb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=nb),b&&a.jQuery===r&&(a.jQuery=mb),r},b||(a.jQuery=a.$=r),r});
index 7a469353341b4a610fe6ec41ae40b5461854305f..4749222173ff5d801902de326526f92b319a83b2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * QUnit 2.3.3
+ * QUnit 2.4.0
  * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2017-06-02T14:07Z
+ * Date: 2017-07-08T15:20Z
  */
 
 /** Font Family and Sizes */
        left: -10000px;
        width: 1000px;
        height: 1000px;
-}
\ No newline at end of file
+}
index 3cda99631a9542dd813c6a0a22f61bcfccef4f52..bb8f31d680a37b8a1addb7c238593529449ccf65 100644 (file)
@@ -1,17 +1,17 @@
 /*!
- * QUnit 2.3.3
+ * QUnit 2.4.0
  * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2017-06-02T14:07Z
+ * Date: 2017-07-08T15:20Z
  */
 (function (global$1) {
   'use strict';
 
-  global$1 = 'default' in global$1 ? global$1['default'] : global$1;
+  global$1 = global$1 && 'default' in global$1 ? global$1['default'] : global$1;
 
   var window = global$1.window;
   var self$1 = global$1.self;
                case "Function":
                case "Symbol":
                        return type.toLowerCase();
-       }
-
-       if ((typeof obj === "undefined" ? "undefined" : _typeof(obj)) === "object") {
-               return "object";
+               default:
+                       return typeof obj === "undefined" ? "undefined" : _typeof(obj);
        }
   }
 
                return arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1));
        }
 
-       return innerEquiv;
+       return function () {
+               var result = innerEquiv.apply(undefined, arguments);
+
+               // Release any retained objects
+               pairs.length = 0;
+               return result;
+       };
   })();
 
   /**
                tests: [],
                childModules: [],
                testsRun: 0,
-               unskippedTestsRun: 0
+               unskippedTestsRun: 0,
+               hooks: {
+                       before: [],
+                       beforeEach: [],
+                       afterEach: [],
+                       after: []
+               }
        },
 
        callbacks: {},
        return TestReport;
   }();
 
-  var focused = false;
+  var focused$1 = false;
 
   function Test(settings) {
        var i, l;
        ++Test.count;
 
        this.expected = null;
-       extend(this, settings);
        this.assertions = [];
        this.semaphore = 0;
        this.module = config.currentModule;
        this.stack = sourceFromStacktrace(3);
        this.steps = [];
+       this.timeout = undefined;
+
+       // If a module is skipped, all its tests and the tests of the child suites
+       // should be treated as skipped even if they are defined as `only` or `todo`.
+       // As for `todo` module, all its tests will be treated as `todo` except for
+       // tests defined as `skip` which will be left intact.
+       //
+       // So, if a test is defined as `todo` and is inside a skipped module, we should
+       // then treat that test as if was defined as `skip`.
+       if (this.module.skip) {
+               settings.skip = true;
+               settings.todo = false;
+
+               // Skipped tests should be left intact
+       } else if (this.module.todo && !settings.skip) {
+               settings.todo = true;
+       }
+
+       extend(this, settings);
 
        this.testReport = new TestReport(settings.testName, this.module.suiteReport, {
                todo: settings.todo,
                function runTest(test) {
                        promise = test.callback.call(test.testEnvironment, test.assert);
                        test.resolvePromise(promise);
+
+                       // If the test has a "lock" on it, but the timeout is 0, then we push a
+                       // failure as the test should be synchronous.
+                       if (test.timeout === 0 && test.semaphore !== 0) {
+                               pushFailure("Test did not finish synchronously even though assert.timeout( 0 ) was used.", sourceFromStacktrace(2));
+                       }
                }
        },
 
        },
 
        queueHook: function queueHook(hook, hookName, hookOwner) {
-               var promise,
-                   test = this;
-               return function runHook() {
+               var _this = this;
+
+               var callHook = function callHook() {
+                       var promise = hook.call(_this.testEnvironment, _this.assert);
+                       _this.resolvePromise(promise, hookName);
+               };
+
+               var runHook = function runHook() {
                        if (hookName === "before") {
                                if (hookOwner.unskippedTestsRun !== 0) {
                                        return;
                                }
 
-                               test.preserveEnvironment = true;
+                               _this.preserveEnvironment = true;
                        }
 
                        if (hookName === "after" && hookOwner.unskippedTestsRun !== numberOfUnskippedTests(hookOwner) - 1 && config.queue.length > 2) {
                                return;
                        }
 
-                       config.current = test;
+                       config.current = _this;
                        if (config.notrycatch) {
                                callHook();
                                return;
                        try {
                                callHook();
                        } catch (error) {
-                               test.pushFailure(hookName + " failed on " + test.testName + ": " + (error.message || error), extractStacktrace(error, 0));
-                       }
-
-                       function callHook() {
-                               promise = hook.call(test.testEnvironment, test.assert);
-                               test.resolvePromise(promise, hookName);
+                               _this.pushFailure(hookName + " failed on " + _this.testName + ": " + (error.message || error), extractStacktrace(error, 0));
                        }
                };
+
+               return runHook;
        },
 
+
        // Currently only used for module level hooks, can be used to add global level ones
        hooks: function hooks(handler) {
                var hooks = [];
                        if (module.parentModule) {
                                processHooks(test, module.parentModule);
                        }
-                       if (module.hooks && objectType(module.hooks[handler]) === "function") {
-                               hooks.push(test.queueHook(module.hooks[handler], handler, module));
+
+                       if (module.hooks[handler].length) {
+                               for (var i = 0; i < module.hooks[handler].length; i++) {
+                                       hooks.push(test.queueHook(module.hooks[handler][i], handler, module));
+                               }
                        }
                }
 
                if (!this.skip) {
                        processHooks(this, this.module);
                }
+
                return hooks;
        },
 
+
        finish: function finish() {
                config.current = this;
                if (config.requireExpects && this.expected === null) {
 
   // Will be exposed as QUnit.test
   function test(testName, callback) {
-       if (focused) {
+       if (focused$1) {
                return;
        }
 
   }
 
   function todo(testName, callback) {
-       if (focused) {
+       if (focused$1) {
                return;
        }
 
 
   // Will be exposed as QUnit.skip
   function skip(testName) {
-       if (focused) {
+       if (focused$1) {
                return;
        }
 
 
   // Will be exposed as QUnit.only
   function only(testName, callback) {
-       if (focused) {
+       if (focused$1) {
                return;
        }
 
        config.queue.length = 0;
-       focused = true;
+       focused$1 = true;
 
        var newTest = new Test({
                testName: testName,
 
   // Put a hold on processing and return a function that will release it.
   function internalStop(test) {
-       var released = false;
-
        test.semaphore += 1;
        config.blocking = true;
 
        // Set a recovery timeout, if so configured.
-       if (config.testTimeout && defined.setTimeout) {
-               clearTimeout(config.timeout);
-               config.timeout = setTimeout(function () {
-                       pushFailure("Test timed out", sourceFromStacktrace(2));
-                       internalRecover(test);
-               }, config.testTimeout);
+       if (defined.setTimeout) {
+               var timeoutDuration = void 0;
+
+               if (typeof test.timeout === "number") {
+                       timeoutDuration = test.timeout;
+               } else if (typeof config.testTimeout === "number") {
+                       timeoutDuration = config.testTimeout;
+               }
+
+               if (typeof timeoutDuration === "number" && timeoutDuration > 0) {
+                       clearTimeout(config.timeout);
+                       config.timeout = setTimeout(function () {
+                               pushFailure("Test took longer than " + timeoutDuration + "ms; test timed out.", sourceFromStacktrace(2));
+                               internalRecover(test);
+                       }, timeoutDuration);
+               }
        }
 
+       var released = false;
        return function resume() {
                if (released) {
                        return;
 
        // Assert helpers
 
-       // Documents a "step", which is a string value, in a test as a passing assertion
+       createClass(Assert, [{
+               key: "timeout",
+               value: function timeout(duration) {
+                       if (typeof duration !== "number") {
+                               throw new Error("You must pass a number as the duration to assert.timeout");
+                       }
 
+                       this.test.timeout = duration;
+               }
 
-       createClass(Assert, [{
+               // Documents a "step", which is a string value, in a test as a passing assertion
+
+       }, {
                key: "step",
                value: function step(message) {
                        var result = !!message;
        }, {
                key: "push",
                value: function push(result, actual, expected, message, negative) {
-                       Logger.warn("assert.push is deprecated and will be removed in QUnit 3.0." + " Please use assert.pushResult instead (http://api.qunitjs.com/pushResult/).");
+                       Logger.warn("assert.push is deprecated and will be removed in QUnit 3.0." + " Please use assert.pushResult instead (https://api.qunitjs.com/assert/pushResult).");
 
                        var currentAssert = this instanceof Assert ? this : config.current.assert;
                        return currentAssert.pushResult({
        return false;
   }
 
+  var focused = false;
   var QUnit = {};
   var globalSuite = new SuiteReport();
 
   QUnit.isLocal = !(defined.document && window.location.protocol !== "file:");
 
   // Expose the current QUnit version
-  QUnit.version = "2.3.3";
+  QUnit.version = "2.4.0";
 
-  function createModule(name, testEnvironment) {
+  function createModule(name, testEnvironment, modifiers) {
        var parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null;
        var moduleName = parentModule !== null ? [parentModule.name, name].join(" > ") : name;
        var parentSuite = parentModule ? parentModule.suiteReport : globalSuite;
 
+       var skip$$1 = parentModule !== null && parentModule.skip || modifiers.skip;
+       var todo$$1 = parentModule !== null && parentModule.todo || modifiers.todo;
+
        var module = {
                name: moduleName,
                parentModule: parentModule,
                testsRun: 0,
                unskippedTestsRun: 0,
                childModules: [],
-               suiteReport: new SuiteReport(name, parentSuite)
+               suiteReport: new SuiteReport(name, parentSuite),
+
+               // Pass along `skip` and `todo` properties from parent module, in case
+               // there is one, to childs. And use own otherwise.
+               // This property will be used to mark own tests and tests of child suites
+               // as either `skipped` or `todo`.
+               skip: skip$$1,
+               todo: skip$$1 ? false : todo$$1
        };
 
        var env = {};
        return module;
   }
 
-  extend(QUnit, {
-       on: on,
+  function processModule(name, options, executeNow) {
+       var modifiers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
 
-       // Call on start of module test to prepend name to all tests
-       module: function module(name, testEnvironment, executeNow) {
-               if (arguments.length === 2) {
-                       if (objectType(testEnvironment) === "function") {
-                               executeNow = testEnvironment;
-                               testEnvironment = undefined;
-                       }
+       var module = createModule(name, options, modifiers);
+
+       // Move any hooks to a 'hooks' object
+       var testEnvironment = module.testEnvironment;
+       var hooks = module.hooks = {};
+
+       setHookFromEnvironment(hooks, testEnvironment, "before");
+       setHookFromEnvironment(hooks, testEnvironment, "beforeEach");
+       setHookFromEnvironment(hooks, testEnvironment, "afterEach");
+       setHookFromEnvironment(hooks, testEnvironment, "after");
+
+       function setHookFromEnvironment(hooks, environment, name) {
+               var potentialHook = environment[name];
+               hooks[name] = typeof potentialHook === "function" ? [potentialHook] : [];
+               delete environment[name];
+       }
+
+       var moduleFns = {
+               before: setHookFunction(module, "before"),
+               beforeEach: setHookFunction(module, "beforeEach"),
+               afterEach: setHookFunction(module, "afterEach"),
+               after: setHookFunction(module, "after")
+       };
+
+       var currentModule = config.currentModule;
+       if (objectType(executeNow) === "function") {
+               moduleStack.push(module);
+               config.currentModule = module;
+               executeNow.call(module.testEnvironment, moduleFns);
+               moduleStack.pop();
+               module = module.parentModule || currentModule;
+       }
+
+       config.currentModule = module;
+  }
+
+  // TODO: extract this to a new file alongside its related functions
+  function module$1(name, options, executeNow) {
+       if (focused) {
+               return;
+       }
+
+       if (arguments.length === 2) {
+               if (objectType(options) === "function") {
+                       executeNow = options;
+                       options = undefined;
                }
+       }
+
+       processModule(name, options, executeNow);
+  }
 
-               var module = createModule(name, testEnvironment);
+  module$1.only = function () {
+       if (focused) {
+               return;
+       }
 
-               // Move any hooks to a 'hooks' object
-               if (module.testEnvironment) {
-                       module.hooks = {
-                               before: module.testEnvironment.before,
-                               beforeEach: module.testEnvironment.beforeEach,
-                               afterEach: module.testEnvironment.afterEach,
-                               after: module.testEnvironment.after
-                       };
+       config.modules.length = 0;
+       config.queue.length = 0;
 
-                       delete module.testEnvironment.before;
-                       delete module.testEnvironment.beforeEach;
-                       delete module.testEnvironment.afterEach;
-                       delete module.testEnvironment.after;
+       module$1.apply(undefined, arguments);
+
+       focused = true;
+  };
+
+  module$1.skip = function (name, options, executeNow) {
+       if (focused) {
+               return;
+       }
+
+       if (arguments.length === 2) {
+               if (objectType(options) === "function") {
+                       executeNow = options;
+                       options = undefined;
                }
+       }
 
-               var moduleFns = {
-                       before: setHook(module, "before"),
-                       beforeEach: setHook(module, "beforeEach"),
-                       afterEach: setHook(module, "afterEach"),
-                       after: setHook(module, "after")
-               };
+       processModule(name, options, executeNow, { skip: true });
+  };
 
-               var currentModule = config.currentModule;
-               if (objectType(executeNow) === "function") {
-                       moduleStack.push(module);
-                       config.currentModule = module;
-                       executeNow.call(module.testEnvironment, moduleFns);
-                       moduleStack.pop();
-                       module = module.parentModule || currentModule;
+  module$1.todo = function (name, options, executeNow) {
+       if (focused) {
+               return;
+       }
+
+       if (arguments.length === 2) {
+               if (objectType(options) === "function") {
+                       executeNow = options;
+                       options = undefined;
                }
+       }
 
-               config.currentModule = module;
-       },
+       processModule(name, options, executeNow, { todo: true });
+  };
+
+  extend(QUnit, {
+       on: on,
+
+       module: module$1,
 
        test: test,
 
        ProcessingQueue.advance();
   }
 
-  function setHook(module, hookName) {
-       if (!module.hooks) {
-               module.hooks = {};
-       }
-
-       return function (callback) {
-               module.hooks[hookName] = callback;
+  function setHookFunction(module, hookName) {
+       return function setHook(callback) {
+               module.hooks[hookName].push(callback);
        };
   }
 
index 88c13ceeb312d75436c31be54e6d151a9b273ab3..77a644eec857147a31c74b138246921762322c03 100644 (file)
     "popper.js": "^1.10.8"
   },
   "devDependencies": {
-    "autoprefixer": "^7.1.1",
+    "autoprefixer": "^7.1.2",
     "babel-cli": "^6.24.1",
     "babel-eslint": "^7.2.3",
     "babel-plugin-transform-es2015-modules-strip": "^0.1.1",
     "babel-preset-es2015": "^6.24.1",
-    "clean-css-cli": "^4.1.3",
-    "eslint": "^3.19.0",
+    "clean-css-cli": "^4.1.6",
+    "eslint": "^4.2.0",
     "grunt": "^1.0.1",
     "grunt-cli": "^1.2.0",
     "grunt-saucelabs": "^9.0.0",
     "nodemon": "^1.11.0",
     "npm-run-all": "^4.0.2",
     "phantomjs-prebuilt": "^2.1.14",
-    "postcss-cli": "^4.0.0",
+    "postcss-cli": "^4.1.0",
     "qunit-phantomjs-runner": "^2.3.0",
-    "qunitjs": "^2.3.2",
-    "shelljs": "^0.7.7",
+    "qunitjs": "^2.4.0",
+    "shelljs": "^0.7.8",
     "shx": "^0.2.2",
-    "uglify-js": "^3.0.13"
+    "uglify-js": "^3.0.24"
   },
   "engines": {
     "node": ">=4"